Skip to content

Prod: enforce project evaluation deadline - #739

Merged
TThanos3000 merged 1 commit into
masterfrom
prod/project-rating-evaluation-deadline
Sep 10, 2026
Merged

TThanos3000 merged 1 commit into
masterfrom
prod/project-rating-evaluation-deadline

Conversation

@TThanos3000

@TThanos3000 TThanos3000 commented Sep 10, 2026

Copy link
Copy Markdown
Collaborator

Что изменено

Legacy endpoint POST /rate-project/rate/<project_id> теперь серверно запрещает создание и изменение ProjectScore после завершения оценивания программы.

Причина: до этого deadline проверялся только на frontend, поэтому прямой HTTP-запрос мог записать или изменить legacy-оценки после окончания этапа.

База

Контракт deadline

Единственный источник истины: PartnerProgram.datetime_evaluation_ends.

  • null — оценивание по deadline не блокируется;
  • timezone.now() < datetime_evaluation_ends — запись разрешена;
  • точное равенство — запись разрешена;
  • timezone.now() > datetime_evaluation_ends — запись отклоняется.

При закрытом оценивании endpoint возвращает:

{
  "error": "evaluation_deadline_passed",
  "detail": "Срок оценивания завершён."
}

HTTP status: 409 Conflict.

Guard применяется и к первичной оценке, и к редактированию существующей. Он выполняется после определения программы по Criteria и прежних проверок membership, связи Program↔Project и distributed assignment, но до max_project_rates и до bulk_create.

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

  • В multi-program Project deadline выбирается по программе Criteria текущего payload, без program_links.first() и legacy singular-связей.
  • Прежние ответы для invalid Criteria, non-expert/foreign expert, unlinked Project и отсутствующего distributed assignment сохранены.
  • До deadline прежний max_project_rates работает без изменений; после deadline при валидном запросе приоритет имеет новый 409.
  • Отклонённый запрос не создаёт и не меняет ProjectScore, не меняет rated count, Project, PartnerProgramProject или ProjectExpertAssignment и не отправляет Celery email.
  • Новый production domain (Application, Submission, SubmissionExpertAssignment, Evaluation, EvaluationScore, EvaluationAmendment) не изменён.
  • Analytics endpoints не изменены; добавлены regression snapshots их read-contracts.
  • Serializer, Criteria payload contract и проблема пустого payload (Criteria not found) не менялись.
  • Новых endpoint, моделей и migrations нет.

SQL impact

Дополнительных SELECT-запросов нет: guard читает datetime_evaluation_ends из PartnerProgram, уже загруженной _prepare_project_score_data() через Criteria. Проверка выполняется внутри существующей транзакции до max-rate queries и write; N+1 и pagination scan не добавлены.

Тесты и проверки

Локально, Python 3.11:

  • новые deadline regressions, PostgreSQL: 15/15 OK;
  • новые deadline regressions, SQLite: 15/15 OK;
  • весь project_rates: 34/34 OK до добавления отдельного non-expert regression; финальный full suite включает его;
  • production-port regressions Prod: harden program project access and expert filters #732Prod: add project analytics attention and cases #738: 260/260 OK;
  • projects + partner_programs + project_rates: 943/943 OK;
  • полный PostgreSQL suite на exact head: 1493/1493 OK;
  • обычный SQLite suite: все 1492/1492 существовавших на момент запуска тестов прошли (OK, 5 PostgreSQL-only skipped), после чего локальный Windows runner получил WinError 32 только при удалении уже отработавшей test_db.sqlite3; финальный дополнительный test отдельно прошёл в SQLite targeted 15/15;
  • scoped Black: OK;
  • full Flake8: OK;
  • python manage.py check: OK;
  • python manage.py check --tag models: OK;
  • python manage.py makemigrations --check --dry-run: No changes detected;
  • PostgreSQL vendor / select_for_update capability: подтверждены;
  • git diff --check: OK.

GitHub Actions на exact head:

  • Lint: pass (9s);
  • ordinary Tests: 1493/1493 pass (OK, 5 PostgreSQL-only skipped; job 28m03s);
  • Backend PostgreSQL CI targeted locking/constraints: 86/86 pass;
  • Backend PostgreSQL CI full suite: 1493/1493 pass (job 12m05s);
  • служебные sync: pass.

Не входит в PR

  • redesign блокировок max_project_rates;
  • изменение Criteria payload/serializer;
  • изменения production Evaluation API;
  • migrations, dependencies, workflows, Docker;
  • deploy.

@TThanos3000
TThanos3000 marked this pull request as ready for review September 10, 2026 11:46
@TThanos3000
TThanos3000 merged commit 907ced2 into master Sep 10, 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