mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-24 17:38:37 -06:00
migrate yaml nav item definitions to dataclasses
This commit is contained in:
parent
3c0f4278c7
commit
fb25c79b9c
@ -1,42 +1,285 @@
|
|||||||
from pathlib import Path
|
from dataclasses import dataclass
|
||||||
from typing import Dict, List
|
from typing import Dict, Sequence
|
||||||
from django import template
|
from django import template
|
||||||
from django.template import Context
|
from django.template import Context
|
||||||
from django.contrib.auth.context_processors import PermWrapper
|
from django.contrib.auth.context_processors import PermWrapper
|
||||||
|
|
||||||
import yaml
|
|
||||||
|
|
||||||
register = template.Library()
|
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:
|
@dataclass
|
||||||
with NAV_GROUPS.open("r") as f:
|
class MenuGroup:
|
||||||
menus = yaml.safe_load(f.read())
|
"""A group of menu items within a menu."""
|
||||||
return menus
|
|
||||||
|
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."""
|
"""Enable a menu item if view permissions exist for the user."""
|
||||||
for group in nav_group["groups"]:
|
for group in menu.groups:
|
||||||
for item in group["items"]:
|
for item in group.items:
|
||||||
# Parse the URL template tag to a permission string.
|
# 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}"
|
view_perm = f"{app}.view_{scope}"
|
||||||
if view_perm in perms:
|
if view_perm in perms:
|
||||||
# If the view permission for each item exists, toggle
|
# If the view permission for each item exists, toggle
|
||||||
# the `disabled` field, which will be used in the UI.
|
# 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)
|
@register.inclusion_tag("navigation/nav_items.html", takes_context=True)
|
||||||
def nav(context: Context) -> Dict:
|
def nav(context: Context) -> Dict:
|
||||||
"""Provide navigation items to template."""
|
"""Provide navigation items to template."""
|
||||||
perms: PermWrapper = context["perms"]
|
perms: PermWrapper = context["perms"]
|
||||||
nav_menus = import_groups()
|
groups = [process_menu(g, perms) for g in MENUS]
|
||||||
groups = [process_nav_group(g, perms) for g in nav_menus["menus"]]
|
|
||||||
|
|
||||||
return {"nav_items": groups, "request": context["request"]}
|
return {"nav_items": groups, "request": context["request"]}
|
||||||
|
@ -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
|
|
Loading…
Reference in New Issue
Block a user