1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

Closes #9070: Hide navigation menu items based on user permissions

This commit is contained in:
jeremystretch
2022-06-29 16:36:10 -04:00
parent 2245f1bf41
commit 779969f150
3 changed files with 59 additions and 54 deletions

View File

@ -27,6 +27,7 @@
* [#8471](https://github.com/netbox-community/netbox/issues/8471) - Add `status` field to Cluster * [#8471](https://github.com/netbox-community/netbox/issues/8471) - Add `status` field to Cluster
* [#8495](https://github.com/netbox-community/netbox/issues/8495) - Enable custom field grouping * [#8495](https://github.com/netbox-community/netbox/issues/8495) - Enable custom field grouping
* [#8995](https://github.com/netbox-community/netbox/issues/8995) - Enable arbitrary ordering of REST API results * [#8995](https://github.com/netbox-community/netbox/issues/8995) - Enable arbitrary ordering of REST API results
* [#9070](https://github.com/netbox-community/netbox/issues/9070) - Hide navigation menu items based on user permissions
* [#9166](https://github.com/netbox-community/netbox/issues/9166) - Add UI visibility toggle for custom fields * [#9166](https://github.com/netbox-community/netbox/issues/9166) - Add UI visibility toggle for custom fields
* [#9177](https://github.com/netbox-community/netbox/issues/9177) - Add tenant assignment for wireless LANs & links * [#9177](https://github.com/netbox-community/netbox/issues/9177) - Add tenant assignment for wireless LANs & links
* [#9536](https://github.com/netbox-community/netbox/issues/9536) - Track API token usage times * [#9536](https://github.com/netbox-community/netbox/issues/9536) - Track API token usage times

View File

@ -1,58 +1,43 @@
{% load helpers %} {% load helpers %}
<ul class="navbar-nav"> <ul class="navbar-nav">
{% for menu in nav_items %} {% for menu, groups in nav_items %}
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="#menu{{ menu.label }}" data-bs-toggle="collapse" role="button" aria-expanded="false" aria-controls="menu{{ menu.label }}"> {# Menu heading #}
<i class="{{ menu.icon_class }}"></i> <a class="nav-link" href="#menu{{ menu.label }}" data-bs-toggle="collapse" role="button" aria-expanded="false" aria-controls="menu{{ menu.label }}">
<span class="nav-link-text">{{ menu.label }}</span> <i class="{{ menu.icon_class }}"></i>
</a> <span class="nav-link-text">{{ menu.label }}</span>
<div class="collapse" id="menu{{ menu.label }}"> </a>
<ul class="nav nav-sm flex-column"> {# Menu groups #}
<div class="collapse" id="menu{{ menu.label }}">
{% for group in menu.groups %} <ul class="nav nav-sm flex-column">
{# Within each main menu, there are groups of menu items #} {% for group, items in groups %}
<li class="nav-item"> {# Group heading #}
{# Group Label #} <li class="nav-item">
<div class="nav-group-header"> <div class="nav-group-header">
<span class="nav-group-label">{{ group.label }}</span> <span class="nav-group-label">{{ group.label }}</span>
</div> </div>
</li> </li>
{# Group items #}
{% for item in group.items %} {% for item, buttons in items %}
{# Each Item #} <li class="nav-item{% if not item.buttons %} no-buttons{% endif %}">
{% if request.user|has_perms:item.permissions %} {# Item #}
<li class="nav-item{% if not item.buttons %} no-buttons{% endif %}"> <a href="{% url item.link %}" class="nav-link">{{ item.link_text }}</a>
<a href="{% url item.link %}" class="nav-link"> {# Item buttons (if any) #}
{{ item.link_text }} {% if buttons %}
</a> <div class="btn-group px-2">
{% for button in buttons %}
{# Menu item buttons (if any) #} <a class="btn btn-sm btn-{{ button.color }} lh-1" href="{% url button.link %}" title="{{ button.title }}">
{% if item.buttons %} <i class="{{ button.icon_class }}"></i>
<div class="btn-group px-2"> </a>
{% for button in item.buttons %}
{% if request.user|has_perms:button.permissions %}
<a class="btn btn-sm btn-{{ button.color }} lh-1" href="{% url button.link %}" title="{{ button.title }}">
<i class="{{ button.icon_class }}"></i>
</a>
{% endif %}
{% endfor %}
</div>
{% endif %}
</li>
{% else %}
{# Display a disabled link (no permission) #}
<li class="nav-item disabled">
<a href="#" class="nav-link disabled" aria-disabled="true" disabled>
<i class='mdi mdi-lock small'></i>
{{ item.link_text }}
</a>
</li>
{% endif %}
{% endfor %}
{% endfor %} {% endfor %}
</ul> </div>
</div> {% endif %}
</li> </li>
{% endfor %} {% endfor %}
{% endfor %}
</ul>
</div>
</li>
{% endfor %}
</ul> </ul>

View File

@ -13,7 +13,26 @@ def nav(context: Context) -> Dict:
""" """
Render the navigation menu. Render the navigation menu.
""" """
user = context['request'].user
nav_items = []
# Construct the navigation menu based upon the current user's permissions
for menu in MENUS:
groups = []
for group in menu.groups:
items = []
for item in group.items:
if user.has_perms(item.permissions):
buttons = [
button for button in item.buttons if user.has_perms(button.permissions)
]
items.append((item, buttons))
if items:
groups.append((group, items))
if groups:
nav_items.append((menu, groups))
return { return {
"nav_items": MENUS, "nav_items": nav_items,
"request": context["request"] "request": context["request"]
} }