migrate yaml nav item definitions to dataclasses

This commit is contained in:
checktheroads 2021-04-16 15:55:06 -07:00
parent 3c0f4278c7
commit fb25c79b9c
2 changed files with 260 additions and 246 deletions

View File

@ -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"]}

View File

@ -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