Make voucher lookups case-insensitive

This commit is contained in:
Raphael Michel
2018-03-16 15:27:02 +01:00
parent b564fe8a0d
commit 5e3b4b126e
5 changed files with 12 additions and 10 deletions
+4 -6
View File
@@ -25,7 +25,7 @@ def _generate_random_code(prefix=None):
def generate_code(prefix=None): def generate_code(prefix=None):
while True: while True:
code = _generate_random_code(prefix=prefix) code = _generate_random_code(prefix=prefix)
if not Voucher.objects.filter(code=code).exists(): if not Voucher.objects.filter(code__iexact=code).exists():
return code return code
@@ -278,11 +278,9 @@ class Voucher(LoggedModel):
if old_instance.quota: if old_instance.quota:
quotas.add(old_instance.quota) quotas.add(old_instance.quota)
elif old_instance.variation: elif old_instance.variation:
quotas |= set(old_instance.variation.quotas.filter( quotas |= set(old_instance.variation.quotas.filter(subevent=old_instance.subevent))
subevent=old_instance.subevent))
elif old_instance.item: elif old_instance.item:
quotas |= set(old_instance.item.quotas.filter( quotas |= set(old_instance.item.quotas.filter(subevent=old_instance.subevent))
subevent=old_instance.subevent))
return quotas return quotas
@staticmethod @staticmethod
@@ -313,7 +311,7 @@ class Voucher(LoggedModel):
@staticmethod @staticmethod
def clean_voucher_code(data, event, pk): def clean_voucher_code(data, event, pk):
if 'code' in data and Voucher.objects.filter(Q(code=data['code']) & Q(event=event) & ~Q(pk=pk)).exists(): if 'code' in data and Voucher.objects.filter(Q(code__iexact=data['code']) & Q(event=event) & ~Q(pk=pk)).exists():
raise ValidationError(_('A voucher with this code already exists.')) raise ValidationError(_('A voucher with this code already exists.'))
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
+1 -1
View File
@@ -295,7 +295,7 @@ class CartManager:
if i.get('voucher'): if i.get('voucher'):
try: try:
voucher = self.event.vouchers.get(code=i.get('voucher').strip()) voucher = self.event.vouchers.get(code__iexact=i.get('voucher').strip())
except Voucher.DoesNotExist: except Voucher.DoesNotExist:
raise CartError(error_messages['voucher_invalid']) raise CartError(error_messages['voucher_invalid'])
else: else:
+5 -1
View File
@@ -2,6 +2,7 @@ import copy
from django import forms from django import forms
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.db.models.functions import Lower
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from pretix.base.forms import I18nModelForm from pretix.base.forms import I18nModelForm
@@ -164,7 +165,10 @@ class VoucherBulkForm(VoucherForm):
def clean(self): def clean(self):
data = super().clean() data = super().clean()
if Voucher.objects.filter(code__in=data['codes'], event=self.instance.event).exists(): vouchers = self.instance.event.vouchers.annotate(
code_lower=Lower('code')
).filter(code_lower__in=[c.lower() for c in data['codes']])
if vouchers.exists():
raise ValidationError(_('A voucher with one of these codes already exists.')) raise ValidationError(_('A voucher with one of these codes already exists.'))
return data return data
+1 -1
View File
@@ -399,7 +399,7 @@ class RedeemView(NoSearchIndexViewMixin, EventViewMixin, TemplateView):
if v: if v:
v = v.strip() v = v.strip()
try: try:
self.voucher = Voucher.objects.get(code=v, event=request.event) self.voucher = Voucher.objects.get(code__iexact=v, event=request.event)
if self.voucher.redeemed >= self.voucher.max_usages: if self.voucher.redeemed >= self.voucher.max_usages:
err = error_messages['voucher_redeemed'] err = error_messages['voucher_redeemed']
if self.voucher.valid_until is not None and self.voucher.valid_until < now(): if self.voucher.valid_until is not None and self.voucher.valid_until < now():
+1 -1
View File
@@ -238,7 +238,7 @@ class WidgetAPIProductList(View):
self.voucher = None self.voucher = None
if 'voucher' in request.GET: if 'voucher' in request.GET:
try: try:
self.voucher = request.event.vouchers.get(code=request.GET.get('voucher').strip()) self.voucher = request.event.vouchers.get(code__iexact=request.GET.get('voucher').strip())
if self.voucher.redeemed >= self.voucher.max_usages: if self.voucher.redeemed >= self.voucher.max_usages:
data['error'] = error_messages['voucher_redeemed'] data['error'] = error_messages['voucher_redeemed']
fail = True fail = True