DEV: fix program manager project detail access - #727
Merged
Conversation
TThanos3000
marked this pull request as ready for review
September 6, 2026 10:46
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.
Изменения
Исправлено открытие проектов из manager analytics обычным
GET /projects/:id/. Angular/React и контракты аналитики не менялись.dev:4dea5bd8893839e46800f5c9ee20646fc6307aab— подтверждён fetch и повторным remote SHA.89769ff1b927bb45e41fd5ac94941e80c7d5ea0f.fix/dev-program-manager-project-detail-access.Воспроизведение до fix
Regression-тесты сначала запускались на неизменённом application code текущего dev.
403 на draft/private
ProjectVisibilityPermissionразрешал manager/expert связанной программы и staff/superuser, но следующийHasInvolvementInProjectOrReadOnlyотклонял draft, если пользователь не leader/collaborator/invite.Тесты подтвердили 403 вместо ожидаемого 200 для manager, expert, staff и superuser. Integration: тот же project.id возвращался в attention, но detail по нему давал 403.
500 при нескольких program links
GET проекта, доступного лидеру, с двумя
PartnerProgramProjectвоспроизвёл фактический traceback:Вариант с восемью связями также падал. Это подтверждённая причина воспроизведённого 500 на текущем коде, не catch-all маскировка исключений.
Ограничение диагностики: серверный traceback именно DEV
/projects/42/и реальные данные проектов №42/232 не читались. Совпадение причины конкретного HTTP 500 №42 с этим воспроизведением не заявляется доказанным; для этого нужен runtime traceback. Реальные пользовательские данные не изменялись.READ и WRITE
Выделен один helper
has_project_read_involvement, общий для ограниченной visibility и draft READ gate:Он не выдаёт WRITE capabilities. SAFE_METHODS для draft используют helper; существующие ветки PUT/PATCH/DELETE сохранены: опубликованный проект — leader, draft — существующие leader/collaborator/invite. Manager/expert/admin без такого участия не могут изменять или удалять чужой проект.
Приватность опубликованных проектов по-прежнему отдельно проверяет ProjectVisibilityPermission. Публичный флаг не открывает draft постороннему/анониму. Нет создания leader/collaborator/invite/owner или отдельного manager-detail endpoint. Timing permission не менялась семантически.
Black отформатировал существующие длинные выражения внутри изменённого
projects/permissions.py; в остальных permissions/модулях функциональных изменений нет.Legacy partner_program
Singular контракт сохраняется. Выбор:
select_related("partner_program").order_by("pk").first().Тесты и integration
17 новых тестов (включая subtests) покрывают:
SQL
До fix, прогретый detail с одной связью: 17 SQL. После fix: 17 SQL с одной связью и 17 SQL с восемью связями. Первый вызов с созданием View: 20 SQL до и после.
Сам
get_partner_program: 3 SQL до/после — JOIN link/program, поля программы, значения полей. Количество не растёт с количеством program links. Queryset detail и list querysets не изменены; новые per-link запросы не добавлены.Это контролируемый test fixture, не замер live DEV проекта.
Проверки
postgresql,has_select_for_update=True, migrations на пустую БД, 39/39 locking/lifecycle и 717/717 полного suite, без skips. Новые 17 tests выполнены на PostgreSQL в полном suite.manage.py check,check --tag models,makemigrations --check --dry-run: успешно локально и в PostgreSQL CI,No changes detected.git diff --check,git diff --cached --check,git diff origin/dev...HEAD --check: успешно.Targeted команда:
Локальное окружение: Windows / Python 3.12 / SQLite, существующая внешняя test-only заглушка WeasyPrint из-за отсутствия Pango (не часть PR). Поэтому реальные зависимости отдельно проверены Linux/PostgreSQL CI на Python 3.11. Локальный полный Flake8 5.0.4 выдал 29 диагностик в неизменённых файлах; штатный CI Lint на Python 3.11 уже прошёл по всему репозиторию. Unrelated файлы не исправлялись; dependencies/workflows не менялись.
Границы
Изменены только:
projects/permissions.pyprojects/serializers.pyprojects/tests/test_program_project_detail_access.pyНе менялись analytics endpoints/contracts и PR #726 logic, frontend/Angular/React, submission/scoring, models/migrations, dependencies, shared modal, workflows, Docker и deploy.
PR остаётся Draft. Merge/deploy не выполнялись.