Просмотр исходного кода

migrate yaml nav item definitions to dataclasses

checktheroads 4 лет назад
Родитель
Сommit
fb25c79b9c
2 измененных файлов с 260 добавлено и 246 удалено
  1. 260 17
      netbox/utilities/templatetags/nav.py
  2. 0 229
      netbox/utilities/templatetags/nav.yaml

+ 260 - 17
netbox/utilities/templatetags/nav.py

@@ -1,42 +1,285 @@
-from pathlib import Path
-from typing import Dict, List
+from dataclasses import dataclass
+from typing import Dict, Sequence
 from django import template
 from django.template import Context
 from django.contrib.auth.context_processors import PermWrapper
 
-import yaml
-
 register = template.Library()
 
-NAV_GROUPS = Path.cwd() / "utilities" / "templatetags" / "nav.yaml"
 
+@dataclass
+class MenuItem:
+    """A navigation menu item link. Example: Sites, Platforms, RIRs, etc."""
+
+    label: str
+    url: str
+    disabled: bool = True
+
+
+@dataclass
+class MenuGroup:
+    """A group of menu items within a menu."""
+
+    label: str
+    items: Sequence[MenuItem]
+
+
+@dataclass
+class Menu:
+    """A top level menu group. Example: Organization, Devices, IPAM."""
+
+    label: str
+    groups: Sequence[MenuGroup]
+
+
+ORGANIZATION_MENU = Menu(
+    label="Organization",
+    groups=(
+        MenuGroup(
+            label="Sites",
+            items=(
+                MenuItem(label="Sites", url="dcim:site_list"),
+                MenuItem(label="Site Groups", url="dcim:sitegroup_list"),
+                MenuItem(label="Regions", url="dcim:region_list"),
+                MenuItem(label="Locations", url="dcim:location_list"),
+            ),
+        ),
+        MenuGroup(
+            label="Racks",
+            items=(
+                MenuItem(label="Racks", url="dcim:rack_list"),
+                MenuItem(label="Rack Roles", url="dcim:rackrole_list"),
+                MenuItem(label="Elevations", url="dcim:rack_elevation_list"),
+            ),
+        ),
+        MenuGroup(
+            label="Tenancy",
+            items=(
+                MenuItem(label="Tenants", url="tenancy:tenant_list"),
+                MenuItem(label="Tenant Groups", url="tenancy:tenantgroup_list"),
+            ),
+        ),
+        MenuGroup(
+            label="Tags",
+            items=(MenuItem(label="Tags", url="extras:tag_list"),),
+        ),
+    ),
+)
+
+DEVICES_MENU = Menu(
+    label="Devices",
+    groups=(
+        MenuGroup(
+            label="Devices",
+            items=(
+                MenuItem(label="Devices", url="dcim:device_list"),
+                MenuItem(label="Device Roles", url="dcim:devicerole_list"),
+                MenuItem(label="Platforms", url="dcim:platform_list"),
+                MenuItem(label="Virtual Chassis", url="dcim:virtualchassis_list"),
+            ),
+        ),
+        MenuGroup(
+            label="Device Types",
+            items=(
+                MenuItem(label="Device Types", url="dcim:devicetype_list"),
+                MenuItem(label="Manufacturers", url="dcim:manufacturer_list"),
+            ),
+        ),
+        MenuGroup(
+            label="Connections",
+            items=(
+                MenuItem(label="Cables", url="dcim:cable_list"),
+                MenuItem(
+                    label="Console Connections", url="dcim:console_connections_list"
+                ),
+                MenuItem(
+                    label="Interface Connections", url="dcim:interface_connections_list"
+                ),
+                MenuItem(label="Power Connections", url="dcim:power_connections_list"),
+            ),
+        ),
+        MenuGroup(
+            label="Device Components",
+            items=(
+                MenuItem(label="Interfaces", url="dcim:interface_list"),
+                MenuItem(label="Front Ports", url="dcim:frontport_list"),
+                MenuItem(label="Rear Ports", url="dcim:rearport_list"),
+                MenuItem(label="Console Ports", url="dcim:consoleport_list"),
+                MenuItem(
+                    label="Console Server Ports", url="dcim:consoleserverport_list"
+                ),
+                MenuItem(label="Power Ports", url="dcim:powerport_list"),
+                MenuItem(label="Power Outlets", url="dcim:poweroutlet_list"),
+                MenuItem(label="Device Bays", url="dcim:devicebay_list"),
+                MenuItem(label="Inventory Items", url="dcim:inventoryitem_list"),
+            ),
+        ),
+    ),
+)
+
+IPAM_MENU = Menu(
+    label="IPAM",
+    groups=(
+        MenuGroup(
+            label="IP Addresses",
+            items=(MenuItem(label="IP Addresses", url="ipam:ipaddress_list"),),
+        ),
+        MenuGroup(
+            label="Prefixes",
+            items=(
+                MenuItem(label="Prefixes", url="ipam:prefix_list"),
+                MenuItem(label="Prefix & VLAN Roles", url="ipam:role_list"),
+            ),
+        ),
+        MenuGroup(
+            label="Aggregates",
+            items=(
+                MenuItem(label="Aggregates", url="ipam:aggregate_list"),
+                MenuItem(label="RIRs", url="ipam:rir_list"),
+            ),
+        ),
+        MenuGroup(
+            label="VRFs",
+            items=(
+                MenuItem(label="VRFs", url="ipam:vrf_list"),
+                MenuItem(label="Route Targets", url="ipam:routetarget_list"),
+            ),
+        ),
+        MenuGroup(
+            label="VLANs",
+            items=(
+                MenuItem(label="VLANs", url="ipam:vlan_list"),
+                MenuItem(label="VLAN Groups", url="ipam:vlangroup_list"),
+            ),
+        ),
+        MenuGroup(
+            label="Services",
+            items=(MenuItem(label="Services", url="ipam:service_list"),),
+        ),
+    ),
+)
+
+VIRTUALIZATION_MENU = Menu(
+    label="Virtualization",
+    groups=(
+        MenuGroup(
+            label="Virtual Machines",
+            items=(
+                MenuItem(
+                    label="Virtual Machines",
+                    url="virtualization:virtualmachine_list",
+                ),
+                MenuItem(label="Interfaces", url="virtualization:vminterface_list"),
+            ),
+        ),
+        MenuGroup(
+            label="Clusters",
+            items=(
+                MenuItem(label="Clusters", url="virtualization:cluster_list"),
+                MenuItem(label="Cluster Types", url="virtualization:clustertype_list"),
+                MenuItem(
+                    label="Cluster Groups", url="virtualization:clustergroup_list"
+                ),
+            ),
+        ),
+    ),
+)
+
+CIRCUITS_MENU = Menu(
+    label="Circuits",
+    groups=(
+        MenuGroup(
+            label="Circuits",
+            items=(
+                MenuItem(label="Circuits", url="circuits:circuit_list"),
+                MenuItem(label="Circuit Types", url="circuits:circuittype_list"),
+            ),
+        ),
+        MenuGroup(
+            label="Providers",
+            items=(MenuItem(label="Providersr", url="circuits:provider_list"),),
+        ),
+    ),
+)
+
+POWER_MENU = Menu(
+    label="Power",
+    groups=(
+        MenuGroup(
+            label="Power",
+            items=(
+                MenuItem(label="Power Feeds", url="dcim:powerfeed_list"),
+                MenuItem(label="Power Panels", url="dcim:powerpanel_list"),
+            ),
+        ),
+    ),
+)
+
+SECRETS_MENU = Menu(
+    label="Secrets",
+    groups=(
+        MenuGroup(
+            label="Secrets",
+            items=(
+                MenuItem(label="Secrets", url="secrets:secret_list"),
+                MenuItem(label="Secret Roles", url="secrets:secretrole_list"),
+            ),
+        ),
+    ),
+)
+
+OTHER_MENU = Menu(
+    label="Other",
+    groups=(
+        MenuGroup(
+            label="Logging",
+            items=(
+                MenuItem(label="Change Log", url="extras:objectchange_list"),
+                MenuItem(label="Journal Entries", url="extras:journalentry_list"),
+            ),
+        ),
+        MenuGroup(
+            label="Miscellaneous",
+            items=(
+                MenuItem(label="Config Contexts", url="extras:configcontext_list"),
+                MenuItem(label="Reports", url="extras:report_list"),
+                MenuItem(label="Scripts", url="extras:script_list"),
+            ),
+        ),
+    ),
+)
 
-def import_groups() -> Dict:
-    with NAV_GROUPS.open("r") as f:
-        menus = yaml.safe_load(f.read())
-        return menus
+MENUS = (
+    ORGANIZATION_MENU,
+    DEVICES_MENU,
+    IPAM_MENU,
+    VIRTUALIZATION_MENU,
+    CIRCUITS_MENU,
+    POWER_MENU,
+    SECRETS_MENU,
+    OTHER_MENU,
+)
 
 
-def process_nav_group(nav_group: Dict, perms: PermWrapper) -> Dict:
+def process_menu(menu: Menu, perms: PermWrapper) -> MenuGroup:
     """Enable a menu item if view permissions exist for the user."""
-    for group in nav_group["groups"]:
-        for item in group["items"]:
+    for group in menu.groups:
+        for item in group.items:
             # Parse the URL template tag to a permission string.
-            app, scope = item["url"].split(":")
+            app, scope = item.url.split(":")
             view_perm = f"{app}.view_{scope}"
             if view_perm in perms:
                 # If the view permission for each item exists, toggle
                 # the `disabled` field, which will be used in the UI.
-                item["disabled"] = False
+                item.disabled = False
 
-    return nav_group
+    return menu
 
 
 @register.inclusion_tag("navigation/nav_items.html", takes_context=True)
 def nav(context: Context) -> Dict:
     """Provide navigation items to template."""
     perms: PermWrapper = context["perms"]
-    nav_menus = import_groups()
-    groups = [process_nav_group(g, perms) for g in nav_menus["menus"]]
+    groups = [process_menu(g, perms) for g in MENUS]
 
     return {"nav_items": groups, "request": context["request"]}

+ 0 - 229
netbox/utilities/templatetags/nav.yaml

@@ -1,229 +0,0 @@
-menus:
-  - label: Organization
-    groups:
-      - label: Sites
-        items:
-          - label: Sites
-            url: 'dcim:site_list'
-            disabled: true
-          - label: Site Groups
-            url: 'dcim:sitegroup_list'
-            disabled: true
-          - label: Regions
-            url: 'dcim:region_list'
-            disabled: true
-      - label: Racks
-        items:
-          - label: Racks
-            url: 'dcim:rack_list'
-            disabled: true
-          - label: Locations
-            url: 'dcim:location_list'
-            disabled: true
-          - label: Rack Roles
-            url: 'dcim:rackrole_list'
-            disabled: true
-          - label: Elevations
-            url: 'dcim:rack_elevation_list'
-            disabled: true
-      - label: Tenancy
-        items:
-          - label: Tenants
-            url: 'tenancy:tenant_list'
-            disabled: true
-          - label: Tenant Groups
-            url: 'tenancy:tenantgroup_list'
-            disabled: true
-      - label: Tags
-        items:
-          - label: Tags
-            url: 'extras:tag_list'
-            disabled: true
-  - label: Devices
-    groups:
-      - items:
-          - disabled: true
-            label: Devices
-            url: dcim:device_list
-          - disabled: true
-            label: Device Roles
-            url: dcim:devicerole_list
-          - disabled: true
-            label: Platforms
-            url: dcim:platform_list
-          - disabled: true
-            label: Virtual Chassis
-            url: dcim:virtualchassis_list
-        label: Devices
-      - items:
-          - disabled: true
-            label: Device Types
-            url: dcim:devicetype_list
-          - disabled: true
-            label: Manufacturers
-            url: dcim:manufacturer_list
-        label: Device Types
-      - items:
-          - disabled: true
-            label: Cables
-            url: dcim:cable_list
-          - disabled: true
-            label: Console Connections
-            url: dcim:console_connections_list
-          - disabled: true
-            label: Interface Connections
-            url: dcim:interface_connections_list
-          - disabled: true
-            label: Power Connections
-            url: dcim:power_connections_list
-        label: Connections
-      - items:
-          - disabled: true
-            label: Interfaces
-            url: dcim:interface_list
-          - disabled: true
-            label: Front Ports
-            url: dcim:frontport_list
-          - disabled: true
-            label: Rear Ports
-            url: dcim:rearport_list
-          - disabled: true
-            label: Console Ports
-            url: dcim:consoleport_list
-          - disabled: true
-            label: Console Server Ports
-            url: dcim:consoleserverport_list
-          - disabled: true
-            label: Power Ports
-            url: dcim:powerport_list
-          - disabled: true
-            label: Power Outlets
-            url: dcim:poweroutlet_list
-          - disabled: true
-            label: Device Bays
-            url: dcim:devicebay_list
-          - disabled: true
-            label: Inventory Items
-            url: dcim:inventoryitem_list
-        label: Device Components
-  - label: IPAM
-    groups:
-      - label: IP Addresses
-        items:
-          - label: IP Addresses
-            url: 'ipam:ipaddress_list'
-            disabled: true
-      - label: Prefixes
-        items:
-          - label: Prefixes
-            url: 'ipam:prefix_list'
-            disabled: true
-          - label: Prefix & VLAN Roles
-            url: 'ipam:role_list'
-            disabled: true
-      - label: Aggregates
-        items:
-          - label: Aggregates
-            url: 'ipam:aggregate_list'
-            disabled: true
-          - label: RIRs
-            url: 'ipam:rir_list'
-            disabled: true
-      - label: VRFs
-        items:
-          - label: VRFs
-            url: 'ipam:vrf_list'
-            disabled: true
-          - label: Route Targets
-            url: 'ipam:routetarget_list'
-            disabled: true
-      - label: VLANs
-        items:
-          - label: VLANs
-            url: 'ipam:vlan_list'
-            disabled: true
-          - label: VLAN Groups
-            url: 'ipam:vlangroup_list'
-            disabled: true
-      - label: Services
-        items:
-          - label: Services
-            url: 'ipam:service_list'
-            disabled: true
-  - label: Virtualization
-    groups:
-      - label: Virtual Machines
-        items:
-          - label: Virtual Machines
-            url: 'virtualization:virtualmachine_list'
-            disabled: true
-          - label: Interfaces
-            url: 'virtualization:vminterface_list'
-            disabled: true
-      - label: Clusters
-        items:
-          - label: Clusters
-            url: 'virtualization:cluster_list'
-            disabled: true
-          - label: Cluster Types
-            url: 'virtualization:clustertype_list'
-            disabled: true
-          - label: Cluster Groups
-            url: 'virtualization:clustergroup_list'
-            disabled: true
-  - label: Circuits
-    groups:
-      - label: Circuits
-        items:
-          - label: Circuits
-            url: 'circuits:circuit_list'
-            disabled: true
-          - label: Circuit Types
-            url: 'circuits:circuittype_list'
-            disabled: true
-      - label: Providers
-        items:
-          - label: Providers
-            url: 'circuits:provider_list'
-            disabled: true
-  - label: Power
-    groups:
-      - label: Power
-        items:
-          - label: Power Feeds
-            url: 'dcim:powerfeed_list'
-            disabled: true
-          - label: Power Panels
-            url: 'dcim:powerpanel_list'
-            disabled: true
-  - label: Secrets
-    groups:
-      - label: Secrets
-        items:
-          - label: Secrets
-            url: 'secrets:secret_list'
-            disabled: true
-          - label: Secret Roles
-            url: 'secrets:secretrole_list'
-            disabled: true
-  - label: Other
-    groups:
-      - label: Logging
-        items:
-          - label: Change Log
-            url: 'extras:objectchange_list'
-            disabled: true
-          - label: Journal Entries
-            url: 'extras:journalentry_list'
-            disabled: true
-      - label: Miscellaneous
-        items:
-          - label: Config Contexts
-            url: 'extras:configcontext_list'
-            disabled: true
-          - label: Reports
-            url: 'extras:report_list'
-            disabled: true
-          - label: Scripts
-            url: 'extras:script_list'
-            disabled: true