Badge/ticket export: Allow to sort by company

This commit is contained in:
Raphael Michel
2024-04-15 10:55:32 +02:00
parent 46da0bda61
commit d0c58713c4
2 changed files with 38 additions and 6 deletions

View File

@@ -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':

View File

@@ -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:'):