"""Zentrale Konfiguration aller 16 deutschen Bundesländer. Dieses Modul ist die Single Source of Truth für alle bundeslandspezifischen Daten: Parlamente, Regierungen, Wahlperioden, Doku-Systeme, etc. Andere Module (main.py, parlamente.py, wahlprogramme.py, analyzer.py) lesen ausschließlich von hier. Stand: April 2026. Nach jeder Landtagswahl bzw. Regierungsbildung müssen die betroffenen Einträge aktualisiert werden. Datenquellen: Wikipedia, offizielle Landtagsseiten, parlamentsspiegel.de, https://github.com/okfde/dokukratie (für Doku-System-Zuordnung). """ from dataclasses import dataclass, field from typing import Optional @dataclass class Bundesland: """Konfiguration eines deutschen Bundeslands. Attributes: code: Übliches Kürzel im politischen Sprachgebrauch (NRW, BY, LSA…). Bei Mehrdeutigkeit ISO-3166-2-DE-Suffix; Sachsen-Anhalt nutzt jedoch das politisch dominante "LSA" statt ISO "ST". name: Vollständiger Landesname. parlament_name: Offizieller Name des Parlaments. wahlperiode: Aktuelle Wahlperiode als Zahl. wahlperiode_start: Beginn der aktuellen WP (ISO-Datum). naechste_wahl: Nächste reguläre Landtagswahl (ISO-Datum), oder None wenn noch nicht festgesetzt. regierungsfraktionen: Parteien der aktuellen Landesregierung in Reihenfolge der Größe. landtagsfraktionen: Alle aktuell im Landtag vertretenen Fraktionen. doku_system: Verwendetes Parlamentsdokumentationssystem. Werte: "OPAL", "StarWeb", "ParlDok", "PARDOK", "PARLIS", "PARiS", "Eigensystem". doku_base_url: Basis-URL der Parlamentsdokumentation. drucksache_format: Beispielhaftes Format einer Drucksachen-ID, z.B. "18/12345" für NRW WP18. dokukratie_scraper: Code-Name des Dokukratie-Scrapers (falls vorhanden), nützlich für künftige Adapter-Implementierung. aktiv: Ob das Bundesland im Frontend auswählbar und im Analyzer unterstützt ist. Inaktive Bundesländer werden im UI als "(bald)" angezeigt und sind disabled. anmerkung: Optionale Hinweise zu Sondersituationen (z.B. Koalitionsverhandlungen, jüngste Wahl, geschätzte Termine). """ code: str name: str parlament_name: str wahlperiode: int wahlperiode_start: str naechste_wahl: Optional[str] regierungsfraktionen: list[str] landtagsfraktionen: list[str] doku_system: str doku_base_url: str drucksache_format: str dokukratie_scraper: Optional[str] aktiv: bool = False anmerkung: str = "" # Hauptregister: code -> Bundesland-Instanz. # Reihenfolge alphabetisch nach offiziellem Namen für stabile UI-Sortierung. BUNDESLAENDER: dict[str, Bundesland] = { "BW": Bundesland( code="BW", name="Baden-Württemberg", parlament_name="Landtag von Baden-Württemberg", wahlperiode=17, wahlperiode_start="2021-05-01", naechste_wahl="2031-03-08", regierungsfraktionen=["GRÜNE", "CDU"], landtagsfraktionen=["GRÜNE", "CDU", "AfD", "SPD", "FDP"], doku_system="PARLIS", doku_base_url="https://parlis.landtag-bw.de", drucksache_format="17/12345", dokukratie_scraper="bw", anmerkung=( "Wahl zum 18. Landtag fand am 08.03.2026 statt; Koalitionsverhandlungen " "GRÜNE+CDU laufen, Kabinett Kretschmann III geschäftsführend. Nach " "Konstituierung des 18. LT ca. Mai 2026 müssen WP und Wahltermin aktualisiert werden." ), ), "BY": Bundesland( code="BY", name="Bayern", parlament_name="Bayerischer Landtag", wahlperiode=19, wahlperiode_start="2023-10-30", naechste_wahl="2028-10-08", regierungsfraktionen=["CSU", "FW"], landtagsfraktionen=["CSU", "GRÜNE", "FW", "AfD", "SPD"], doku_system="Eigensystem", doku_base_url="https://www.bayern.landtag.de", drucksache_format="19/1234", dokukratie_scraper="by", anmerkung="Wahltermin 2028 noch nicht offiziell festgesetzt; Schätzung Herbst 2028.", ), "BE": Bundesland( code="BE", name="Berlin", parlament_name="Abgeordnetenhaus von Berlin", wahlperiode=19, wahlperiode_start="2023-04-27", naechste_wahl="2026-09-20", regierungsfraktionen=["CDU", "SPD"], landtagsfraktionen=["CDU", "SPD", "GRÜNE", "LINKE", "AfD"], doku_system="PARDOK", doku_base_url="https://pardok.parlament-berlin.de", drucksache_format="19/1234", dokukratie_scraper="be", anmerkung=( "PARDOK basiert auf StarWeb-Software (portala-Frontend). Berlin bietet " "zusätzlich Open-Data-XML unter parlament-berlin.de/dokumente/open-data." ), ), "BB": Bundesland( code="BB", name="Brandenburg", parlament_name="Landtag Brandenburg", wahlperiode=8, wahlperiode_start="2024-10-23", naechste_wahl="2029-09-23", regierungsfraktionen=["SPD", "BSW"], landtagsfraktionen=["SPD", "AfD", "CDU", "BSW"], doku_system="StarWeb", doku_base_url="https://www.parlamentsdokumentation.brandenburg.de", drucksache_format="8/1234", dokukratie_scraper="bb", anmerkung="Kabinett Woidke IV (SPD-BSW) seit Dezember 2024. Knappe Mehrheit (zwei Sitze).", ), "HB": Bundesland( code="HB", name="Bremen", parlament_name="Bremische Bürgerschaft", wahlperiode=21, wahlperiode_start="2023-07-05", naechste_wahl="2027-05-09", regierungsfraktionen=["SPD", "GRÜNE", "LINKE"], landtagsfraktionen=["SPD", "CDU", "GRÜNE", "LINKE", "AfD", "BiW"], doku_system="PARiS", doku_base_url="https://paris.bremische-buergerschaft.de", drucksache_format="21/1234", dokukratie_scraper="hb", anmerkung=( "PARiS basiert auf StarWeb. AfD durch Listenstreichung 2023 nicht im Landtag, " "stattdessen Bürger in Wut (BiW). Wahltag 2027 noch nicht festgesetzt." ), ), "HH": Bundesland( code="HH", name="Hamburg", parlament_name="Hamburgische Bürgerschaft", wahlperiode=23, wahlperiode_start="2025-03-26", naechste_wahl="2030-03-03", regierungsfraktionen=["SPD", "GRÜNE"], landtagsfraktionen=["SPD", "CDU", "GRÜNE", "LINKE", "AfD"], doku_system="ParlDok", doku_base_url="https://www.buergerschaft-hh.de/parldok", drucksache_format="23/1234", dokukratie_scraper="hh", anmerkung="Wahl am 02.03.2025; Senat Tschentscher III seit 07.05.2025 vereidigt.", ), "HE": Bundesland( code="HE", name="Hessen", parlament_name="Hessischer Landtag", wahlperiode=21, wahlperiode_start="2024-01-18", naechste_wahl="2028-10-22", regierungsfraktionen=["CDU", "SPD"], landtagsfraktionen=["CDU", "AfD", "SPD", "GRÜNE", "FDP"], doku_system="StarWeb", doku_base_url="https://starweb.hessen.de/starweb/LIS", drucksache_format="21/1234", dokukratie_scraper="he", anmerkung="Wahltermin 2028 ist Schätzung.", ), "MV": Bundesland( code="MV", name="Mecklenburg-Vorpommern", parlament_name="Landtag Mecklenburg-Vorpommern", wahlperiode=8, wahlperiode_start="2021-10-26", naechste_wahl="2026-09-20", regierungsfraktionen=["SPD", "LINKE"], landtagsfraktionen=["SPD", "AfD", "CDU", "LINKE", "GRÜNE", "FDP"], doku_system="ParlDok", doku_base_url="https://www.dokumentation.landtag-mv.de", drucksache_format="8/1234", dokukratie_scraper="mv", anmerkung="Wahltag offiziell auf 20.09.2026 festgelegt.", ), "NI": Bundesland( code="NI", name="Niedersachsen", parlament_name="Niedersächsischer Landtag", wahlperiode=19, wahlperiode_start="2022-11-08", naechste_wahl="2027-10-10", regierungsfraktionen=["SPD", "GRÜNE"], landtagsfraktionen=["SPD", "CDU", "GRÜNE", "AfD"], doku_system="StarWeb", doku_base_url="https://www.landtag-niedersachsen.de", drucksache_format="19/12345", dokukratie_scraper="ni", anmerkung=( "Wahltermin Herbst 2027 (zwischen 11.07. und 03.10.2027) noch nicht festgesetzt; " "geschätzt. Olaf Lies (SPD) seit 20.05.2025 Ministerpräsident." ), ), "NRW": Bundesland( code="NRW", name="Nordrhein-Westfalen", parlament_name="Landtag Nordrhein-Westfalen", wahlperiode=18, wahlperiode_start="2022-06-01", naechste_wahl="2027-05-15", regierungsfraktionen=["CDU", "GRÜNE"], landtagsfraktionen=["CDU", "SPD", "GRÜNE", "FDP", "AfD"], doku_system="OPAL", doku_base_url="https://opal.landtag.nrw.de", drucksache_format="18/12345", dokukratie_scraper="nw", aktiv=True, anmerkung=( "OPAL in NRW ist eine eigene Implementierung, nicht identisch mit dem " "StarWeb-basierten OPAL in RLP. Wahltermin 2027 ist Schätzung." ), ), "RP": Bundesland( code="RP", name="Rheinland-Pfalz", parlament_name="Landtag Rheinland-Pfalz", wahlperiode=18, wahlperiode_start="2021-05-18", naechste_wahl="2031-03-22", regierungsfraktionen=["SPD", "GRÜNE", "FDP"], landtagsfraktionen=["SPD", "CDU", "AfD", "GRÜNE", "FREIE WÄHLER", "FDP"], doku_system="StarWeb", doku_base_url="https://opal.rlp.de", drucksache_format="18/12345", dokukratie_scraper="rp", anmerkung=( "OPAL in RLP basiert auf StarWeb. Wahl zum 19. Landtag fand am 22.03.2026 " "statt; Koalitionsverhandlungen CDU+SPD laufen, Kabinett Schweitzer I " "geschäftsführend. Nach Konstituierung müssen WP und Wahltermin aktualisiert werden." ), ), "SL": Bundesland( code="SL", name="Saarland", parlament_name="Landtag des Saarlandes", wahlperiode=17, wahlperiode_start="2022-04-25", naechste_wahl="2027-04-18", regierungsfraktionen=["SPD"], landtagsfraktionen=["SPD", "CDU", "AfD"], doku_system="Eigensystem", doku_base_url="https://www.landtag-saar.de", drucksache_format="17/1234", dokukratie_scraper="sl", anmerkung=( "Einzige SPD-Alleinregierung in Deutschland. AfD-Status im 17. LT vor " "produktiver Nutzung verifizieren." ), ), "SN": Bundesland( code="SN", name="Sachsen", parlament_name="Sächsischer Landtag", wahlperiode=8, wahlperiode_start="2024-10-01", naechste_wahl="2029-09-02", regierungsfraktionen=["CDU", "SPD"], landtagsfraktionen=["CDU", "AfD", "BSW", "SPD", "LINKE", "GRÜNE"], doku_system="ParlDok", doku_base_url="https://edas.landtag.sachsen.de", drucksache_format="8/1234", dokukratie_scraper="sn", anmerkung=( "Minderheitsregierung CDU+SPD (Kabinett Kretschmer III seit 18.12.2024). " "Doku-System EDAS basiert auf ParlDok." ), ), "LSA": Bundesland( code="LSA", name="Sachsen-Anhalt", parlament_name="Landtag von Sachsen-Anhalt", wahlperiode=8, wahlperiode_start="2021-07-06", naechste_wahl="2026-09-06", regierungsfraktionen=["CDU", "SPD", "FDP"], landtagsfraktionen=["CDU", "AfD", "LINKE", "SPD", "GRÜNE", "FDP"], doku_system="StarWeb", doku_base_url="https://padoka.landtag.sachsen-anhalt.de", drucksache_format="8/1234", dokukratie_scraper="st", anmerkung=( "ISO-Code wäre ST; LSA ist im politischen Sprachgebrauch dominant. " "Sven Schulze (CDU) seit 28.01.2026 MP nach Rücktritt Haseloff. " "PADOKA = Parlamentsdokumentationssystem auf StarWeb-6.0.01-Basis." ), ), "SH": Bundesland( code="SH", name="Schleswig-Holstein", parlament_name="Schleswig-Holsteinischer Landtag", wahlperiode=20, wahlperiode_start="2022-06-07", naechste_wahl="2027-04-18", regierungsfraktionen=["CDU", "GRÜNE"], landtagsfraktionen=["CDU", "GRÜNE", "SPD", "FDP", "SSW"], doku_system="StarWeb", doku_base_url="https://www.landtag.ltsh.de", drucksache_format="20/1234", dokukratie_scraper="sh", anmerkung="SSW ist von der 5%-Hürde befreit.", ), "TH": Bundesland( code="TH", name="Thüringen", parlament_name="Thüringer Landtag", wahlperiode=8, wahlperiode_start="2024-10-01", naechste_wahl="2029-09-01", regierungsfraktionen=["CDU", "BSW", "SPD"], landtagsfraktionen=["AfD", "CDU", "LINKE", "BSW", "SPD"], doku_system="StarWeb", doku_base_url="https://parldok.thueringen.de", drucksache_format="8/1234", dokukratie_scraper="th", anmerkung=( "Erste Brombeer-Koalition Deutschlands (CDU+BSW+SPD) als Minderheitsregierung " "mit 44 von 88 Sitzen. Mario Voigt (CDU) seit Dezember 2024 MP." ), ), } def get(code: str) -> Optional[Bundesland]: """Bundesland-Konfig per Code abrufen, oder None.""" return BUNDESLAENDER.get(code) def aktive_bundeslaender() -> list[Bundesland]: """Alle aktuell aktiven (im Analyzer unterstützten) Bundesländer.""" return [bl for bl in BUNDESLAENDER.values() if bl.aktiv] def alle_bundeslaender() -> list[Bundesland]: """Alle 16 Bundesländer (aktive zuerst, dann alphabetisch nach Name).""" aktiv = sorted([bl for bl in BUNDESLAENDER.values() if bl.aktiv], key=lambda b: b.name) inaktiv = sorted([bl for bl in BUNDESLAENDER.values() if not bl.aktiv], key=lambda b: b.name) return aktiv + inaktiv