فهرست منبع

#12135: Elegantly handle ProtectedError/RestrictedError exceptions

Jeremy Stretch 2 سال پیش
والد
کامیت
7cec4e9e22
1فایلهای تغییر یافته به همراه21 افزوده شده و 1 حذف شده
  1. 21 1
      netbox/netbox/views/generic/object_views.py

+ 21 - 1
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 import router, transaction
 from django.db.models import ProtectedError, RestrictedError
 from django.db.models import ProtectedError, RestrictedError
 from django.db.models.deletion import Collector
 from django.db.models.deletion import Collector
+from django.http import HttpResponse
 from django.shortcuts import redirect, render
 from django.shortcuts import redirect, render
 from django.urls import reverse
 from django.urls import reverse
 from django.utils.html import escape
 from django.utils.html import escape
@@ -343,6 +344,19 @@ class ObjectDeleteView(GetReturnURLMixin, BaseObjectView):
 
 
         return dict(dependent_objects)
         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
     # Request handlers
     #
     #
@@ -356,7 +370,13 @@ class ObjectDeleteView(GetReturnURLMixin, BaseObjectView):
         """
         """
         obj = self.get_object(**kwargs)
         obj = self.get_object(**kwargs)
         form = ConfirmationForm(initial=request.GET)
         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 this is an HTMX request, return only the rendered deletion form as modal content
         if is_htmx(request):
         if is_htmx(request):