summaryrefslogtreecommitdiff
path: root/postgresqleu/util/backendviews.py
diff options
context:
space:
mode:
authorMagnus Hagander2019-12-21 14:02:05 +0000
committerMagnus Hagander2019-12-21 14:02:05 +0000
commita62eb81a1785b97b07667ed03add3fc63b7cc06f (patch)
tree938ada09576096af5b6c0b346fa96e9e7eb7ceb5 /postgresqleu/util/backendviews.py
parent0972936b7aa607bac77c6762bff4aa5e95b2f935 (diff)
Allow a model to prevent the backend editors from deleting it
By definiting a method called validate_object_delete, the model can raise a ValidationError which will act the same way as an object attached via a foreign key in how it prevents the deletion of the object.
Diffstat (limited to 'postgresqleu/util/backendviews.py')
-rw-r--r--postgresqleu/util/backendviews.py13
1 files changed, 11 insertions, 2 deletions
diff --git a/postgresqleu/util/backendviews.py b/postgresqleu/util/backendviews.py
index edde72e6..2e4d08ba 100644
--- a/postgresqleu/util/backendviews.py
+++ b/postgresqleu/util/backendviews.py
@@ -1,4 +1,4 @@
-from django.core.exceptions import PermissionDenied
+from django.core.exceptions import PermissionDenied, ValidationError
from django.db import transaction
from django import forms
from django.shortcuts import render, get_object_or_404
@@ -110,6 +110,12 @@ def backend_process_form(request, urlname, formclass, id, cancel_url='../', save
extra_error = None
if allow_delete and request.POST['submit'] == 'Delete':
if instance.pk:
+ if hasattr(instance, 'validate_object_delete'):
+ try:
+ instance.validate_object_delete()
+ except ValidationError as e:
+ extra_error = "This {0} cannot be deleted: {1}".format(formclass.Meta.model._meta.verbose_name, e.message)
+
# Are there any associated objects here, by any chance?
collector = NestedObjects(using='default')
collector.collect([instance, ])
@@ -117,7 +123,10 @@ def backend_process_form(request, urlname, formclass, id, cancel_url='../', save
to_delete.remove(instance)
if to_delete:
to_delete = [d for d in flatten_list(to_delete[0]) if d._meta.model_name not in formclass.auto_cascade_delete_to]
- if to_delete:
+
+ if extra_error:
+ pass
+ elif to_delete:
pieces = [str(to_delete[n]) for n in range(0, min(5, len(to_delete))) if not isinstance(to_delete[n], list)]
extra_error = "This {0} cannot be deleted. It would have resulted in the following other objects also being deleted: {1}".format(formclass.Meta.model._meta.verbose_name, ', '.join(pieces))
else: