- Vorlagen + Ketten: Partei-Dropdown-Filter mit Badges (#9) - Vorlagen-Detail: Ketten-Klassifikation mit Begründung anzeigen - Vorlagen-Detail: Umsetzungsbewertungen mit Score + Begründung - SPA-Routing: Catch-All für direkten URL-Zugriff - Status-Engine: Begründungen für alle Ketten-Status generieren - Kurze Beschlusstexte (<=5 Zeichen) nicht mehr als Beschluss werten - POST /api/bewertung/vorlagen/{id} + /ketten/{id} für KI-Neubewertung - Frontend: 'Neu bewerten' Button + Kommentarfeld auf beiden Detailseiten - Job-Status-Polling mit Spinner - ALLRIS-Rescrape vor Bewertung noch offen (#10) Closes #9
50 lines
1.5 KiB
Python
50 lines
1.5 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Repariert kaputte ketten_match Einträge:
|
|
- begruendung enthält rohes JSON statt Klartext
|
|
- bewertung ist 'unklar' obwohl Score eindeutig ist
|
|
Löscht kaputte Einträge → run_ketten_match.sh matched sie erneut mit gefixtem Script.
|
|
"""
|
|
import sqlite3
|
|
from pathlib import Path
|
|
|
|
DB = Path(__file__).resolve().parent.parent / "data" / "tracker_remote.db"
|
|
|
|
conn = sqlite3.connect(str(DB))
|
|
conn.row_factory = sqlite3.Row
|
|
|
|
# Zähle kaputte
|
|
broken = conn.execute("""
|
|
SELECT COUNT(*) as n FROM ki_bewertungen
|
|
WHERE typ='umsetzung_match' AND begruendung LIKE '{%'
|
|
""").fetchone()["n"]
|
|
|
|
print(f"Kaputte Einträge: {broken}")
|
|
|
|
if broken > 0:
|
|
# Lösche alle kaputten → werden vom Runner erneut bewertet
|
|
conn.execute("""
|
|
DELETE FROM ki_bewertungen
|
|
WHERE typ='umsetzung_match' AND begruendung LIKE '{%'
|
|
""")
|
|
# Setze ki_status zurück für betroffene Vorlagen
|
|
conn.execute("""
|
|
UPDATE vorlagen SET ki_status = NULL
|
|
WHERE id IN (
|
|
SELECT vorlage_id FROM ki_bewertungen WHERE typ='umsetzung_match'
|
|
) OR (ki_status = 'matched' AND id NOT IN (
|
|
SELECT vorlage_id FROM ki_bewertungen WHERE typ='umsetzung_match'
|
|
))
|
|
""")
|
|
conn.commit()
|
|
|
|
remaining = conn.execute("""
|
|
SELECT COUNT(*) as n FROM ki_bewertungen WHERE typ='umsetzung_match'
|
|
""").fetchone()["n"]
|
|
|
|
print(f"Gelöscht: {broken}")
|
|
print(f"Verbleibend (intakt): {remaining}")
|
|
print(f"→ Runner wird {broken} erneut matchen")
|
|
|
|
conn.close()
|