Fix logic flaw in cart position deletion

This commit is contained in:
Raphael Michel
2019-04-04 17:11:07 +02:00
parent 482f6b1eb8
commit d0d0f9aa4c
5 changed files with 15 additions and 14 deletions

View File

@@ -13,7 +13,7 @@ from pretix.api.serializers.event import (
) )
from pretix.api.views import ConditionalListView from pretix.api.views import ConditionalListView
from pretix.base.models import ( from pretix.base.models import (
Device, Event, ItemCategory, TaxRule, TeamAPIToken, CartPosition, Device, Event, ItemCategory, TaxRule, TeamAPIToken,
) )
from pretix.base.models.event import SubEvent from pretix.base.models.event import SubEvent
from pretix.helpers.dicts import merge_dicts from pretix.helpers.dicts import merge_dicts
@@ -272,7 +272,7 @@ class SubEventViewSet(ConditionalListView, viewsets.ModelViewSet):
auth=self.request.auth, auth=self.request.auth,
data=self.request.data data=self.request.data
) )
instance.cartposition_set.filter(addon_to__isnull=False).delete() CartPosition.objects.filter(addon_to__subevent=instance).delete()
instance.cartposition_set.all().delete() instance.cartposition_set.all().delete()
super().perform_destroy(instance) super().perform_destroy(instance)
except ProtectedError: except ProtectedError:

View File

@@ -16,8 +16,8 @@ from pretix.api.serializers.item import (
) )
from pretix.api.views import ConditionalListView from pretix.api.views import ConditionalListView
from pretix.base.models import ( from pretix.base.models import (
Item, ItemAddOn, ItemBundle, ItemCategory, ItemVariation, Question, CartPosition, Item, ItemAddOn, ItemBundle, ItemCategory, ItemVariation,
QuestionOption, Quota, Question, QuestionOption, Quota,
) )
from pretix.helpers.dicts import merge_dicts from pretix.helpers.dicts import merge_dicts
@@ -84,8 +84,8 @@ class ItemViewSet(ConditionalListView, viewsets.ModelViewSet):
user=self.request.user, user=self.request.user,
auth=self.request.auth, auth=self.request.auth,
) )
self.get_object().cartposition_set.filter(addon_to__isnull=False).delete() CartPosition.objects.filter(addon_to__item=instance).delete()
self.get_object().cartposition_set.all().delete() instance.cartposition_set.all().delete()
super().perform_destroy(instance) super().perform_destroy(instance)

View File

@@ -18,8 +18,8 @@ from django.views.generic.edit import DeleteView
from pretix.base.forms import I18nFormSet from pretix.base.forms import I18nFormSet
from pretix.base.models import ( from pretix.base.models import (
CachedTicket, Item, ItemCategory, ItemVariation, Order, Question, CachedTicket, CartPosition, Item, ItemCategory, ItemVariation, Order,
QuestionAnswer, QuestionOption, Quota, Voucher, Question, QuestionAnswer, QuestionOption, Quota, Voucher,
) )
from pretix.base.models.event import SubEvent from pretix.base.models.event import SubEvent
from pretix.base.models.items import ItemAddOn, ItemBundle from pretix.base.models.items import ItemAddOn, ItemBundle
@@ -1158,7 +1158,7 @@ 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():
self.get_object().cartposition_set.filter(addon_to__isnull=False).delete() CartPosition.objects.filter(addon_to__item=self.get_object()).delete()
self.get_object().cartposition_set.all().delete() self.get_object().cartposition_set.all().delete()
self.get_object().log_action('pretix.event.item.deleted', user=self.request.user) self.get_object().log_action('pretix.event.item.deleted', user=self.request.user)
self.get_object().delete() self.get_object().delete()

View File

@@ -16,6 +16,7 @@ from django.utils.translation import pgettext_lazy, ugettext_lazy as _
from django.views import View from django.views import View
from django.views.generic import CreateView, DeleteView, ListView, UpdateView from django.views.generic import CreateView, DeleteView, ListView, UpdateView
from pretix.base.models import CartPosition
from pretix.base.models.checkin import CheckinList from pretix.base.models.checkin import CheckinList
from pretix.base.models.event import SubEvent, SubEventMetaValue from pretix.base.models.event import SubEvent, SubEventMetaValue
from pretix.base.models.items import ( from pretix.base.models.items import (
@@ -117,7 +118,7 @@ class SubEventDelete(EventPermissionRequiredMixin, DeleteView):
return HttpResponseRedirect(self.get_success_url()) return HttpResponseRedirect(self.get_success_url())
else: else:
self.object.log_action('pretix.subevent.deleted', user=self.request.user) self.object.log_action('pretix.subevent.deleted', user=self.request.user)
self.object.cartposition_set.filter(addon_to__isnull=False).delete() CartPosition.objects.filter(addon_to__subevent=self.object).delete()
self.object.cartposition_set.all().delete() self.object.cartposition_set.all().delete()
self.object.delete() self.object.delete()
messages.success(request, pgettext_lazy('subevent', 'The selected date has been deleted.')) messages.success(request, pgettext_lazy('subevent', 'The selected date has been deleted.'))
@@ -513,7 +514,7 @@ class SubEventBulkAction(EventPermissionRequiredMixin, View):
elif request.POST.get('action') == 'delete_confirm': elif request.POST.get('action') == 'delete_confirm':
for obj in self.objects: for obj in self.objects:
if obj.allow_delete(): if obj.allow_delete():
obj.cartposition_set.filter(addon_to__isnull=False).delete() CartPosition.objects.filter(addon_to__subevent=obj).delete()
obj.cartposition_set.all().delete() obj.cartposition_set.all().delete()
obj.log_action('pretix.subevent.deleted', user=self.request.user) obj.log_action('pretix.subevent.deleted', user=self.request.user)
obj.delete() obj.delete()

View File

@@ -17,7 +17,7 @@ from django.views.generic import (
CreateView, DeleteView, ListView, TemplateView, UpdateView, View, CreateView, DeleteView, ListView, TemplateView, UpdateView, View,
) )
from pretix.base.models import LogEntry, Voucher from pretix.base.models import CartPosition, LogEntry, OrderPosition, Voucher
from pretix.base.models.vouchers import _generate_random_code from pretix.base.models.vouchers import _generate_random_code
from pretix.control.forms.filter import VoucherFilterForm from pretix.control.forms.filter import VoucherFilterForm
from pretix.control.forms.vouchers import VoucherBulkForm, VoucherForm from pretix.control.forms.vouchers import VoucherBulkForm, VoucherForm
@@ -143,7 +143,7 @@ class VoucherDelete(EventPermissionRequiredMixin, DeleteView):
messages.error(request, _('A voucher can not be deleted if it already has been redeemed.')) messages.error(request, _('A voucher can not be deleted if it already has been redeemed.'))
else: else:
self.object.log_action('pretix.voucher.deleted', user=self.request.user) self.object.log_action('pretix.voucher.deleted', user=self.request.user)
self.object.cartposition_set.filter(addon_to__isnull=False).delete() CartPosition.objects.filter(addon_to__voucher=False).delete()
self.object.cartposition_set.all().delete() self.object.cartposition_set.all().delete()
self.object.delete() self.object.delete()
messages.success(request, _('The selected voucher has been deleted.')) messages.success(request, _('The selected voucher has been deleted.'))
@@ -349,7 +349,7 @@ class VoucherBulkAction(EventPermissionRequiredMixin, View):
for obj in self.objects: for obj in self.objects:
if obj.allow_delete(): if obj.allow_delete():
obj.log_action('pretix.voucher.deleted', user=self.request.user) obj.log_action('pretix.voucher.deleted', user=self.request.user)
obj.cartposition_set.filter(addon_to__isnull=False).delete() OrderPosition.objects.filter(addon_to__voucher=obj).delete()
obj.cartposition_set.all().delete() obj.cartposition_set.all().delete()
obj.delete() obj.delete()
else: else: