antragstracker/scripts/migrate_strang.py
Dotty Dotter f8bc893a54 feat: Strang-basierte Klassifikation + Explorer + Ampel (#16)
Neue Features:
- 4 Verfahrensstränge: Antrag, Anfrage, Beschlussvorlage, Mitteilung
- Ampel-Visualisierung pro Kette (Fortschrittsanzeige mit Abzweigungen)
- 3-Panel Explorer (/explorer): Liste | Kette+Ampel | Vorlage-Detail
- KI-Bewertungs-Versionierung (alte Versionen aufklappbar)
- Neubewertung triggert automatisch Umsetzungs-Score
- Bewertungs-Log (bewertungs_log Tabelle)
- Umsetzungsgrad an Kette (Score + Begründung)
- Antragsteller + Beratungsergebnis pro Kettenglied
- HAK und Hagen Aktiv als getrennte Fraktionen
- Status-Filter im Explorer
- Suche durchsucht Aktenzeichen + Betreff

Backend:
- tracker/core/ampel.py — Ampel-Definition + get_ampel()
- tracker/core/perioden.py — Shared Perioden-Filter
- Neues Feld: ketten.strang, ki_bewertungen.kette_id
- GET /api/ampel/definition, erweiterte Ketten/Vorlagen-APIs

Closes #16
2026-04-02 00:36:30 +02:00

65 lines
1.8 KiB
Python

#!/usr/bin/env python3
"""Migration: Add 'strang' column to ketten and populate based on Ursprungs-Vorlage typ."""
import sqlite3
import sys
from pathlib import Path
DB_PATH = Path(__file__).parent.parent / "data" / "tracker.db"
VORLAGE_TYP_TO_STRANG = {
"antrag": "antrag",
"anfrage": "anfrage",
"beschlussvorlage": "beschlussvorlage",
"mitteilungsvorlage": "mitteilung",
}
def migrate(db_path: Path = DB_PATH):
conn = sqlite3.connect(str(db_path))
conn.row_factory = sqlite3.Row
# Check if column already exists
cols = [r[1] for r in conn.execute("PRAGMA table_info(ketten)").fetchall()]
if "strang" not in cols:
print("Adding 'strang' column to ketten...")
conn.execute("ALTER TABLE ketten ADD COLUMN strang TEXT")
conn.commit()
print("Column added.")
else:
print("Column 'strang' already exists.")
# Populate strang based on Ursprungs-Vorlage typ
rows = conn.execute("""
SELECT k.id, v.typ as vorlage_typ
FROM ketten k
LEFT JOIN vorlagen v ON k.ursprung_id = v.id
WHERE k.strang IS NULL
""").fetchall()
if not rows:
print("All ketten already have strang set.")
conn.close()
return
print(f"Updating {len(rows)} ketten...")
counts = {}
for r in rows:
vorlage_typ = r["vorlage_typ"] or ""
strang = VORLAGE_TYP_TO_STRANG.get(vorlage_typ, "sonstig")
conn.execute("UPDATE ketten SET strang = ? WHERE id = ?", (strang, r["id"]))
counts[strang] = counts.get(strang, 0) + 1
conn.commit()
conn.close()
print("Done. Counts per strang:")
for strang, count in sorted(counts.items()):
print(f" {strang}: {count}")
if __name__ == "__main__":
db = Path(sys.argv[1]) if len(sys.argv) > 1 else DB_PATH
migrate(db)