From d0b1facfd8181b61f6eca98b7092544e167bcdb4 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 31 Aug 2023 10:51:16 -0400 Subject: [PATCH] Closes #13638: Add optional staff_only attribute to MenuItem --- docs/plugins/development/navigation.md | 13 +++++++------ netbox/netbox/navigation/__init__.py | 1 + netbox/utilities/templatetags/navigation.py | 13 ++++++++----- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/docs/plugins/development/navigation.md b/docs/plugins/development/navigation.md index 3e7762184..4239e8733 100644 --- a/docs/plugins/development/navigation.md +++ b/docs/plugins/development/navigation.md @@ -64,12 +64,13 @@ item1 = PluginMenuItem( A `PluginMenuItem` has the following attributes: -| Attribute | Required | Description | -|---------------|----------|------------------------------------------------------| -| `link` | Yes | Name of the URL path to which this menu item links | -| `link_text` | Yes | The text presented to the user | -| `permissions` | - | A list of permissions required to display this link | -| `buttons` | - | An iterable of PluginMenuButton instances to include | +| Attribute | Required | Description | +|---------------|----------|----------------------------------------------------------------------------------------------------------| +| `link` | Yes | Name of the URL path to which this menu item links | +| `link_text` | Yes | The text presented to the user | +| `permissions` | - | A list of permissions required to display this link | +| `staff_only` | - | Display only for users who have `is_staff` set to true (any specified permissions will also be required) | +| `buttons` | - | An iterable of PluginMenuButton instances to include | ## Menu Buttons diff --git a/netbox/netbox/navigation/__init__.py b/netbox/netbox/navigation/__init__.py index a05b1c495..4c7190bbb 100644 --- a/netbox/netbox/navigation/__init__.py +++ b/netbox/netbox/navigation/__init__.py @@ -34,6 +34,7 @@ class MenuItem: link: str link_text: str permissions: Optional[Sequence[str]] = () + staff_only: Optional[bool] = False buttons: Optional[Sequence[MenuItemButton]] = () diff --git a/netbox/utilities/templatetags/navigation.py b/netbox/utilities/templatetags/navigation.py index 4a229e952..7534d7034 100644 --- a/netbox/utilities/templatetags/navigation.py +++ b/netbox/utilities/templatetags/navigation.py @@ -26,11 +26,14 @@ def nav(context: Context) -> Dict: 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 not user.has_perms(item.permissions): + continue + if item.staff_only and not user.is_staff: + continue + 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: