Skip to content

Prod: expose current project application in program detail - #735

Merged
TThanos3000 merged 1 commit into
masterfrom
prod/program-current-project-application
Sep 9, 2026
Merged

TThanos3000 merged 1 commit into
masterfrom
prod/program-current-project-application

Conversation

@TThanos3000

Copy link
Copy Markdown
Collaborator

Основа и назначение

  • Exact backend base (актуальный origin/master перед началом): d23c555540ccd425e8c3d21bc2c1722cb3361b1b.
  • Exact final head: dd902c0d75abea2a4d7456bb1e247250ec41ad4a.
  • Semantic production port DEV #731, без cherry-pick и без merge dev → master.
  • DEV-имя current_application намеренно не используется: production уже имеет самостоятельную модель Application. Новое поле описывает только legacy Angular flow Project × PartnerProgramProject.

Singular Project.partner_program не является надёжным источником для multi-program Project: ранняя связь с A не должна скрывать заявку того же проекта в запрошенной B.

Additive read contract

Существующий GET /programs/<programId>/ всегда возвращает:

{
  "current_project_application": {
    "project_id": 123,
    "program_link_id": 700,
    "submitted": false
  }
}

Либо "current_project_application": null для anonymous, authenticated non-member и member без подходящей legacy-связи.

  • Member gate остаётся во view. Для anonymous/non-member selector не вызывается, даже при существующей связи проекта.
  • Lookup: только PartnerProgramProject, одновременно partner_program_id=requested program и project__leader_id=current user.
  • Владелец только Project.leader. Collaborator, Invite, TeamMember, настоящая Application, profile.project, singular program и связи других программ не участвуют в определении DTO.
  • Сначала фильтрация текущей программы, затем детерминированный minimum PartnerProgramProject.pk. Legacy duplicates не вызывают 500; новый код ничего не создаёт.
  • submitted передаётся непосредственно из выбранного PartnerProgramProject.submitted, без новой lifecycle-семантики.

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

Добавлен небольшой typed selector, member-only вызов в detail view, 21 regression-тест и документация контракта.

Не изменены production serializers и прежние поля detail: application_policy, welcome_acknowledged_at, courses/materials, manager/member flags, dates и остальные поля. Тест сравнивает весь прежний ответ без additive-поля для anonymous/non-member/member.

Production Application / Team / Submission / Evaluation и /applications/, /applications/my/ не изменены. Отдельно проверены Application-only, legacy-only, оба одновременно с различающимися project/status, Application другой программы, TeamMember чужой заявки.

Не изменены foundation #732/#733/#734: scoped READ/expert filters, cases/canonical fields/admin freeze/access helper, submission metadata. Не изменены apply/submit, fields PUT, permissions, manager-overview. Нет новых endpoints, моделей, migrations, dependencies, Docker/workflow или frontend-изменений.

SQL-бюджет

Warm HTTP detail GET через APIClient, существующий add_view оставлен включённым; сравнение exact base → exact head на локальном PostgreSQL:

Пользователь Base Head Изменение
Anonymous 4 4 0
Authenticated non-member 7 7 0
Member 8 9 +1

Selector выполняет один фиксированный SQL с тремя колонками, ORDER BY pk LIMIT 1, включая случаи 0/1/20 подходящих проектов. Нет project-list/pagination scan или N+1. В regression-тестах проверены отсутствие вызова для anonymous/non-member и ровно +1 запрос для member.

Проверки exact final head

Локально: Windows, Python 3.11.15, существующее окружение, PostgreSQL 18.1; изолированная test DB. Зависимости и конфигурация окружения проекта не менялись.

  • Targeted: 325 passed, exit 0 (324 detail/welcome/Application/case/access/apply/submit регрессии + один in-memory before/after query-budget probe).
  • manage.py test projects partner_programs --verbosity 1 --noinput: 812 passed, exit 0.
  • Full backend manage.py test --verbosity 1 --noinput --keepdb: 1381 passed, exit 0; выделенная test DB удалена после завершения процесса.
  • manage.py check: PASS.
  • manage.py check --tag models: PASS.
  • manage.py makemigrations --check --dry-run: PASS, No changes detected.
  • Scoped Black: PASS для detail view, нового test-файла и добавленных DTO/selector. Whole-file selectors.py имеет pre-existing formatting debt в неизменённых participant selectors, воспроизводимый на exact base; он намеренно не переформатирован вне scope.
  • Full Flake8: PASS.
  • git diff --check HEAD^ HEAD: PASS; рабочее дерево чистое, изменены только четыре заявленных файла.
  • Ordinary CI, run 34374781865: SUCCESS: Lint + Tests; 1381 tests, OK (skipped=5), exact head выше.
  • PostgreSQL CI, run 34374783127: SUCCESS: 86 locking/constraint tests + 1381 full-suite tests, без skips, workflow_dispatch feature-ветки на том же exact head; PostgreSQL locking/constraint tests и full backend suite.

Draft для review. Merge и deploy не выполнялись.

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