diff --git a/src/pretix/base/signals.py b/src/pretix/base/signals.py index 0b2edda63e..1f0eec923b 100644 --- a/src/pretix/base/signals.py +++ b/src/pretix/base/signals.py @@ -50,7 +50,7 @@ class EventPluginSignal(django.dispatch.Signal): if not hasattr(app, 'compatibility_errors') or not app.compatibility_errors: response = receiver(signal=self, sender=sender, **named) responses.append((receiver, response)) - return responses + return sorted(responses, key=lambda r: (receiver.__module__, receiver.__name__)) class DeprecatedSignal(django.dispatch.Signal): diff --git a/src/pretix/control/context.py b/src/pretix/control/context.py index 7589d1778d..f24de2f0fb 100644 --- a/src/pretix/control/context.py +++ b/src/pretix/control/context.py @@ -45,12 +45,12 @@ def contextprocessor(request): if not hasattr(request, 'event'): for receiver, response in nav_global.send(request, request=request): _nav_global += response - ctx['nav_global'] = _nav_global + ctx['nav_global'] = sorted(_nav_global, key=lambda n: n['label']) _nav_topbar = [] for receiver, response in nav_topbar.send(request, request=request): _nav_topbar += response - ctx['nav_topbar'] = _nav_topbar + ctx['nav_topbar'] = sorted(_nav_topbar, key=lambda n: n['label']) ctx['js_datetime_format'] = get_javascript_format('DATETIME_INPUT_FORMATS') ctx['js_date_format'] = get_javascript_format('DATE_INPUT_FORMATS') diff --git a/src/pretix/control/forms/global_settings.py b/src/pretix/control/forms/global_settings.py index a5bbbde339..ac2fafb368 100644 --- a/src/pretix/control/forms/global_settings.py +++ b/src/pretix/control/forms/global_settings.py @@ -29,7 +29,7 @@ class GlobalSettingsForm(SettingsForm): )) ]) responses = register_global_settings.send(self) - for r, response in responses: + for r, response in sorted(responses, key=lambda r: str(r[0])): for key, value in response.items(): # We need to be this explicit, since OrderedDict.update does not retain ordering self.fields[key] = value diff --git a/src/pretix/control/views/event.py b/src/pretix/control/views/event.py index c85e1ddb71..7e54d7643f 100644 --- a/src/pretix/control/views/event.py +++ b/src/pretix/control/views/event.py @@ -674,7 +674,7 @@ class EventLive(EventPermissionRequiredMixin, TemplateView): issues.append(_('You need to configure at least one quota to sell anything.')) responses = event_live_issues.send(self.request.event) - for receiver, response in responses: + for receiver, response in sorted(responses, key=lambda r: str(r[0])): if response: issues.append(response) diff --git a/src/pretix/control/views/organizer.py b/src/pretix/control/views/organizer.py index 2a56257b65..94989dfc92 100644 --- a/src/pretix/control/views/organizer.py +++ b/src/pretix/control/views/organizer.py @@ -48,6 +48,7 @@ class OrganizerDetailViewMixin: for recv, retv in nav_organizer.send(sender=self.request.organizer, request=self.request, organizer=self.request.organizer): ctx['nav_organizer'] += retv + ctx['nav_organizer'].sort(key=lambda n: n['label']) return ctx def get_object(self, queryset=None) -> Organizer: diff --git a/src/pretix/plugins/ticketoutputpdf/views.py b/src/pretix/plugins/ticketoutputpdf/views.py index a6cc63df2e..043193de72 100644 --- a/src/pretix/plugins/ticketoutputpdf/views.py +++ b/src/pretix/plugins/ticketoutputpdf/views.py @@ -21,7 +21,6 @@ from pretix.control.permissions import EventPermissionRequiredMixin from pretix.control.views import ChartContainingView from pretix.helpers.database import rolledback_transaction from pretix.plugins.ticketoutputpdf.signals import get_fonts - from .ticketoutput import PdfTicketOutput logger = logging.getLogger(__name__) @@ -95,7 +94,8 @@ class EditorView(EventPermissionRequiredMixin, ChartContainingView, TemplateView p = order.positions.create(item=item, attendee_name=_("John Doe"), price=item.default_price) prov = PdfTicketOutput(request.event, - override_layout=json.loads(request.POST.get("data")), + override_layout=(json.loads(request.POST.get("data")) + if request.POST.get("data") else None), override_background=cf.file if cf else None) fname, mimet, data = prov.generate(p)