Bundesland-Filter & Transparenz: stringente Trennung im Frontend + Backend #8

Closed
opened 2026-04-07 22:50:56 +02:00 by tobias · 1 comment
Owner

Problem

Seit #2 (LSA aktiv) liegen NRW- und LSA-Anträge vermischt in der Tabelle. Die Header-Dropdown filtert aktuell nicht durchgängig:

  • /api/assessments ignoriert bundesland komplett — die Liste zeigt immer alle
  • Statistiken (Ø Score, Ø pro Partei) werden über alle Bundesländer hinweg gemittelt
  • Es gibt keinen explizit gekennzeichneten „Bundesweit"-Modus
  • Im Bundesweit-Modus ist nicht erkennbar, aus welchem Landtag ein Antrag stammt

Ziel

Stringenz + Transparenz:

  1. Bundesland-Auswahl filtert konsequent durch alle Schichten (Liste, Suche, Statistiken, Partei/Tag-Filter, Upload-Mode)
  2. Bei „Bundesweit" ist Live-Suche im Landtag deaktiviert
  3. Bei „Bundesweit" ist bei jedem Antrag sichtbar, aus welchem Landtag er kommt — Listen-Eintrag, Detail-Header und PDF-Report

Akzeptanzkriterien

  • Header-Dropdown bekommt zusätzliche erste Option 🌍 Bundesweit (Code ALL)
  • /api/assessments?bundesland=NRW liefert nur NRW, =LSA nur LSA, =ALL oder ohne Parameter alles
  • /api/search-landtag?bundesland=ALL liefert HTTP 400 mit Fehlermeldung
  • „Im Landtag suchen"-Button im Frontend disabled mit Tooltip wenn currentBundesland === 'ALL'
  • Bundesland-Wechsel resettet Partei- und Tag-Filter automatisch
  • Bundesland-Auswahl wird in localStorage persistiert, Reload behält den Wert
  • Listen-Items zeigen im Bundesweit-Modus ein bl-badge neben der Drucksachen-Nummer; im Bundesland-spezifischen Modus ausgeblendet
  • Detail-Header eines Antrags zeigt immer den parlament_name aus BUNDESLAENDER
  • PDF-Report-Kopfzeile enthält ebenfalls den parlament_name
  • Statistik-Block zeigt im Bundesweit-Modus zusätzlich eine Aufschlüsselung pro aktivem Bundesland (Ø NRW: x | Ø LSA: y)
  • Upload-Mode: bei ALL als Header-Auswahl muss der User im Upload-Form explizit ein Bundesland wählen, kein automatischer Default
  • NRW-only- und LSA-only-Smoke-Tests (Listing, interne Suche, Live-Landtag-Suche, Detail) funktionieren

Umfang

Berührt: app/database.py, app/main.py, app/templates/index.html, app/report.py und Report-Template. Keine Änderung an app/bundeslaender.py (ALL ist eine Frontend-Konvention, kein echtes Bundesland).

## Problem Seit #2 (LSA aktiv) liegen NRW- und LSA-Anträge vermischt in der Tabelle. Die Header-Dropdown filtert aktuell **nicht** durchgängig: - `/api/assessments` ignoriert `bundesland` komplett — die Liste zeigt immer alle - Statistiken (Ø Score, Ø pro Partei) werden über alle Bundesländer hinweg gemittelt - Es gibt keinen explizit gekennzeichneten „Bundesweit"-Modus - Im Bundesweit-Modus ist nicht erkennbar, aus welchem Landtag ein Antrag stammt ## Ziel **Stringenz** + **Transparenz**: 1. Bundesland-Auswahl filtert konsequent durch alle Schichten (Liste, Suche, Statistiken, Partei/Tag-Filter, Upload-Mode) 2. Bei „Bundesweit" ist Live-Suche im Landtag deaktiviert 3. Bei „Bundesweit" ist bei jedem Antrag sichtbar, aus welchem Landtag er kommt — Listen-Eintrag, Detail-Header und PDF-Report ## Akzeptanzkriterien - [ ] Header-Dropdown bekommt zusätzliche erste Option `🌍 Bundesweit` (Code `ALL`) - [ ] `/api/assessments?bundesland=NRW` liefert nur NRW, `=LSA` nur LSA, `=ALL` oder ohne Parameter alles - [ ] `/api/search-landtag?bundesland=ALL` liefert HTTP 400 mit Fehlermeldung - [ ] „Im Landtag suchen"-Button im Frontend disabled mit Tooltip wenn `currentBundesland === 'ALL'` - [ ] Bundesland-Wechsel resettet Partei- und Tag-Filter automatisch - [ ] Bundesland-Auswahl wird in `localStorage` persistiert, Reload behält den Wert - [ ] Listen-Items zeigen im Bundesweit-Modus ein `bl-badge` neben der Drucksachen-Nummer; im Bundesland-spezifischen Modus ausgeblendet - [ ] Detail-Header eines Antrags zeigt immer den `parlament_name` aus `BUNDESLAENDER` - [ ] PDF-Report-Kopfzeile enthält ebenfalls den `parlament_name` - [ ] Statistik-Block zeigt im Bundesweit-Modus zusätzlich eine Aufschlüsselung pro aktivem Bundesland (`Ø NRW: x | Ø LSA: y`) - [ ] Upload-Mode: bei `ALL` als Header-Auswahl muss der User im Upload-Form explizit ein Bundesland wählen, kein automatischer Default - [ ] NRW-only- und LSA-only-Smoke-Tests (Listing, interne Suche, Live-Landtag-Suche, Detail) funktionieren ## Umfang Berührt: `app/database.py`, `app/main.py`, `app/templates/index.html`, `app/report.py` und Report-Template. **Keine** Änderung an `app/bundeslaender.py` (`ALL` ist eine Frontend-Konvention, kein echtes Bundesland).
Author
Owner

Erledigt

Commit f1867d4 deployed auf https://gwoe.toppyr.de.

Stringenz (Backend-Smoke):

  • /api/assessments ohne Param: 27 Einträge (NRW + LSA gemischt)
  • ?bundesland=ALL: 27 Einträge (synonym zu kein Filter)
  • ?bundesland=NRW: 25 Einträge, alle bundesland='NRW'
  • ?bundesland=LSA: 2 Einträge, alle bundesland='LSA'
  • ?bundesland= durchgängig in /api/search, korrekt durchgereicht zur DB
  • /api/search-landtag?bundesland=ALL → HTTP 400, {"detail":"Landtag-Suche benötigt ein konkretes Bundesland"} (Plus zusätzlicher Frühcheck im Frontend)
  • /api/bundeslaender enthält jetzt 17 Einträge (16 + ALL) mit parlament_name

Transparenz:

  • Listen-Item-Badge bl-badge neben Drucksachen-ID, im Single-Bundesland-Modus per CSS-Toggle ausgeblendet (data-mode="single")
  • Detail-Header zeigt parlament_name aus BUNDESLAENDER (Variante A — Frontend-Map vom Backend bei Initial-Render)
  • PDF-Report-Header (report.py) bekommt <div class="header-parlament"> mit dem parlament_name; alle 3 Call-Sites (run_analysis, run_drucksache_analysis, download_assessment_pdf) reichen den bundesland-Code durch

UX-Politur:

  • Bundesland-Wechsel resettet automatisch Score-, Partei- und Tag-Filter
  • localStorage-Persistenz (selectedBundesland)
  • Stats-Block bekommt im Bundesweit-Modus eine zweite Zeile mit Pro-Bundesland-Aufschlüsselung (Ø NRW: x · Ø LSA: y), automatisch versteckt im Single-Modus
  • Upload-Mode: kein automatischer Default mehr — User muss bei ALL ein konkretes Bundesland im Upload-Form wählen, sonst alert + return
  • Default-Bundesland ist jetzt ALL statt NRW (Erstbesucher sehen alles)
  • Landtag-Suche-Button: disabled + Tooltip im Bundesweit-Modus

Folge-Issue: #9 (Original-PDF an GWÖ-Report anhängen) ist separat erfasst.

## Erledigt Commit `f1867d4` deployed auf https://gwoe.toppyr.de. **Stringenz (Backend-Smoke):** - `/api/assessments` ohne Param: 27 Einträge (NRW + LSA gemischt) - `?bundesland=ALL`: 27 Einträge (synonym zu kein Filter) - `?bundesland=NRW`: 25 Einträge, **alle** `bundesland='NRW'` - `?bundesland=LSA`: 2 Einträge, **alle** `bundesland='LSA'` - `?bundesland=` durchgängig in `/api/search`, korrekt durchgereicht zur DB - `/api/search-landtag?bundesland=ALL` → HTTP 400, `{"detail":"Landtag-Suche benötigt ein konkretes Bundesland"}` (Plus zusätzlicher Frühcheck im Frontend) - `/api/bundeslaender` enthält jetzt 17 Einträge (16 + ALL) mit `parlament_name` **Transparenz:** - Listen-Item-Badge `bl-badge` neben Drucksachen-ID, im Single-Bundesland-Modus per CSS-Toggle ausgeblendet (`data-mode="single"`) - Detail-Header zeigt `parlament_name` aus `BUNDESLAENDER` (Variante A — Frontend-Map vom Backend bei Initial-Render) - PDF-Report-Header (`report.py`) bekommt `<div class="header-parlament">` mit dem `parlament_name`; alle 3 Call-Sites (`run_analysis`, `run_drucksache_analysis`, `download_assessment_pdf`) reichen den `bundesland`-Code durch **UX-Politur:** - Bundesland-Wechsel resettet automatisch Score-, Partei- und Tag-Filter - localStorage-Persistenz (`selectedBundesland`) - Stats-Block bekommt im Bundesweit-Modus eine zweite Zeile mit Pro-Bundesland-Aufschlüsselung (`Ø NRW: x · Ø LSA: y`), automatisch versteckt im Single-Modus - Upload-Mode: kein automatischer Default mehr — User muss bei `ALL` ein konkretes Bundesland im Upload-Form wählen, sonst alert + return - Default-Bundesland ist jetzt `ALL` statt `NRW` (Erstbesucher sehen alles) - Landtag-Suche-Button: `disabled` + Tooltip im Bundesweit-Modus **Folge-Issue:** #9 (Original-PDF an GWÖ-Report anhängen) ist separat erfasst.
Sign in to join this conversation.
No description provided.