diff --git a/app/main.py b/app/main.py index 8e2c3ca..5a4c551 100644 --- a/app/main.py +++ b/app/main.py @@ -329,6 +329,36 @@ async def _render_antrag_detail( except Exception: logger.exception("Fehler beim Laden plenum_vote_results für %s", drucksache) antrag["plenum_votes"] = [] + + # Geltungs-Kontext: Regierung + Legislatur zum Antragsdatum, plus pro + # Fraktion das jeweilige Wahlprogramm. Nutzt die neuen Helper aus + # ``app/legislaturen.py`` und ``app/programme.py``. + geltung_kontext: dict = {"regierung": None, "legislatur": None, "programme": []} + try: + from .legislaturen import ( + regierung_zum_zeitpunkt, + legislatur_zum_zeitpunkt, + ) + from .programme import wahlprogramm_zum_zeitpunkt + + bl = antrag.get("bundesland") + # antrag["datum"] ist die deutsche Anzeige-Form ("10.09.2025"); für + # die zeitpunktigen Helper brauchen wir das ISO-Datum aus row. + antrag_datum = (row.get("datum") or "")[:10] # type: ignore[union-attr] + if bl and antrag_datum: + geltung_kontext["regierung"] = regierung_zum_zeitpunkt(bl, antrag_datum) + geltung_kontext["legislatur"] = legislatur_zum_zeitpunkt(bl, antrag_datum) + seen_pids: set = set() + # _row_to_detail mappt fraktionen → "parteien"-Key fuers Template; + # die Antragsteller-Fraktionen sind dort. + for partei in (antrag.get("parteien") or []): + prog = wahlprogramm_zum_zeitpunkt(bl, partei, antrag_datum) + if prog and prog["id"] not in seen_pids: + seen_pids.add(prog["id"]) + geltung_kontext["programme"].append(prog) + except Exception: + logger.exception("Fehler beim Laden des Geltungs-Kontexts für %s", drucksache) + from .models import MATRIX_LABELS return templates.TemplateResponse(template_name, { "request": request, @@ -337,6 +367,7 @@ async def _render_antrag_detail( "assessment_count": None, "matrix_explanations": _MATRIX_EXPLANATIONS, "matrix_labels": MATRIX_LABELS, + "geltung_kontext": geltung_kontext, **_v2_template_context(current_user), }) diff --git a/app/static/v3/v3.css b/app/static/v3/v3.css index c6fb248..9949d1b 100644 --- a/app/static/v3/v3.css +++ b/app/static/v3/v3.css @@ -830,3 +830,30 @@ body.v2 .v3-page p { max-width: none; } margin: 4px 0 0; border-radius: 0 2px 2px 0; } + +/* Geltungs-Kontext — kompakte Doku-Sektion direkt vor Programm-Treue. + Erklärt transparent, gegen welche Programme die LLM-Bewertung gemessen + wurde, plus Regierung/Wahlperiode zur Antragszeit. */ +.v3-geltung-meta { + font-size: 0.95em; + color: var(--ink-muted, #555); + display: grid; + gap: 8px; +} +.v3-geltung-label { + font-weight: 600; + color: var(--ink, #222); + margin-right: 6px; +} +.v3-geltung-list { + margin: 6px 0 0; + padding-left: 18px; + list-style-type: "· "; +} +.v3-geltung-list li { + margin: 2px 0; +} +.v3-geltung-gueltig { + color: var(--ink-muted, #777); + font-size: 0.92em; +} diff --git a/app/templates/v3/screens/antrag_detail.html b/app/templates/v3/screens/antrag_detail.html index de91086..08e08d3 100644 --- a/app/templates/v3/screens/antrag_detail.html +++ b/app/templates/v3/screens/antrag_detail.html @@ -180,6 +180,44 @@ {% endif %} + {# Geltungs-Kontext — Regierung + Programmgeltung zur Antragszeit. + Macht transparent, gegen welche Programme die LLM-Bewertung gemessen + wurde. Daten kommen aus app/legislaturen.py + app/programme.py. #} + {% if geltung_kontext and (geltung_kontext.regierung or geltung_kontext.legislatur or geltung_kontext.programme) %} +
+

Bewertungs-Kontext

+
+ {% if geltung_kontext.legislatur %} +
+ Wahlperiode: + {{ geltung_kontext.legislatur.wp }}. Wahlperiode + ({{ geltung_kontext.legislatur.konstituierung }}{% if geltung_kontext.legislatur.ende %} bis {{ geltung_kontext.legislatur.ende }}{% else %} – laufend{% endif %}) +
+ {% endif %} + {% if geltung_kontext.regierung %} +
+ Regierung zur Antragszeit: + {{ geltung_kontext.regierung.name }} ({{ geltung_kontext.regierung.parteien | join("+") }}), + vereidigt {{ geltung_kontext.regierung.von }}{% if geltung_kontext.regierung.bis %}, abgelöst {{ geltung_kontext.regierung.bis }}{% endif %} +
+ {% endif %} + {% if geltung_kontext.programme %} +
+ Bewertet gegen die folgenden Wahlprogramme: +
    + {% for p in geltung_kontext.programme %} +
  • + {{ p.partei }}: {{ p.titel }} + — gültig seit {{ p.gueltig_ab }}{% if p.gueltig_bis %} bis {{ p.gueltig_bis }}{% endif %} +
  • + {% endfor %} +
+
+ {% endif %} +
+
+ {% endif %} + {# 6 ── Programm-Treue — wird komplett ausgeblendet wenn ALLE Fraktionen ohne Programm sind (typisch bei Bundestags-Antraegen, wo aktuell keine Programme indiziert sind), sonst werden nur