Deleting products: Catch ProtectedError

This commit is contained in:
Raphael Michel
2021-08-19 10:20:01 +02:00
parent 74dd13abd5
commit 5bc9ba4641

View File

@@ -41,7 +41,9 @@ from django.contrib import messages
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from django.core.files import File from django.core.files import File
from django.db import transaction from django.db import transaction
from django.db.models import Count, Exists, F, OuterRef, Prefetch, Q from django.db.models import (
Count, Exists, F, OuterRef, Prefetch, ProtectedError, Q,
)
from django.forms.models import inlineformset_factory from django.forms.models import inlineformset_factory
from django.http import ( from django.http import (
Http404, HttpResponse, HttpResponseBadRequest, HttpResponseRedirect, Http404, HttpResponse, HttpResponseBadRequest, HttpResponseRedirect,
@@ -1408,11 +1410,23 @@ class ItemDelete(EventPermissionRequiredMixin, DeleteView):
success_url = self.get_success_url() success_url = self.get_success_url()
o = self.get_object() o = self.get_object()
if o.allow_delete(): if o.allow_delete():
CartPosition.objects.filter(addon_to__item=self.get_object()).delete() try:
self.get_object().cartposition_set.all().delete() CartPosition.objects.filter(addon_to__item=self.get_object()).delete()
self.get_object().log_action('pretix.event.item.deleted', user=self.request.user) self.get_object().cartposition_set.all().delete()
self.get_object().delete() self.get_object().log_action('pretix.event.item.deleted', user=self.request.user)
messages.success(request, _('The selected product has been deleted.')) self.get_object().delete()
except ProtectedError:
o = self.get_object()
o.active = False
o.save()
o.log_action('pretix.event.item.changed', user=self.request.user, data={
'active': False
})
messages.error(self.request, _('The product could not be deleted as some constraints (e.g. data created by '
'plug-ins) did not allow it. Deleting it could break reporting or other '
'functionality, so the procut has been disabled instead.'))
else:
messages.success(request, _('The selected product has been deleted.'))
return HttpResponseRedirect(success_url) return HttpResponseRedirect(success_url)
else: else:
o = self.get_object() o = self.get_object()