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)