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

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