Skip to content

Commit 7cec4e9

Browse files
committed
#12135: Elegantly handle ProtectedError/RestrictedError exceptions
1 parent e4824db commit 7cec4e9

File tree

1 file changed

+21
-1
lines changed

1 file changed

+21
-1
lines changed

netbox/netbox/views/generic/object_views.py

+21-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from django.db import router, transaction
77
from django.db.models import ProtectedError, RestrictedError
88
from django.db.models.deletion import Collector
9+
from django.http import HttpResponse
910
from django.shortcuts import redirect, render
1011
from django.urls import reverse
1112
from django.utils.html import escape
@@ -343,6 +344,19 @@ def _get_dependent_objects(self, obj):
343344

344345
return dict(dependent_objects)
345346

347+
def _handle_protected_objects(self, obj, protected_objects, request, exc):
348+
"""
349+
Handle a ProtectedError or RestrictedError exception raised while attempt to resolve dependent objects.
350+
"""
351+
handle_protectederror(protected_objects, request, exc)
352+
353+
if is_htmx(request):
354+
return HttpResponse(headers={
355+
'HX-Redirect': obj.get_absolute_url(),
356+
})
357+
else:
358+
return redirect(obj.get_absolute_url())
359+
346360
#
347361
# Request handlers
348362
#
@@ -356,7 +370,13 @@ def get(self, request, *args, **kwargs):
356370
"""
357371
obj = self.get_object(**kwargs)
358372
form = ConfirmationForm(initial=request.GET)
359-
dependent_objects = self._get_dependent_objects(obj)
373+
374+
try:
375+
dependent_objects = self._get_dependent_objects(obj)
376+
except ProtectedError as e:
377+
return self._handle_protected_objects(obj, e.protected_objects, request, e)
378+
except RestrictedError as e:
379+
return self._handle_protected_objects(obj, e.restricted_objects, request, e)
360380

361381
# If this is an HTMX request, return only the rendered deletion form as modal content
362382
if is_htmx(request):

0 commit comments

Comments
 (0)