""" Rendert die Doc-Type-Mismatch-Hinweise als Mail-Block. Wenn der User Text in das falsche Feld kopiert (z.B. Impressum-Text ins DSE-Feld), zeigt der Block: - was er deklariert hat - was der Classifier erkannt hat - Empfehlung (re-paste oder als unbekannt einreichen) """ from __future__ import annotations import logging from typing import Iterable logger = logging.getLogger(__name__) _DOC_LABELS = { "dse": "Datenschutzerklaerung", "cookie": "Cookie-Richtlinie", "impressum": "Impressum", "agb": "AGB", "widerruf": "Widerrufsbelehrung", "nutzungsbedingungen": "Nutzungsbedingungen", "social_media": "Social Media DSE", "dsfa": "DSFA", "dsa": "DSA-Pflichtangaben", "legal_notice": "Rechtliche Hinweise", "lizenzhinweise": "Lizenzhinweise", } def _label(dt: str) -> str: return _DOC_LABELS.get(dt, dt) def collect_warnings(doc_entries: Iterable[dict]) -> list[dict]: """Returns list of {declared, detected, action, scores} fuer alle doc_entries mit einem reclassify_hint.""" out: list[dict] = [] for e in (doc_entries or []): hint = e.get("reclassify_hint") if not hint: continue out.append({ "input_source": e.get("input_source"), "declared": hint.get("declared"), "detected": hint.get("detected"), "action": hint.get("action"), "declared_score": hint.get("declared_score", 0), "detected_score": hint.get("detected_score", 0), "all_scores": hint.get("all_scores") or {}, "word_count": e.get("word_count", 0), }) return out def build_warnings_block_html(warnings: list[dict]) -> str: if not warnings: return "" items: list[str] = [] for w in warnings: action = w.get("action") if action == "reclassify": color = "#0e7490" badge = "AUTO-RECLASSIFIZIERT" body = ( f'Sie haben den Text als {_label(w["declared"])} ' f'eingereicht, das System hat ihn aber automatisch als ' f'{_label(w["detected"])} erkannt und entsprechend ' f'gepruft (Konfidenz-Score: {w["detected_score"]} vs ' f'{w["declared_score"]} für die deklarierte Kategorie).' ) else: color = "#d97706" badge = "MOEGLICHER MISMATCH" body = ( f'Sie haben den Text als {_label(w["declared"])} ' f'eingereicht. Der Inhalt enthaelt aber Patterns die eher zu ' f'{_label(w["detected"])} passen ' f'({w["detected_score"]} vs {w["declared_score"]}). ' 'Bitte pruefen Sie ob Sie den richtigen Doc-Typ ausgewaehlt haben.' ) items.append( f'
  • ' f'[{badge}] {body}' f'
  • ' ) return ( '
    ' '
    ' 'Hinweise zum eingefügten Text
    ' '
    ' )