Files
ros_control/docs/changes/006-ui-redesign/summary.md
T
ayurishchevandClaude Sonnet 5 4c1841b61b ros_control: централизованное управление парком MikroTik RouterOS
Control Server (FastAPI) с WEB UI (Jinja2 + HTMX) и JSON API для группового
администрирования устройств RouterOS 7 через REST.

- Устройства: список, статус (модель, канал, версии ROS/FW, uptime, доступные
  обновления), примечания, пароли шифруются (Fernet); фоновый опрос каждые 30 с
  и быстрое обнаружение недоступности (таймаут соединения 4 с).
- Группы устройств и фильтры (устройства, резервные копии).
- Резервные копии: .backup и .rsc (show-sensitive) создаются через REST,
  скачиваются сервером и загружаются в S3 (Yandex Object Storage).
- Обновление ROS/FW и выбор канала, групповые операции задачами.
- Интерфейс по утверждённому макету: светлая/тёмная темы, окна, шрифты IBM Plex
  локально. Docker Compose, SQLite в томе, минимальный набор тестов.
- Планы и итоги каждого изменения — в docs/changes/.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-19 13:13:29 +03:00

37 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Итоги: 006 — перенос утверждённого макета в UI и два бага
## Баги
1. **Прошивка не перезагружала устройство.** `upgrade_firmware` ждал `current-firmware == upgrade-firmware`, но `current-firmware`
меняется только после перезагрузки (на `OZ_Dacha`: `7.22.3` при `upgrade 7.24.4`, задача №12 упала по таймауту).
Теперь триггер — новая запись журнала «Firmware upgraded successfully, please reboot for changes to take effect!»
(журнал читается целиком и фильтруется на сервере: REST-фильтр `?message=` по точному тексту ничего не вернул).
Если запись новее последней загрузки (по `system/clock` − `uptime`) уже есть, то повторная команда не нужна — сразу перезагрузка.
2. **Нельзя привязать создаваемое устройство к группе.** Форма и маршрут работали, но групп в экземпляре не было (тестовые я удалил
после проверки), а создать группу из формы было нельзя. Теперь в окне устройства в списке «Группа» есть пункт «+ Новая группа…»:
группа создаётся и привязывается в одной транзакции (при ошибке лишней группы не остаётся). Если сценарий был другим — сообщить.
## Интерфейс (перенос макета)
- Дизайн-система в `app/ui/static/style.css`: токены и размеры макета 1:1 (контролы h36 r8, метки h22 r6, панели r12), тёмная тема на тех же токенах.
Шрифты IBM Plex Sans/Mono лежат локально (`static/fonts`, лицензия OFL) — внешний CDN не нужен.
- Страницы: «Устройства» (заголовок со счётчиками, вкладки групп, карточка с полосой «фильтры ⇄ действия над выбранными», таблица, задачи),
«Группы», «Резервные копии» (фильтры на `.field`, «Скачать» и «⋯» в строке), вход.
- Окна (`<dialog>` + HTMX): добавление/изменение устройства, создание/переименование группы; ошибки — внутри окна, успех — обновление страницы.
Запасные страницы `/devices/new`, `/devices/{id}/edit` сохранены.
- Логика выбора строк, меню, окон и фильтров — `static/app.js` (без библиотек, кроме htmx).
## Проверено
- `pytest`: 8 из 8 (добавлены: перезагрузка по записи журнала — оба сценария; добавление устройства из окна с группой и «новой группой», окна групп).
- Реальный браузер (headless Chromium): вход → окно «Новое устройство» → «Новая группа…» → вкладка «QA группа 1» → выбор строк и панель действий,
меню «Обновление / В группу», меню строки с подменю каналов, живой фильтр без перезагрузки и «Сбросить (N)», страницы «Группы» и «Бэкапы»;
ошибок JS/консоли нет; тестовые данные удалены (в БД остались `MSK_Home`, `OZ_Dacha`, групп нет).
- По скриншотам исправлены расхождения с макетом: пробел в «Выбрано: N», двойные границы карточек, «системная» за краем таблицы,
закрытие подменю каналов, склейка «Сбросить (N)», серые «—» у offline-устройства, знак «+» в списке групп.
## Не проверено
- Реальная перезагрузка по «Обновить FW» на `OZ_Dacha` — нужно подтверждение (перезагрузит роутер); логика проверена на моках и на реальном журнале (чтение).
- Соответствие макету на других размерах окна и в тёмной теме (проверялось при 1440 px в светлой).
## Отличия от макета
- Календарь в фильтре дат — нативный `<input type="date">`: формат зависит от локали браузера (в макете ISO).
- Фильтры вкладок и списков в приложении работают; в макете они статичны.