From 1ce613ff8954671de8102b8845e786e0b9926dbb Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Fri, 14 Jun 2019 12:20:06 +0200 Subject: [PATCH] Add new signal nav_item --- doc/development/api/general.rst | 2 +- src/pretix/control/signals.py | 18 ++++++++++++++++++ .../templates/pretixcontrol/item/base.html | 7 +++++++ src/pretix/control/views/item.py | 14 +++++++++++++- 4 files changed, 39 insertions(+), 2 deletions(-) diff --git a/doc/development/api/general.rst b/doc/development/api/general.rst index 9e163959a..308de0702 100644 --- a/doc/development/api/general.rst +++ b/doc/development/api/general.rst @@ -45,7 +45,7 @@ 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 + order_info, event_settings_widget, oauth_application_registered, order_position_buttons, nav_item .. automodule:: pretix.base.signals diff --git a/src/pretix/control/signals.py b/src/pretix/control/signals.py index b6c83923c..de58fb5d3 100644 --- a/src/pretix/control/signals.py +++ b/src/pretix/control/signals.py @@ -237,6 +237,24 @@ As with all plugin signals, the ``sender`` keyword argument will contain the eve A second keyword argument ``request`` will contain the request object. """ +nav_item = EventPluginSignal( + providing_args=['request', 'item'] +) +""" +This signal is sent out to include tab links on the settings page of an item. +Receivers are expected to return a list of dictionaries. The dictionaries +should contain at least the keys ``label`` and ``url``. You should also return +an ``active`` key with a boolean set to ``True``, when this item should be marked +as active. + +If your linked view should stay in the tab-like context of this page, we recommend +that you use ``pretix.control.views.item.ItemDetailMixin`` for your view +and your template inherits from ``pretixcontrol/item/base.html``. + +As with all plugin signals, the ``sender`` keyword argument will contain the event. +A second keyword argument ``request`` will contain the request object. +""" + event_settings_widget = EventPluginSignal( providing_args=['request'] ) diff --git a/src/pretix/control/templates/pretixcontrol/item/base.html b/src/pretix/control/templates/pretixcontrol/item/base.html index fc6a05995..87d785441 100644 --- a/src/pretix/control/templates/pretixcontrol/item/base.html +++ b/src/pretix/control/templates/pretixcontrol/item/base.html @@ -27,6 +27,13 @@ {% trans "Bundled products" %} + {% for n in extra_nav %} +
  • + + {{ n.label }} + +
  • + {% endfor %} {% else %}

    {% trans "Create product" %}

    diff --git a/src/pretix/control/views/item.py b/src/pretix/control/views/item.py index d31bbc796..b91b3d3aa 100644 --- a/src/pretix/control/views/item.py +++ b/src/pretix/control/views/item.py @@ -33,7 +33,7 @@ from pretix.control.forms.item import ( from pretix.control.permissions import ( EventPermissionRequiredMixin, event_permission_required, ) -from pretix.control.signals import item_forms +from pretix.control.signals import item_forms, nav_item from . import ChartContainingView, CreateView, PaginationMixin, UpdateView @@ -782,6 +782,18 @@ class ItemDetailMixin(SingleObjectMixin): model = Item context_object_name = 'item' + def get_context_data(self, **kwargs): + ctx = super().get_context_data(**kwargs) + nav = sorted( + sum( + (list(a[1]) for a in nav_item.send(self.request.event, request=self.request, item=self.get_object())), + [] + ), + key=lambda r: str(r['label']) + ) + ctx['extra_nav'] = nav + return ctx + def get_object(self, queryset=None) -> Item: try: if not hasattr(self, 'object') or not self.object: