60 lines
1.5 KiB
Python
60 lines
1.5 KiB
Python
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()
|