From d4a491fc1b2a5d76429154f4f0ac1963e27f721d Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Thu, 28 Nov 2019 11:18:09 +0100 Subject: [PATCH] Add new signal pretix.control.signals.order_search_filter_q --- doc/development/api/general.rst | 4 ++-- src/pretix/control/forms/filter.py | 8 +++++++- src/pretix/control/signals.py | 11 +++++++++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/doc/development/api/general.rst b/doc/development/api/general.rst index b23cb4f9e..952f957e0 100644 --- a/doc/development/api/general.rst +++ b/doc/development/api/general.rst @@ -49,8 +49,8 @@ Backend .. automodule:: pretix.control.signals :members: nav_event, html_head, html_page_start, quota_detail_html, nav_topbar, nav_global, nav_organizer, nav_event_settings, - order_info, event_settings_widget, oauth_application_registered, order_position_buttons, subevent_forms, item_formsets - + order_info, event_settings_widget, oauth_application_registered, order_position_buttons, subevent_forms, + item_formsets, order_search_filter_q .. automodule:: pretix.base.signals :members: logentry_display, logentry_object_link, requiredaction_display, timeline_events diff --git a/src/pretix/control/forms/filter.py b/src/pretix/control/forms/filter.py index c3e38e9ea..55e5a23a8 100644 --- a/src/pretix/control/forms/filter.py +++ b/src/pretix/control/forms/filter.py @@ -18,6 +18,7 @@ from pretix.base.models import ( ) from pretix.base.signals import register_payment_providers from pretix.control.forms.widgets import Select2 +from pretix.control.signals import order_search_filter_q from pretix.helpers.database import FixedOrderBy, rolledback_transaction from pretix.helpers.i18n import i18ncomp @@ -139,7 +140,7 @@ class OrderFilterForm(FilterForm): ) ).values('id') - qs = qs.annotate(has_pos=Exists(matching_positions)).filter( + mainq = ( code | Q(email__icontains=u) | Q(invoice_address__name_cached__icontains=u) @@ -148,6 +149,11 @@ class OrderFilterForm(FilterForm): | Q(comment__icontains=u) | Q(has_pos=True) ) + 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( + mainq + ) if fdata.get('status'): s = fdata.get('status') diff --git a/src/pretix/control/signals.py b/src/pretix/control/signals.py index af87986eb..aa2f90065 100644 --- a/src/pretix/control/signals.py +++ b/src/pretix/control/signals.py @@ -301,3 +301,14 @@ oauth_application_registered = Signal( """ This signal will be called whenever a user registers a new OAuth application. """ + +order_search_filter_q = Signal( + providing_args=["query"] +) +""" +This signal will be called whenever a free-text order search is performed. You are expected to return one +Q object that will be OR-ed with existing search queries. As order search exists on a global level as well, +this is not an Event signal and will be called even if your plugin is not active. ``sender`` will contain the +event if the search is performed within an event, and ``None`` otherwise. The search query will be passed as +``query``. +"""