From 83908fde45c847edc295bca07152e7874125cb05 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Fri, 24 Jul 2020 17:48:50 +0200 Subject: [PATCH] [experimental] restructure order search query for different performance characteristics --- src/pretix/control/forms/filter.py | 33 ++++++++++++++++++------------ src/pretix/control/views/search.py | 5 +---- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/pretix/control/forms/filter.py b/src/pretix/control/forms/filter.py index dc81e8126f..6f755daa92 100644 --- a/src/pretix/control/forms/filter.py +++ b/src/pretix/control/forms/filter.py @@ -12,8 +12,8 @@ from django.utils.translation import gettext_lazy as _, pgettext_lazy from pretix.base.forms.widgets import DatePickerWidget from pretix.base.models import ( - Checkin, Event, EventMetaProperty, EventMetaValue, Invoice, Item, Order, - OrderPayment, OrderPosition, OrderRefund, Organizer, Question, + Checkin, Event, EventMetaProperty, EventMetaValue, Invoice, InvoiceAddress, + Item, Order, OrderPayment, OrderPosition, OrderRefund, Organizer, Question, QuestionAnswer, SubEvent, ) from pretix.base.signals import register_payment_providers @@ -139,26 +139,33 @@ class OrderFilterForm(FilterForm): | Q(invoice_no__iexact=u.zfill(5)) | Q(full_invoice_no__iexact=u) ).values_list('order_id', flat=True) - matching_positions = OrderPosition.objects.filter( - Q(order=OuterRef('pk')) & Q( + Q( Q(attendee_name_cached__icontains=u) | Q(attendee_email__icontains=u) - | Q(secret__istartswith=u) | Q(voucher__code__icontains=u) + | Q(secret__istartswith=u) ) - ).values('id') - - mainq = ( + ).values_list('order_id', flat=True) + matching_invoice_addresses = InvoiceAddress.objects.filter( + Q( + Q(name_cached__icontains=u) | Q(company__icontains=u) + ) + ).values_list('order_id', flat=True) + matching_orders = Order.objects.filter( code | Q(email__icontains=u) - | Q(invoice_address__name_cached__icontains=u) - | Q(invoice_address__company__icontains=u) - | Q(pk__in=matching_invoices) | Q(comment__icontains=u) - | Q(has_pos=True) + ).values_list('id', flat=True) + + mainq = ( + Q(pk__in=matching_orders) + | Q(pk__in=matching_invoices) + | Q(pk__in=matching_positions) + | Q(pk__in=matching_invoice_addresses) + | Q(pk__in=matching_invoices) ) for recv, q in order_search_filter_q.send(sender=getattr(self, 'event', None), query=u): mainq = mainq | q - qs = qs.annotate(has_pos=Exists(matching_positions)).filter( + qs = qs.filter( mainq ) diff --git a/src/pretix/control/views/search.py b/src/pretix/control/views/search.py index b0a5c75683..8b5271ea9a 100644 --- a/src/pretix/control/views/search.py +++ b/src/pretix/control/views/search.py @@ -62,10 +62,7 @@ class OrderSearch(PaginationMixin, ListView): if not self.request.user.has_active_staff_session(self.request.session.session_key): qs = qs.filter( - Q(event__organizer_id__in=self.request.user.teams.filter( - all_events=True, can_view_orders=True).values_list('organizer', flat=True)) - | Q(event_id__in=self.request.user.teams.filter( - can_view_orders=True).values_list('limit_events__id', flat=True)) + Q(event_id__in=self.request.user.get_events_with_permission('can_view_orders').values_list('id', flat=True)) ) if self.filter_form.is_valid():