"""Report generation for HTML and PDF output.""" import subprocess from pathlib import Path from typing import Optional from jinja2 import Environment, FileSystemLoader from .models import Assessment, MATRIX_LABELS, EMPFEHLUNG_CONFIG # ECOnGOOD Colors COLORS = { "darkgray": "#5a5a5a", "green": "#889e33", "blue": "#009da5", "lightgray": "#bfbfbf", "orange": "#F7941D", "red": "#d00000", } def get_score_color(score: float) -> str: """Get color for a score value.""" if score >= 7: return COLORS["blue"] if score >= 4: return COLORS["green"] if score >= 2: return "#FFC20E" if score >= 1: return COLORS["orange"] return COLORS["red"] def get_rating_symbol(rating: int) -> str: """Convert numeric rating to symbol.""" if rating >= 2: return "++" if rating == 1: return "+" if rating == 0: return "○" if rating == -1: return "−" return "−−" def format_redline_html(text: str) -> str: """Convert redline markup to HTML.""" import re # **text** → green bold (inserted) text = re.sub(r'\*\*([^*]+)\*\*', r'\1', text) # ~~text~~ → red strikethrough (deleted) text = re.sub(r'~~([^~]+)~~', r'\1', text) return text def build_matrix_html(assessment: Assessment) -> str: """Build HTML matrix table.""" rating_map = {e.field: e for e in assessment.gwoe_matrix} rows = ["A", "B", "C", "D", "E"] row_labels = { "A": "Lieferant:innen", "B": "Finanzen", "C": "Führung/Verwaltung", "D": "Bürger:innen", "E": "Gesellschaft/Natur", } html = ['
| ') for col in range(1, 6): html.append(f' | {col} | ') html.append('|
|---|---|---|
| {row}: {row_labels[row]} | ') for col in range(1, 6): field = f"{row}{col}" entry = rating_map.get(field) if entry: symbol = get_rating_symbol(entry.rating) css_class = "positive" if entry.rating > 0 else ("negative" if entry.rating < 0 else "neutral") html.append(f'{symbol} | ') else: html.append('') html.append(' |
{assessment.antrag_zusammenfassung or 'Keine Zusammenfassung verfügbar.'}
{('Score: {assessment.gwoe_score}/10
Begründung: {assessment.gwoe_begruendung}
Schwerpunkte: {', '.join(assessment.gwoe_schwerpunkt)}
Legende: ++ stark fördernd, + fördernd, ○ neutral, − widersprechend, −− stark widersprechend
Wahlprogramm: {s.wahlprogramm.score}/10 — {s.wahlprogramm.begruendung}
Parteiprogramm: {s.parteiprogramm.score}/10 — {s.parteiprogramm.begruendung}
''' for s in assessment.wahlprogramm_scores)}Keine Verbesserungsvorschläge.
'}