From f10c8b229fa87e8f6af75e18ec52eb008713c370 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Fri, 23 Jul 2021 11:15:35 +0200 Subject: [PATCH] Check-in: Ticket should not count as redeemed if only exits have been scanned so far --- src/pretix/base/services/checkin.py | 9 +++++---- src/tests/base/test_checkin.py | 9 +++++++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/pretix/base/services/checkin.py b/src/pretix/base/services/checkin.py index 92582cd85f..d332a60aa0 100644 --- a/src/pretix/base/services/checkin.py +++ b/src/pretix/base/services/checkin.py @@ -649,15 +649,16 @@ def perform_checkin(op: OrderPosition, clist: CheckinList, given_answers: dict, if isinstance(auth, Device): device = auth - last_ci = op.checkins.order_by('-datetime').filter(list=clist).only('type', 'nonce').first() + last_cis = list(op.checkins.order_by('-datetime').filter(list=clist).only('type', 'nonce')) entry_allowed = ( type == Checkin.TYPE_EXIT or clist.allow_multiple_entries or - last_ci is None or - (clist.allow_entry_after_exit and last_ci.type == Checkin.TYPE_EXIT) + not last_cis or + all(c.type == Checkin.TYPE_EXIT for c in last_cis) or + (clist.allow_entry_after_exit and last_cis[0].type == Checkin.TYPE_EXIT) ) - if nonce and ((last_ci and last_ci.nonce == nonce) or op.checkins.filter(type=type, list=clist, device=device, nonce=nonce).exists()): + if nonce and ((last_cis and last_cis[0].nonce == nonce) or op.checkins.filter(type=type, list=clist, device=device, nonce=nonce).exists()): return if entry_allowed or force: diff --git a/src/tests/base/test_checkin.py b/src/tests/base/test_checkin.py index b1bacd383d..943e0d2675 100644 --- a/src/tests/base/test_checkin.py +++ b/src/tests/base/test_checkin.py @@ -336,6 +336,15 @@ def test_single_entry_forced_reentry(position, clist): assert position.order.all_logentries().count() == 2 +@pytest.mark.django_db +def test_exit_does_not_invalidate(position, clist): + perform_checkin(position, clist, {}, type=Checkin.TYPE_EXIT) + perform_checkin(position, clist, {}) + perform_checkin(position, clist, {}, type=Checkin.TYPE_EXIT) + + assert position.checkins.count() == 3 + + @pytest.mark.django_db def test_multi_exit(position, clist): perform_checkin(position, clist, {})