antragstracker/scripts/repair_ketten_match.py
Dotty Dotter 9d8a73e2a9 feat: Parteien-Filter, Klassifikation, Umsetzungsbewertung, KI-Neubewertung
- 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
2026-04-01 10:36:22 +02:00

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()