diff --git a/server/core/wagtail_hooks.py b/server/core/wagtail_hooks.py index 2d85789a..e78aa834 100644 --- a/server/core/wagtail_hooks.py +++ b/server/core/wagtail_hooks.py @@ -1,8 +1,12 @@ +from django.db.models import ProtectedError +from django.shortcuts import redirect +from wagtail.admin import messages import wagtail.admin.rich_text.editors.draftail.features as draftail_features from wagtail.admin.rich_text.converters.html_to_contentstate import ( InlineStyleElementHandler, ) from wagtail import hooks +from wagtail.admin.utils import get_valid_next_url_from_request from basicknowledge.models import BasicKnowledge from books.models import ContentBlockSnapshot @@ -142,3 +146,55 @@ def after_create_hook(request, page): if type(page.specific) == ContentBlock: content_block = page.specific content_block.reassign_entities() + + +@hooks.register("before_delete_page") +def on_page_delete(request, page): + if request.method != "POST": + return + + try: + next_url = get_valid_next_url_from_request(request) + parent_id = page.get_parent().id + page.delete() + + messages.success( + request, ("Page '{0}' deleted.").format(page.get_admin_display_title()) + ) + + for fn in hooks.get_hooks("after_delete_page"): + result = fn(request, page) + if hasattr(result, "status_code"): + return result + + if next_url: + return redirect(next_url) + return redirect("wagtailadmin_explore", parent_id) + + except ProtectedError as exc: + protected_objects = {} + for obj in exc.protected_objects: + model_name = obj._meta.verbose_name_plural + if model_name in protected_objects: + protected_objects[model_name].append(str(obj)) + else: + protected_objects[model_name] = [str(obj)] + + dependency_summary = [] + for model_name, items in protected_objects.items(): + if len(items) == 1: + items_summary = ("{0} ({1})").format(model_name, items[0]) + else: + items_summary = ("{0} ({1} and {2} more...)").format( + model_name, items[0], len(items) - 1 + ) + + dependency_summary.append(items_summary) + + messages.error( + request, + ("Page '{0}' cannot be deleted while it's used by {1}").format( + page.get_admin_display_title(), ", ".join(dependency_summary) + ), + ) + return redirect("wagtailadmin_pages:delete", page.id)