Skip to content

DEV: read-only аналитика программы для ролевого Angular-виджета - #742

Draft
TThanos3000 wants to merge 1 commit into
devfrom
feature/dev-program-role-analytics-widget
Draft

TThanos3000 wants to merge 1 commit into
devfrom
feature/dev-program-role-analytics-widget

Conversation

@TThanos3000

@TThanos3000 TThanos3000 commented Sep 14, 2026

Copy link
Copy Markdown
Collaborator

На странице программы Angular заглушке аналитики не хватало безопасного источника данных для участника и эксперта. Добавлен компактный read-only GET /programs/{id}/analytics-widget/: сервер выбирает роль текущей программы и возвращает только разрешённые показатели.

Draft только в DEV. Merge и deploy не выполнялись.

SHA и зависимости

  • Base (dev): ed5244bd4a098bd0f1cee0f5e380dd67bdd61a96
  • Head: 3d84c7f4090985e4f42a13654e8fb05856f65cb3
  • Angular base: 99c8813a66f89560a946eab7d1de73ab2925d0f5
  • Парный Angular commit, ветка feature/dev-program-role-analytics-widget.
  • Для будущего DEV-развёртывания сначала нужен этот контракт и is_user_expert, затем Angular. Миграций нет.

Что изменено

  • Приоритет ролей: организатор → эксперт → участник. Роль эксперта определяется связью с программой, даже без member-роли и назначений. Клиентские role/user_id не дают доступ; manager-only API сохраняют ограничения.
  • Участник получает единственный participant_project через Project.leader / Collaborator и PartnerProgramProject текущей программы. Лидер и член одной команды видят одинаковые проект, case и этап. Права редактирования/сдачи не расширяются.
  • current_application остаётся прежним leader-only контрактом. Нет поддержки нескольких команд, dropdown или выбора первого проекта. Противоречивые связи возвращают 409 без изменения данных.
  • Кейс читается по точному name="case" на текущей связи. Этап использует общую серверную аналитику; нет закрытых баллов или личностей экспертов.
  • Организатор использует общие _get_participant_metrics / _get_solution_metrics: distinct участники; связи проектов/решений; отсутствие проекта учитывает лидера, Collaborator и черновики.
  • Эксперт использует общий annotated_assignment_queryset: персональные назначения и незавершённые, включая not_ready. Допустимый 0 является заполненной оценкой. Open не получает фиктивные назначения; реальный срок — datetime_evaluation_ends.
  • GET выполняет SQL-агрегации без N+1 и бизнес-записей. React-модели Application/Team/Submission/SubmissionExpertAssignment/Evaluation и их реализация не менялись. Нет новых зависимостей, migrations, CI/Docker/workflow изменений.

В open сохранено фактическое правило существующей основной аналитики: наличие ProjectScore по критерию программы означает evaluated; новая формула завершения не вводилась.

Проверки

  • Targeted Django: 120/120 PASS, в том числе 15 новых тестов прав, приоритета ролей, команды/лидера, изоляции программ, case, current_application, distributed/open, нулевых/частичных/полных оценок, not_ready, черновиков, distinct пользователей, read-only и числа запросов.
  • Full SQLite: 849 тестов, OK (skipped=4); после тестов exit 1 из-за WinError 32 при удалении тестовой БД.
  • Full PostgreSQL: 849 тестов, 1 failure в неизменённом feed.tests.test_feed_api.FeedAPITests.test_feed_returns_project_news_as_news_content (project вместо news). Отдельно этот тест на исходном DEV SHA прошёл; причина полного сбоя не установлена. Teardown встретил незакрытые соединения; временная БД после завершения процесса удалена.
  • Flake8 всех tracked Python и новых файлов — PASS; Black новых файлов/urls — PASS; Django check — 0 issues; makemigrations --check --dry-run — No changes detected; git diff --check — PASS.
  • Mypy не запустил проверку: существующий mypy.ini некорректно объединяет две строки plugins в один import. Конфигурация не менялась.
  • Живой DEV не использовался. Отдельно проверена реальная локальная связка Angular + Django на новой PostgreSQL БД: роли без member, одинаковый проект лидера/члена команды, новости организатора, переходы, сохранение case, сдача, оценка 0, нулевые состояния, logout и HTTP 503/Retry. Результаты и ограничения. Fixture-smoke проверил геометрию 23 состояний.

Контракт, источники, команды и ограничения проверок.
Скриншоты и сравнение геометрии до/после.

Актуализация проверок 14.09.2026

Backend-код в UI follow-up не менялся; head остаётся 3d84c7f4090985e4f42a13654e8fb05856f65cb3. Нового искусственного коммита нет.

Backend PostgreSQL CI run 34849441959 повторно проверен: completed / success, headSha точно совпадает с этим PR. Lint и Tests также success. Это отдельный результат CI; он не устанавливает причину описанного выше локального PostgreSQL failure, не отменяет ошибку удаления SQLite БД и ограничение запуска mypy.

Парный Angular Draft PR #348, head 239e3a5eafe653291daf95930ecac9824314f365: восстановлены новости организатора без member, исправлена композиция при прежних 157 × 140,984375 CSS px. Targeted 349 PASS; full Angular head 1560 и base 1489 тестов прошли, но оба full процесса exit 1 с воспроизведённой ngx-autosize teardown ошибкой. Скриншоты, base/head stack traces и полная локальная проверка.

Локальные тестовые настройки и fixtures не включены в backend PR. React-контракты, current_application и бизнес-права не изменены. Merge/deploy не выполнялись.

Диагностика PUT /projects/NaN/ — 14.09.2026

Angular base 99c8813a66f89560a946eab7d1de73ab2925d0f5, проверенный код head 239e3a5eafe653291daf95930ecac9824314f365, итоговый head с документацией c97eb8b61c4982b23dbae743104d5b1de71dedef; backend в обоих прогонах 3d84c7f4090985e4f42a13654e8fb05856f65cb3.

Семь прогонов на локальных Angular + Django и отдельной PostgreSQL БД, одинаковые Node/dependencies и восстановленные синтетические данные, 10-секундные окна наблюдения, 23 повторных чтения API. На head проверены вход из виджета и существующий путь; на точном base — существующий путь.

Причина: root ProjectFormAutosaveService читает params["projectId"] из root ActivatedRoute (params={}), хотя ID 31 есть на leaf-маршруте; Number(undefined) становится NaN. Начальный patchValue пустого файлового поля запускает cleanup-autosave. При удалении файла запускается тот же ошибочный PUT. Он возникает до ProgramWidgetChanged и повторяется на base без нового виджета. После destroy в контрольных окнах новых PUT не было.

Обычное непустое название и case текущей связи 73 сохраняются явной кнопкой на base/head. Удаление презентации не сохраняется: файл удалён, URL проекта остаётся прежним; после повторного открытия UI показывает «Файл успешно загружен». Явный save тоже не очищает URL: stripNullish исключает пустую строку из payload, PUT /projects/31/ возвращает 200 и UI показывает «данные успешно сохранены». Подтверждено API-readback и содержимым запросов на обеих версиях.

Отдельная задача P1, препятствие для дальнейшего релиза редактора. В проверенных сценариях это существующий дефект, не регрессия #348; редактор в рамках виджета не ремонтировался. Описание задачи, полная диагностика, initiator/stack, маршруты, payload и скриншоты, машиночитаемые evidence.

Production-код не менялся; повторные full suite/lint:ts/production build не требовались и не запускались. Две diagnostic development-сборки PASS; проверка логов, scoped Prettier документов и git diff --check PASS. Прежний full suite с ngx-autosize teardown не объявляется успешным. Внешний CDN заменён только локальным тестовым storage; живые DEV/PROD/CDN не проверялись. Backend production-файлы и SHA неизменны. Оба PR остаются Draft → dev, без merge/deploy.

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