""" P18 — Erweiterter Banner-Block fuer die Email. Rendert die Daten aus dem consent-tester die heute weggeworfen wurden: - 3-Phasen-Cookie-Tabelle (before_consent / after_reject / after_accept) - Banner-Quality-Score (completeness/correctness/violations) - Per-Category-Tracker-Listing - Violations-Liste mit Rechtsgrundlagen """ from __future__ import annotations def _color_for(pct: int) -> str: return ("#16a34a" if pct >= 80 else "#d97706" if pct >= 50 else "#dc2626") def _short_phase_label(key: str) -> str: return { "before_consent": "Vor Consent", "after_reject": "Nach Ablehnung", "after_accept": "Nach Annahme", }.get(key, key) def _phase_color(key: str, cookie_count: int) -> str: if key == "before_consent": return "#16a34a" if cookie_count == 0 else "#dc2626" if key == "after_reject": return "#16a34a" if cookie_count <= 1 else "#d97706" return "#94a3b8" def build_banner_deep_html(banner_result: dict | None) -> str: """Render: Banner-Quality + Phases + Violations. Konsumiert das volle consent-tester-Response. Komplementiert `build_provider_list_html` (das nur Summary + TCF-Vendor-Tabelle macht). """ if not banner_result: return "" parts: list[str] = [ '
| '
f' '
f'Vollstaendigkeit '
f'{compl}% '
f' | '
)
if corr is not None:
c = _color_for(int(corr))
parts.append(
f''
f' '
f'Korrektheit '
f'{corr}% '
f' | '
)
viol_c = ("#dc2626" if n_critical + n_high > 0 else
"#d97706" if (summary.get("total_violations") or 0) > 0 else
"#16a34a")
parts.append(
f''
f' '
f'Verstoesse '
f''
f'{summary.get("total_violations", 0)}'
f''
f'(crit:{n_critical} high:{n_high}) | '
)
parts.append('
| Phase | ' 'Cookies | ' 'Tracker | ' 'Auffaelligkeiten | ' '
|---|---|---|---|
| ' f'' f'{_short_phase_label(key)} | ' f'{len(cookies)} | ' f'{len(trackers)} | ' f'{issues_str} | ' f'
| Kategorie | ' 'Anbieter | ' 'Hinweis | ' '
|---|---|---|
| {label} | ' f'{n} | ' f'' f'{hint} |