Add multilingual audit CI pipeline + extract mandelblog_content_guard

This commit is contained in:
2026-03-29 20:49:42 +02:00
parent 2a51989fa4
commit 1f05011a63
104 changed files with 3372 additions and 6 deletions

View File

@@ -0,0 +1,79 @@
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