31 lines
4.5 KiB
Markdown
31 lines
4.5 KiB
Markdown
# Суммаризация: смена VRF у префикса и целостность «VRF ⊂ организация» (изменение 002)
|
||||
|
|
|
|||
|
|
## Сделано
|
|||
|
|
- **API:** `PATCH /prefixes/{id}` принимает `vrf_id`. Перенос — только в VRF той же организации (иначе 422), вместе со всем поддеревом;
|
|||
|
|
дубль CIDR в целевом VRF → 409 со списком конфликтов, откат целиком. Родитель пересчитывается в целевом VRF; логика подбора родителя
|
|||
|
|
вынесена в общую `attach_to_tree` (её же использует создание префикса). В журнал пишется `VRF: старый → новый` и число перенесённых.
|
|||
|
|
- **БД (миграция 0002):** `UNIQUE(id, organization_id)` на `vrfs` + составной FK `prefixes(vrf_id, organization_id) → vrfs`;
|
|||
|
|
имя VRF уникально в организации без учёта регистра (`uq_vrfs_org_lower_name`). Миграция сама проверяет данные на дубли/расхождения.
|
|||
|
|
Проверено: `upgrade → check (без дрейфа) → downgrade → upgrade`.
|
|||
|
|
- **UI:** в окне редактирования префикса появилось поле «VRF» (только VRF текущей организации), подсказка «Вместе с префиксом будет
|
|||
|
|
перенесено вложенных: N» при выборе другого VRF; ошибки 409/422 — в баннере окна.
|
|||
|
|
- **Тесты:** +2 (всего 6, все проходят против контейнеров): уникальность имён VRF по организациям; перенос поддерева (409 / 422 / успех).
|
|||
|
|
|
|||
|
|
## Найдено и исправлено попутно
|
|||
|
|
- Дубликат при создании (организация, VRF, тип, устройство, адрес, префикс) приводил к **500** вместо 409: ошибка уникальности возникала на `flush`,
|
|||
|
|
минуя обработку. Добавлен `services.flush` с тем же переводом в 409 и глобальный обработчик `IntegrityError` как страховка.
|
|||
|
|
- Меню действий строки оставалось на экране под открытым диалогом после выбора пункта.
|
|||
|
|
|
|||
|
|
## Ограничения
|
|||
|
|
- В UI кнопка «⋯» есть только у листовых префиксов (как в макете), поэтому перенос целого поддерева через интерфейс недоступен — только через API;
|
|||
|
|
подсказка про вложенные в UI готова и появится, если добавить действие у родительских префиксов.
|
|||
|
|
|
|||
|
|
## Дополнение: локальные шрифты
|
|||
|
|
IBM Plex Sans (400/500/600) и Mono (400/500) в формате woff2 (latin + cyrillic, ~150 КБ всего) лежат в `web/fonts/`, подключены через `fonts/fonts.css`
|
|||
|
|
(`@font-face` с `unicode-range`); ссылка на fonts.googleapis.com удалена. Проверено: при загрузке UI нет ни одного запроса за пределы приложения.
|
|||
|
|
|
|||
|
|
## Дополнение: выпадающие списки в диалогах
|
|||
|
|
- Баг: в окне «Редактировать префикс» на экране адресов список VRF был пуст (VRF загружались только на экране «Префиксы») — теперь запрашиваются и на экране адресов.
|
|||
|
|
- Нативный `<select>` во всех диалогах (VRF, статус, родитель, организация, тип, устройство) заменён на собственный выпадающий список в стиле меню строк:
|
|||
|
|
скруглённая карточка с тенью, подсветка выбранного и наведения, значение хранится в скрытом поле; закрытие по клику вне списка и по Esc
|
|||
|
|
(диалог при этом не закрывается), навигация стрелками ↑/↓. Это также ближе к макетам, где поля выбора — кнопки с шевроном.
|