mirror of
https://github.com/pretix/pretix.git
synced 2026-08-24 13:02:00 +00:00
Make voucher lookups case-insensitive
This commit is contained in:
@@ -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):
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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():
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user