diff --git a/cookbook/models.py b/cookbook/models.py index 1e682f3a..af2f6d85 100644 --- a/cookbook/models.py +++ b/cookbook/models.py @@ -458,6 +458,9 @@ class Step(ExportModelOperationsMixin('step'), models.Model, PermissionModelMixi from cookbook.helper.template_helper import render_instructions return render_instructions(self) + def __str__(self): + return f'{self.pk} {self.name}' + class Meta: ordering = ['order', 'pk'] indexes = (GinIndex(fields=["search_vector"]),) diff --git a/cookbook/templates/generic/delete_template.html b/cookbook/templates/generic/delete_template.html index 2867f819..ba3382c8 100644 --- a/cookbook/templates/generic/delete_template.html +++ b/cookbook/templates/generic/delete_template.html @@ -22,13 +22,11 @@ {{ form|crispy }} - {% if related_objects %} - {% blocktrans %} {{ object }} could not be deleted because it is still referenced by the following instances: {% endblocktrans %} -
-
- {% for o in related_objects %} + {% if protected_objects %} +
{% trans 'Protected' %} The object you are trying to delete is protected by the following references to it.
+ {% for o in protected_objects %} {% class_name o.model as name %} -
{{ name }}
+ {{ name }} - {% endfor %} - - -
{% endif %} - {% trans 'Cancel' %} diff --git a/cookbook/views/delete.py b/cookbook/views/delete.py index 466c8733..55b5ab2b 100644 --- a/cookbook/views/delete.py +++ b/cookbook/views/delete.py @@ -1,4 +1,5 @@ from django.contrib import messages +from django.db import models from django.db.models import ProtectedError from django.http import HttpResponseRedirect from django.shortcuts import get_object_or_404, render @@ -24,30 +25,36 @@ class RecipeDelete(GroupRequiredMixin, DeleteView): success_url = reverse_lazy('index') def delete(self, request, *args, **kwargs): - obj = self.get_object() - - related_objects = [] - for x in obj._meta.get_fields(): - try: - related = x.related_model.objects.filter(**{x.field.name: obj}) - if related.exists(): - related_objects.append(related) - except AttributeError: - pass - - if related_objects: - self.object = obj - return render(request, template_name=self.template_name, context=self.get_context_data(related_objects=related_objects)) + self.object = self.get_object() + # TODO make this more generic so that all delete functions benefit from this + if self.get_context_data()['protected_objects']: + return render(request, template_name=self.template_name, context=self.get_context_data()) success_url = self.get_success_url() - obj.delete() + self.object.delete() return HttpResponseRedirect(success_url) def get_context_data(self, **kwargs): context = super(RecipeDelete, self).get_context_data(**kwargs) context['title'] = _("Recipe") - if 'related_objects' in kwargs: - context['related_objects'] = kwargs.pop('related_objects') + + # TODO make this more generic so that all delete functions benefit from this + self.object = self.get_object() + context['protected_objects'] = [] + context['cascading_objects'] = [] + context['set_null_objects'] = [] + for x in self.object._meta.get_fields(): + try: + related = x.related_model.objects.filter(**{x.field.name: self.object}) + if related.exists() and x.on_delete == models.PROTECT: + context['protected_objects'].append(related) + if related.exists() and x.on_delete == models.CASCADE: + context['cascading_objects'].append(related) + if related.exists() and x.on_delete == models.SET_NULL: + context['set_null_objects'].append(related) + except AttributeError: + pass + return context