fix: tracker_remove в сценариях + прямая загрузка логов (v1.2.36)

Баг 1: удалённые сценарием инстансы показывались как 'creating'
  — run_scenario() не вызывал tracker_remove после delete
  — фикс: tracker_remove после успешного delete-шага

Баг 2: чёрный экран на вкладке Логи
  — views.js копировал пустую log-panel
  — фикс: прямая загрузка fetch('/api/log')
This commit is contained in:
2026-08-03 09:48:03 +04:00
parent bfe26f07d8
commit 9fda5f042c
3 changed files with 25 additions and 7 deletions
+1 -1
View File
@@ -32,7 +32,7 @@ from routes.api_scenario_defs import bp_defs as api_scenario_defs_bp
# Версия — показывается в топбаре UI. Меняется при КАЖДОМ изменении кода. # Версия — показывается в топбаре UI. Меняется при КАЖДОМ изменении кода.
# Нужна для фильтрации истории (пользователь видит только записи своей версии). # Нужна для фильтрации истории (пользователь видит только записи своей версии).
VERSION = "1.2.35" VERSION = "1.2.36"
# Flask-приложение с Jinja2-шаблонами из папки templates/ # Flask-приложение с Jinja2-шаблонами из папки templates/
app = Flask(__name__, template_folder="templates", static_folder="static") app = Flask(__name__, template_folder="templates", static_folder="static")
+9
View File
@@ -281,6 +281,15 @@ def run_scenario(client, steps, client_id, stand, user_email, app_version, scena
except Exception as e: except Exception as e:
print(f"[SCENARIO] save_run failed for step {step_num}: {e}", flush=True) 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) ═══ # ═══ Шаг 8: обновить scenario_runs (прогресс для UI) ═══
# Пока не последний шаг — статус RUNNING # Пока не последний шаг — статус RUNNING
_save_scenario_run(scenario_run_id, _save_scenario_run(scenario_run_id,
+15 -6
View File
@@ -41,15 +41,24 @@ function switchView(viewId) {
if (!scenarioOpen) toggleScenario(); if (!scenarioOpen) toggleScenario();
} }
// Логи: специальная обработка — копируем содержимое нижней панели в вид // Логи: прямая загрузка с API, не полагаемся на нижнюю панель
if (viewId === 'logs-view') { if (viewId === 'logs-view') {
const lp = document.getElementById('log-panel');
const lvc = document.getElementById('log-view-content'); const lvc = document.getElementById('log-view-content');
if (lp && lvc) { if (lvc) {
// Копируем текущее содержимое лог-панели в вид lvc.innerHTML = '<span style="color:#888;">Логи загружаются...</span>';
lvc.innerHTML = lp.innerHTML || '<span style="color:#888;">Логи загружаются...</span>'; fetch('/api/log').then(r => r.json()).then(lines => {
lp.style.display = 'none'; // скрываем нижнюю панель if (lines.length) {
lvc.innerHTML = lines.map(l => `<div>${_esc(l)}</div>`).join('');
} else {
lvc.innerHTML = '<span style="color:#888;">Логов пока нет</span>';
} }
}).catch(() => {
lvc.innerHTML = '<span style="color:#f88;">Ошибка загрузки логов</span>';
});
}
// Скрываем нижнюю лог-панель если была открыта
const lp = document.getElementById('log-panel');
if (lp) lp.style.display = 'none';
} else { } else {
// На всех видах кроме логов — скрываем нижнюю лог-панель // На всех видах кроме логов — скрываем нижнюю лог-панель
const lp = document.getElementById('log-panel'); const lp = document.getElementById('log-panel');