diff --git a/src/pretix/api/serializers/order.py b/src/pretix/api/serializers/order.py index 12c3174d68..3be4acf29e 100644 --- a/src/pretix/api/serializers/order.py +++ b/src/pretix/api/serializers/order.py @@ -704,6 +704,16 @@ class CheckinListOrderPositionSerializer(OrderPositionSerializer): if 'answers.question' in self.context['expand']: self.fields['answers'].child.fields['question'] = QuestionSerializer(read_only=True) + if 'addons' in self.context['expand']: + # Experimental feature, undocumented on purpose for now in case we need to remove it again + # for performance reasons + subl = CheckinListOrderPositionSerializer(read_only=True, many=True, context={ + **self.context, + 'expand': [v for v in self.context['expand'] if v != 'addons'], + 'pdf_data': False, + }) + self.fields['addons'] = subl + class OrderPaymentTypeField(serializers.Field): # TODO: Remove after pretix 2.2 diff --git a/src/pretix/api/views/checkin.py b/src/pretix/api/views/checkin.py index 7f51c2403b..7a7d50e97a 100644 --- a/src/pretix/api/views/checkin.py +++ b/src/pretix/api/views/checkin.py @@ -381,15 +381,21 @@ def _checkin_list_position_queryset(checkinlists, ignore_status=False, ignore_pr qs = qs.filter(reduce(operator.or_, lists_qs)) + prefetch_related = [ + Prefetch( + lookup='checkins', + queryset=Checkin.objects.filter(list_id__in=[cl.pk for cl in checkinlists]).select_related('device') + ), + Prefetch('print_logs', queryset=PrintLog.objects.select_related('device')), + 'answers', 'answers__options', 'answers__question', + ] + select_related = [ + 'item', 'variation', 'order', 'addon_to', 'order__invoice_address', 'order', 'seat' + ] + if pdf_data: qs = qs.prefetch_related( - Prefetch( - lookup='checkins', - queryset=Checkin.objects.filter(list_id__in=[cl.pk for cl in checkinlists]).select_related('device') - ), - Prefetch('print_logs', queryset=PrintLog.objects.select_related('device')), - 'answers', 'answers__options', 'answers__question', - Prefetch('addons', OrderPosition.objects.select_related('item', 'variation')), + # Don't add to list, we don't want to propagate to addons Prefetch('order', Order.objects.select_related('invoice_address').prefetch_related( Prefetch( 'event', @@ -404,32 +410,39 @@ def _checkin_list_position_queryset(checkinlists, ignore_status=False, ignore_pr ) ) )) - ).select_related( - 'item', 'variation', 'item__category', 'addon_to', 'order', 'order__invoice_address', 'seat' ) - else: - qs = qs.prefetch_related( - Prefetch( - lookup='checkins', - queryset=Checkin.objects.filter(list_id__in=[cl.pk for cl in checkinlists]).select_related('device') - ), - Prefetch('print_logs', queryset=PrintLog.objects.select_related('device')), - 'answers', 'answers__options', 'answers__question', - Prefetch('addons', OrderPosition.objects.select_related('item', 'variation')) - ).select_related('item', 'variation', 'order', 'addon_to', 'order__invoice_address', 'order', 'seat') if expand and 'subevent' in expand: - qs = qs.prefetch_related( + prefetch_related += [ 'subevent', 'subevent__event', 'subevent__subeventitem_set', 'subevent__subeventitemvariation_set', 'subevent__seat_category_mappings', 'subevent__meta_values' - ) + ] if expand and 'item' in expand: - qs = qs.prefetch_related('item', 'item__addons', 'item__bundles', 'item__meta_values', - 'item__variations').select_related('item__tax_rule') + prefetch_related += [ + 'item', 'item__addons', 'item__bundles', 'item__meta_values', + 'item__variations', + ] + select_related.append('item__tax_rule') if expand and 'variation' in expand: - qs = qs.prefetch_related('variation', 'variation__meta_values') + prefetch_related += [ + 'variation', 'variation__meta_values', + ] + + if expand and 'addons' in expand: + prefetch_related += [ + Prefetch('addons', OrderPosition.objects.prefetch_related(*prefetch_related).select_related(*select_related)), + ] + else: + prefetch_related += [ + Prefetch('addons', OrderPosition.objects.select_related('item', 'variation')) + ] + + if pdf_data: + select_related.remove("order") # Don't need it twice on this queryset + + qs = qs.prefetch_related(*prefetch_related).select_related(*select_related) return qs diff --git a/src/pretix/plugins/webcheckin/static/pretixplugins/webcheckin/components/app.vue b/src/pretix/plugins/webcheckin/static/pretixplugins/webcheckin/components/app.vue index 6e75db0f4f..f9e0936582 100644 --- a/src/pretix/plugins/webcheckin/static/pretixplugins/webcheckin/components/app.vue +++ b/src/pretix/plugins/webcheckin/static/pretixplugins/webcheckin/components/app.vue @@ -38,6 +38,7 @@
{{ checkResult.position.order }}-{{ checkResult.position.positionid }}