From 7cec4e9e2218e0e8bf03ef6c184c8696f5421c0d Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 1 Dec 2023 09:51:54 -0500 Subject: [PATCH] #12135: Elegantly handle ProtectedError/RestrictedError exceptions --- netbox/netbox/views/generic/object_views.py | 22 ++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/netbox/netbox/views/generic/object_views.py b/netbox/netbox/views/generic/object_views.py index 456c2e14f..c775f12a0 100644 --- a/netbox/netbox/views/generic/object_views.py +++ b/netbox/netbox/views/generic/object_views.py @@ -6,6 +6,7 @@ from django.contrib import messages from django.db import router, transaction from django.db.models import ProtectedError, RestrictedError from django.db.models.deletion import Collector +from django.http import HttpResponse from django.shortcuts import redirect, render from django.urls import reverse from django.utils.html import escape @@ -343,6 +344,19 @@ class ObjectDeleteView(GetReturnURLMixin, BaseObjectView): return dict(dependent_objects) + def _handle_protected_objects(self, obj, protected_objects, request, exc): + """ + Handle a ProtectedError or RestrictedError exception raised while attempt to resolve dependent objects. + """ + handle_protectederror(protected_objects, request, exc) + + if is_htmx(request): + return HttpResponse(headers={ + 'HX-Redirect': obj.get_absolute_url(), + }) + else: + return redirect(obj.get_absolute_url()) + # # Request handlers # @@ -356,7 +370,13 @@ class ObjectDeleteView(GetReturnURLMixin, BaseObjectView): """ obj = self.get_object(**kwargs) form = ConfirmationForm(initial=request.GET) - dependent_objects = self._get_dependent_objects(obj) + + try: + dependent_objects = self._get_dependent_objects(obj) + except ProtectedError as e: + return self._handle_protected_objects(obj, e.protected_objects, request, e) + except RestrictedError as e: + return self._handle_protected_objects(obj, e.restricted_objects, request, e) # If this is an HTMX request, return only the rendered deletion form as modal content if is_htmx(request):