diff --git a/backend/src/tracker/api/models.py b/backend/src/tracker/api/models.py index 1fc5fa8..8819032 100644 --- a/backend/src/tracker/api/models.py +++ b/backend/src/tracker/api/models.py @@ -118,7 +118,7 @@ class KetteDetail(BaseModel): letzte_aktivitaet: date | None = None vertagungen_count: int = 0 begruendung: str | None = None - glieder: list[KettenGliedOut] = [] + glieder: list[dict] = [] antragsteller: list[ParteiOut] = [] graph: dict | None = None strang: str | None = None diff --git a/backend/src/tracker/api/routes/ketten.py b/backend/src/tracker/api/routes/ketten.py index c7867b1..63a3532 100644 --- a/backend/src/tracker/api/routes/ketten.py +++ b/backend/src/tracker/api/routes/ketten.py @@ -161,19 +161,59 @@ def get_kette(kette_id: int, conn=Depends(_db)): (kette_id,), ).fetchall() + # Collect IDs for batch queries + glied_ids = [g["id"] for g in glieder_rows] + placeholders = ",".join("?" * len(glied_ids)) if glied_ids else "0" + + # Antragsteller per Glied + glied_ast: dict[int, list] = {} + if glied_ids: + ast_rows = conn.execute( + f"""SELECT a.vorlage_id, p.kuerzel, p.name, p.farbe + FROM antragsteller a JOIN parteien p ON a.partei_id = p.id + WHERE a.vorlage_id IN ({placeholders})""", + glied_ids, + ).fetchall() + for a in ast_rows: + glied_ast.setdefault(a["vorlage_id"], []).append( + {"kuerzel": a["kuerzel"], "name": a["name"], "farbe": a["farbe"]} + ) + + # Beratungen per Glied (Gremium + Ergebnis) + glied_beratungen: dict[int, list] = {} + if glied_ids: + ber_rows = conn.execute( + f"""SELECT b.vorlage_id, g.name as gremium, b.ergebnis, b.beschlusstext, b.sitzung_datum + FROM beratungen b LEFT JOIN gremien g ON b.gremium_id = g.id + WHERE b.vorlage_id IN ({placeholders}) + ORDER BY b.sitzung_datum""", + glied_ids, + ).fetchall() + for b in ber_rows: + glied_beratungen.setdefault(b["vorlage_id"], []).append({ + "gremium": b["gremium"], + "ergebnis": b["ergebnis"], + "beschlusstext": b["beschlusstext"][:200] if b["beschlusstext"] else None, + "sitzung_datum": b["sitzung_datum"], + }) + glieder = [ - KettenGliedOut( - vorlage=VorlageKurz( - id=g["id"], - aktenzeichen=g["aktenzeichen"], - typ=g["typ"], - betreff=g["betreff"], - datum_eingang=g["datum_eingang"], - ist_verwaltungsvorlage=bool(g["ist_verwaltungsvorlage"]), - ), - position=g["position"], - rolle=g["rolle"], - ) + { + **KettenGliedOut( + vorlage=VorlageKurz( + id=g["id"], + aktenzeichen=g["aktenzeichen"], + typ=g["typ"], + betreff=g["betreff"], + datum_eingang=g["datum_eingang"], + ist_verwaltungsvorlage=bool(g["ist_verwaltungsvorlage"]), + ), + position=g["position"], + rolle=g["rolle"], + ).model_dump(), + "antragsteller": glied_ast.get(g["id"], []), + "beratungen": glied_beratungen.get(g["id"], []), + } for g in glieder_rows ] diff --git a/frontend/src/routes/explorer/+page.svelte b/frontend/src/routes/explorer/+page.svelte index 4ba7908..10925d0 100644 --- a/frontend/src/routes/explorer/+page.svelte +++ b/frontend/src/routes/explorer/+page.svelte @@ -414,13 +414,28 @@ {glied.vorlage.aktenzeichen || `#${glied.vorlage.id}`} - {#if glied.rolle} - - {glied.rolle} - - {/if} +