From f16034d0ccb603b28e81263a5e6b311c7ec755d5 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Mon, 8 Jun 2026 14:25:50 +0200 Subject: [PATCH] Check-in: Fix handling of optional file questions (Z#23236493) (#6251) --- src/pretix/api/views/checkin.py | 5 ++++- src/tests/api/test_checkin.py | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/pretix/api/views/checkin.py b/src/pretix/api/views/checkin.py index 20d9ff8512..6652b96c9f 100644 --- a/src/pretix/api/views/checkin.py +++ b/src/pretix/api/views/checkin.py @@ -788,7 +788,10 @@ def _redeem_process(*, checkinlists, raw_barcode, answers_data, datetime, force, if str(q.pk) in answers_data: try: if q.type == Question.TYPE_FILE: - given_answers[q] = _handle_file_upload(answers_data[str(q.pk)], user, auth) + if answers_data[str(q.pk)]: + given_answers[q] = _handle_file_upload(answers_data[str(q.pk)], user, auth) + else: + given_answers[q] = None else: given_answers[q] = q.clean_answer(answers_data[str(q.pk)]) except (ValidationError, BaseValidationError): diff --git a/src/tests/api/test_checkin.py b/src/tests/api/test_checkin.py index 63c38df34e..88115b40e1 100644 --- a/src/tests/api/test_checkin.py +++ b/src/tests/api/test_checkin.py @@ -1098,6 +1098,27 @@ def test_question_upload(token_client, organizer, clist, event, order, question) assert order.positions.first().answers.get(question=question[0]).file +@pytest.mark.django_db +def test_question_upload_optional(token_client, organizer, clist, event, order, question): + with scopes_disabled(): + p = order.positions.first() + question[0].type = 'F' + question[0].required = False + question[0].save() + + resp = _redeem(token_client, organizer, clist, p.pk, {}) + assert resp.status_code == 400 + assert resp.data['status'] == 'incomplete' + with scopes_disabled(): + assert resp.data['questions'] == [QuestionSerializer(question[0]).data] + + resp = _redeem(token_client, organizer, clist, p.pk, {'answers': {question[0].pk: ""}}) + assert resp.status_code == 201 + assert resp.data['status'] == 'ok' + with scopes_disabled(): + assert not order.positions.first().answers.filter(question=question[0]).exists() + + @pytest.mark.django_db def test_store_failed(token_client, organizer, clist, event, order): with scopes_disabled():