mirror of
https://github.com/pretix/pretix.git
synced 2026-08-06 10:07:50 +00:00
API: Fix bulk voucher creation with server-generated codes
This commit is contained in:
@@ -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 = []
|
||||
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user