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++;