from __future__ import annotations """ Reusable configuration helpers for mandelblog_content_guard. Supported Django settings: - CONTENT_GUARD_STRICT: bool - CONTENT_GUARD_BLOCK_MEDIUM: bool - CONTENT_GUARD_LOCALES: list[str] - CONTENT_GUARD_REWRITE_ENABLED: bool - CONTENT_GUARD_REWRITE_BACKEND: dotted path | None """ from django.conf import settings DEFAULT_LOCALES = ["nl", "en", "de", "fr", "es", "it", "pt", "ru"] SEVERITY = { "CRITICAL": "block", "HIGH": "block", "MEDIUM": "warn", "LOW": "log", } ISSUE_LEVELS = { "known_bad_pattern": "CRITICAL", "wrong_language_fragment": "CRITICAL", "rendered_bad_pattern": "CRITICAL", "rendered_wrong_language": "CRITICAL", "render_status": "CRITICAL", "language_heuristic": "CRITICAL", "cta_language_mismatch": "HIGH", "form_language_mismatch": "HIGH", "empty_form_copy": "HIGH", "placeholder_value": "HIGH", "rewrite_candidate": "MEDIUM", "weak_marketing_copy": "MEDIUM", "foreign_ui_label": "MEDIUM", "generic_badge_label": "MEDIUM", "mixed_locale_heading": "MEDIUM", "cta_tone_check": "MEDIUM", } def strict_mode_enabled() -> bool: return getattr(settings, "CONTENT_GUARD_STRICT", True) def block_medium_enabled() -> bool: return getattr(settings, "CONTENT_GUARD_BLOCK_MEDIUM", False) def audit_default_locales() -> list[str]: return list(getattr(settings, "CONTENT_GUARD_LOCALES", DEFAULT_LOCALES)) def rewrite_enabled() -> bool: return getattr(settings, "CONTENT_GUARD_REWRITE_ENABLED", True) def get_rewrite_backend() -> str | None: return getattr(settings, "CONTENT_GUARD_REWRITE_BACKEND", None) def classify_issue(issue_type: str) -> str: return ISSUE_LEVELS.get(issue_type, "LOW") def severity_for_issue(issue_type: str) -> str: return SEVERITY[classify_issue(issue_type)] def should_block_issue(issue_type: str) -> bool: level = classify_issue(issue_type) if level in {"CRITICAL", "HIGH"}: return True if level == "MEDIUM": return block_medium_enabled() and strict_mode_enabled() return False