From b6518449d65a7ba1c2b8685fd4b0f4025f0cbbd5 Mon Sep 17 00:00:00 2001 From: Kara Engelhardt Date: Wed, 1 Apr 2026 18:46:51 +0200 Subject: [PATCH] Add placeholder for checked in addons (Z#23230009) --- src/pretix/base/pdf.py | 21 ++++++++++++++++----- src/tests/api/test_orders.py | 4 ++-- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/pretix/base/pdf.py b/src/pretix/base/pdf.py index 5d11c3504..21a62e7e0 100644 --- a/src/pretix/base/pdf.py +++ b/src/pretix/base/pdf.py @@ -54,7 +54,7 @@ from bidi import get_display from django.conf import settings from django.contrib.staticfiles import finders from django.core.exceptions import ValidationError -from django.db.models import Max, Min +from django.db.models import Exists, Max, Min, OuterRef from django.db.models.fields.files import FieldFile from django.dispatch import receiver from django.utils.deconstruct import deconstructible @@ -76,7 +76,7 @@ from reportlab.pdfgen.canvas import Canvas from reportlab.platypus import Paragraph from pretix.base.i18n import language -from pretix.base.models import Event, Order, OrderPosition, Question +from pretix.base.models import Checkin, Event, Order, OrderPosition, Question from pretix.base.settings import PERSON_NAME_SCHEMES from pretix.base.signals import layout_image_variables, layout_text_variables from pretix.base.templatetags.money import money_filter @@ -379,6 +379,13 @@ DEFAULT_VARIABLES = OrderedDict(( str(p) for p in generate_compressed_addon_list(op, order, ev) ]) }), + ("checked_in_addons", { + "label": _("List of Checked-In Add-Ons"), + "editor_sample": _("Add-on 1\n2x Add-on 2"), + "evaluate": lambda op, order, ev: "\n".join([ + str(p) for p in generate_compressed_addon_list(op, order, ev, only_checked_in=True) + ]) + }), ("organizer", { "label": _("Organizer name"), "editor_sample": _("Event organizer company"), @@ -750,12 +757,16 @@ def get_program_times(op: OrderPosition, ev: Event): ]) -def generate_compressed_addon_list(op, order, event): +def generate_compressed_addon_list(op, order, event, only_checked_in=False): itemcount = defaultdict(int) - addons = [p for p in ( + addon_qs = ( op.addons.all() if 'addons' in getattr(op, '_prefetched_objects_cache', {}) else op.addons.select_related('item', 'variation') - ) if not p.canceled] + ) + if only_checked_in: + addon_qs = addon_qs.filter(Exists(Checkin.objects.filter(position=OuterRef('pk'))), canceled=False) + addons = [p for p in addon_qs if not p.canceled] + for pos in addons: itemcount[pos.item, pos.variation] += 1 diff --git a/src/tests/api/test_orders.py b/src/tests/api/test_orders.py index 6d8f2cc14..570178974 100644 --- a/src/tests/api/test_orders.py +++ b/src/tests/api/test_orders.py @@ -2053,7 +2053,7 @@ def test_pdf_data(token_client, organizer, event, order, django_assert_max_num_q assert not resp.data['positions'][0].get('pdf_data') # order list - with django_assert_max_num_queries(33): + with django_assert_max_num_queries(34): resp = token_client.get('/api/v1/organizers/{}/events/{}/orders/?pdf_data=true'.format( organizer.slug, event.slug )) @@ -2068,7 +2068,7 @@ def test_pdf_data(token_client, organizer, event, order, django_assert_max_num_q assert not resp.data['results'][0]['positions'][0].get('pdf_data') # position list - with django_assert_max_num_queries(35): + with django_assert_max_num_queries(36): resp = token_client.get('/api/v1/organizers/{}/events/{}/orderpositions/?pdf_data=true'.format( organizer.slug, event.slug ))