From 859c1cb5713004b09c49ec7bc5462de98c2e6bb5 Mon Sep 17 00:00:00 2001 From: sistason <c3infra@sistason.de> Date: Tue, 26 Oct 2021 16:11:20 +0000 Subject: [PATCH] build navbar positions from an explicit list, instead of magic numbers in the blueprints --- uffd/__init__.py | 5 ++++- uffd/invite/views.py | 2 +- uffd/mail/views.py | 2 +- uffd/navbar.py | 13 +++++++++---- uffd/role/views.py | 2 +- uffd/rolemod/views.py | 2 +- uffd/selfservice/views.py | 2 +- uffd/services/views.py | 2 +- uffd/user/views_group.py | 2 +- uffd/user/views_user.py | 2 +- 10 files changed, 21 insertions(+), 13 deletions(-) diff --git a/uffd/__init__.py b/uffd/__init__.py index f5190360..c6c83c71 100644 --- a/uffd/__init__.py +++ b/uffd/__init__.py @@ -69,7 +69,10 @@ def create_app(test_config=None): # pylint: disable=too-many-locals,too-many-sta init_config(app, test_config) register_template_helper(app) - setup_navbar(app) + + # Sort the navbar positions by their blueprint names (from the left) + positions = ["selfservice", "services", "rolemod", "invite", "user", "group", "role", "mail"] + setup_navbar(app, positions) # We never want to fail here, but at a file access that doesn't work. # We might only have read access to app.instance_path diff --git a/uffd/invite/views.py b/uffd/invite/views.py index 8f38c7ef..c647e5dc 100644 --- a/uffd/invite/views.py +++ b/uffd/invite/views.py @@ -43,7 +43,7 @@ def reset_acl_filter(user): return Invite.creator == user @bp.route('/') -@register_navbar(14, lazy_gettext('Invites'), icon='link', blueprint=bp, visible=invite_acl_check) +@register_navbar(lazy_gettext('Invites'), icon='link', blueprint=bp, visible=invite_acl_check) @login_required(invite_acl_check) def index(): invites = Invite.query.filter(view_acl_filter(request.user)).all() diff --git a/uffd/mail/views.py b/uffd/mail/views.py index 47af1a84..8ee57c56 100644 --- a/uffd/mail/views.py +++ b/uffd/mail/views.py @@ -19,7 +19,7 @@ def mail_acl(): pass @bp.route("/") -@register_navbar(29, lazy_gettext('Forwardings'), icon='envelope', blueprint=bp, visible=mail_acl_check) +@register_navbar(lazy_gettext('Forwardings'), icon='envelope', blueprint=bp, visible=mail_acl_check) def index(): return render_template('mail/list.html', mails=Mail.query.all()) diff --git a/uffd/navbar.py b/uffd/navbar.py index e0167597..501d8f86 100644 --- a/uffd/navbar.py +++ b/uffd/navbar.py @@ -1,4 +1,5 @@ -def setup_navbar(app): +def setup_navbar(app, positions): + app.navbarPositions = positions app.navbarList = [] app.jinja_env.globals['getnavbar'] = lambda: [n for n in app.navbarList if n['visible']()] @@ -8,7 +9,7 @@ def setup_navbar(app): # ( see: http://fontawesome.io/icons/ ) # visible is a function that returns "True" if this icon should be visible in the calling context # pylint: disable=too-many-arguments -def register_navbar(position, name, iconlib='fa', icon=None, group=None, endpoint=None, blueprint=None, visible=None): +def register_navbar(name, iconlib='fa', icon=None, group=None, endpoint=None, blueprint=None, visible=None): def wrapper(func): def deferred_call(state): assert blueprint @@ -19,7 +20,7 @@ def register_navbar(position, name, iconlib='fa', icon=None, group=None, endpoin urlendpoint = "{}.{}".format(blueprint.name, func.__name__) else: urlendpoint = func.__name_ - # pylint: enable=protected-access + # pylint: enable=protected-access item = {} item['iconlib'] = iconlib item['icon'] = icon @@ -28,7 +29,11 @@ def register_navbar(position, name, iconlib='fa', icon=None, group=None, endpoin item['name'] = name item['blueprint'] = blueprint item['visible'] = visible or (lambda: True) - item['position'] = position + item['position'] = 99 + if blueprint.name in state.app.navbarPositions: + item['position'] = state.app.navbarPositions.index(blueprint.name) + else: + item['visible'] = lambda: False state.app.navbarList.append(item) state.app.navbarList.sort(key=lambda item: item['position']) blueprint.record_once(deferred_call) diff --git a/uffd/role/views.py b/uffd/role/views.py index 94b15e17..ce99dafc 100644 --- a/uffd/role/views.py +++ b/uffd/role/views.py @@ -45,7 +45,7 @@ def role_acl(): pass @bp.route("/") -@register_navbar(25, lazy_gettext('Roles'), icon='key', blueprint=bp, visible=role_acl_check) +@register_navbar(lazy_gettext('Roles'), icon='key', blueprint=bp, visible=role_acl_check) def index(): return render_template('role/list.html', roles=Role.query.all()) diff --git a/uffd/rolemod/views.py b/uffd/rolemod/views.py index 0a99ac3d..d1c520b7 100644 --- a/uffd/rolemod/views.py +++ b/uffd/rolemod/views.py @@ -20,7 +20,7 @@ def acl_check(): abort(403) @bp.route("/") -@register_navbar(12, lazy_gettext('Moderation'), icon='user-lock', blueprint=bp, visible=user_is_rolemod) +@register_navbar(lazy_gettext('Moderation'), icon='user-lock', blueprint=bp, visible=user_is_rolemod) def index(): roles = Role.query.join(Role.moderator_group).join(Group.members).filter(User.id==request.user.id).all() return render_template('rolemod/list.html', roles=roles) diff --git a/uffd/selfservice/views.py b/uffd/selfservice/views.py index 3137aabb..b194ceca 100644 --- a/uffd/selfservice/views.py +++ b/uffd/selfservice/views.py @@ -22,7 +22,7 @@ def selfservice_acl_check(): return request.user and request.user.is_in_group(current_app.config['ACL_SELFSERVICE_GROUP']) @bp.route("/") -@register_navbar(0, lazy_gettext('Selfservice'), icon='portrait', blueprint=bp, visible=selfservice_acl_check) +@register_navbar(lazy_gettext('Selfservice'), icon='portrait', blueprint=bp, visible=selfservice_acl_check) @login_required(selfservice_acl_check) def index(): return render_template('selfservice/self.html', user=request.user) diff --git a/uffd/services/views.py b/uffd/services/views.py index c533cef3..3423eba4 100644 --- a/uffd/services/views.py +++ b/uffd/services/views.py @@ -80,7 +80,7 @@ def services_visible(): return len(get_services(request.user)) > 0 @bp.route("/") -@register_navbar(9, lazy_gettext('Services'), icon='sitemap', blueprint=bp, visible=services_visible) +@register_navbar(lazy_gettext('Services'), icon='sitemap', blueprint=bp, visible=services_visible) def index(): services = get_services(request.user) if not current_app.config['SERVICES']: diff --git a/uffd/user/views_group.py b/uffd/user/views_group.py index 7bbe310b..5e1bdf0c 100644 --- a/uffd/user/views_group.py +++ b/uffd/user/views_group.py @@ -20,7 +20,7 @@ def group_acl(): pass @bp.route("/") -@register_navbar(23, lazy_gettext('Groups'), icon='layer-group', blueprint=bp, visible=group_acl_check) +@register_navbar(lazy_gettext('Groups'), icon='layer-group', blueprint=bp, visible=group_acl_check) def index(): return render_template('group/list.html', groups=Group.query.all()) diff --git a/uffd/user/views_user.py b/uffd/user/views_user.py index 9baf94a1..95f8643e 100644 --- a/uffd/user/views_user.py +++ b/uffd/user/views_user.py @@ -27,7 +27,7 @@ def user_acl(): pass @bp.route("/") -@register_navbar(21, lazy_gettext('Users'), icon='users', blueprint=bp, visible=user_acl_check) +@register_navbar(lazy_gettext('Users'), icon='users', blueprint=bp, visible=user_acl_check) def index(): return render_template('user/list.html', users=User.query.all()) -- GitLab