История правок и откат

История правок — ваши последние операции с сетью и свойствами, новые сверху. Отменённые помечены, каждую можно показать на карте, а «Откатить до сюда» отменяет правки от последней до выбранной включительно.

Где найти
редактор сети: кнопка «Редактировать топологию сети» (значок ломаной с карандашом) в строке режимов над картой → кнопка «История правок» (значок часов со стрелкой) на панели или клавиша H.
Права
любое право на правку сети; в истории только свои операции.
Функция показана в сквозном сценарии:Правка сети с проверкой и откатом
Читаю как

Возможности

  • Список ваших последних операций редактора — правок сети и свойств из журнала отмены, новые сверху, с названием, временем и отметкой «отменено».
  • Кнопка с рамкой-прицелом — показать место правки на карте.
  • У последней неотменённой правки — «Отменить», у более ранних — «Откатить до сюда»: отмена всех правок от последней до выбранной включительно.
  • Кнопка обновления списка в заголовке окна.

Как это работает

Откуда список. Окно читает журнал отмены topology_undo_log — только операции текущего пользователя, последние 50. Каждая запись хранит название операции, краткое описание (номера узлов и участков, длина, тип) и границы области на карте для кнопки «Показать».

Откат до места. Окно передаёт серверу операции, которые показывало, — от последней до выбранной. Сервер отменяет ровно их, по одной, каждую в своей транзакции — как несколько Ctrl+Z подряд. Если сверху журнала оказалась другая операция (вы правили в другой вкладке или с другого компьютера после открытия истории), откат останавливается с причиной «Последняя операция изменилась — обновите список» и чужую для этого списка правку не трогает. Отмена каждой сверяет контрольные суммы строк: если объект изменили после этой операции (другой пользователь, десктоп или ваша же более поздняя правка, которую отменить нельзя), откат останавливается на ней. Уже отменённое остаётся отменённым, уведомление пишет «Отменено правок: N; дальше нельзя — причина». При полном успехе — «Отменено правок: N».

Подтверждение. При откате больше чем одной правки окно спрашивает: «Отменить 2 последние правки — до «…» включительно?» (число и форма слова — по количеству правок). Одна правка отменяется сразу.

Повтор. Отменённые правки возвращает «Повторить» (Ctrl+Y) — по одной, начиная с последней отменённой, пока их объекты не изменены.

Что нужно для работы

  • Любое право на правку сети; отмена и повтор — при флагах API MUTATIONS_ENABLED и TOPOLOGY_MUTATIONS_ENABLED.
  • Таблица журнала topology_undo_log в базе города (API создаёт её сам). Правки, записанные без журнала, в истории не видны и не отменяются.

Шаги

  1. Нажмите кнопку «История правок» на панели редактора (или H).

    История правок и откат: шаг 1

  2. Окно «История правок»: операция, время, отменена ли. Кнопка с рамкой-прицелом показывает место на карте, «Откатить до сюда» — откат до этой строки (у самой новой правки кнопка называется «Отменить»).

    История правок и откат: шаг 2

  3. Подтверждение называет, сколько правок отменится и до какой операции включительно. Нажмите «Откатить».

    История правок и откат: шаг 3

  4. Уведомление «Отменено правок: …». Отменённые строки в истории остаются, с отметкой «отменено» и временем.

    История правок и откат: шаг 4

Примеры

На копии базы Алматы, фрагмент 74. Сделаны трасса, смена типа конечного узла на «Потребитель», разворот участка и его разрез — четыре строки истории. «Откатить до сюда» на строке «Разворот участка …» спросило «Отменить 2 последние правки — до «разворот участка …» включительно?» и отменило разрез и разворот одной командой; трасса и смена типа узла остались.

В e2e-тесте после девяти операций откат до «Разрезания участка» отменил шесть операций (разрез, новый узел, слияние, соединение труб, тип линии, трасса по координатам). Участок трассы снова целый, его длина совпала с исходной.

Если не получается

  • «Отменено правок: N; дальше нельзя — …» — одну из операций отменить нельзя: её объекты изменили после неё. Откат остановился на ней, более поздние правки уже отменены.
  • Нет нужной правки — в истории только ваши операции и только записанные с журналом отмены.
  • Повторить откат нельзя пачкой — после отката «Повторить» (Ctrl+Y) возвращает правки по одной.
  • В истории чужие операции — на стенде без входа все работают под одним пользователем, и журнал у них общий. На рабочем сервере у каждого пользователя своя история.
  • Откат остановился раньше выбранной строки — объект этой операции изменили позже: смотрите причину в уведомлении и правьте вручную.
  • «Последняя операция изменилась — обновите список» — после открытия истории вы сделали правку в другой вкладке или сессии: обновите историю (кнопка вверху окна) и выберите место заново.
  • Строки «Импорт фрагмента» и «Слияние фрагментов» — операции окна «Фрагменты: экспорт, импорт, слияние»; откатываются так же.

Для разработчика

  • GET /api/v1/topology/history?limit=1..200 → items: [{operation_id, operation, summary, created_at, undone_at, redone_at, objects, undo_supported, bbox}].
  • POST /api/v1/topology/undo-to {operation_id, expected} → {undone: [...], stopped: {reason} | null, target, complete}. expected — показанные неотменённые операции до operation_id: отменяются только они, другая операция сверху — остановка; operation_id не из expected — 422. Без expected (старый клиент) — подряд всё сверху журнала. Тест — tests/test_topology_undo_to.py.
  • GET|POST /api/v1/topology/undo, GET|POST /api/v1/topology/redo — последняя отменяемая или повторяемая операция и её отмена или повтор; 404 — нечего, 409 — объекты изменены.
  • Сервер: database/topology_history.py (operation_history, undo_to, HISTORY_LIMIT = 200), database/topology_journal.py (образы строк и контрольные суммы).
  • Веб: components/EditHistoryPanel.vue, названия операций — utils/topologyLabels.ts (topologyOperationLabel), Ctrl+Z / Ctrl+Y — composables/useTopologyEditor.ts.
  • Тесты: API tests/test_history.py, tests/test_topology_undo.py, веб tests/utils/topologyLabels.spec.ts; e2e — тесты «отмена и повтор» и «история правок (H)» в e2e/functions/network-editor.spec.ts.
Хотите увидеть эту функцию на своих данных?Покажем ТГИД на демонстрации и ответим на вопросы инженеров.
Запросить демо