diff options
author | Magnus Hagander | 2019-12-21 14:02:05 +0000 |
---|---|---|
committer | Magnus Hagander | 2019-12-21 14:02:05 +0000 |
commit | a62eb81a1785b97b07667ed03add3fc63b7cc06f (patch) | |
tree | 938ada09576096af5b6c0b346fa96e9e7eb7ceb5 /postgresqleu/util/backendviews.py | |
parent | 0972936b7aa607bac77c6762bff4aa5e95b2f935 (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.py | 13 |
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: |