mirror of
https://github.com/pretix/pretix.git
synced 2026-10-02 19:24:42 +00:00
commit2177bebf6aMerge:ea613bf271d08216d8c5Author: Mira Weller <weller@rami.io> Date: Fri Aug 7 21:22:31 2026 +0200 Merge branch 'master' into questions-vue3 commitea613bf271Author: Mira Weller <weller@rami.io> Date: Fri Aug 7 21:21:35 2026 +0200 wip commitc8bed5e3b9Author: Mira Weller <weller@rami.io> Date: Fri Aug 7 10:15:00 2026 +0200 rename get_cart to get_cart_positions (keep old name alive) commit1ec27fff05Author: Mira Weller <weller@rami.io> Date: Fri Aug 7 10:01:38 2026 +0200 filter questionnaires by sales channel commit0294f205d0Author: Mira Weller <weller@rami.io> Date: Thu Aug 6 20:06:05 2026 +0200 refactor: extract build_requested_valid_from_field method commit3424aacdc3Author: Mira Weller <weller@rami.io> Date: Thu Aug 6 20:05:44 2026 +0200 rename presale question forms and mixins commit4012889076Author: Mira Weller <weller@rami.io> Date: Thu Aug 6 19:42:29 2026 +0200 rebase migration commitfe15d71cd2Merge:3ea7ea31b64d9dfa88feAuthor: Mira Weller <weller@rami.io> Date: Thu Aug 6 19:25:44 2026 +0200 Merge branch 'master' into questions-vue3 # Conflicts: # src/pretix/base/forms/questions.py # src/pretix/base/middleware.py # src/pretix/base/templates/pretixbase/redirect.html commit3ea7ea31b6Author: Mira Weller <weller@rami.io> Date: Fri Jul 24 17:37:46 2026 +0200 wip commit5b34a25fb5Author: Mira Weller <weller@rami.io> Date: Wed Jun 17 16:21:11 2026 +0200 use questionnaire data for rendering checkout questions step commit9467f1d08dAuthor: Mira Weller <weller@rami.io> Date: Wed Jun 17 15:54:14 2026 +0200 refactor: extract build_system_question_field method commit85344a7690Author: Mira Weller <weller@rami.io> Date: Wed Jun 17 15:50:41 2026 +0200 refactor: extract build_user_question_field method commit3b47f4aaa7Author: Mira Weller <weller@rami.io> Date: Wed Jun 17 15:49:34 2026 +0200 refactor: cartpos / orderpos commit0309b05121Author: Mira Weller <weller@rami.io> Date: Thu Mar 19 13:52:18 2026 +0100 vite config: allow cors access from pretix.work subdomains commitad092ae0d1Author: Mira Weller <weller@rami.io> Date: Wed Jun 17 12:35:33 2026 +0200 re-add vue-slicksort dep commit9f42d679ccAuthor: Mira Weller <weller@rami.io> Date: Wed Jun 17 12:28:53 2026 +0200 rebase migration commit9eae9c6de7Merge:84c51e031e694b915d89Author: Mira Weller <weller@rami.io> Date: Wed Jun 17 12:24:49 2026 +0200 Merge branch 'master' into questions-vue3 # Conflicts: # .github/workflows/tests.yml # .gitignore # Dockerfile # package-lock.json # package.json # src/pretix/base/management/commands/runserver.py # src/pretix/base/middleware.py # src/pretix/base/templatetags/vite.py # src/pretix/control/forms/global_settings.py # src/pretix/control/templates/pretixcontrol/checkin/list_edit.html # src/pretix/control/views/item.py # src/pretix/presale/views/widget.py # src/pretix/settings.py # src/pretix/static/pretixcontrol/js/ui/checkinrules/App.vue # src/pretix/static/pretixcontrol/js/ui/checkinrules/constants.ts # src/pretix/static/pretixcontrol/js/ui/checkinrules/django-interop.ts # src/pretix/static/pretixcontrol/js/ui/checkinrules/lookup-select2.vue # src/pretix/static/pretixcontrol/js/ui/checkinrules/timefield.vue # src/pretix/static/pretixcontrol/js/ui/checkinrules/viz-node.vue # src/pretix/static/pretixpresale/widget/index.html # src/pretix/static/pretixpresale/widget/src/api.ts # src/pretix/static/pretixpresale/widget/src/button.ts # src/pretix/static/pretixpresale/widget/src/components/PriceBox.vue # src/pretix/static/pretixpresale/widget/src/main.ts # src/pretix/static/pretixpresale/widget/src/sharedStore.ts # src/pretix/static/pretixpresale/widget/src/utils.ts # src/pretix/static/pretixpresale/widget/src/widget.ts # src/tests/e2e/conftest.py # vite.config.ts commit84c51e031eMerge:902ee9242e222b453b43Author: Mira Weller <weller@rami.io> Date: Wed Jun 17 12:20:05 2026 +0200 Merge branch 'master' into questions-vue3 commit902ee9242eAuthor: Mira Weller <weller@rami.io> Date: Wed Jun 17 12:19:26 2026 +0200 css comment commitb758efd4a9Author: Mira Weller <weller@rami.io> Date: Wed Jun 17 12:19:19 2026 +0200 question dependencies commitc68fe00502Author: Mira Weller <weller@rami.io> Date: Wed Jun 17 12:18:00 2026 +0200 add data field edit link commitb7da9bb6c1Author: Mira Weller <weller@rami.io> Date: Wed Jun 17 12:16:20 2026 +0200 handle hidden questions commit897120d3daAuthor: Mira Weller <weller@rami.io> Date: Tue May 12 13:04:08 2026 +0200 add ts model definitions commit09abc5725eAuthor: Mira Weller <weller@rami.io> Date: Tue May 12 11:30:12 2026 +0200 reorder and save commit9a7d5abb1fAuthor: Mira Weller <weller@rami.io> Date: Tue May 12 11:29:37 2026 +0200 fix unhandled exception in taxrules API commit3cee5f524bAuthor: Mira Weller <weller@rami.io> Date: Tue May 5 18:12:21 2026 +0200 use slicksort for reordering questionnaires and questions commit3a1a6b988eAuthor: Mira Weller <weller@rami.io> Date: Tue Apr 28 19:23:35 2026 +0200 improve i18n, implement "add text block" dialog commitbdc720f5a2Author: Mira Weller <weller@rami.io> Date: Fri Mar 27 18:57:22 2026 +0100 wip commit583184af38Author: Mira Weller <weller@rami.io> Date: Thu Mar 19 21:45:32 2026 +0100 change existing views commit63d9f7cea8Author: Mira Weller <weller@rami.io> Date: Thu Mar 19 21:45:32 2026 +0100 adapt vue app to new data model (wip) commitc3d6fb1bd6Author: Mira Weller <weller@rami.io> Date: Thu Mar 19 21:44:47 2026 +0100 add Questionnaire and QuestionnaireChild models and their API; migrate existing data commitbb43acd257Author: Mira Weller <weller@rami.io> Date: Thu Mar 19 13:52:28 2026 +0100 vite config: add questionnaires app commite0744951e8Author: Mira Weller <weller@rami.io> Date: Thu Mar 19 13:52:18 2026 +0100 vite config: allow cors access from pretix.work subdomains commitfef1e356f7Author: Mira Weller <weller@rami.io> Date: Thu Mar 19 13:33:24 2026 +0100 fix out-of-the-box experience commit81775f5d2dAuthor: Mira Weller <weller@rami.io> Date: Thu Mar 19 13:33:24 2026 +0100 setup questionnaires vue app, add code from question editor proof of concept commit4bbcc398ccMerge:a924d0a26658840a5fd6Author: Mira Weller <weller@rami.io> Date: Thu Mar 19 13:13:32 2026 +0100 Merge remote-tracking branch 'refs/remotes/origin/master' into questions-vue3
741 lines
28 KiB
Python
741 lines
28 KiB
Python
#
|
|
# This file is part of pretix (Community Edition).
|
|
#
|
|
# Copyright (C) 2014-2020 Raphael Michel and contributors
|
|
# Copyright (C) 2020-today pretix GmbH and contributors
|
|
#
|
|
# This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General
|
|
# Public License as published by the Free Software Foundation in version 3 of the License.
|
|
#
|
|
# ADDITIONAL TERMS APPLY: Pursuant to Section 7 of the GNU Affero General Public License, additional terms are
|
|
# applicable granting you additional permissions and placing additional restrictions on your usage of this software.
|
|
# Please refer to the pretix LICENSE file to obtain the full terms applicable to this work. If you did not receive
|
|
# this file, see <https://pretix.eu/about/en/license>.
|
|
#
|
|
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
|
|
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
|
# details.
|
|
#
|
|
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
|
|
# <https://www.gnu.org/licenses/>.
|
|
#
|
|
from django.http import HttpRequest
|
|
from django.urls import reverse
|
|
from django.utils.translation import gettext_lazy as _, pgettext_lazy
|
|
|
|
from pretix.control.signals import (
|
|
nav_event, nav_event_settings, nav_global, nav_organizer,
|
|
)
|
|
|
|
|
|
def get_event_navigation(request: HttpRequest):
|
|
url = request.resolver_match
|
|
if not url:
|
|
return []
|
|
nav = [
|
|
{
|
|
'label': _('Dashboard'),
|
|
'url': reverse('control:event.index', kwargs={
|
|
'event': request.event.slug,
|
|
'organizer': request.event.organizer.slug,
|
|
}),
|
|
'active': (url.url_name == 'event.index'),
|
|
'icon': 'dashboard',
|
|
}
|
|
]
|
|
event_settings = []
|
|
if "event.settings.general:write" in request.eventpermset:
|
|
event_settings.append({
|
|
'label': _('General'),
|
|
'url': reverse('control:event.settings', kwargs={
|
|
'event': request.event.slug,
|
|
'organizer': request.event.organizer.slug,
|
|
}),
|
|
'active': url.url_name == 'event.settings',
|
|
})
|
|
|
|
if "event.settings.payment:write" in request.eventpermset or "event.settings.general:write" in request.eventpermset:
|
|
event_settings.append({
|
|
'label': _('Payment'),
|
|
'url': reverse('control:event.settings.payment', kwargs={
|
|
'event': request.event.slug,
|
|
'organizer': request.event.organizer.slug,
|
|
}),
|
|
'active': url.url_name in ('event.settings.payment', 'event.settings.payment.provider'),
|
|
})
|
|
|
|
if "event.settings.general:write" in request.eventpermset:
|
|
event_settings += [
|
|
{
|
|
'label': _('Plugins'),
|
|
'url': reverse('control:event.settings.plugins', kwargs={
|
|
'event': request.event.slug,
|
|
'organizer': request.event.organizer.slug,
|
|
}),
|
|
'active': url.url_name == 'event.settings.plugins',
|
|
},
|
|
{
|
|
'label': _('Tickets'),
|
|
'url': reverse('control:event.settings.tickets', kwargs={
|
|
'event': request.event.slug,
|
|
'organizer': request.event.organizer.slug,
|
|
}),
|
|
'active': url.url_name == 'event.settings.tickets',
|
|
},
|
|
{
|
|
'label': _('Email'),
|
|
'url': reverse('control:event.settings.mail', kwargs={
|
|
'event': request.event.slug,
|
|
'organizer': request.event.organizer.slug,
|
|
}),
|
|
'active': url.url_name == 'event.settings.mail',
|
|
}
|
|
]
|
|
|
|
if "event.settings.tax:write" in request.eventpermset or "event.settings.general:write" in request.eventpermset:
|
|
event_settings.append({
|
|
'label': _('Taxes'),
|
|
'url': reverse('control:event.settings.tax', kwargs={
|
|
'event': request.event.slug,
|
|
'organizer': request.event.organizer.slug,
|
|
}),
|
|
'active': url.url_name.startswith('event.settings.tax'),
|
|
})
|
|
|
|
if "event.settings.invoicing:write" in request.eventpermset or "event.settings.general:write" in request.eventpermset:
|
|
event_settings.append({
|
|
'label': _('Invoicing'),
|
|
'url': reverse('control:event.settings.invoice', kwargs={
|
|
'event': request.event.slug,
|
|
'organizer': request.event.organizer.slug,
|
|
}),
|
|
'active': url.url_name == 'event.settings.invoice',
|
|
})
|
|
|
|
if "event.settings.general:write" in request.eventpermset:
|
|
event_settings += [
|
|
{
|
|
'label': pgettext_lazy('action', 'Cancellation'),
|
|
'url': reverse('control:event.settings.cancel', kwargs={
|
|
'event': request.event.slug,
|
|
'organizer': request.event.organizer.slug,
|
|
}),
|
|
'active': url.url_name == 'event.settings.cancel',
|
|
},
|
|
{
|
|
'label': _('Widget'),
|
|
'url': reverse('control:event.settings.widget', kwargs={
|
|
'event': request.event.slug,
|
|
'organizer': request.event.organizer.slug,
|
|
}),
|
|
'active': url.url_name == 'event.settings.widget',
|
|
},
|
|
]
|
|
|
|
# It would be better to allow plugins to handle the permission themselves, but for backwards compatibility
|
|
# we need to have it in the "if" statement
|
|
event_settings += sorted(
|
|
sum((list(a[1]) for a in nav_event_settings.send(request.event, request=request)), []),
|
|
key=lambda r: r['label']
|
|
)
|
|
if event_settings:
|
|
nav.append({
|
|
'label': _('Settings'),
|
|
'url': event_settings[0]["url"],
|
|
'active': False,
|
|
'icon': 'wrench',
|
|
'children': event_settings
|
|
})
|
|
|
|
nav.append({
|
|
'label': _('Products'),
|
|
'url': reverse('control:event.items', kwargs={
|
|
'event': request.event.slug,
|
|
'organizer': request.event.organizer.slug,
|
|
}),
|
|
'active': False,
|
|
'icon': 'ticket',
|
|
'children': [
|
|
{
|
|
'label': _('Products'),
|
|
'url': reverse('control:event.items', kwargs={
|
|
'event': request.event.slug,
|
|
'organizer': request.event.organizer.slug,
|
|
}),
|
|
'active': url.url_name in (
|
|
'event.item', 'event.items.add', 'event.items') or "event.item." in url.url_name,
|
|
},
|
|
{
|
|
'label': _('Quotas'),
|
|
'url': reverse('control:event.items.quotas', kwargs={
|
|
'event': request.event.slug,
|
|
'organizer': request.event.organizer.slug,
|
|
}),
|
|
'active': 'event.items.quota' in url.url_name,
|
|
},
|
|
{
|
|
'label': _('Categories'),
|
|
'url': reverse('control:event.items.categories', kwargs={
|
|
'event': request.event.slug,
|
|
'organizer': request.event.organizer.slug,
|
|
}),
|
|
'active': 'event.items.categories' in url.url_name,
|
|
},
|
|
{
|
|
'label': _('Questionnaires'),
|
|
'url': reverse('control:event.items.questionnaires', kwargs={
|
|
'event': request.event.slug,
|
|
'organizer': request.event.organizer.slug,
|
|
}),
|
|
'active': 'event.items.questionnaires' in url.url_name or 'event.items.questions' in url.url_name,
|
|
},
|
|
{
|
|
'label': _('Discounts'),
|
|
'url': reverse('control:event.items.discounts', kwargs={
|
|
'event': request.event.slug,
|
|
'organizer': request.event.organizer.slug,
|
|
}),
|
|
'active': 'event.items.discounts' in url.url_name,
|
|
},
|
|
]
|
|
})
|
|
|
|
if request.event.has_subevents:
|
|
nav.append({
|
|
'label': pgettext_lazy('subevent', 'Dates'),
|
|
'url': reverse('control:event.subevents', kwargs={
|
|
'event': request.event.slug,
|
|
'organizer': request.event.organizer.slug,
|
|
}),
|
|
'active': ('event.subevent' in url.url_name),
|
|
'icon': 'calendar',
|
|
})
|
|
|
|
if 'event.orders:read' in request.eventpermset:
|
|
children = [
|
|
{
|
|
'label': _('All orders'),
|
|
'url': reverse('control:event.orders', kwargs={
|
|
'event': request.event.slug,
|
|
'organizer': request.event.organizer.slug,
|
|
}),
|
|
'active': url.url_name in ('event.orders', 'event.order', 'event.orders.search') or "event.order." in url.url_name,
|
|
},
|
|
{
|
|
'label': _('Overview'),
|
|
'url': reverse('control:event.orders.overview', kwargs={
|
|
'event': request.event.slug,
|
|
'organizer': request.event.organizer.slug,
|
|
}),
|
|
'active': 'event.orders.overview' in url.url_name,
|
|
},
|
|
{
|
|
'label': _('Refunds'),
|
|
'url': reverse('control:event.orders.refunds', kwargs={
|
|
'event': request.event.slug,
|
|
'organizer': request.event.organizer.slug,
|
|
}),
|
|
'active': 'event.orders.refunds' in url.url_name,
|
|
},
|
|
{
|
|
'label': _('Export'),
|
|
'url': reverse('control:event.orders.export', kwargs={
|
|
'event': request.event.slug,
|
|
'organizer': request.event.organizer.slug,
|
|
}),
|
|
'active': 'event.orders.export' in url.url_name,
|
|
},
|
|
{
|
|
'label': _('Waiting list'),
|
|
'url': reverse('control:event.orders.waitinglist', kwargs={
|
|
'event': request.event.slug,
|
|
'organizer': request.event.organizer.slug,
|
|
}),
|
|
'active': 'event.orders.waitinglist' in url.url_name,
|
|
},
|
|
]
|
|
if 'event.orders:write' in request.eventpermset:
|
|
children.append({
|
|
'label': _('Import'),
|
|
'url': reverse('control:event.orders.import', kwargs={
|
|
'event': request.event.slug,
|
|
'organizer': request.event.organizer.slug,
|
|
}),
|
|
'active': 'event.orders.import' in url.url_name,
|
|
})
|
|
nav.append({
|
|
'label': _('Orders'),
|
|
'url': reverse('control:event.orders', kwargs={
|
|
'event': request.event.slug,
|
|
'organizer': request.event.organizer.slug,
|
|
}),
|
|
'active': False,
|
|
'icon': 'shopping-cart',
|
|
'children': children
|
|
})
|
|
else:
|
|
nav.append({
|
|
'label': _('Export'),
|
|
'url': reverse('control:event.orders.export', kwargs={
|
|
'event': request.event.slug,
|
|
'organizer': request.event.organizer.slug,
|
|
}),
|
|
'active': 'event.orders.export' in url.url_name,
|
|
'icon': 'download',
|
|
})
|
|
|
|
if 'event.vouchers:read' in request.eventpermset:
|
|
nav.append({
|
|
'label': _('Vouchers'),
|
|
'url': reverse('control:event.vouchers', kwargs={
|
|
'event': request.event.slug,
|
|
'organizer': request.event.organizer.slug,
|
|
}),
|
|
'active': False,
|
|
'icon': 'tags',
|
|
'children': [
|
|
{
|
|
'label': _('All vouchers'),
|
|
'url': reverse('control:event.vouchers', kwargs={
|
|
'event': request.event.slug,
|
|
'organizer': request.event.organizer.slug,
|
|
}),
|
|
'active': url.url_name != 'event.vouchers.tags' and "event.vouchers" in url.url_name,
|
|
},
|
|
{
|
|
'label': _('Tags'),
|
|
'url': reverse('control:event.vouchers.tags', kwargs={
|
|
'event': request.event.slug,
|
|
'organizer': request.event.organizer.slug,
|
|
}),
|
|
'active': 'event.vouchers.tags' in url.url_name,
|
|
},
|
|
]
|
|
})
|
|
|
|
if 'event.orders:read' in request.eventpermset or 'event.settings.general:write' in request.eventpermset:
|
|
nav.append({
|
|
'label': pgettext_lazy('navigation', 'Check-in'),
|
|
'url': reverse('control:event.orders.checkinlists', kwargs={
|
|
'event': request.event.slug,
|
|
'organizer': request.event.organizer.slug,
|
|
}),
|
|
'active': False,
|
|
'icon': 'check-square-o',
|
|
'children': [
|
|
{
|
|
'label': _('Check-in lists'),
|
|
'url': reverse('control:event.orders.checkinlists', kwargs={
|
|
'event': request.event.slug,
|
|
'organizer': request.event.organizer.slug,
|
|
}),
|
|
'active': 'event.orders.checkinlists' in url.url_name,
|
|
},
|
|
{
|
|
'label': _('Check-in history'),
|
|
'url': reverse('control:event.orders.checkins', kwargs={
|
|
'event': request.event.slug,
|
|
'organizer': request.event.organizer.slug,
|
|
}),
|
|
'active': 'event.orders.checkins' in url.url_name,
|
|
},
|
|
]
|
|
})
|
|
|
|
merge_in(nav, sorted(
|
|
sum((list(a[1]) for a in nav_event.send(request.event, request=request)), []),
|
|
key=lambda r: (1 if r.get('parent') else 0, r['label'])
|
|
))
|
|
|
|
return nav
|
|
|
|
|
|
def get_global_navigation(request):
|
|
url = request.resolver_match
|
|
if not url:
|
|
return []
|
|
has_staff_session = request.user.has_active_staff_session(request.session.session_key)
|
|
nav = [
|
|
{
|
|
'label': _('Dashboard'),
|
|
'url': reverse('control:index'),
|
|
'active': (url.url_name == 'index'),
|
|
'icon': 'dashboard',
|
|
},
|
|
]
|
|
if request.user.is_in_any_teams or request.user.is_staff:
|
|
nav += [
|
|
{
|
|
'label': _('Events'),
|
|
'url': reverse('control:events'),
|
|
'active': 'events' in url.url_name,
|
|
'icon': 'calendar',
|
|
},
|
|
{
|
|
'label': _('Organizers'),
|
|
'url': reverse('control:organizers'),
|
|
'active': 'organizers' in url.url_name,
|
|
'icon': 'group',
|
|
},
|
|
{
|
|
'label': _('Search'),
|
|
'url': reverse('control:search.orders'),
|
|
'active': False,
|
|
'icon': 'search',
|
|
'children': [
|
|
{
|
|
'label': _('Orders'),
|
|
'url': reverse('control:search.orders'),
|
|
'active': 'search.orders' in url.url_name,
|
|
'icon': 'search',
|
|
},
|
|
{
|
|
'label': _('Payments'),
|
|
'url': reverse('control:search.payments'),
|
|
'active': 'search.payments' in url.url_name,
|
|
'icon': 'search',
|
|
},
|
|
]
|
|
},
|
|
]
|
|
nav += [
|
|
{
|
|
'label': _('User settings'),
|
|
'url': reverse('control:user.settings'),
|
|
'active': False,
|
|
'icon': 'user',
|
|
'children': [
|
|
{
|
|
'label': _('General'),
|
|
'url': reverse('control:user.settings'),
|
|
'active': 'user.settings' == url.url_name,
|
|
},
|
|
{
|
|
'label': _('Notifications'),
|
|
'url': reverse('control:user.settings.notifications'),
|
|
'active': 'user.settings.notifications' == url.url_name,
|
|
},
|
|
{
|
|
'label': _('2FA'),
|
|
'url': reverse('control:user.settings.2fa'),
|
|
'active': 'user.settings.2fa' in url.url_name,
|
|
},
|
|
{
|
|
'label': _('Authorized apps'),
|
|
'url': reverse('control:user.settings.oauth.list'),
|
|
'active': 'user.settings.oauth' in url.url_name,
|
|
},
|
|
{
|
|
'label': _('Account history'),
|
|
'url': reverse('control:user.settings.history'),
|
|
'active': 'user.settings.history' in url.url_name,
|
|
},
|
|
]
|
|
},
|
|
]
|
|
if has_staff_session:
|
|
nav.append({
|
|
'label': _('Users'),
|
|
'url': reverse('control:users'),
|
|
'active': False,
|
|
'icon': 'user',
|
|
'children': [
|
|
{
|
|
'label': _('All users'),
|
|
'url': reverse('control:users'),
|
|
'active': ('users' in url.url_name),
|
|
},
|
|
{
|
|
'label': _('Admin sessions'),
|
|
'url': reverse('control:user.sudo.list'),
|
|
'active': ('sudo' in url.url_name),
|
|
},
|
|
]
|
|
})
|
|
nav.append({
|
|
'label': _('Global settings'),
|
|
'url': reverse('control:global.settings'),
|
|
'active': False,
|
|
'icon': 'wrench',
|
|
'children': [
|
|
{
|
|
'label': _('Settings'),
|
|
'url': reverse('control:global.settings'),
|
|
'active': (url.url_name == 'global.settings'),
|
|
},
|
|
{
|
|
'label': _('Update check'),
|
|
'url': reverse('control:global.update'),
|
|
'active': (url.url_name == 'global.update'),
|
|
},
|
|
{
|
|
'label': _('License check'),
|
|
'url': reverse('control:global.license'),
|
|
'active': (url.url_name == 'global.license'),
|
|
},
|
|
{
|
|
'label': _('System report'),
|
|
'url': reverse('control:global.sysreport'),
|
|
'active': (url.url_name == 'global.sysreport'),
|
|
},
|
|
{
|
|
'label': _('Data sync problems'),
|
|
'url': reverse('control:global.datasync.failedjobs'),
|
|
'active': (url.url_name == 'global.datasync.failedjobs'),
|
|
},
|
|
]
|
|
})
|
|
|
|
merge_in(nav, sorted(
|
|
sum((list(a[1]) for a in nav_global.send(request, request=request)), []),
|
|
key=lambda r: (1 if r.get('parent') else 0, r['label'])
|
|
))
|
|
return nav
|
|
|
|
|
|
def get_organizer_navigation(request):
|
|
url = request.resolver_match
|
|
if not url:
|
|
return []
|
|
nav = [
|
|
{
|
|
'label': _('Events'),
|
|
'url': reverse('control:organizer', kwargs={
|
|
'organizer': request.organizer.slug
|
|
}),
|
|
'active': url.url_name == 'organizer',
|
|
'icon': 'calendar',
|
|
},
|
|
]
|
|
if 'organizer.settings.general:write' in request.orgapermset:
|
|
nav.append({
|
|
'label': _('Settings'),
|
|
'url': reverse('control:organizer.edit', kwargs={
|
|
'organizer': request.organizer.slug
|
|
}),
|
|
'icon': 'wrench',
|
|
'children': [
|
|
{
|
|
'label': _('General'),
|
|
'url': reverse('control:organizer.edit', kwargs={
|
|
'organizer': request.organizer.slug
|
|
}),
|
|
'active': url.url_name == 'organizer.edit',
|
|
},
|
|
{
|
|
'label': _('Plugins'),
|
|
'url': reverse('control:organizer.settings.plugins', kwargs={
|
|
'organizer': request.organizer.slug,
|
|
}),
|
|
'active': url.url_name == 'organizer.settings.plugins' or url.url_name == 'organizer.settings.plugin-events',
|
|
},
|
|
{
|
|
'label': _('Event metadata'),
|
|
'url': reverse('control:organizer.properties', kwargs={
|
|
'organizer': request.organizer.slug
|
|
}),
|
|
'active': url.url_name.startswith('organizer.propert'),
|
|
},
|
|
{
|
|
'label': _('Email'),
|
|
'url': reverse('control:organizer.settings.mail', kwargs={
|
|
'organizer': request.organizer.slug,
|
|
}),
|
|
'active': url.url_name == 'organizer.settings.mail',
|
|
},
|
|
{
|
|
'label': _('Sales channels'),
|
|
'url': reverse('control:organizer.channels', kwargs={
|
|
'organizer': request.organizer.slug
|
|
}),
|
|
'active': url.url_name.startswith('organizer.channel'),
|
|
},
|
|
{
|
|
'label': _('Webhooks'),
|
|
'url': reverse('control:organizer.webhooks', kwargs={
|
|
'organizer': request.organizer.slug
|
|
}),
|
|
'active': 'organizer.webhook' in url.url_name,
|
|
'icon': 'bolt',
|
|
},
|
|
]
|
|
})
|
|
|
|
if 'organizer.teams:write' in request.orgapermset:
|
|
nav.append({
|
|
'label': _('Teams'),
|
|
'url': reverse('control:organizer.teams', kwargs={
|
|
'organizer': request.organizer.slug
|
|
}),
|
|
'active': 'organizer.team' in url.url_name and url.namespace == 'control',
|
|
'icon': 'group',
|
|
})
|
|
|
|
if 'organizer.giftcards:read' in request.orgapermset or 'organizer.giftcards:write' in request.orgapermset:
|
|
children = []
|
|
children.append({
|
|
'label': _('Gift cards'),
|
|
'url': reverse('control:organizer.giftcards', kwargs={
|
|
'organizer': request.organizer.slug
|
|
}),
|
|
'active': 'organizer.giftcard' in url.url_name and 'acceptance' not in url.url_name,
|
|
'children': children,
|
|
})
|
|
if 'organizer.settings.general:write' in request.orgapermset:
|
|
children.append(
|
|
{
|
|
'label': _('Acceptance'),
|
|
'url': reverse('control:organizer.giftcards.acceptance', kwargs={
|
|
'organizer': request.organizer.slug
|
|
}),
|
|
'active': 'organizer.giftcards.acceptance' in url.url_name,
|
|
}
|
|
)
|
|
nav.append({
|
|
'label': _('Gift cards'),
|
|
'url': reverse('control:organizer.giftcards', kwargs={
|
|
'organizer': request.organizer.slug
|
|
}),
|
|
'icon': 'credit-card',
|
|
'children': children,
|
|
})
|
|
|
|
if request.organizer.settings.customer_accounts:
|
|
children = []
|
|
if 'organizer.customers:read' in request.orgapermset or 'organizer.customers:write' in request.orgapermset:
|
|
children.append(
|
|
{
|
|
'label': _('Customers'),
|
|
'url': reverse('control:organizer.customers', kwargs={
|
|
'organizer': request.organizer.slug
|
|
}),
|
|
'active': 'organizer.customer' in url.url_name,
|
|
}
|
|
)
|
|
if 'organizer.settings.general:write' in request.orgapermset:
|
|
children.append(
|
|
{
|
|
'label': _('Membership types'),
|
|
'url': reverse('control:organizer.membershiptypes', kwargs={
|
|
'organizer': request.organizer.slug
|
|
}),
|
|
'active': 'organizer.membershiptype' in url.url_name,
|
|
}
|
|
)
|
|
children.append(
|
|
{
|
|
'label': _('SSO clients'),
|
|
'url': reverse('control:organizer.ssoclients', kwargs={
|
|
'organizer': request.organizer.slug
|
|
}),
|
|
'active': 'organizer.ssoclient' in url.url_name,
|
|
}
|
|
)
|
|
children.append(
|
|
{
|
|
'label': _('SSO providers'),
|
|
'url': reverse('control:organizer.ssoproviders', kwargs={
|
|
'organizer': request.organizer.slug
|
|
}),
|
|
'active': 'organizer.ssoprovider' in url.url_name,
|
|
}
|
|
)
|
|
if children:
|
|
nav.append({
|
|
'label': _('Customer accounts'),
|
|
'url': reverse('control:organizer.customers', kwargs={
|
|
'organizer': request.organizer.slug
|
|
}),
|
|
'icon': 'user',
|
|
'children': children,
|
|
})
|
|
|
|
if request.organizer.settings.reusable_media_active:
|
|
if 'organizer.reusablemedia:read' in request.orgapermset or 'organizer.reusablemedia:write' in request.orgapermset:
|
|
nav.append({
|
|
'label': _('Reusable media'),
|
|
'url': reverse('control:organizer.reusable_media', kwargs={
|
|
'organizer': request.organizer.slug
|
|
}),
|
|
'icon': 'key',
|
|
'active': 'organizer.reusable_medi' in url.url_name,
|
|
})
|
|
|
|
if 'organizer.devices:read' in request.orgapermset or 'organizer.devices:write' in request.orgapermset:
|
|
nav.append({
|
|
'label': _('Devices'),
|
|
'url': reverse('control:organizer.devices', kwargs={
|
|
'organizer': request.organizer.slug
|
|
}),
|
|
'icon': 'tablet',
|
|
'children': [
|
|
{
|
|
'label': _('Devices'),
|
|
'url': reverse('control:organizer.devices', kwargs={
|
|
'organizer': request.organizer.slug
|
|
}),
|
|
'active': 'organizer.device' in url.url_name,
|
|
},
|
|
{
|
|
'label': _('Gates'),
|
|
'url': reverse('control:organizer.gates', kwargs={
|
|
'organizer': request.organizer.slug
|
|
}),
|
|
'active': 'organizer.gate' in url.url_name,
|
|
}
|
|
]
|
|
})
|
|
|
|
nav.append({
|
|
'label': _('Export'),
|
|
'url': reverse('control:organizer.export', kwargs={
|
|
'organizer': request.organizer.slug,
|
|
}),
|
|
'active': 'organizer.export' in url.url_name,
|
|
'icon': 'download',
|
|
})
|
|
|
|
if 'organizer.settings.general:write' in request.orgapermset:
|
|
merge_in(nav, [{
|
|
'parent': reverse('control:organizer.export', kwargs={
|
|
'organizer': request.organizer.slug,
|
|
}),
|
|
'label': _('Data sync problems'),
|
|
'url': reverse('control:organizer.datasync.failedjobs', kwargs={
|
|
'organizer': request.organizer.slug,
|
|
}),
|
|
'active': (url.url_name == 'organizer.datasync.failedjobs'),
|
|
}])
|
|
|
|
if 'organizer.outgoingmails:read' in request.orgapermset:
|
|
nav.append({
|
|
'label': _('Outgoing emails'),
|
|
'url': reverse('control:organizer.outgoingmails', kwargs={
|
|
'organizer': request.organizer.slug,
|
|
}),
|
|
'active': 'organizer.outgoingmail' in url.url_name,
|
|
'icon': 'send',
|
|
})
|
|
|
|
merge_in(nav, sorted(
|
|
sum((list(a[1]) for a in nav_organizer.send(request.organizer, request=request, organizer=request.organizer)),
|
|
[]),
|
|
key=lambda r: (1 if r.get('parent') else 0, r['label'])
|
|
))
|
|
return nav
|
|
|
|
|
|
def merge_in(nav, newnav):
|
|
for item in newnav:
|
|
if 'parent' in item:
|
|
parents = [n for n in nav if n['url'] == item['parent']]
|
|
if parents:
|
|
if 'children' not in parents[0]:
|
|
parents[0]['children'] = [
|
|
dict(parents[0])
|
|
]
|
|
parents[0]['active'] = False
|
|
parents[0]['children'].append(item)
|
|
continue
|
|
nav.append(item)
|