From 9fda5f042c3d73fefbb61b554e3735cde2f16072 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Mon, 3 Aug 2026 09:48:03 +0400 Subject: [PATCH] =?UTF-8?q?fix:=20tracker=5Fremove=20=D0=B2=20=D1=81=D1=86?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=D1=80=D0=B8=D1=8F=D1=85=20+=20=D0=BF=D1=80?= =?UTF-8?q?=D1=8F=D0=BC=D0=B0=D1=8F=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=BB=D0=BE=D0=B3=D0=BE=D0=B2=20(v1.2.36)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Баг 1: удалённые сценарием инстансы показывались как 'creating' — run_scenario() не вызывал tracker_remove после delete — фикс: tracker_remove после успешного delete-шага Баг 2: чёрный экран на вкладке Логи — views.js копировал пустую log-panel — фикс: прямая загрузка fetch('/api/log') --- site/app.py | 2 +- site/operations/scenario.py | 9 +++++++++ site/static/js/views.js | 21 +++++++++++++++------ 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/site/app.py b/site/app.py index 4613af9..62c245a 100644 --- a/site/app.py +++ b/site/app.py @@ -32,7 +32,7 @@ from routes.api_scenario_defs import bp_defs as api_scenario_defs_bp # Версия — показывается в топбаре UI. Меняется при КАЖДОМ изменении кода. # Нужна для фильтрации истории (пользователь видит только записи своей версии). -VERSION = "1.2.35" +VERSION = "1.2.36" # Flask-приложение с Jinja2-шаблонами из папки templates/ app = Flask(__name__, template_folder="templates", static_folder="static") diff --git a/site/operations/scenario.py b/site/operations/scenario.py index d28ea2c..7409574 100644 --- a/site/operations/scenario.py +++ b/site/operations/scenario.py @@ -281,6 +281,15 @@ def run_scenario(client, steps, client_id, stand, user_email, app_version, scena except Exception as e: print(f"[SCENARIO] save_run failed for step {step_num}: {e}", flush=True) + # Удалить из трекера после успешного delete + # (run_scenario не вызывает tracker_remove — трекер показывал удалённые инстансы как "creating") + if op_name == "delete" and step_status == "OK": + try: + from operations.tracker import remove as tracker_remove + tracker_remove(client_id, stand, instance_uid) + except Exception: + pass # трекер не критичен + # ═══ Шаг 8: обновить scenario_runs (прогресс для UI) ═══ # Пока не последний шаг — статус RUNNING _save_scenario_run(scenario_run_id, diff --git a/site/static/js/views.js b/site/static/js/views.js index 24b8e7a..9abb13c 100644 --- a/site/static/js/views.js +++ b/site/static/js/views.js @@ -41,15 +41,24 @@ function switchView(viewId) { if (!scenarioOpen) toggleScenario(); } - // Логи: специальная обработка — копируем содержимое нижней панели в вид + // Логи: прямая загрузка с API, не полагаемся на нижнюю панель if (viewId === 'logs-view') { - const lp = document.getElementById('log-panel'); const lvc = document.getElementById('log-view-content'); - if (lp && lvc) { - // Копируем текущее содержимое лог-панели в вид - lvc.innerHTML = lp.innerHTML || 'Логи загружаются...'; - lp.style.display = 'none'; // скрываем нижнюю панель + if (lvc) { + lvc.innerHTML = 'Логи загружаются...'; + fetch('/api/log').then(r => r.json()).then(lines => { + if (lines.length) { + lvc.innerHTML = lines.map(l => `
${_esc(l)}
`).join(''); + } else { + lvc.innerHTML = 'Логов пока нет'; + } + }).catch(() => { + lvc.innerHTML = 'Ошибка загрузки логов'; + }); } + // Скрываем нижнюю лог-панель если была открыта + const lp = document.getElementById('log-panel'); + if (lp) lp.style.display = 'none'; } else { // На всех видах кроме логов — скрываем нижнюю лог-панель const lp = document.getElementById('log-panel');