From ce6e8d0f5ca63dcab2161a03e720547cf884d318 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Fri, 5 Aug 2016 10:18:24 +0200 Subject: [PATCH] Refs #105 -- Check quota before blocking it with a voucher --- src/pretix/control/forms/vouchers.py | 20 ++++++++++++++++---- src/pretix/control/views/vouchers.py | 10 ++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/pretix/control/forms/vouchers.py b/src/pretix/control/forms/vouchers.py index 013a362cd1..c34ede6eed 100644 --- a/src/pretix/control/forms/vouchers.py +++ b/src/pretix/control/forms/vouchers.py @@ -3,7 +3,6 @@ import copy from django import forms from django.core.exceptions import ValidationError from django.utils.translation import ugettext_lazy as _ - from pretix.base.forms import I18nModelForm from pretix.base.models import Item, ItemVariation, Quota, Voucher @@ -65,16 +64,30 @@ class VoucherForm(I18nModelForm): self.instance.item = Item.objects.get(pk=itemid, event=self.instance.event) if varid: self.instance.variation = ItemVariation.objects.get(pk=varid, item=self.instance.item) + avail = self.instance.variation.check_quotas() else: self.instance.variation = None + avail = self.instance.item.check_quotas() self.instance.quota = None else: self.instance.quota = Quota.objects.get(pk=quotaid, event=self.instance.event) self.instance.item = None self.instance.variation = None + avail = self.instance.quota.availability() - if 'code' in data and not self.instance.pk and Voucher.objects.filter(code=data['code'], event=self.instance.event).exists(): - raise ValidationError(_('A voucher with this code already exists.')) + if 'codes' in data: + data['codes'] = [a.strip() for a in data.get('codes', '').strip().split("\n") if a] + cnt = len(data['codes']) + else: + cnt = 1 + + if data.get('block_quota', False): + if avail[0] != Quota.AVAILABILITY_OK or (avail[1] is not None and avail[1] < cnt): + raise ValidationError(_('You cannot create a voucher that blocks quota as the selected product or quota is ' + 'currently sold out or completely reserved.')) + + if 'code' in data and not self.instance.pk and Voucher.objects.filter(code=data['code'], event=self.instance.event).exists(): + raise ValidationError(_('A voucher with this code already exists.')) return data @@ -103,7 +116,6 @@ class VoucherBulkForm(VoucherForm): def clean(self): data = super().clean() - data['codes'] = [a.strip() for a in data.get('codes', '').strip().split("\n") if a] if Voucher.objects.filter(code__in=data['codes'], event=self.instance.event).exists(): raise ValidationError(_('A voucher with one of this codes already exists.')) diff --git a/src/pretix/control/views/vouchers.py b/src/pretix/control/views/vouchers.py index 854959a382..15685d39aa 100644 --- a/src/pretix/control/views/vouchers.py +++ b/src/pretix/control/views/vouchers.py @@ -172,6 +172,11 @@ class VoucherCreate(EventPermissionRequiredMixin, CreateView): form.instance.log_action('pretix.voucher.added', data=dict(form.cleaned_data), user=self.request.user) return ret + def post(self, request, *args, **kwargs): + # TODO: Transform this into an asynchronous call? + with request.event.lock(): + return super().post(request, *args, **kwargs) + class VoucherBulkCreate(EventPermissionRequiredMixin, CreateView): model = Voucher @@ -208,3 +213,8 @@ class VoucherBulkCreate(EventPermissionRequiredMixin, CreateView): ctx = super().get_context_data(**kwargs) ctx['code_length'] = settings.ENTROPY['voucher_code'] return ctx + + def post(self, request, *args, **kwargs): + # TODO: Transform this into an asynchronous call? + with request.event.lock(): + return super().post(request, *args, **kwargs)