From 49828186b0b2ba9112f1302475c3fa2ab84973aa Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Tue, 11 Dec 2018 16:43:07 +0100 Subject: [PATCH] Signals: Pretictable call order, not return order --- src/pretix/base/signals.py | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/pretix/base/signals.py b/src/pretix/base/signals.py index 70f1f5830..3a581f379 100644 --- a/src/pretix/base/signals.py +++ b/src/pretix/base/signals.py @@ -65,11 +65,11 @@ class EventPluginSignal(django.dispatch.Signal): if not app_cache: _populate_app_cache() - for receiver in self._live_receivers(sender): + for receiver in self._sorted_receivers(sender): if self._is_active(sender, receiver): response = receiver(signal=self, sender=sender, **named) responses.append((receiver, response)) - return sorted(responses, key=lambda r: (receiver.__module__, receiver.__name__)) + return responses def send_chained(self, sender: Event, chain_kwarg_name, **named) -> List[Tuple[Callable, Any]]: """ @@ -89,7 +89,7 @@ class EventPluginSignal(django.dispatch.Signal): if not app_cache: _populate_app_cache() - for receiver in self._live_receivers(sender): + for receiver in self._sorted_receivers(sender): if self._is_active(sender, receiver): named[chain_kwarg_name] = response response = receiver(signal=self, sender=sender, **named) @@ -116,7 +116,7 @@ class EventPluginSignal(django.dispatch.Signal): if not app_cache: _populate_app_cache() - for receiver in self._live_receivers(sender): + for receiver in self._sorted_receivers(sender): if self._is_active(sender, receiver): try: response = receiver(signal=self, sender=sender, **named) @@ -124,10 +124,19 @@ class EventPluginSignal(django.dispatch.Signal): responses.append((receiver, err)) else: responses.append((receiver, response)) - return sorted( - responses, - key=lambda response: (response[0].__module__, response[0].__name__), + return responses + + def _sorted_receivers(self, sender): + orig_list = self._live_receivers(sender) + sorted_list = sorted( + orig_list, + key=lambda receiver: ( + 0 if any(receiver.__module__.startswith(m) for m in settings.CORE_MODULES) else 1, + receiver.__module__, + receiver.__name__, + ) ) + return sorted_list class DeprecatedSignal(django.dispatch.Signal):