Skip to content

feat(ams): перенос абитуриента между ВУС из таблицы поступающих#740

Merged
maklybae merged 1 commit into
masterfrom
feat/ams-vus-move
Jul 4, 2026
Merged

feat(ams): перенос абитуриента между ВУС из таблицы поступающих#740
maklybae merged 1 commit into
masterfrom
feat/ams-vus-move

Conversation

@maklybae

@maklybae maklybae commented Jul 3, 2026

Copy link
Copy Markdown
Collaborator

Контекст

Во время активного поступления комиссия часто просит перенести абитуриента из одной
ВУС (военно-учётной специальности) в другую. Раньше сменить ВУС можно было только
тяжёлым PUT /api/ams/applicants/{id}/: он требует все вложенные данные, сверяет
corporate_email, переназначает кампус и в PROD перегенерирует документы. В таблице
поступающих (/applications/) ВУС вообще не отображался и action переноса не было.

Этот PR добавляет лёгкий точечный перенос прямо из таблицы.

Физо-скоринг (ams/physical/scoring.py) зависит только от возраста, упражнения и
результата — не от ВУС. Поэтому перенос не требует пересчёта баллов и не трогает
ApplicationProcess.

Что изменилось

Back-end

  • PATCH /api/ams/applicants/{id}/milspecialty/ (body { "milspecialty": <id> }) —
    меняет только Applicant.milspecialty. Проверяет is_selectable_by_program и
    доступность ВУС для кампуса абитуриента; при несовместимости → 400. Документы не
    перегенерирует
    (осознанно, в отличие от update()).
  • ApplicantMilspecialtyMutateSerializer — валидация id ВУС.
  • ApplicantWithApplicationProcessSerializer теперь отдаёт milspecialty и program_id
    (для колонки и загрузки допустимых опций по программе строки).
  • queryset.select_related("milspecialty", "university_info__program__faculty") — против N+1.

Front-end

  • Колонка «ВУС» в таблице поступающих (видна комиссии, скрыта у study.office).
  • Inline-select в ячейке — как medical_examination/prof_psy_selection. Опции берутся
    через getMilSpecialtiesSelectableByProgram(campus, programId) и фильтруются по
    selectable_by_program; предзагрузка на @Watch("data") + кэш по program_id.
  • updateApplicantMilspecialty в api/applicants.js; ветка в onUpdate.

Проверка (e2e, Playwright)

Прогнано вживую на дев-стеке (superuser@mail.com, кампус Москва, 2026):

1. Колонка «ВУС» в таблице поступающих
Колонка ВУС

2. Inline-выбор нового ВУС — список отфильтрован по образовательной программе строки
Выбор ВУС

3. После выбора → PATCH /milspecialty/ → 200; значение сохраняется после перезагрузки
После переноса

Сценарий: у «Иванов И.И.» (программа 09.03.01) ВУС 453100 → выбран 751100 - Защита информационных технологий → запрос PATCH /api/ams/applicants/1/milspecialty/ 200 OK
после reload ВУС остаётся 751100 (сохранено в БД).

Тесты

  • pytest src/ams/12 passed (в т.ч. 4 новых в test_milspecialty_move.py:
    успех / несовместимо с программой / недоступно для кампуса / без прав → 403).
  • ESLint по изменённым файлам — 0 ошибок. black — чисто.

Замечания

🤖 Generated with Claude Code

@maklybae maklybae force-pushed the feat/ams-vus-move branch from b51eb89 to 6d0111c Compare July 3, 2026 16:37
@maklybae maklybae requested a review from asadullinam July 3, 2026 16:38
asadullinam
asadullinam previously approved these changes Jul 3, 2026
Base automatically changed from feat/ams-physical-manual-override to master July 3, 2026 21:39
@maklybae maklybae dismissed asadullinam’s stale review July 3, 2026 21:39

The base branch was changed.

Комиссия во время поступления часто просит перенести абитуриента из одной
военно-учётной специальности (ВУС) в другую. Раньше это можно было сделать
только тяжёлым PUT /applicants/{id}/ (все вложенные данные + перегенерация
документов). Теперь — лёгкий inline-перенос прямо в таблице /applications/.

Back-end:
- PATCH /api/ams/applicants/{id}/milspecialty/ — меняет только Applicant.milspecialty,
  проверяет is_selectable_by_program и доступность для кампуса, документы НЕ трогает
  (в отличие от update()). ApplicantMilspecialtyMutateSerializer для валидации.
- ApplicantWithApplicationProcessSerializer отдаёт milspecialty + program_id.
- queryset.select_related(milspecialty, university_info__program__faculty) против N+1.
- Тесты test_milspecialty_move.py (успех / несовместимо с программой / недоступно
  для кампуса / без прав -> 403).

Front-end:
- Колонка «ВУС» в таблице поступающих (только для комиссии, скрыта у study.office).
- Inline-select как у medical_examination; опции по программе строки через
  getMilSpecialtiesSelectableByProgram, отфильтрованные по selectable_by_program,
  с предзагрузкой на @watch(data) и кэшем по program_id.
- updateApplicantMilspecialty в api/applicants.js; ветка в onUpdate.

Физо-скоринг не зависит от ВУС, поэтому перенос не требует пересчёта баллов.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@maklybae maklybae force-pushed the feat/ams-vus-move branch from 6d0111c to 90ed18a Compare July 3, 2026 21:42
@maklybae maklybae merged commit 48adb4f into master Jul 4, 2026
2 checks passed
@maklybae maklybae deleted the feat/ams-vus-move branch July 4, 2026 13:22
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