feat: Antragsteller + Beratungsergebnis pro Kettenglied
- Backend: Batch-Queries für Antragsteller + Beratungen pro Glied - Jedes Glied zeigt: Partei-Badges + Gremium: Beschlusstext - Explorer Panel 2: Farbige Partei-Badges + Beratungsergebnis an jedem Schritt
This commit is contained in:
parent
e35dab8f7d
commit
601d07b787
@ -118,7 +118,7 @@ class KetteDetail(BaseModel):
|
|||||||
letzte_aktivitaet: date | None = None
|
letzte_aktivitaet: date | None = None
|
||||||
vertagungen_count: int = 0
|
vertagungen_count: int = 0
|
||||||
begruendung: str | None = None
|
begruendung: str | None = None
|
||||||
glieder: list[KettenGliedOut] = []
|
glieder: list[dict] = []
|
||||||
antragsteller: list[ParteiOut] = []
|
antragsteller: list[ParteiOut] = []
|
||||||
graph: dict | None = None
|
graph: dict | None = None
|
||||||
strang: str | None = None
|
strang: str | None = None
|
||||||
|
|||||||
@ -161,8 +161,45 @@ def get_kette(kette_id: int, conn=Depends(_db)):
|
|||||||
(kette_id,),
|
(kette_id,),
|
||||||
).fetchall()
|
).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 = [
|
glieder = [
|
||||||
KettenGliedOut(
|
{
|
||||||
|
**KettenGliedOut(
|
||||||
vorlage=VorlageKurz(
|
vorlage=VorlageKurz(
|
||||||
id=g["id"],
|
id=g["id"],
|
||||||
aktenzeichen=g["aktenzeichen"],
|
aktenzeichen=g["aktenzeichen"],
|
||||||
@ -173,7 +210,10 @@ def get_kette(kette_id: int, conn=Depends(_db)):
|
|||||||
),
|
),
|
||||||
position=g["position"],
|
position=g["position"],
|
||||||
rolle=g["rolle"],
|
rolle=g["rolle"],
|
||||||
)
|
).model_dump(),
|
||||||
|
"antragsteller": glied_ast.get(g["id"], []),
|
||||||
|
"beratungen": glied_beratungen.get(g["id"], []),
|
||||||
|
}
|
||||||
for g in glieder_rows
|
for g in glieder_rows
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
@ -414,13 +414,28 @@
|
|||||||
{glied.vorlage.aktenzeichen || `#${glied.vorlage.id}`}
|
{glied.vorlage.aktenzeichen || `#${glied.vorlage.id}`}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="flex flex-wrap items-center gap-1 mb-0.5">
|
||||||
{#if glied.rolle}
|
{#if glied.rolle}
|
||||||
<span class="inline-block text-[10px] px-1.5 py-0.5 rounded bg-gray-100 text-gray-600 mb-0.5">
|
<span class="text-[10px] px-1.5 py-0.5 rounded bg-gray-100 text-gray-600">
|
||||||
{glied.rolle}
|
{glied.rolle}
|
||||||
</span>
|
</span>
|
||||||
{/if}
|
{/if}
|
||||||
|
{#each glied.antragsteller || [] as a}
|
||||||
|
<span class="text-[10px] px-1 py-0.5 rounded font-medium"
|
||||||
|
style="background-color: {a.farbe || '#6b7280'}20; color: {a.farbe || '#6b7280'}; border: 1px solid {a.farbe || '#6b7280'}40;">
|
||||||
|
{a.kuerzel}
|
||||||
|
</span>
|
||||||
|
{/each}
|
||||||
|
</div>
|
||||||
|
{#each glied.beratungen || [] as b}
|
||||||
|
{#if b.beschlusstext || b.ergebnis}
|
||||||
|
<div class="text-[10px] text-gray-500 leading-tight">
|
||||||
|
<span class="font-medium">{b.gremium || '?'}</span>: {b.beschlusstext || b.ergebnis || ''}
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
{/each}
|
||||||
{#if glied.vorlage.datum_eingang}
|
{#if glied.vorlage.datum_eingang}
|
||||||
<div class="text-[10px] text-gray-400">
|
<div class="text-[10px] text-gray-400 mt-0.5">
|
||||||
{formatDate(glied.vorlage.datum_eingang)}
|
{formatDate(glied.vorlage.datum_eingang)}
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user