From 5058f54629a27e0c860a0425dcae0efda0449a00 Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 3 Aug 2026 17:36:31 +0500 Subject: [PATCH] Show effective worker enabled state --- src/vk_parser_app/admin.py | 73 +++++++++++++++++++----- src/vk_parser_app/templates/workers.html | 6 +- 2 files changed, 63 insertions(+), 16 deletions(-) diff --git a/src/vk_parser_app/admin.py b/src/vk_parser_app/admin.py index 228b50e..c778db2 100644 --- a/src/vk_parser_app/admin.py +++ b/src/vk_parser_app/admin.py @@ -3432,6 +3432,7 @@ async def workers(request: Request): """ ) settings_rows = await pool.fetch("SELECT * FROM app_settings ORDER BY category, key") + setting_values: dict[str, Any] = {} settings = [] for row in settings_rows: item = dict(row) @@ -3440,6 +3441,7 @@ async def workers(request: Request): item["value_json"] = json.loads(item["value_json"]) except json.JSONDecodeError: pass + setting_values[str(item.get("key") or "")] = item.get("value_json") if item.get("key") in {"ai_writer_categories", "tg_poster_schedule_json", "vk_poster_schedule_json", *AI_WORKER_ENABLED_SETTINGS.values()}: continue settings.append(item) @@ -3460,6 +3462,19 @@ async def workers(request: Request): workers=[ { **dict(r), + "setting_enabled": ( + bool(setting_values.get(AI_WORKER_ENABLED_SETTINGS[str(r["name"])])) + if str(r["name"]) in AI_WORKER_ENABLED_SETTINGS + else None + ), + "effective_enabled": ( + bool(r["enabled"]) + and ( + bool(setting_values.get(AI_WORKER_ENABLED_SETTINGS[str(r["name"])])) + if str(r["name"]) in AI_WORKER_ENABLED_SETTINGS + else True + ) + ), "meta_json": json.loads(r["meta_json"]) if isinstance(r["meta_json"], str) else (r["meta_json"] or {}), } for r in rows @@ -3750,22 +3765,50 @@ async def worker_toggle(request: Request, worker_name: str, csrf_token: str = Fo pool = await get_pool() async with pool.acquire() as conn: async with conn.transaction(): - row = await conn.fetchrow( - """ - UPDATE worker_controls - SET enabled=NOT enabled, - updated_by=$2, - updated_at=NOW() - WHERE name=$1 - RETURNING enabled - """, - worker_name, - user["id"], - ) - if not row: - return redirect("/workers") - enabled = bool(row["enabled"]) setting_key = AI_WORKER_ENABLED_SETTINGS.get(worker_name) + if setting_key: + current = await conn.fetchrow( + """ + SELECT wc.enabled AS worker_enabled, + COALESCE((s.value_json)::boolean, FALSE) AS setting_enabled + FROM worker_controls wc + LEFT JOIN app_settings s ON s.key=$2 + WHERE wc.name=$1 + """, + worker_name, + setting_key, + ) + if not current: + return redirect("/workers") + enabled = not (bool(current["worker_enabled"]) and bool(current["setting_enabled"])) + await conn.execute( + """ + UPDATE worker_controls + SET enabled=$2, + updated_by=$3, + updated_at=NOW() + WHERE name=$1 + """, + worker_name, + enabled, + user["id"], + ) + else: + row = await conn.fetchrow( + """ + UPDATE worker_controls + SET enabled=NOT enabled, + updated_by=$2, + updated_at=NOW() + WHERE name=$1 + RETURNING enabled + """, + worker_name, + user["id"], + ) + if not row: + return redirect("/workers") + enabled = bool(row["enabled"]) if setting_key: await conn.execute( """ diff --git a/src/vk_parser_app/templates/workers.html b/src/vk_parser_app/templates/workers.html index 13c40d0..5520e1a 100644 --- a/src/vk_parser_app/templates/workers.html +++ b/src/vk_parser_app/templates/workers.html @@ -27,10 +27,14 @@ {{ w.name }} - {% if w.enabled %} + {% if w.effective_enabled %} Включен + {% elif w.enabled and w.setting_enabled == false %} + + Выключен настройкой + {% else %} Выключен