From fb25c79b9cc9b90974f1dcce01d4fbb9e44b2a55 Mon Sep 17 00:00:00 2001 From: checktheroads Date: Fri, 16 Apr 2021 15:55:06 -0700 Subject: [PATCH] migrate yaml nav item definitions to dataclasses --- netbox/utilities/templatetags/nav.py | 277 +++++++++++++++++++++++-- netbox/utilities/templatetags/nav.yaml | 229 -------------------- 2 files changed, 260 insertions(+), 246 deletions(-) delete mode 100644 netbox/utilities/templatetags/nav.yaml diff --git a/netbox/utilities/templatetags/nav.py b/netbox/utilities/templatetags/nav.py index bc995955a..22c07a0f8 100644 --- a/netbox/utilities/templatetags/nav.py +++ b/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 -def import_groups() -> Dict: - with NAV_GROUPS.open("r") as f: - menus = yaml.safe_load(f.read()) - return menus +@dataclass +class MenuGroup: + """A group of menu items within a menu.""" + + label: str + items: Sequence[MenuItem] -def process_nav_group(nav_group: Dict, perms: PermWrapper) -> Dict: +@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"), + ), + ), + ), +) + +MENUS = ( + ORGANIZATION_MENU, + DEVICES_MENU, + IPAM_MENU, + VIRTUALIZATION_MENU, + CIRCUITS_MENU, + POWER_MENU, + SECRETS_MENU, + OTHER_MENU, +) + + +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"]} diff --git a/netbox/utilities/templatetags/nav.yaml b/netbox/utilities/templatetags/nav.yaml deleted file mode 100644 index 5d4421d35..000000000 --- a/netbox/utilities/templatetags/nav.yaml +++ /dev/null @@ -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