mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-22 20:12:00 -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 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"]}
|
||||
|
@ -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