Add an error message when deleting a page with protected foreign keys
Resolves MS-691 #complete
This commit is contained in:
parent
05a7c3fc6f
commit
bbcfb98af6
|
|
@ -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
|
import wagtail.admin.rich_text.editors.draftail.features as draftail_features
|
||||||
from wagtail.admin.rich_text.converters.html_to_contentstate import (
|
from wagtail.admin.rich_text.converters.html_to_contentstate import (
|
||||||
InlineStyleElementHandler,
|
InlineStyleElementHandler,
|
||||||
)
|
)
|
||||||
from wagtail import hooks
|
from wagtail import hooks
|
||||||
|
from wagtail.admin.utils import get_valid_next_url_from_request
|
||||||
|
|
||||||
from basicknowledge.models import BasicKnowledge
|
from basicknowledge.models import BasicKnowledge
|
||||||
from books.models import ContentBlockSnapshot
|
from books.models import ContentBlockSnapshot
|
||||||
|
|
@ -142,3 +146,55 @@ def after_create_hook(request, page):
|
||||||
if type(page.specific) == ContentBlock:
|
if type(page.specific) == ContentBlock:
|
||||||
content_block = page.specific
|
content_block = page.specific
|
||||||
content_block.reassign_entities()
|
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)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue