"""Main menu management."""
from __future__ import annotations
from pyramid.config import Configurator
from pyramid.events import BeforeRender
from pyramid.threadlocal import get_current_request
from .lib.i18n import _
from .lib.menu import Menu
# Menu entry = (icon, label, permission, route, (subentry, ...))
MENU_HOME = ('{theme}/images/menu_home.png', _('Home'), None, 'home', None)
MENU_TEST = (
'{theme}/custom/menu_test1.png', _('Test'), None, None,
(('{theme}/custom/menu_test2.png', _('Users'), None, 'user_index',
((None, _('Administrator'), None, ('user_view', {'user_id': 1}), None),
(None, _('User 1'), None, ('user_view', {'user_id': 3}), None))),
('{theme}/custom/menu_test3.png', _('Profiles'), None, 'profile_index',
None)))
MENU_ADMIN = (
'{theme}/images/menu_admin.png', _('Administration'), None, None,
[(None, _('Global Settings'), 'settings-view', 'settings_view', None),
(None, _('Groups'), 'group-view', 'group_index', None),
(None, _('Users'), 'user-view', 'user_index', None),
(None, _('Profiles'), 'profile-view', 'profile_index', None),
(None, _('Backup'), 'backup-create', 'backup', None)])
# =============================================================================
[docs]
def includeme(configurator: Configurator):
"""Function to include menu functionality.
:type configurator: pyramid.config.Configurator
:param configurator:
Object used to do configuration declaration within the application.
"""
if isinstance(configurator, Configurator):
configurator.registry['menu'] = [MENU_HOME, MENU_ADMIN]
configurator.add_subscriber(before_render, BeforeRender)
# =============================================================================
[docs]
def before_render(event: BeforeRender):
"""A subscriber for :class:`pyramid.events.BeforeRender` events to add a
main menu.
:type event: pyramid.events.BeforeRender
:param event:
Current event.
"""
request = event.get('request') or get_current_request()
event['menu'] = Menu(request, 'menu', request.registry.get('menu', ''))