fix: published_at bei Tier-1-Triage setzen + Mobile-Triage-Badges + für Ungeprüfte

- published_at = CURRENT_TIMESTAMP bei Tier-1-Publish (sonst sortieren NULLs ans Ende)
- Mobile-Cards zeigen jetzt auch Triage-Badge (🟢🟡🔴)
- Desktop-Tabelle zeigt  für noch nicht triagierte Einträge
- TRIAGE_DELAY_SECONDS env-var (default 360)
This commit is contained in:
Hermes Agent
2026-06-19 13:29:31 +02:00
parent 6eadb7342b
commit ad3082c195
+16 -3
View File
@@ -440,7 +440,8 @@ def triage_submission(db, submission_id: int) -> dict:
db.execute( db.execute(
"""UPDATE submissions """UPDATE submissions
SET triage_tier=?, triage_reasons=?, triage_at=CURRENT_TIMESTAMP, SET triage_tier=?, triage_reasons=?, triage_at=CURRENT_TIMESTAMP,
public=?, status=?, display_text=? public=?, status=?, display_text=?,
published_at=CASE WHEN ? = 1 THEN COALESCE(published_at, CURRENT_TIMESTAMP) ELSE published_at END
WHERE id=?""", WHERE id=?""",
( (
tier, tier,
@@ -448,6 +449,7 @@ def triage_submission(db, submission_id: int) -> dict:
1 if tier == 1 else 0, 1 if tier == 1 else 0,
"published" if tier == 1 else ("blocked" if tier == 3 else "pending"), "published" if tier == 1 else ("blocked" if tier == 3 else "pending"),
display_text, display_text,
tier,
submission_id, submission_id,
), ),
) )
@@ -481,7 +483,7 @@ def _run_triage_async(submission_id: int):
import time as _time import time as _time
import sqlite3 as _sqlite3 import sqlite3 as _sqlite3
THREAD_WINDOW_SEC = 360 # 6 Minuten (5 Min Thread-Window + 1 Min Puffer) THREAD_WINDOW_SEC = int(os.environ.get("TRIAGE_DELAY_SECONDS", "360")) # default: 6 Min
print(f"[triage] #{submission_id} geplant in {THREAD_WINDOW_SEC}s", file=sys.stderr) print(f"[triage] #{submission_id} geplant in {THREAD_WINDOW_SEC}s", file=sys.stderr)
_time.sleep(THREAD_WINDOW_SEC) _time.sleep(THREAD_WINDOW_SEC)
@@ -1316,6 +1318,8 @@ def admin_dashboard():
reasons = json.loads(r["triage_reasons"] or "[]") reasons = json.loads(r["triage_reasons"] or "[]")
tooltip = " | ".join(reasons) if reasons else "Keine Details" tooltip = " | ".join(reasons) if reasons else "Keine Details"
triage_badge = f'<span class="triage-badge" title="{tooltip}">{emoji}</span>' triage_badge = f'<span class="triage-badge" title="{tooltip}">{emoji}</span>'
else:
triage_badge = '<span class="triage-badge" title="Wartet auf KI-Prüfung" style="opacity:0.4">⏳</span>'
table_rows += f""" table_rows += f"""
<tr class="row-{r['status']}" style="cursor:pointer;" onclick="window.location='/submission/{r['id']}'"> <tr class="row-{r['status']}" style="cursor:pointer;" onclick="window.location='/submission/{r['id']}'">
@@ -1338,8 +1342,17 @@ def admin_dashboard():
content_snippet = (r["content"] or "")[:80] content_snippet = (r["content"] or "")[:80]
media_icon = {"image": "🖼️", "audio": "🎤", "video": "🎬", "document": "📎"}.get(r["type"], "") media_icon = {"image": "🖼️", "audio": "🎤", "video": "🎬", "document": "📎"}.get(r["type"], "")
st_label = status_names.get(r["status"], r["status"]) st_label = status_names.get(r["status"], r["status"])
# Triage badge for mobile
triage_mobile = ""
if r["triage_tier"]:
emoji = triage_emoji.get(r["triage_tier"], "")
reasons = json.loads(r["triage_reasons"] or "[]")
tooltip = " | ".join(reasons) if reasons else ""
triage_mobile = f'<span class="triage-badge" title="{tooltip}">{emoji}</span>'
else:
triage_mobile = '<span class="triage-badge" title="Wartet auf KI-Prüfung" style="opacity:0.5">⏳</span>'
mobile_cards += f"""<a href="/submission/{r['id']}" class="mobile-card row-{r['status']}"> mobile_cards += f"""<a href="/submission/{r['id']}" class="mobile-card row-{r['status']}">
<div class="mc-top"><span class="mc-id">#{r['id']}</span><span class="mc-badge badge badge-{r['status']}">{st_label}</span></div> <div class="mc-top"><span class="mc-id">#{r['id']}</span>{triage_mobile}<span class="mc-badge badge badge-{r['status']}">{st_label}</span></div>
<div class="mc-body"><b>{media_icon} {r['type']}</b> · {r['channel']}</div> <div class="mc-body"><b>{media_icon} {r['type']}</b> · {r['channel']}</div>
<div class="mc-meta">{'📍 ' + r['halle'] if r['halle'] else ''}{' 🎯 ' + r['spiel_titel'] if r['spiel_titel'] else ''}</div> <div class="mc-meta">{'📍 ' + r['halle'] if r['halle'] else ''}{' 🎯 ' + r['spiel_titel'] if r['spiel_titel'] else ''}</div>
<div class="mc-snippet">{content_snippet}</div> <div class="mc-snippet">{content_snippet}</div>