From 7a83c539fa044ea4471f387987c3fe6fffbc340b Mon Sep 17 00:00:00 2001 From: Brian Tiemann Date: Tue, 8 Jul 2025 18:14:18 -0400 Subject: [PATCH 1/4] Pass PluginMenuItems with custom iterable object as groups for dynamic nav menu --- netbox_custom_objects/navigation.py | 41 ++++++++++++----------------- 1 file changed, 17 insertions(+), 24 deletions(-) diff --git a/netbox_custom_objects/navigation.py b/netbox_custom_objects/navigation.py index 855c405..7b7b15e 100644 --- a/netbox_custom_objects/navigation.py +++ b/netbox_custom_objects/navigation.py @@ -21,13 +21,13 @@ ) -def get_menu(): - CustomObjectType = apps.get_model(APP_LABEL, "CustomObjectType") - menu_items = [] - for custom_object_type in CustomObjectType.objects.all(): - model = custom_object_type.get_model() - menu_items.append( - PluginMenuItem( +class CustomObjectTypeMenuItems: + + def __iter__(self): + CustomObjectType = apps.get_model(APP_LABEL, "CustomObjectType") + for custom_object_type in CustomObjectType.objects.all(): + model = custom_object_type.get_model() + yield PluginMenuItem( link=None, url=reverse( f"plugins:{APP_LABEL}:customobject_list", @@ -48,23 +48,16 @@ def get_menu(): ), ), ) - ) - return PluginMenu( - label="Custom Objects", - groups=( - (_("Object Types"), (custom_object_type_plugin_menu_item,)), - (_("Objects"), tuple(menu_items)), - ), - icon_class="mdi mdi-toy-brick-outline", - ) current_version = version.parse(settings.RELEASE.version) -if current_version < version.parse("4.4.0"): - menu = PluginMenu( - label="Custom Objects", - groups=((_("Object Types"), (custom_object_type_plugin_menu_item,)),), - icon_class="mdi mdi-toy-brick-outline", - ) -else: - menu = get_menu + +groups = [(_("Object Types"), (custom_object_type_plugin_menu_item,))] +if current_version > version.parse("4.4.0"): + groups.append((_("Objects"), CustomObjectTypeMenuItems())) + +menu = PluginMenu( + label="Custom Objects", + groups=tuple(groups), + icon_class="mdi mdi-toy-brick-outline", +) \ No newline at end of file From e42bc6a9afcfcdba567250bd4defab4e663d5e11 Mon Sep 17 00:00:00 2001 From: Brian Tiemann Date: Sun, 13 Jul 2025 20:19:45 -0400 Subject: [PATCH 2/4] Make url a property on MenuItem/PluginMenuItem etc, overridable via a setter --- netbox_custom_objects/navigation.py | 36 ++++++++++++++--------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/netbox_custom_objects/navigation.py b/netbox_custom_objects/navigation.py index 7b7b15e..0a69986 100644 --- a/netbox_custom_objects/navigation.py +++ b/netbox_custom_objects/navigation.py @@ -27,27 +27,27 @@ def __iter__(self): CustomObjectType = apps.get_model(APP_LABEL, "CustomObjectType") for custom_object_type in CustomObjectType.objects.all(): model = custom_object_type.get_model() - yield PluginMenuItem( + add_button = PluginMenuButton( + None, + _("Add"), + "mdi mdi-plus-thick", + ) + add_button.url = reverse( + f"plugins:{APP_LABEL}:customobject_add", + kwargs={ + "custom_object_type": custom_object_type.name.lower() + }, + ) + menu_item = PluginMenuItem( link=None, - url=reverse( - f"plugins:{APP_LABEL}:customobject_list", - kwargs={"custom_object_type": custom_object_type.name.lower()}, - ), link_text=_(title(model._meta.verbose_name_plural)), - buttons=( - PluginMenuButton( - None, - _("Add"), - "mdi mdi-plus-thick", - url=reverse( - f"plugins:{APP_LABEL}:customobject_add", - kwargs={ - "custom_object_type": custom_object_type.name.lower() - }, - ), - ), - ), + buttons=(add_button,), + ) + menu_item.url = reverse( + f"plugins:{APP_LABEL}:customobject_list", + kwargs={"custom_object_type": custom_object_type.name.lower()}, ) + yield menu_item current_version = version.parse(settings.RELEASE.version) From 79de6ed2b05d7a07b99ca20afb99a0ee43fef49e Mon Sep 17 00:00:00 2001 From: Brian Tiemann Date: Mon, 14 Jul 2025 12:33:13 -0400 Subject: [PATCH 3/4] Change min version for dynamic nav menus to 4.3.4 --- netbox_custom_objects/navigation.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/netbox_custom_objects/navigation.py b/netbox_custom_objects/navigation.py index 0a69986..6cd0d88 100644 --- a/netbox_custom_objects/navigation.py +++ b/netbox_custom_objects/navigation.py @@ -1,6 +1,6 @@ from django.apps import apps from django.conf import settings -from django.urls import reverse +from django.urls import reverse_lazy from django.utils.translation import gettext_lazy as _ from netbox.plugins import PluginMenu, PluginMenuButton, PluginMenuItem from packaging import version @@ -32,7 +32,7 @@ def __iter__(self): _("Add"), "mdi mdi-plus-thick", ) - add_button.url = reverse( + add_button.url = reverse_lazy( f"plugins:{APP_LABEL}:customobject_add", kwargs={ "custom_object_type": custom_object_type.name.lower() @@ -43,7 +43,7 @@ def __iter__(self): link_text=_(title(model._meta.verbose_name_plural)), buttons=(add_button,), ) - menu_item.url = reverse( + menu_item.url = reverse_lazy( f"plugins:{APP_LABEL}:customobject_list", kwargs={"custom_object_type": custom_object_type.name.lower()}, ) @@ -53,7 +53,7 @@ def __iter__(self): current_version = version.parse(settings.RELEASE.version) groups = [(_("Object Types"), (custom_object_type_plugin_menu_item,))] -if current_version > version.parse("4.4.0"): +if current_version >= version.parse("4.3.4"): groups.append((_("Objects"), CustomObjectTypeMenuItems())) menu = PluginMenu( From 19cde44a3f3afe28c03bf85c397e2470d312e877 Mon Sep 17 00:00:00 2001 From: Brian Tiemann Date: Mon, 14 Jul 2025 13:03:22 -0400 Subject: [PATCH 4/4] Add gettext label --- netbox_custom_objects/navigation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox_custom_objects/navigation.py b/netbox_custom_objects/navigation.py index 6cd0d88..97cfd54 100644 --- a/netbox_custom_objects/navigation.py +++ b/netbox_custom_objects/navigation.py @@ -57,7 +57,7 @@ def __iter__(self): groups.append((_("Objects"), CustomObjectTypeMenuItems())) menu = PluginMenu( - label="Custom Objects", + label=_("Custom Objects"), groups=tuple(groups), icon_class="mdi mdi-toy-brick-outline", ) \ No newline at end of file