Files
mandelstudio/mandelblog_content_guard/hooks.py

96 lines
3.4 KiB
Python

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)