diff --git a/src/pretix/plugins/badges/exporters.py b/src/pretix/plugins/badges/exporters.py index c1cb81260d..574be19162 100644 --- a/src/pretix/plugins/badges/exporters.py +++ b/src/pretix/plugins/badges/exporters.py @@ -50,7 +50,7 @@ from django.contrib.staticfiles import finders from django.core.files import File from django.core.files.storage import default_storage from django.db import DataError, models -from django.db.models import Case, Exists, OuterRef, Q, Subquery, When +from django.db.models import Case, Exists, OuterRef, Q, Subquery, When, Value 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 @@ -471,6 +471,7 @@ class BadgeExporter(BaseExporter): label=_('Sort by'), choices=[ ('name', _('Attendee name')), + ('company', _('Attendee company')), ('code', _('Order code')), ('date', _('Event date')), ] + ([ @@ -525,7 +526,23 @@ class BadgeExporter(BaseExporter): qs = qs.filter(Q(subevent__date_from__lt=dt) | Q(subevent__isnull=True, order__event__date_from__lt=dt)) if form_data.get('order_by') == 'name': - qs = qs.order_by('attendee_name_cached', 'order__code') + qs = qs.annotate( + resolved_name=Case( + When(attendee_name_cached__ne='', then='attendee_name_cached'), + When(addon_to__attendee_name_cached__isnull=False, addon_to__attendee_name_cached__ne='', + then='addon_to__attendee_name_cached'), + default=Value(""), + ) + ).order_by('resolved_name', 'order__code') + elif form_data.get('order_by') == 'company': + qs = qs.annotate( + resolved_company=Case( + When(company__ne='', then='company'), + When(addon_to__company__isnull=False, addon_to__company__ne='', + then='addon_to__company_cached'), + default=Value(""), + ) + ).order_by('resolved_company', 'order__code') elif form_data.get('order_by') == 'code': qs = qs.order_by('order__code') elif form_data.get('order_by') == 'date': diff --git a/src/pretix/plugins/ticketoutputpdf/exporters.py b/src/pretix/plugins/ticketoutputpdf/exporters.py index f853750064..de602f5bba 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 Case, OuterRef, Q, Subquery, When +from django.db.models import Case, OuterRef, Q, Subquery, When, Value 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 @@ -92,6 +92,7 @@ class AllTicketsPDF(BaseExporter): label=_('Sort by'), choices=[ ('name', _('Attendee name')), + ('company', _('Attendee company')), ('code', _('Order code')), ('date', _('Event date')), ] + ([ @@ -137,9 +138,23 @@ class AllTicketsPDF(BaseExporter): qs = qs.filter(Q(subevent__date_from__lt=dt_end) | Q(subevent__isnull=True, order__event__date_from__lt=dt_end)) if form_data.get('order_by') == 'name': - qs = qs.order_by('attendee_name_cached', 'order__code') - elif form_data.get('order_by') == 'code': - qs = qs.order_by('order__code') + qs = qs.annotate( + resolved_name=Case( + When(attendee_name_cached__ne='', then='attendee_name_cached'), + When(addon_to__attendee_name_cached__isnull=False, addon_to__attendee_name_cached__ne='', + then='addon_to__attendee_name_cached'), + default=Value(""), + ) + ).order_by('resolved_name', 'order__code') + elif form_data.get('order_by') == 'company': + qs = qs.annotate( + resolved_company=Case( + When(company__ne='', then='company'), + When(addon_to__company__isnull=False, addon_to__company__ne='', + then='addon_to__company'), + default=Value(""), + ) + ).order_by('resolved_company', 'order__code') elif form_data.get('order_by') == 'date': qs = qs.annotate(ed=Coalesce('subevent__date_from', 'order__event__date_from')).order_by('ed', 'order__code') elif form_data.get('order_by', '').startswith('name:'):