from __future__ import annotations from django.conf import settings from .providers import ModerationConfigError, ModerationProvider, Verdict def moderation_enabled() -> bool: return bool(getattr(settings, "MODERATION_ENABLED", False)) def fail_closed() -> bool: return bool(getattr(settings, "MODERATION_FAIL_CLOSED", True)) def block_on_review() -> bool: return bool(getattr(settings, "MODERATION_BLOCK_ON_REVIEW", False)) def verdict_is_blocking(verdict: Verdict) -> bool: if verdict == Verdict.BLOCK: return True if verdict == Verdict.REVIEW: return block_on_review() return False def selected_provider_name() -> str: return str(getattr(settings, "MODERATION_PROVIDER", "") or "").strip().lower() def _build_keyword() -> ModerationProvider: from .providers.keyword import KeywordModerationProvider return KeywordModerationProvider() _PROVIDER_BUILDERS = { "keyword": _build_keyword, } def biz_type(stage: str) -> str: return stage def _build_provider() -> ModerationProvider: """按 MODERATION_PROVIDER 选具体厂商。未选 / 未知 → ModerationConfigError(上层按 fail-closed 处理)。""" name = selected_provider_name() if not name: raise ModerationConfigError("MODERATION_PROVIDER 未设置(内容安全厂商未选定)") builder = _PROVIDER_BUILDERS.get(name) if builder is None: raise ModerationConfigError(f"未知内容安全厂商: {name}") return builder() def get_text_provider() -> ModerationProvider: return _build_provider()