From b931d274861c3681ea8ea44950f14b54f63dda02 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Thu, 4 Apr 2019 09:05:53 +0200 Subject: [PATCH] Solve cart deletion issues once and for all --- src/pretix/api/views/event.py | 2 ++ src/pretix/api/views/item.py | 1 + src/pretix/api/views/voucher.py | 5 ++++- src/pretix/base/models/event.py | 1 + src/pretix/control/views/item.py | 1 + src/pretix/control/views/subevents.py | 2 ++ src/pretix/control/views/vouchers.py | 2 ++ 7 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/pretix/api/views/event.py b/src/pretix/api/views/event.py index a409c2b05..4daa15f18 100644 --- a/src/pretix/api/views/event.py +++ b/src/pretix/api/views/event.py @@ -272,6 +272,8 @@ class SubEventViewSet(ConditionalListView, viewsets.ModelViewSet): auth=self.request.auth, data=self.request.data ) + instance.cartposition_set.filter(addon_to__isnull=False).delete() + instance.cartposition_set.all().delete() super().perform_destroy(instance) except ProtectedError: raise PermissionDenied('The sub-event could not be deleted as some constraints (e.g. data created by ' diff --git a/src/pretix/api/views/item.py b/src/pretix/api/views/item.py index 4c85f9a3d..6ed80475c 100644 --- a/src/pretix/api/views/item.py +++ b/src/pretix/api/views/item.py @@ -84,6 +84,7 @@ class ItemViewSet(ConditionalListView, viewsets.ModelViewSet): user=self.request.user, auth=self.request.auth, ) + self.get_object().cartposition_set.filter(addon_to__isnull=False).delete() self.get_object().cartposition_set.all().delete() super().perform_destroy(instance) diff --git a/src/pretix/api/views/voucher.py b/src/pretix/api/views/voucher.py index c9eea8b50..4f2bd5972 100644 --- a/src/pretix/api/views/voucher.py +++ b/src/pretix/api/views/voucher.py @@ -111,7 +111,10 @@ class VoucherViewSet(viewsets.ModelViewSet): user=self.request.user, auth=self.request.auth, ) - super().perform_destroy(instance) + with transaction.atomic(): + instance.cartposition_set.filter(addon_to__isnull=False).delete() + instance.cartposition_set.all().delete() + super().perform_destroy(instance) @list_route(methods=['POST']) def batch_create(self, request, *args, **kwargs): diff --git a/src/pretix/base/models/event.py b/src/pretix/base/models/event.py index 7f9266438..50199b168 100644 --- a/src/pretix/base/models/event.py +++ b/src/pretix/base/models/event.py @@ -759,6 +759,7 @@ class Event(EventMixin, LoggedModel): return not self.orders.exists() and not self.invoices.exists() def delete_sub_objects(self): + self.cartposition_set.filter(addon_to__isnull=False).delete() self.cartposition_set.all().delete() self.items.all().delete() self.subevents.all().delete() diff --git a/src/pretix/control/views/item.py b/src/pretix/control/views/item.py index afbc4e6a0..c61d98dfb 100644 --- a/src/pretix/control/views/item.py +++ b/src/pretix/control/views/item.py @@ -1158,6 +1158,7 @@ class ItemDelete(EventPermissionRequiredMixin, DeleteView): success_url = self.get_success_url() o = self.get_object() if o.allow_delete(): + self.get_object().cartposition_set.filter(addon_to__isnull=False).delete() self.get_object().cartposition_set.all().delete() self.get_object().log_action('pretix.event.item.deleted', user=self.request.user) self.get_object().delete() diff --git a/src/pretix/control/views/subevents.py b/src/pretix/control/views/subevents.py index be95be838..832f883cf 100644 --- a/src/pretix/control/views/subevents.py +++ b/src/pretix/control/views/subevents.py @@ -117,6 +117,7 @@ class SubEventDelete(EventPermissionRequiredMixin, DeleteView): return HttpResponseRedirect(self.get_success_url()) else: self.object.log_action('pretix.subevent.deleted', user=self.request.user) + self.object.cartposition_set.filter(addon_to__isnull=False).delete() self.object.cartposition_set.all().delete() self.object.delete() messages.success(request, pgettext_lazy('subevent', 'The selected date has been deleted.')) @@ -512,6 +513,7 @@ class SubEventBulkAction(EventPermissionRequiredMixin, View): elif request.POST.get('action') == 'delete_confirm': for obj in self.objects: if obj.allow_delete(): + obj.cartposition_set.filter(addon_to__isnull=False).delete() obj.cartposition_set.all().delete() obj.log_action('pretix.subevent.deleted', user=self.request.user) obj.delete() diff --git a/src/pretix/control/views/vouchers.py b/src/pretix/control/views/vouchers.py index 81f906587..41c710cb0 100644 --- a/src/pretix/control/views/vouchers.py +++ b/src/pretix/control/views/vouchers.py @@ -143,6 +143,7 @@ class VoucherDelete(EventPermissionRequiredMixin, DeleteView): messages.error(request, _('A voucher can not be deleted if it already has been redeemed.')) else: self.object.log_action('pretix.voucher.deleted', user=self.request.user) + self.object.cartposition_set.filter(addon_to__isnull=False).delete() self.object.cartposition_set.all().delete() self.object.delete() messages.success(request, _('The selected voucher has been deleted.')) @@ -348,6 +349,7 @@ class VoucherBulkAction(EventPermissionRequiredMixin, View): for obj in self.objects: if obj.allow_delete(): obj.log_action('pretix.voucher.deleted', user=self.request.user) + obj.cartposition_set.filter(addon_to__isnull=False).delete() obj.cartposition_set.all().delete() obj.delete() else: