From b1e8e072d4ff9037b5a79c779ee4ac86296e45c0 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Thu, 6 Apr 2023 09:34:31 +0200 Subject: [PATCH] PDF exporters: Fix ordering of add-on products by name --- src/pretix/plugins/badges/exporters.py | 10 +++++++--- src/pretix/plugins/ticketoutputpdf/exporters.py | 8 ++++++-- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/pretix/plugins/badges/exporters.py b/src/pretix/plugins/badges/exporters.py index 9947001d3..170fae05f 100644 --- a/src/pretix/plugins/badges/exporters.py +++ b/src/pretix/plugins/badges/exporters.py @@ -47,7 +47,7 @@ from django.core.files import File from django.core.files.base import ContentFile from django.core.files.storage import default_storage from django.db import DataError, models -from django.db.models import Exists, OuterRef, Q, Subquery +from django.db.models import Case, Exists, OuterRef, Q, Subquery, When from django.db.models.functions import Cast, Coalesce from django.utils.timezone import make_aware from django.utils.translation import gettext as _, gettext_lazy, pgettext_lazy @@ -373,8 +373,12 @@ class BadgeExporter(BaseExporter): elif form_data.get('order_by', '').startswith('name:'): part = form_data['order_by'][5:] qs = qs.annotate( - resolved_name=Coalesce('attendee_name_parts', 'addon_to__attendee_name_parts', - 'order__invoice_address__name_parts') + resolved_name=Case( + When(attendee_name_cached__ne='', then='attendee_name_parts'), + When(addon_to__attendee_name_cached__isnull=False, addon_to__attendee_name_cached__ne='', + then='addon_to__attendee_name_parts'), + default='order__invoice_address__name_parts', + ) ).annotate( resolved_name_part=JSONExtract('resolved_name', part) ).order_by( diff --git a/src/pretix/plugins/ticketoutputpdf/exporters.py b/src/pretix/plugins/ticketoutputpdf/exporters.py index 0e65b06b4..d20888df2 100644 --- a/src/pretix/plugins/ticketoutputpdf/exporters.py +++ b/src/pretix/plugins/ticketoutputpdf/exporters.py @@ -39,7 +39,7 @@ from io import BytesIO from django import forms from django.core.files.base import ContentFile from django.db import DataError, models -from django.db.models import OuterRef, Q, Subquery +from django.db.models import Case, OuterRef, Q, Subquery, When from django.db.models.functions import Cast, Coalesce from django.utils.timezone import now from django.utils.translation import gettext as _, gettext_lazy, pgettext_lazy @@ -145,7 +145,11 @@ class AllTicketsPDF(BaseExporter): elif form_data.get('order_by', '').startswith('name:'): part = form_data['order_by'][5:] qs = qs.annotate( - resolved_name=Coalesce('attendee_name_parts', 'addon_to__attendee_name_parts', 'order__invoice_address__name_parts') + resolved_name=Case( + When(attendee_name_cached__ne='', then='attendee_name_parts'), + When(addon_to__attendee_name_cached__isnull=False, addon_to__attendee_name_cached__ne='', then='addon_to__attendee_name_parts'), + default='order__invoice_address__name_parts', + ) ).annotate( resolved_name_part=JSONExtract('resolved_name', part) ).order_by(