В списке адресов префикса подряд идущие свободные адреса сворачиваются в строку «начало – конец · Свободно: N» (параметр group_free, группировка на сервере — пагинация по строкам после свёртки); раскрытие — существующим status=free&offset=free_offset порциями по 500. Без group_free ответ API прежний. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2.7 KiB
2.7 KiB
Итог: свёртка свободных адресов в раскрывающиеся диапазоны (изменение 042)
План: PLAN.md. В списке адресов префикса подряд идущие свободные адреса сворачиваются в строку-диапазон
«начало – конец · Свободно: N»; клик раскрывает её в отдельные адреса, повторный — сворачивает. Одиночный свободный адрес — обычная строка.
Что сделано
| Файл | Изменение |
|---|---|
app/api/v1/prefixes.py |
list_addresses(group_free=False): в смешанном режиме (без фильтра и поиска, подсеть ≤ FREE_LISTING_LIMIT) серии свободных ≥ 2 сворачиваются одним проходом по отсортированному списку в строку free_range. total и пагинация — по строкам после свёртки. Без group_free ответ прежний |
app/schemas.py |
AddressOut.range_end, range_count, free_offset |
web/app.js |
Список запрашивается с group_free. Строка диапазона: шеврон как в дереве префиксов, бейдж «Свободно: N», без чекбокса и действий. Раскрытие — существующий status=free&offset=free_offset, порциями по 500 со строкой «ещё N — показать». Состояние в S.freeOpen/S.freeLoaded, сброс при смене фильтра, поиска или префикса. Подсказка адреса в «Назначить адрес» учитывает free_range |
tests/test_api.py |
В test_tree_utilization_and_next_free: free_range с корректными границами и free_offset; раскрытие даёт ровно адреса диапазона; без group_free ответ не изменился |
README.md |
Свёртка свободных адресов; строка 042 |
Проверки
pytest -q— 17 passed.- На стенде (временная организация, удалена):
10.242.0.0/24с 3 назначенными — 5 строк вместо 254;fd00:242::/120с 3 назначенными — 5 строк вместо 256;- раскрытие каждого диапазона через
status=free&offset&limitсовпадает по первому и последнему адресу и количеству.
- UI — проверка пользователя.