From 38148516e646efcfeff797353d76cb0a796a0aad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Mon, 3 Aug 2026 10:09:17 +0400 Subject: [PATCH] =?UTF-8?q?fix:=20=D1=81=D1=86=D0=B5=D0=BD=D0=B0=D1=80?= =?UTF-8?q?=D0=B8=D0=B8=20=E2=80=94=20=D0=BF=D0=B5=D1=80=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=BD=D0=B4=D0=B5=D1=80=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D0=BB=D0=B8=D0=BD=D0=B3=D0=B0=20+=20=D0=B8?= =?UTF-8?q?=D0=BD=D0=B4=D0=B5=D0=BA=D1=81=20=D0=BE=D1=82=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D0=BE=20(v1.2.38)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Баг 1: страница сценариев зависала после завершения — scenario-list.js: добавлен loadScenarios() после поллинга Баг 2: история могла быть пустой (ON CONFLICT без индекса) — init_db.py: CREATE UNIQUE INDEX отдельным cur.execute() (мультистейтмент SQL в psycopg2 ненадёжен) --- site/app.py | 2 +- site/db/init_db.py | 5 +++++ site/static/js/scenario-list.js | 1 + 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/site/app.py b/site/app.py index 9ab2e6d..8c684a8 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.37" +VERSION = "1.2.38" # Flask-приложение с Jinja2-шаблонами из папки templates/ app = Flask(__name__, template_folder="templates", static_folder="static") diff --git a/site/db/init_db.py b/site/db/init_db.py index f8e82b9..d563c22 100644 --- a/site/db/init_db.py +++ b/site/db/init_db.py @@ -218,6 +218,11 @@ def init_db(): cur.execute(SCHEMA_SQL) cur.execute(MIGRATION_SQL) cur.execute(SCENARIO_RUNS_SQL) + + # Индекс для UPSERT в save_run — отдельным запросом для надёжности + # (мультистейтмент SQL в psycopg2 может выполнить не все операторы) + cur.execute("CREATE UNIQUE INDEX IF NOT EXISTS idx_runs_op_uid ON runs (op_uid) WHERE op_uid IS NOT NULL") + conn.commit() cur.close() print("[DB] Schema initialized", flush=True) diff --git a/site/static/js/scenario-list.js b/site/static/js/scenario-list.js index a4141a1..16be625 100644 --- a/site/static/js/scenario-list.js +++ b/site/static/js/scenario-list.js @@ -218,6 +218,7 @@ async function runScenario(defId){ busy=false; await refreshInstances(); // обновить список инстансов if(historyOpen) await loadHistory(); // обновить историю + await loadScenarios(); // перерендерить список (кнопки) } }catch(e){ _scenarioPollErrors++;