Skip to content

Prod: add project analytics assignment drilldowns - #737

Merged
TThanos3000 merged 1 commit into
masterfrom
prod/project-analytics-assignments
Sep 9, 2026
Merged

TThanos3000 merged 1 commit into
masterfrom
prod/project-analytics-assignments

Conversation

@TThanos3000

Copy link
Copy Markdown
Collaborator

База и границы

Контракт B6a

  • GET /programs/<program_id>/project-analytics/assignments/: массив реальных assignments по PK; scope=all|completed|pending, default all. Пустой/неподдерживаемый scope → 400. Pending включает not_ready, pending и in_progress.
  • GET /programs/<program_id>/project-analytics/assignments/<assignment_id>/scores/: assignment DTO + все текущие criteria по PK. Unknown/foreign assignment → 404, в том числе для manager обеих программ.
  • Additive attention.delayed_experts в существующем GET /programs/<program_id>/project-analytics/.
  • DEV namespace /manager-overview адаптирован в production /project-analytics. Production /manager-overview не изменён.

Единая семантика

Общий read-only project_assignment_analytics.py используется и overview, и drilldowns. Assignment completed только при submitted link текущей программы, непустом наборе criteria и score rows назначенного expert user по всем текущим criteria. Один score или zero criteria не завершают assignment. Статусы: not_ready / pending / in_progress / completed; Добавление критерия делает assignment снова незавершённым. Overview сохраняет total = pending + evaluated и прежнюю by-project completion semantics, без использования max_project_rates как required target.

Waiting start = max(current-program datetime_submitted, assignment datetime_created), только для незавершённой submitted-записи с реальной датой. Aware now, seconds >= 0. Missing timestamp, completed и not_ready не создают SLA.

Delayed experts только в distributed: >=1 × 48h → critical; иначе >=2 × 24h → warning. Все реальные assignments входят в totals, но незавершённые без waiting не создают SLA. Порядок: severity, oldest waiting descending, expert_id. В open delayed_experts всегда empty; list показывает реальные assignments без synthetic rows, а project evaluation остаётся по первому current-program ProjectScore.

Scores возвращают все criteria, включая missing score (null/false); существующие string/null, пробелы и пустые строки сохраняются без numeric conversion/trim/average. Expert DTO содержит только expert_id, user_id, first_name, last_name, full_name, avatar.

Совместимость и безопасность

  • Тот же production stack: ProgramPermissionMixin + IsAuthenticated + IsAdminOrManagerOfProgram. Manager текущей программы/staff/superuser → 200; participant/expert-only/other manager → 403; anonymous → 401; unknown program → 404; mutations → 405.
  • Program-scoped assignments, criteria, scores и link timestamps. Regression: один Project связан A+B, каждая программа использует собственную связь/состояние.
  • Legacy runtime не использует Application, Team, Submission, SubmissionExpertAssignment или Evaluation. Двусторонние isolation tests охватывают production manager-overview, submission-assignments и evaluation list/detail.
  • Полный B5 response в open/distributed совпал с exact base после удаления только delayed_experts. Функции regions/participants/solutions/activity AST-identical; отдельный committed regression проверяет полный прежний контракт.
  • No scoring writes, deadline changes, migrations/models, B6b endpoints/cases, foundation Prod: harden program project access and expert filters #732Prod: expose current project application in program detail #735 changes, frontend, dependencies, Docker или workflows. Production views/services/serializers и ProjectScore writes не изменены.

SQL

Проверка SQL
Assignment list: 1 / 31 assignments 3 / 3
Scores: 1 / 20 criteria 5 / 5
Overview HTTP: 1 / 31 assignments 10 / 10
Overview service 8 SELECT
Serializers / delayed aggregation 0

Assignment SELECT в overview выполняется один раз; его DTOs переиспользуются для counters, by-project и delayed experts. Увеличения query budget нет. Количество возвращаемых строк/память всё ещё зависят от размера программы.

Проверки на exact final head

  • Targeted (assignment analytics, B5, production manager, project_rates, Application/Submission/Evaluation, Prod: harden program project access and expert filters #732Prod: add legacy project analytics overview #736): 581 OK.
  • projects + partner_programs: 869 OK.
  • Локальный full backend suite (PostgreSQL): 1438 OK, без пропусков, exit code 0.
  • Дополнительное direct base/final comparison: 1 OK, полное совпадение B5 в обоих режимах.
  • Django check / check --tag models: 0 issues.
  • makemigrations --check --dry-run: No changes detected.
  • Scoped Black, scoped + repository Flake8, git diff --check: OK.
  • Обычный CI: success, Lint + 1438 tests, OK (skipped=5, SQLite).
  • PostgreSQL CI: success, PostgreSQL 15; 86 locking/constraint + 1438 full tests, без пропусков. Workflow dispatch на этой feature branch, не deploy.

Документация: docs/project-analytics-api.md. Локальные тесты используют изолированную PostgreSQL test database; production data не затрагивались.

Локальное окружение

При переходе через полночь Windows Loguru выводил WinError 32 при ротации warning.log (файл занят). Runner завершил 1438 тестов с OK / exit 0; это отмечено отдельно от результатов assertions. Logging middleware/config совпадают с base и в PR не менялись. Изолированная локальная test database удалена после завершения процесса.

@TThanos3000
TThanos3000 marked this pull request as ready for review September 9, 2026 21:44
@TThanos3000
TThanos3000 merged commit f300e3d into master Sep 9, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants