96 lines
3.4 KiB
Python
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)
|