API: Fix bulk voucher creation with server-generated codes

This commit is contained in:
Raphael Michel
2023-10-15 16:16:32 +02:00
parent f1a29a7c5b
commit 215a2f2dbb
2 changed files with 50 additions and 0 deletions
+6
View File
@@ -24,10 +24,16 @@ from rest_framework.exceptions import ValidationError
from pretix.api.serializers.i18n import I18nAwareModelSerializer
from pretix.base.models import Seat, Voucher
from pretix.base.models.vouchers import generate_codes
class VoucherListSerializer(serializers.ListSerializer):
def create(self, validated_data):
vouchers_without_codes = [v for v in validated_data if not v.get('code')]
for voucher_data, code in zip(vouchers_without_codes, generate_codes(self.context['event'].organizer, num=len(vouchers_without_codes), prefix=None)):
voucher_data['code'] = code
codes = set()
seats = set()
errs = []
+44
View File
@@ -1092,6 +1092,50 @@ def test_create_multiple_vouchers_duplicate_code(token_client, organizer, event,
assert Voucher.objects.count() == 0
@pytest.mark.django_db
def test_create_multiple_vouchers_autogenerate_codes(token_client, organizer, event, item):
resp = token_client.post(
'/api/v1/organizers/{}/events/{}/vouchers/batch_create/'.format(organizer.slug, event.slug),
data=[
{
'max_usages': 1,
'valid_until': None,
'block_quota': False,
'allow_ignore_quota': False,
'price_mode': 'set',
'value': '12.00',
'item': item.pk,
'variation': None,
'quota': None,
'tag': 'Foo',
'comment': '',
'subevent': None
},
{
'max_usages': 1,
'valid_until': None,
'block_quota': True,
'allow_ignore_quota': False,
'price_mode': 'set',
'value': '12.00',
'item': item.pk,
'variation': None,
'quota': None,
'tag': 'Foo',
'comment': '',
'subevent': None
}
], format='json'
)
assert resp.status_code == 201
with scopes_disabled():
assert Voucher.objects.count() == 2
v1 = Voucher.objects.get(code=resp.data[0]['code'])
assert not v1.block_quota
v2 = Voucher.objects.get(code=resp.data[1]['code'])
assert v2.block_quota
@pytest.fixture
def seatingplan(organizer, event):
plan = SeatingPlan.objects.create(