Misc cleanup

This commit is contained in:
Jeremy Stretch 2023-11-01 11:29:09 -04:00
parent ee5be84911
commit 593fa468a5
2 changed files with 42 additions and 35 deletions

View File

@ -324,7 +324,8 @@ class ObjectDeleteView(GetReturnURLMixin, BaseObjectView):
def _get_dependent_objects(self, obj):
"""
Returns a dict of dependent objects, model names as primary key, inside each two keys exist title and objects (list)
Returns a dictionary mapping of dependent objects (organized by model) which will be deleted as a result of
deleting the requested object.
Args:
obj: The object to return dependent objects for
@ -332,18 +333,15 @@ class ObjectDeleteView(GetReturnURLMixin, BaseObjectView):
using = router.db_for_write(obj._meta.model)
collector = Collector(using=using)
collector.collect([obj])
related_objects = defaultdict(dict)
# Compile a mapping of models to instances
dependent_objects = defaultdict(list)
for model, instance in collector.instances_with_model():
if instance == obj:
continue
# Omit the root object
if instance != obj:
dependent_objects[model].append(instance)
related_objects.setdefault(model.__name__, {"objects": []})['objects'].append(instance)
if len(related_objects[model.__name__]['objects']) == 1:
related_objects[model.__name__]['title'] = title(model._meta.verbose_name)
else:
related_objects[model.__name__]['title'] = title(model._meta.verbose_name_plural)
return dict(related_objects)
return dict(dependent_objects)
#
# Request handlers
@ -358,8 +356,7 @@ class ObjectDeleteView(GetReturnURLMixin, BaseObjectView):
"""
obj = self.get_object(**kwargs)
form = ConfirmationForm(initial=request.GET)
related_objects = self._get_dependent_objects(obj)
dependent_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):
@ -370,7 +367,7 @@ class ObjectDeleteView(GetReturnURLMixin, BaseObjectView):
'object_type': self.queryset.model._meta.verbose_name,
'form': form,
'form_url': form_url,
'related_objects': related_objects,
'dependent_objects': dependent_objects,
**self.get_extra_context(request, obj),
})
@ -378,7 +375,7 @@ class ObjectDeleteView(GetReturnURLMixin, BaseObjectView):
'object': obj,
'form': form,
'return_url': self.get_return_url(request, obj),
'related_objects': related_objects,
'dependent_objects': dependent_objects,
**self.get_extra_context(request, obj),
})

View File

@ -12,29 +12,39 @@
Are you sure you want to <strong class="text-danger">delete</strong> {{ object_type }} <strong>{{ object }}</strong>?
{% endblocktrans %}
</p>
{% if related_objects %}
<p>
This will cause deletion of the following objects: <br>
{% if dependent_objects %}
<p>
{% trans "The following objects will be deleted as a result of this action." %}
</p>
<div class="accordion" id="deleteAccordion">
{% for model,object_dict in related_objects.items %}
<div class="accordion-item">
<h2 class="accordion-header" id="deleteheading{{ forloop.counter }}">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapse{{ forloop.counter }}" aria-expanded="false" aria-controls="collapse{{ forloop.counter }}">
{{ object_dict.objects |length }} {{ object_dict.title }}
</button>
</h2>
<div id="collapse{{ forloop.counter }}" class="accordion-collapse collapse" aria-labelledby="deleteheading{{ forloop.counter }}" data-bs-parent="#deleteAccordion">
<div class="accordion-body">
{% for object in object_dict.objects %}
- {{ object | linkify }}{% if not forloop.last %}<br> {% endif %}
{% endfor %}
{% for model, instances in dependent_objects.items %}
<div class="accordion-item">
<h2 class="accordion-header" id="deleteheading{{ forloop.counter }}">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapse{{ forloop.counter }}" aria-expanded="false" aria-controls="collapse{{ forloop.counter }}">
{% with object_count=instances|length %}
{{ object_count }}
{% if object_count == 1 %}
{{ model|meta:"verbose_name" }}
{% else %}
{{ model|meta:"verbose_name_plural" }}
{% endif %}
{% endwith %}
</button>
</h2>
<div id="collapse{{ forloop.counter }}" class="accordion-collapse collapse" aria-labelledby="deleteheading{{ forloop.counter }}" data-bs-parent="#deleteAccordion">
<div class="accordion-body p-0">
<div class="list-group list-group-flush">
{% for instance in instances %}
{% with url=instance.get_absolute_url %}
<a {% if url %}href="{{ url }}" {% endif %}class="list-group-item list-group-item-action">{{ instance }}</a>
{% endwith %}
{% endfor %}
</div>
</div>
</div>
</div>
</div>
{% endfor %}
</div>
</p>
{% endfor %}
</div>
{% endif %}
{% render_form form %}
</div>