소스 검색

9071 add header to plugin menu

Arthur 3 년 전
부모
커밋
e074570b8f
2개의 변경된 파일33개의 추가작업 그리고 15개의 파일을 삭제
  1. 11 3
      netbox/extras/plugins/__init__.py
  2. 22 12
      netbox/netbox/navigation_menu.py

+ 11 - 3
netbox/extras/plugins/__init__.py

@@ -58,6 +58,7 @@ class PluginConfig(AppConfig):
     # integrated components.
     graphql_schema = 'graphql.schema'
     menu_items = 'navigation.menu_items'
+    menu_header = 'navigation.menu_heading'
     template_extensions = 'template_content.template_extensions'
     user_preferences = 'preferences.preferences'
 
@@ -70,9 +71,14 @@ class PluginConfig(AppConfig):
             register_template_extensions(template_extensions)
 
         # Register navigation menu items (if defined)
+        try:
+            menu_header = import_object(f"{self.__module__}.{self.menu_header}")
+        except AttributeError:
+            menu_header = None
+
         menu_items = import_object(f"{self.__module__}.{self.menu_items}")
         if menu_items is not None:
-            register_menu_items(self.verbose_name, menu_items)
+            register_menu_items(self.verbose_name, menu_header, menu_items)
 
         # Register GraphQL schema (if defined)
         graphql_schema = import_object(f"{self.__module__}.{self.graphql_schema}")
@@ -246,7 +252,7 @@ class PluginMenuButton:
             self.color = color
 
 
-def register_menu_items(section_name, class_list):
+def register_menu_items(section_name, menu_header, class_list):
     """
     Register a list of PluginMenuItem instances for a given menu section (e.g. plugin name)
     """
@@ -258,7 +264,9 @@ def register_menu_items(section_name, class_list):
             if not isinstance(button, PluginMenuButton):
                 raise TypeError(f"{button} must be an instance of extras.plugins.PluginMenuButton")
 
-    registry['plugins']['menu_items'][section_name] = class_list
+    registry['plugins']['menu_items'][section_name] = {}
+    registry['plugins']['menu_items'][section_name]['header'] = menu_header
+    registry['plugins']['menu_items'][section_name]['items'] = class_list
 
 
 #

+ 22 - 12
netbox/netbox/navigation_menu.py

@@ -408,18 +408,28 @@ MENUS = [
 if registry['plugins']['menu_items']:
     plugin_menu_groups = []
 
-    for plugin_name, items in registry['plugins']['menu_items'].items():
-        plugin_menu_groups.append(
-            MenuGroup(
-                label=plugin_name,
-                items=items
+    for plugin_name, data in registry['plugins']['menu_items'].items():
+        if data['header']:
+            menu_groups = [MenuGroup(label=plugin_name, items=data["items"])]
+            icon = data["header"]["icon"]
+            MENUS.append(Menu(
+                label=data["header"]["title"],
+                icon_class=f"mdi {icon}",
+                groups=menu_groups
+            ))
+        else:
+            plugin_menu_groups.append(
+                MenuGroup(
+                    label=plugin_name,
+                    items=data["items"]
+                )
             )
-        )
 
-    PLUGIN_MENU = Menu(
-        label="Plugins",
-        icon_class="mdi mdi-puzzle",
-        groups=plugin_menu_groups
-    )
+    if plugin_menu_groups:
+        PLUGIN_MENU = Menu(
+            label="Plugins",
+            icon_class="mdi mdi-puzzle",
+            groups=plugin_menu_groups
+        )
 
-    MENUS.append(PLUGIN_MENU)
+        MENUS.append(PLUGIN_MENU)