Skip to content

feat(programs): возврат опубликованной программы в черновик - #846

Merged
TThanos3000 merged 2 commits into
devfrom
feat/program-return-to-draft
Oct 30, 2026
Merged

TThanos3000 merged 2 commits into
devfrom
feat/program-return-to-draft

Conversation

@TThanos3000

@TThanos3000 TThanos3000 commented Oct 30, 2026 •

Copy link
Copy Markdown
Collaborator

Что изменено

Организатор может вернуть опубликованную программу в черновик через новый API. В Django admin добавлено подтверждаемое действие через тот же сервис. Участие, ответы анкет, заявки, сданные решения, оценки и материалы сохраняются.

Зачем

Возврат ранее требовал вручную менять Draft в Django admin. Действие нужно для кнопки в существующем кабинете организатора.

Реализация

Общий сервис блокирует строку программы и меняет только draft и datetime_updated. Устаревшая страница не может скрыть измененную или повторно опубликованную программу. Повтор успешного запроса идемпотентен. Повторная публикация использует существующую проверку готовности.

API

Добавлен POST /programs/{id}/management/unpublish/ с обязательным expected_updated_at. Ответ — обычная management-проекция, draft=true. Ошибки: 400 неверные/лишние поля, 401 без авторизации, 403 чужая опубликованная программа, 404 отсутствующая программа или чужой черновик, 409 stale_settings. Старые endpoints и payload не меняются.

UI

В Django admin добавлены ссылка «Вернуть в черновик» и страница подтверждения с CSRF. GET не меняет данные. Angular — PR #516; API внедряется первым.

Permissions

Существующий manager именно этой программы либо staff/superuser. Право создания не требуется. Admin дополнительно проверяет Django change permission и свой queryset.

Проверки

  • PostgreSQL: 92 теста — test_program_unpublish, test_program_launch, test_program_dates, test_management_api, test_registration_admin.
  • Black, flake8 измененных Python-файлов, Django check; makemigrations --check --dry-run — No changes detected.
  • После ограничения теста блокировок: PostgreSQL — 11/11 PASS без пропусков; SQLite — 10 PASS, 1 штатный пропуск теста select_for_update.
  • Локальный Chromium + Angular + Django/PostgreSQL: desktop 1280/mobile 390, отмена, возврат, отказ участнику, доступ manager, повторная публикация; настоящее подтверждение Django admin. 7 сценариев, 0 JS errors.

Acceptance criteria

  • DRAFT-2/3 — статус и права подтверждены API и браузером.
  • DRAFT-4 — снимки записей участников, заявок/решений, оценки, материалов и анкеты до/после совпадают; ответы сохраняются при повторной публикации.
  • DRAFT-5 — 409, идемпотентность, две одновременные транзакции PostgreSQL и устаревшая revision публикации.
  • DRAFT-6 — admin confirmation, change permission и CSRF.
  • DRAFT-1/7 — интерфейс проверен совместно с Angular на локальной связке; его код в отдельном PR.

Выкладка в dev

Deploy Dev завершился успешно. На сервере подтвержден source HEAD cf48cd7e8cb935d5c70a2f038e57eb3d8c82b3b8 и закрепленный runtime image этого коммита.

Не проверено

Авторизованный возврат и повторная публикация проверены на локальной реальной связке Angular/Django/PostgreSQL. Авторизованной live dev сессии здесь нет. Production не затронут.

Риски / migration

Миграций нет. Порядок внедрения: API, затем Angular. Возврат скрывает страницу и закрывает участникам доступ по действующим правилам черновиков; сроки не продлевает, прямые ссылки на ранее опубликованные файлы не отзывает.

@TThanos3000
TThanos3000 merged commit cf48cd7 into dev Oct 30, 2026
3 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.

1 participant