Skip to content

Prod: expose program link submission metadata - #734

Merged
TThanos3000 merged 1 commit into
masterfrom
prod/program-link-submission-metadata
Sep 9, 2026
Merged

TThanos3000 merged 1 commit into
masterfrom
prod/program-link-submission-metadata

Conversation

@TThanos3000

Copy link
Copy Markdown
Collaborator

Основа

  • Exact master base: cd427c6fa280804ca841dfeee73e3b42224cb910 (merge production Prod: formalize program case field contract #733).
  • Exact final head: 6df9f6b61cda4940bab8bb125e715253081a99a8.
  • Минимальный semantic production port DEV #729.
  • DEV feature head: 3b0724668185f5d81d44ba327b045f5fec5ad6ab; DEV merge: 77c8d41e2139c5902f2c7958d499fe26b9c4ef79.
  • Без dev → master merge и без cherry-pick merge-коммита.

GET contract

Существующий GET /programs/partner-program-projects/<programLinkId>/fields/ расширен только четырьмя top-level полями:

Поле Значение
is_competitive link.partner_program.is_competitive
submission_open link.partner_program.is_project_submission_open()
submission_deadline link.partner_program.get_project_submission_deadline(): ISO datetime или null в JSON
can_submit is_competitive and not link.submitted and submission_open

Всё вычисляется строго по запрошенной связи PartnerProgramProject и её программе. Не используются singular Project serializer, первая связь или metadata другой программы общего проекта.

Deadline вычисляет существующий helper: explicit datetime_project_submission_ends, затем прежний fallback на datetime_registration_ends; nullable результат сохраняется. Модели и helpers не изменены.

submission_open не равно can_submit: сданная или неконкурсная связь может иметь открытое окно, но can_submit=false. Это snapshot стадии, не новая authorization policy и не проверка выбранного case. Submit endpoint остаётся authoritative.

Совместимость и scope

  • Runtime diff: 6 добавленных строк только в program_link_fields().
  • GET permissions, scoped access Prod: harden program project access and expert filters #732/Prod: formalize program case field contract #733, leader-only WRITE, submit permissions/validation unchanged.
  • Все прежние GET keys, definitions, values и ordering unchanged.
  • PUT partial/atomic/scoped/case-aware/frozen contract и ответ {"detail": "Значения успешно обновлены"} unchanged; metadata в PUT не добавлена.
  • AST/source audit подтвердил неизменность всех остальных функций сервиса, включая PUT, submit и legacy resolver.
  • Изменены только сервис, canonical tests, Project PATCH regression test и docs/program-case-field.md.
  • Models/admin/forms/permissions/access helpers, routes, migrations, dependencies, workflows и Docker unchanged.
  • Application, Team, TeamMember, TeamInvite, Submission, SubmissionExpertAssignment, Evaluation, EvaluationScore, EvaluationAmendment и manager-overview unchanged.
  • Без current_project_application, analytics, assignments, attention, participant regions, evaluation deadline guard, Angular или React.

Regression coverage

  • Competitive open/closed, already submitted, noncompetitive open.
  • Explicit deadline, fallback open/closed, ISO serialization, nullable helper result без изменения schema.
  • Один Project с A+B: A competitive/open/draft, B noncompetitive/closed/submitted; обе metadata строго link-scoped.
  • Existing fields/values/order, отсутствие metadata в PUT, snapshot can_submit для readers без WRITE.
  • Leader/current manager/current expert READ, manager/expert другой программы 403, прежний leader-only PUT.
  • Обычный Project PATCH без partner_program_id сохраняет обе связи и полные snapshots профилей участников. Production Project code не изменён.

SQL budget

Измерен force-authenticated HTTP GET на exact base до изменения и на final head после изменения:

Роль Base: 1 / 20 fields Head: 1 / 20 fields
Leader 3 / 3 3 / 3
Manager 6 / 6 6 / 6
Expert 6 / 6 6 / 6

Metadata использует уже существующий select_related("project", "partner_program"): 0 дополнительных SQL, N+1 отсутствует.

Проверки exact final head

  • Targeted canonical fields + case/apply/submit/admin + access regressions + Project PATCH: 158 tests, OK, включая существующие PostgreSQL locking regressions.
  • Все partner_programs + projects: 791 tests, OK.
  • Полный локальный backend suite: 1360 tests, OK, exit 0, 627.768 s; Python 3.11.15 / PostgreSQL 18.1 / procollab.settings_ci.
  • manage.py check, check --tag models: PASS.
  • makemigrations --check --dry-run: No changes detected.
  • Scoped Black: 3 changed Python files PASS, без unrelated formatting.
  • Flake8 по backend: PASS.
  • git diff --check и scope audit: PASS.
  • Backend PostgreSQL CI: PASS на exact head, PostgreSQL 15; locking/constraints, full suite, Django/models/migration consistency и cleanup.
  • Ordinary CI: Lint PASS, Tests PASS на том же exact head.
  • Локальный полный suite использовал --keepdb и отдельную тестовую БД. После завершения процесса подтверждено 0 соединений, БД удалена.

Draft only. Не merge, не deploy.

@TThanos3000
TThanos3000 marked this pull request as ready for review September 9, 2026 15:22
@TThanos3000
TThanos3000 merged commit d23c555 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