mirror of
https://github.com/pretix/pretix.git
synced 2026-05-08 15:44:02 +00:00
Store failed offline checkin if successful online checkin with same nonce exists
This commit is contained in:
@@ -188,11 +188,15 @@ class CheckinListViewSet(viewsets.ModelViewSet):
|
|||||||
clist = self.get_object()
|
clist = self.get_object()
|
||||||
if serializer.validated_data.get('nonce'):
|
if serializer.validated_data.get('nonce'):
|
||||||
if kwargs.get('position'):
|
if kwargs.get('position'):
|
||||||
prev = kwargs['position'].all_checkins.filter(nonce=serializer.validated_data['nonce']).first()
|
prev = kwargs['position'].all_checkins.filter(
|
||||||
|
nonce=serializer.validated_data['nonce'],
|
||||||
|
successful=False
|
||||||
|
).first()
|
||||||
else:
|
else:
|
||||||
prev = clist.checkins.filter(
|
prev = clist.checkins.filter(
|
||||||
nonce=serializer.validated_data['nonce'],
|
nonce=serializer.validated_data['nonce'],
|
||||||
raw_barcode=serializer.validated_data['raw_barcode'],
|
raw_barcode=serializer.validated_data['raw_barcode'],
|
||||||
|
successful=False
|
||||||
).first()
|
).first()
|
||||||
if prev:
|
if prev:
|
||||||
# Ignore because nonce is already handled
|
# Ignore because nonce is already handled
|
||||||
|
|||||||
@@ -1177,6 +1177,30 @@ def test_store_failed(token_client, organizer, clist, event, order):
|
|||||||
assert resp.status_code == 400
|
assert resp.status_code == 400
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.django_db
|
||||||
|
def test_store_failed_after_success(token_client, organizer, clist, event, order):
|
||||||
|
with scopes_disabled():
|
||||||
|
p = order.positions.first()
|
||||||
|
p.all_checkins.create(
|
||||||
|
type=Checkin.TYPE_ENTRY,
|
||||||
|
nonce='foobar',
|
||||||
|
successful=True,
|
||||||
|
list=clist,
|
||||||
|
raw_barcode=p.secret
|
||||||
|
)
|
||||||
|
resp = token_client.post('/api/v1/organizers/{}/events/{}/checkinlists/{}/failed_checkins/'.format(
|
||||||
|
organizer.slug, event.slug, clist.pk,
|
||||||
|
), {
|
||||||
|
'raw_barcode': p.secret,
|
||||||
|
'nonce': 'foobar',
|
||||||
|
'position': p.pk,
|
||||||
|
'error_reason': 'unpaid'
|
||||||
|
}, format='json')
|
||||||
|
assert resp.status_code == 201
|
||||||
|
with scopes_disabled():
|
||||||
|
assert Checkin.all.filter(position=p).count() == 2
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.django_db
|
@pytest.mark.django_db
|
||||||
def test_redeem_unknown(token_client, organizer, clist, event, order):
|
def test_redeem_unknown(token_client, organizer, clist, event, order):
|
||||||
resp = _redeem(token_client, organizer, clist, 'unknown_secret', {'force': True})
|
resp = _redeem(token_client, organizer, clist, 'unknown_secret', {'force': True})
|
||||||
|
|||||||
Reference in New Issue
Block a user