From 6be745f13cd5004d40aed03121bf401f4e1d5c86 Mon Sep 17 00:00:00 2001
From: Jamie Murphy
Date: Tue, 31 Oct 2023 21:36:38 +0000
Subject: [PATCH] refactor, add accordion
---
netbox/netbox/views/generic/object_views.py | 34 +++++++++++++++------
netbox/templates/htmx/delete_form.html | 26 +++++++++++-----
2 files changed, 44 insertions(+), 16 deletions(-)
diff --git a/netbox/netbox/views/generic/object_views.py b/netbox/netbox/views/generic/object_views.py
index f0e50c7ab..478b7818f 100644
--- a/netbox/netbox/views/generic/object_views.py
+++ b/netbox/netbox/views/generic/object_views.py
@@ -321,6 +321,30 @@ class ObjectDeleteView(GetReturnURLMixin, BaseObjectView):
def get_required_permission(self):
return get_permission_for_model(self.queryset.model, 'delete')
+ def _get_dependent_objects(self, obj):
+ """
+ Returns a dict of dependent objects, model names as primary key, inside each two keys exist name and items (list)
+
+ Args:
+ obj: The object to return dependent objects for
+ """
+ using = router.db_for_write(obj._meta.model)
+ collector = Collector(using=using)
+ collector.collect([obj])
+ related_objects = {}
+ for model, instance in collector.instances_with_model():
+ if instance == obj:
+ continue
+ if model.__name__ not in related_objects:
+ related_objects[model.__name__] = {
+ "name": model._meta.verbose_name,
+ "items": []
+ }
+ related_objects[model.__name__]['items'].append(instance)
+ if len(related_objects[model.__name__]['items']) > 1:
+ related_objects[model.__name__]['name'] = model._meta.verbose_name_plural
+ return related_objects
+
#
# Request handlers
#
@@ -335,15 +359,7 @@ class ObjectDeleteView(GetReturnURLMixin, BaseObjectView):
obj = self.get_object(**kwargs)
form = ConfirmationForm(initial=request.GET)
- using = router.db_for_write(obj._meta.model)
- collector = Collector(using=using)
- collector.collect([obj])
- related_objects = {}
- for model, instance in collector.instances_with_model():
- # we could ignore the instance == obj so that the list doesnt contain itself...
- if model.__name__ not in related_objects:
- related_objects[model.__name__] = []
- related_objects[model.__name__].append(instance)
+ related_objects = self._get_dependent_objects(obj)
# If this is an HTMX request, return only the rendered deletion form as modal content
if is_htmx(request):
diff --git a/netbox/templates/htmx/delete_form.html b/netbox/templates/htmx/delete_form.html
index 370f48851..71e70ba6e 100644
--- a/netbox/templates/htmx/delete_form.html
+++ b/netbox/templates/htmx/delete_form.html
@@ -14,14 +14,26 @@
{% if related_objects %}
- This will cause deletion of the following items:
- {% for model,objects in related_objects.items %}
- - {{ model }}:
- {% for object in objects %}
- {{ object | linkify }}{% if not forloop.last %}, {% endif %}
- {% endfor %}
-
+ This will cause deletion of the following objects:
+
+
+ {% for model,object_dict in related_objects.items %}
+
+
+
+
+ {% for object in object_dict.items %}
+ - {{ object | linkify }}{% if not forloop.last %}
{% endif %}
+ {% endfor %}
+
+
+
{% endfor %}
+
{% endif %}
{% render_form form %}