You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
motief/analysis/config.py

273 lines
12 KiB

"""Configuration constants for the parliamentary explorer.
This module contains all constant definitions used across the explorer.
It is intentionally free of Streamlit and DuckDB dependencies.
"""
from __future__ import annotations
from typing import Dict
__all__ = [
"PARTY_COLOURS",
"SVD_THEMES",
"KNOWN_MAJOR_PARTIES",
"CURRENT_PARLIAMENT_PARTIES",
"_PARTY_NORMALIZE",
"CANONICAL_RIGHT",
"CANONICAL_LEFT",
]
CANONICAL_RIGHT: frozenset[str] = frozenset(
{
"PVV",
"FVD",
"JA21",
"SGP",
}
)
CANONICAL_LEFT: frozenset[str] = frozenset(
{
"SP",
"PvdA",
"GL",
"GroenLinks",
"GroenLinks-PvdA",
"DENK",
"PvdD",
"Volt",
}
)
PARTY_COLOURS: Dict[str, str] = {
"VVD": "#1E73BE",
"PVV": "#002366",
"D66": "#00A36C",
"CDA": "#4CAF50",
"SP": "#E53935",
"PvdA": "#D32F2F",
"GroenLinks": "#388E3C",
"GroenLinks-PvdA": "#2E7D32",
"CU": "#0288D1",
"SGP": "#F4511E",
"PvdD": "#43A047",
"FVD": "#6A1B9A",
"JA21": "#7B1FA2",
"BBB": "#8D6E63",
"NSC": "#FF8F00",
"Nieuw Sociaal Contract": "#FF8F00",
"DENK": "#00897B",
"50PLUS": "#7E57C2",
"Volt": "#572AB7",
"ChristenUnie": "#0288D1",
"Unknown": "#9E9E9E",
}
SVD_THEMES: dict[int, dict[str, str]] = {
1: {
"label": "Economische sectorbelangen versus sociale welvaart",
"explanation": (
"Deze as scheidt rechts kabinetsbeleid van links oppositiebeleid. "
"Aan de positieve kant staan PVV, NSC, SGP en BBB. "
"Aan de negatieve kant staan PvdD, GroenLinks-PvdA en DENK. "
"Deze as weerspiegelt de klassieke links-rechts verdeling op economisch en migratiebeleid."
),
"positive_pole": "Rechts: PVV, NSC, SGP, BBB — kabinetsbeleid, defensie en restricties",
"negative_pole": "Links: PvdD, GroenLinks-PvdA, DENK — oppositie, zorg en multilateraal",
"flip": False,
},
2: {
"label": "Nationalistische versus multilateralistische oriëntatie",
"explanation": (
"Deze as meet een onafhankelijke culturele dimensie: nationalistisch-populistisch "
"tegenover kosmopolitisch-mainstream. Aan de positieve kant staan PVV en FVD. "
"Aan de negatieve kant staan Volt, GroenLinks-PvdA, DENK en SP. "
"Deze as is onafhankelijk van links-rechts (as 1) en scheidt partijen "
"op hun houding tegenover nationale identiteit, EU-samenwerking en de "
"etnisch-culturele dimensie."
),
"positive_pole": "Nationalistisch/populistisch — PVV, FVD: nationale identiteit en soevereiniteit",
"negative_pole": "Kosmopolitisch/mainstream — Volt, GL-PvdA, DENK, SP: EU en internationale samenwerking",
"flip": False,
},
3: {
"label": "Verzorgingsstaat versus defensie en nationale veiligheid",
"explanation": (
"Deze as weerspiegelt de spanning tussen staatsingrijpen en marktliberalisme, "
"aangescherpt door de kabinetscrisis van 2025. Aan de positieve kant staan moties "
"die bezuinigingen op zorg en het gemeentefonds willen terugdraaien, winstuitkeringen "
"in de zorg verbieden en publieke controle over ziekenhuisfusies eisen. SP, PvdD, "
"GroenLinks-PvdA stemmen hier gelijk — ondanks hun tegengestelde PC1-posities. "
"Aan de negatieve kant staan moties "
"over marktwerking in de zorg, fiscale bedrijfsopvolgingsfaciliteiten (VVD), "
"doorgaan met besturen ondanks de kabinetscrisis (VVD/BBB) en defensie-"
"uitgaven van 3,5% bbp."
),
"positive_pole": "Pro-verzorgingsstaat: SP, PvdD, GroenLinks-PvdA (anti-bezuinigingen)",
"negative_pole": "Marktliberaal en fiscaal conservatief: VVD, D66, CDA, SGP, BBB",
"flip": True,
},
4: {
"label": "Internationale instituties en multilateralisme versus nationale soevereiniteit",
"explanation": (
"Een residuele as met een brede spreiding van partijen. "
"Aan de negatieve kant staan moties waar NSC en BBB sterk op scoren. "
"Aan de positieve kant staan moties waar D66, CDA en JA21 sterk op scoren. "
"FVD en DENK scoren rond het midden — deze as scheidt hen niet van de rest. "
"Dit is geen klassieke links-rechts verdeling maar een mengeling van "
"thematische posities — het label is indicatief."
),
"positive_pole": "D66, CDA, JA21 — moties met brede steun",
"negative_pole": "NSC, BBB — moties met andere focus",
"flip": False,
},
5: {
"label": "Gemeenschapszin versus individuele rechten",
"explanation": (
"Deze as scheidt christelijk-sociale partijen van progressieve partijen op het "
"vlak van gemeenschapswaarden. Aan de positieve kant staan moties over "
"schuldhulpverlening via vrijwilligersorganisaties, maatschappelijke "
"diensttijd voor jongeren, gastouderopvang en financiële prikkels voor scholieren. "
"ChristenUnie, SGP, CDA en NSC voeren hier de toon; ook D66 en FVD scoren positief. "
"Aan de negatieve kant staan moties over wettelijke erkenning van meerouderschap, "
"abortusrecht in het EU-Handvest, armoedebeleid en sociaal-maatschappelijke thema's. "
"SP, VVD, GL-PvdA, PvdD en Volt scoren negatief."
),
"positive_pole": "Christelijk-sociaal: ChristenUnie, SGP, CDA, NSC — gemeenschap en vrijwilligers",
"negative_pole": "Progressief-individueel: SP, VVD, GL-PvdA, PvdD, Volt — individuele rechten",
"flip": False,
},
6: {
"label": "Ecologische transitie versus economische conservatie",
"explanation": (
"Deze as combineert migratie- en culturele posities. Aan de positieve kant staan "
"moties over asielrestricties, nationale cultuur en identiteit, en beperkte "
"immigratie. PVV, JA21, BBB, CDA, ChristenUnie, VVD, SGP, FVD en DENK scoren positief. "
"Aan de negatieve kant staan moties over klimaatmaatregelen, progressieve "
"inclusie, discriminatiebestrijding en internationale samenwerking. "
"SP, PvdD, D66, GL-PvdA en Volt scoren negatief. "
"De as scheidt partijen met restrictief migratiebeleid van partijen met "
"progressief-inclusief beleid."
),
"positive_pole": "Restrictief migratiebeleid: PVV, JA21, BBB, CDA, ChristenUnie, VVD, SGP, FVD, DENK",
"negative_pole": "Progressieve inclusie: SP, PvdD, D66, GL-PvdA, Volt — klimaat en diversiteit",
"flip": False,
},
7: {
"label": "Praktisch-bestuurlijk versus idealistisch-proceduraal",
"explanation": (
"Een residuele as die overwegend beleidsdossiers uit 2024 (vorige parlementaire "
"periode) omvat. De scores zijn smal (max ~11 punten) en de partijcombinaties "
"ideologisch divers — dit label is indicatief. Aan de positieve kant staan "
"pragmatische bestuursmoties: een compleet kostenoverzicht van producten van eigen "
"bodem, papieren schoolboeken voor basisvaardigheden, een invoeringstoets voor het "
"minimumloon en de A2-snelwegplanning. ChristenUnie, Volt, DENK en SP scoren "
"positief. Aan de negatieve kant staan meer ideologisch geladen moties: een "
"landelijk stookverbod (PvdD), het strafbaar stellen van verbranding van religieuze "
"geschriften (DENK), chroom-6 schadevergoedingen en tegenhouden van nieuwe "
"gaswinning. GroenLinks-PvdA, VVD, FVD en JA21 scoren negatief."
),
"positive_pole": "Praktisch-bestuurlijk: ChristenUnie, Volt, SGP, DENK, SP",
"negative_pole": "Ideologisch-principieel: GroenLinks-PvdA, VVD, FVD, JA21",
"flip": True,
},
8: {
"label": "Internationale samenwerking versus nationale soevereiniteit",
"explanation": (
"Een residuele as die overwegend thematisch diverse moties uit 2024-2025 vangt. "
"Aan de positieve kant staan moties over vaccinatiegraad-verlaging voor kinderen, "
"een VWO-profiel kunst en cultuur, stages voor mbo-studenten in het buitenland, "
"en woningbouw voor jongeren in kleine kernen. BBB, SGP en JA21 scoren positief. "
"Aan de negatieve kant staan moties over het instellen van een vaccinatiecommissie, "
"heropening van het coronaoversterfte-onderzoek, regionale energiestrategieën "
"en toegankelijkheid van het basispakket. SP, DENK en PvdD scoren sterk negatief. "
"Deze as combineert onderwijs- en volksgezondheidsposities met regionale "
"huisvestingsprioriteiten — het label is indicatief."
),
"positive_pole": "Onderwijs en volksgezondheid: BBB, SGP, JA21 — vaccinatie, profielkeuze, woningbouw",
"negative_pole": "Zorg en toegankelijkheid: SP, DENK, PvdD, Volt — coronaonderzoek, energie, basispakket",
"flip": False,
},
9: {
"label": "Pragmatische probleemoplossing versus regulering",
"explanation": (
"Deze as scheidt pragmatische, concrete probleemoplossing van idealistische "
"systeemhervorming. Aan de positieve kant staan moties over naleving van de "
"Financiële-verhoudingswet voor gemeenten, beperking van arbeidsmigratie, "
"een nieuwe tandartsopleiding in Rotterdam, een actieplan tegen misbruik van "
"hallucinerende geneesmiddelen en oplossingen voor milieuproblemen op Bonaire. "
"SGP en ChristenUnie scoren sterk positief; ook DENK en SP. Aan de negatieve kant "
"staan moties over een moratorium op geitenstallen, een verbod op gokadvertenties, "
"verduidelijking van gronden voor voorlopige hechtenis, een leegstandbelasting "
"en end-to-end-encryptie. D66, JA21 en PVV scoren negatief. "
"Deze as is indicatief — de scores zijn smal en ideologisch divers."
),
"positive_pole": "Pragmatisch-bestuurlijk: SGP, ChristenUnie, DENK, SP — concrete oplossingen",
"negative_pole": "Systeemhervorming: D66, JA21, PVV — idealistische beleidsposities",
"flip": False,
},
10: {
"label": "Minder overheidsbemoeienis versus meer handhaving",
"explanation": (
"Deze as scheidt partijen die kritisch staan tegenover overheidsbemoeienis van "
"partijen die strikte regulering en handhaving steunen. Aan de positieve kant "
"staan moties over minder tijdsintensieve schoolinspecties, het recht van "
"toeslagenouders op hun persoonlijk dossier, behoud van tegemoetkomingen voor "
"arbeidsongeschikten en verlaging van de leeftijdsdrempel voor kindgesprekken. "
"DENK, SP en PvdD scoren positief. Aan de negatieve kant staan moties over "
"een aangifteplicht voor scholen bij veiligheidsincidenten, een rookverbod in "
"auto's met kinderen, braakliggende landbouwgrond en verhoogd beloningsgeld "
"voor tipgevers. GroenLinks-PvdA scoort opvallend sterk negatief. "
"Deze as is indicatief — de scores zijn smal en de partijcombinaties divers."
),
"positive_pole": "Kritisch op overheidsbemoeienis: DENK, SP, PvdD — minder inspectielast en lastenverlichting",
"negative_pole": "Pro-regulering: GroenLinks-PvdA, CDA, SGP — veiligheid, naleving en handhaving",
"flip": True,
},
}
KNOWN_MAJOR_PARTIES = [
"VVD",
"PVV",
"D66",
"GroenLinks-PvdA",
"GroenLinks",
"PvdA",
"CDA",
"SP",
"NSC",
"CU",
"BBB",
]
CURRENT_PARLIAMENT_PARTIES: frozenset[str] = frozenset(
{
"PVV",
"VVD",
"NSC",
"BBB",
"D66",
"GroenLinks-PvdA",
"CDA",
"SP",
"ChristenUnie",
"SGP",
"Volt",
"DENK",
"PvdD",
"JA21",
"FVD",
}
)
_PARTY_NORMALIZE: dict[str, str] = {
"Nieuw Sociaal Contract": "NSC",
"CU": "ChristenUnie",
"GL": "GroenLinks-PvdA",
"GroenLinks": "GroenLinks-PvdA",
"PvdA": "GroenLinks-PvdA",
"Gündoğan": "Volt",
"Lid Keijzer": "BBB",
"Groep Markuszower": "PVV",
}