Prod: enforce project evaluation deadline - #739
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Что изменено
Legacy endpoint
POST /rate-project/rate/<project_id>теперь серверно запрещает создание и изменениеProjectScoreпосле завершения оценивания программы.Причина: до этого deadline проверялся только на frontend, поэтому прямой HTTP-запрос мог записать или изменить legacy-оценки после окончания этапа.
База
origin/masterbase:6e4bb566cae95358f54f9386048ef817832c06c2(после merge Prod: add project analytics attention and cases #738)28799c07cc2613614806ba750860f6bd38836791prod/project-rating-evaluation-deadlineКонтракт 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.Безопасность и совместимость
program_links.first()и legacy singular-связей.max_project_ratesработает без изменений; после deadline при валидном запросе приоритет имеет новый409.ProjectScore, не меняет rated count, Project,PartnerProgramProjectилиProjectExpertAssignmentи не отправляет Celery email.Application,Submission,SubmissionExpertAssignment,Evaluation,EvaluationScore,EvaluationAmendment) не изменён.Criteria not found) не менялись.SQL impact
Дополнительных SELECT-запросов нет: guard читает
datetime_evaluation_endsизPartnerProgram, уже загруженной_prepare_project_score_data()через Criteria. Проверка выполняется внутри существующей транзакции до max-rate queries и write; N+1 и pagination scan не добавлены.Тесты и проверки
Локально, Python 3.11:
15/15 OK;15/15 OK;project_rates:34/34 OKдо добавления отдельного non-expert regression; финальный full suite включает его;260/260 OK;projects + partner_programs + project_rates:943/943 OK;1493/1493 OK;1492/1492существовавших на момент запуска тестов прошли (OK, 5 PostgreSQL-only skipped), после чего локальный Windows runner получилWinError 32только при удалении уже отработавшейtest_db.sqlite3; финальный дополнительный test отдельно прошёл в SQLite targeted15/15;python manage.py check: OK;python manage.py check --tag models: OK;python manage.py makemigrations --check --dry-run:No changes detected;select_for_updatecapability: подтверждены;git diff --check: OK.GitHub Actions на exact head:
Lint: pass (9s);Tests: 1493/1493 pass (OK, 5 PostgreSQL-only skipped; job28m03s);Backend PostgreSQL CItargeted locking/constraints: 86/86 pass;Backend PostgreSQL CIfull suite: 1493/1493 pass (job 12m05s);sync: pass.Не входит в PR
max_project_rates;