Repository navigation
feat(vacancies): архив и защита истории откликов - #811
Merged
Merged
Conversation
12 tasks done
TThanos3000
marked this pull request as ready for review
October 21, 2026 12:28
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.
Что изменено
Закрытие вакансии через PATCH завершает только ожидающие отклики и сохраняет историю. DELETE с любыми откликами запрещен, возврат в активные доступен только опубликованному публичному проекту. Повторная публикация проекта оставляет архив закрытым до ручного возврата.
Зачем
Управление вакансиями получает разделы «Активные / Архивные». История кандидатов должна сохраняться, а отказ удаления и последствия закрытия должны объясняться в интерфейсе.
Реализация
Атомарные обновление/удаление с блокировками Project → Vacancy → VacancyResponse и повторной проверкой владельца. Email ожидающим откликам ставятся после commit; повторное закрытие не дублирует уведомления. Invalid skills не удаляют старые навыки и не меняют статус. PUT без is_active не завершает отклики.
Внутренний resume_on_publish отличает архив от временного скрытия вместе с черновиком. Только такие скрытые вакансии и новые вакансии черновика публикуются вместе с проектом. Ручное закрытие и принятие кандидата отменяют автоматическое возобновление. Создание вакансии блокирует Project для согласованности с одновременной публикацией.
API
Существующие PATCH/DELETE /vacancies/{id}/. Добавлено readonly total_response_count; response_count сохраняет семантику ожидающих откликов. DELETE с историей возвращает 400 с code=vacancy_has_responses и detail. Закрытые вакансии в представлении проекта видит менеджер. resume_on_publish в контракт не входит.
UI
Связанный Angular PR #475, внедряется после API. Дизайн в Figma, вкладки согласованы высотой 27 px.
Permissions
Изменения разрешены руководителю проекта и администрации. Серверная проверка повторяется под блокировкой, права из наличия кнопки не выводятся.
Проверки
manage.py test vacancy.tests projects.tests.test_project_signals projects.tests.test_program_project_detail_access --noinput --keepdb— 119 tests passed.Acceptance criteria
Не проверено
Deployed dev и реальная доставка email.
Риски / migration
API + миграция vacancy.0011_vacancy_resume_on_publish внедряются до Angular #475. Additive BooleanField default=false: статусы/даты старых записей не переписываются; все старые закрытые вакансии, включая старые черновики, остаются в архиве до ручного возврата. Причина их прежнего закрытия не сохранялась, поэтому автоматическое возобновление для них не предполагается. Миграция обязательна до запуска нового кода. Подробности и evidence: docs/vacancy-archive-api.md. Merge/deploy выполняет пользователь.