Show effective worker enabled state
This commit is contained in:
@@ -3432,6 +3432,7 @@ async def workers(request: Request):
|
|||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
settings_rows = await pool.fetch("SELECT * FROM app_settings ORDER BY category, key")
|
settings_rows = await pool.fetch("SELECT * FROM app_settings ORDER BY category, key")
|
||||||
|
setting_values: dict[str, Any] = {}
|
||||||
settings = []
|
settings = []
|
||||||
for row in settings_rows:
|
for row in settings_rows:
|
||||||
item = dict(row)
|
item = dict(row)
|
||||||
@@ -3440,6 +3441,7 @@ async def workers(request: Request):
|
|||||||
item["value_json"] = json.loads(item["value_json"])
|
item["value_json"] = json.loads(item["value_json"])
|
||||||
except json.JSONDecodeError:
|
except json.JSONDecodeError:
|
||||||
pass
|
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()}:
|
if item.get("key") in {"ai_writer_categories", "tg_poster_schedule_json", "vk_poster_schedule_json", *AI_WORKER_ENABLED_SETTINGS.values()}:
|
||||||
continue
|
continue
|
||||||
settings.append(item)
|
settings.append(item)
|
||||||
@@ -3460,6 +3462,19 @@ async def workers(request: Request):
|
|||||||
workers=[
|
workers=[
|
||||||
{
|
{
|
||||||
**dict(r),
|
**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 {}),
|
"meta_json": json.loads(r["meta_json"]) if isinstance(r["meta_json"], str) else (r["meta_json"] or {}),
|
||||||
}
|
}
|
||||||
for r in rows
|
for r in rows
|
||||||
@@ -3750,6 +3765,35 @@ async def worker_toggle(request: Request, worker_name: str, csrf_token: str = Fo
|
|||||||
pool = await get_pool()
|
pool = await get_pool()
|
||||||
async with pool.acquire() as conn:
|
async with pool.acquire() as conn:
|
||||||
async with conn.transaction():
|
async with conn.transaction():
|
||||||
|
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(
|
row = await conn.fetchrow(
|
||||||
"""
|
"""
|
||||||
UPDATE worker_controls
|
UPDATE worker_controls
|
||||||
@@ -3765,7 +3809,6 @@ async def worker_toggle(request: Request, worker_name: str, csrf_token: str = Fo
|
|||||||
if not row:
|
if not row:
|
||||||
return redirect("/workers")
|
return redirect("/workers")
|
||||||
enabled = bool(row["enabled"])
|
enabled = bool(row["enabled"])
|
||||||
setting_key = AI_WORKER_ENABLED_SETTINGS.get(worker_name)
|
|
||||||
if setting_key:
|
if setting_key:
|
||||||
await conn.execute(
|
await conn.execute(
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -27,10 +27,14 @@
|
|||||||
<tr class="hover:bg-app-surfaceHover transition-colors">
|
<tr class="hover:bg-app-surfaceHover transition-colors">
|
||||||
<td class="px-4 py-3 font-mono font-bold text-white">{{ w.name }}</td>
|
<td class="px-4 py-3 font-mono font-bold text-white">{{ w.name }}</td>
|
||||||
<td class="px-4 py-3">
|
<td class="px-4 py-3">
|
||||||
{% if w.enabled %}
|
{% if w.effective_enabled %}
|
||||||
<span class="badge badge-success px-2 py-0.5 flex items-center gap-1.5 w-max">
|
<span class="badge badge-success px-2 py-0.5 flex items-center gap-1.5 w-max">
|
||||||
<span class="w-1.5 h-1.5 rounded-full bg-app-success"></span> Включен
|
<span class="w-1.5 h-1.5 rounded-full bg-app-success"></span> Включен
|
||||||
</span>
|
</span>
|
||||||
|
{% elif w.enabled and w.setting_enabled == false %}
|
||||||
|
<span class="badge badge-warning px-2 py-0.5 flex items-center gap-1.5 w-max">
|
||||||
|
<span class="w-1.5 h-1.5 rounded-full bg-app-warning"></span> Выключен настройкой
|
||||||
|
</span>
|
||||||
{% else %}
|
{% else %}
|
||||||
<span class="badge badge-error px-2 py-0.5 flex items-center gap-1.5 w-max">
|
<span class="badge badge-error px-2 py-0.5 flex items-center gap-1.5 w-max">
|
||||||
<span class="w-1.5 h-1.5 rounded-full bg-app-error"></span> Выключен
|
<span class="w-1.5 h-1.5 rounded-full bg-app-error"></span> Выключен
|
||||||
|
|||||||
Reference in New Issue
Block a user