Repository navigation
feat: enforce competitive legacy team policy - #765
Merged
Merged
Conversation
This was referenced Sep 29, 2026
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-команда использует общую policy для Invite, Collaborator, vacancy, leave/switch, apply/bind/clone, admin/model save и submission. Submitted-состав фиксируется; pending decline/revoke остаются доступны. Exclusivity действует для draft/submitted команд до окончания программы. Min/max задаются в программе, NULL отключает соответствующую границу.
Зачем
Сдача проекта должна фиксировать состав команды, а приглашение, accept и другие writers должны одинаково проверять program membership, exclusivity и capacity. Spec и AC C1–C15:
docs/competitive-team-policy.md; read-only диагностика данных:docs/legacy-team-data-audit.sql.Реализация
ccf920308d38329a6626fceee1fc1ea3d01c8550.c57e62b91d76b58fec38bcc7d5de95f5dd44bd24.88f114b…обновлён актуальным dev без force-push. A fix: enforce project team management authorization #763 и B fix: port legacy invite integrity hardening to dev #767 уже входят в base; diff не дублирует их доставку.invites/models.py,serializers.py,views.py,tests/test_invite_integrity.py,tests/test_pending_invite_migration.py,projects/team_service.pyиprojects/models.py.Project.save()объединены team locks/leader validation и новая нормализация имени из dev. Актуальные университеты и аналитика сохранены.API
Optional
program_link_id— ID связи, принадлежащей Project. Ноль links — ordinary project; один — unique context; несколько — explicit ID либо 409program_context_required. Новый Invite хранит context. Сохранённый context не переназначается. Link-scoped submission URL сохранён.Project list/detail и компактные user-projects возвращают
team_policy:is_frozen, единственныйprogram_link_idлибо NULL,requires_program_context,program_links. Legacy read projection сохранён.409:
team_frozen,already_in_program_team,team_min_size,team_max_size,program_context_required,program_context_in_use,submission_closed; A/B codes сохраняются. Permission — 403, foreign context — 422, malformed input / existing case validation — 400. Контракт исходного C при актуализации не менялся.UI
Backend-only diff. Angular согласуется в Draft #392 и внедряется после C. React не затронут. Admin использует controlled validation.
Permissions
Управляет текущий leader, actor перепроверяется под lock. Existing staff override vacancy service сохранён. Freeze любой submitted competitive связи действует на shared roster и не обходится context другой программы.
Проверки
No changes detected); diff checks.Первый локальный full run не прошёл: reused targeted DB уже была очищена от data-migration seed, один websocket timeout и Windows error 1450/fsync привёл к recovery старого тестового кластера. Повтор выполнялся на отдельном свежем кластере/БД и прошёл целиком; production code и university tests ради результата не менялись.
Acceptance criteria
Migrations / DB guarantees
Только две migrations C:
partner_programs/0019_legacy_project_team_policyиinvites/0004_legacy_project_team_policy.invites/0003из B не дублируется и не меняется. Новые defaults для границ — NULL; три checks защищают положительные значения и min ≤ max. Invite получает nullable FK RESTRICT; backfill только для ровно одного link, остальные NULL. Forward/backward tests сохраняют Invite/roster.Pending unique Invite, unique Collaborator pair, unique PUP pair и FK/checks защищены БД. Exclusivity/freeze/capacity между таблицами гарантируются application locks поддерживаемых writers. Raw SQL, QuerySet bulk/update и cascade удаления целых родителей не являются roster-service командами. Отдельная materialized membership table автоматически не добавлялась.
Не проверено
Live DEV/PROD data audit и mutations, browser на новом коде не выполнялись. Доступа к read-only DEV DB из этого окружения нет; отсутствие исторических конфликтов не утверждается. Повторная проверка исходного C от сентября не выдаётся за проверку текущей версии. Merge/deploy не выполняются.
Риски / rollout
До rollout выполнить read-only
legacy-team-data-audit.sql. C не удаляет исторические конфликтующие команды и не выбирает программу для ambiguous Invite. Такие записи могут потребовать отдельного решения владельца данных; новые конфликтующие mutations отклоняются. Program locks могут повысить contention. PROD имеет другой migration graph и lifecycle, прямой перенос DEV migrations туда не является release plan.A/B уже merged в dev; следующий пользовательский merge — этот C в dev. Затем backend schema/API должны быть доступны до внедрения Angular D. PR остаётся Draft.