diff --git a/src/pretix/api/serializers/voucher.py b/src/pretix/api/serializers/voucher.py index 219f420fce..9c06db0ae2 100644 --- a/src/pretix/api/serializers/voucher.py +++ b/src/pretix/api/serializers/voucher.py @@ -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 = [] diff --git a/src/tests/api/test_vouchers.py b/src/tests/api/test_vouchers.py index 44d467f563..3d5be809e6 100644 --- a/src/tests/api/test_vouchers.py +++ b/src/tests/api/test_vouchers.py @@ -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(