Add multilingual audit CI pipeline + extract mandelblog_content_guard
This commit is contained in:
95
mandelblog_content_guard/hooks.py
Normal file
95
mandelblog_content_guard/hooks.py
Normal file
@@ -0,0 +1,95 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from django.contrib import messages
|
||||
from django.http import HttpResponseRedirect
|
||||
from wagtail import hooks
|
||||
|
||||
from .types import format_issue, split_issues
|
||||
from .validators.multilingual import validate_page, validate_posted_snippet, validate_snippet_instance
|
||||
|
||||
|
||||
def _flash_issues(request, level, prefix: str, issues):
|
||||
preview = issues[:6]
|
||||
for issue in preview:
|
||||
messages.add_message(request, level, f"{prefix}: {format_issue(issue)}")
|
||||
remaining = len(issues) - len(preview)
|
||||
if remaining > 0:
|
||||
messages.add_message(request, level, f"{prefix}: {remaining} more issue(s) not shown.")
|
||||
|
||||
|
||||
@hooks.register("before_publish_page")
|
||||
def prevent_corrupt_multilingual_publish(request, page):
|
||||
issues = validate_page(page)
|
||||
blocking, warnings = split_issues(issues)
|
||||
if warnings:
|
||||
_flash_issues(request, messages.WARNING, "Content guard warning", warnings)
|
||||
if not blocking:
|
||||
return None
|
||||
_flash_issues(request, messages.ERROR, "Publishing blocked", blocking)
|
||||
return HttpResponseRedirect(request.path)
|
||||
|
||||
|
||||
@hooks.register("after_edit_page")
|
||||
def warn_on_corrupt_multilingual_draft(request, page):
|
||||
blocking, warnings = split_issues(validate_page(page))
|
||||
if blocking:
|
||||
_flash_issues(request, messages.WARNING, "Draft warning", blocking)
|
||||
if warnings:
|
||||
_flash_issues(request, messages.WARNING, "Draft warning", warnings)
|
||||
|
||||
|
||||
def _snippet_locale_code(instance, request) -> str:
|
||||
posted_locale = request.POST.get("locale") if request.method == "POST" else None
|
||||
if posted_locale:
|
||||
return posted_locale
|
||||
locale = getattr(instance, "locale", None)
|
||||
if locale is not None and getattr(locale, "language_code", None):
|
||||
return locale.language_code
|
||||
return "nl"
|
||||
|
||||
|
||||
def _validate_snippet_request(request, instance):
|
||||
if request.method != "POST":
|
||||
return None
|
||||
issues = validate_posted_snippet(_snippet_locale_code(instance, request), request.POST.dict())
|
||||
blocking, warnings = split_issues(issues)
|
||||
if warnings:
|
||||
_flash_issues(request, messages.WARNING, "Snippet warning", warnings)
|
||||
if not blocking:
|
||||
return None
|
||||
_flash_issues(request, messages.ERROR, "Snippet save blocked", blocking)
|
||||
return HttpResponseRedirect(request.path)
|
||||
|
||||
|
||||
@hooks.register("before_create_snippet")
|
||||
def prevent_corrupt_snippet_create(request, model):
|
||||
instance = model()
|
||||
posted_locale = request.GET.get("locale") or request.POST.get("locale")
|
||||
if posted_locale and hasattr(instance, "locale_id"):
|
||||
from wagtail.models import Locale
|
||||
|
||||
instance.locale = Locale.objects.get(language_code=posted_locale)
|
||||
return _validate_snippet_request(request, instance)
|
||||
|
||||
|
||||
@hooks.register("before_edit_snippet")
|
||||
def prevent_corrupt_snippet_edit(request, instance):
|
||||
return _validate_snippet_request(request, instance)
|
||||
|
||||
|
||||
def _warn_saved_snippet(request, instance):
|
||||
blocking, warnings = split_issues(validate_snippet_instance(instance))
|
||||
if blocking:
|
||||
_flash_issues(request, messages.WARNING, "Snippet integrity warning", blocking)
|
||||
if warnings:
|
||||
_flash_issues(request, messages.WARNING, "Snippet integrity warning", warnings)
|
||||
|
||||
|
||||
@hooks.register("after_create_snippet")
|
||||
def warn_on_saved_snippet_create(request, instance):
|
||||
_warn_saved_snippet(request, instance)
|
||||
|
||||
|
||||
@hooks.register("after_edit_snippet")
|
||||
def warn_on_saved_snippet_edit(request, instance):
|
||||
_warn_saved_snippet(request, instance)
|
||||
Reference in New Issue
Block a user