1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00
Files
netbox-community-netbox/netbox/netbox/navigation_menu.py

426 lines
12 KiB
Python
Raw Normal View History

from dataclasses import dataclass
from typing import Sequence, Optional
2021-07-22 08:57:16 -04:00
from extras.registry import registry
from utilities.choices import ButtonColorChoices
#
# Nav menu data classes
#
@dataclass
class MenuItemButton:
link: str
title: str
icon_class: str
permissions: Optional[Sequence[str]] = ()
2021-07-22 08:57:16 -04:00
color: Optional[str] = None
@dataclass
class MenuItem:
2021-07-22 08:57:16 -04:00
link: str
link_text: str
permissions: Optional[Sequence[str]] = ()
buttons: Optional[Sequence[MenuItemButton]] = ()
@dataclass
class MenuGroup:
label: str
items: Sequence[MenuItem]
@dataclass
class Menu:
label: str
2021-07-22 08:57:16 -04:00
icon_class: str
groups: Sequence[MenuGroup]
2021-07-22 08:57:16 -04:00
#
# Utility functions
#
def get_model_item(app_label, model_name, label, actions=('add', 'import')):
return MenuItem(
link=f'{app_label}:{model_name}_list',
link_text=label,
permissions=[f'{app_label}.view_{model_name}'],
buttons=get_model_buttons(app_label, model_name, actions)
)
def get_model_buttons(app_label, model_name, actions=('add', 'import')):
buttons = []
if 'add' in actions:
buttons.append(
MenuItemButton(
link=f'{app_label}:{model_name}_add',
title='Add',
icon_class='mdi mdi-plus-thick',
permissions=[f'{app_label}.add_{model_name}'],
color=ButtonColorChoices.GREEN
)
)
if 'import' in actions:
buttons.append(
MenuItemButton(
link=f'{app_label}:{model_name}_import',
title='Import',
icon_class='mdi mdi-upload',
permissions=[f'{app_label}.add_{model_name}'],
color=ButtonColorChoices.CYAN
)
)
return buttons
#
# Nav menus
#
ORGANIZATION_MENU = Menu(
2021-07-22 08:57:16 -04:00
label='Organization',
icon_class='mdi mdi-domain',
groups=(
MenuGroup(
2021-07-22 08:57:16 -04:00
label='Sites',
items=(
2021-07-22 08:57:16 -04:00
get_model_item('dcim', 'site', 'Sites'),
get_model_item('dcim', 'region', 'Regions'),
2021-07-22 11:30:50 -04:00
get_model_item('dcim', 'sitegroup', 'Site Groups'),
2021-07-22 08:57:16 -04:00
get_model_item('dcim', 'location', 'Locations'),
),
),
MenuGroup(
2021-07-22 08:57:16 -04:00
label='Racks',
items=(
2021-07-22 08:57:16 -04:00
get_model_item('dcim', 'rack', 'Racks'),
get_model_item('dcim', 'rackrole', 'Rack Roles'),
get_model_item('dcim', 'rackreservation', 'Reservations'),
MenuItem(
link='dcim:rack_elevation_list',
link_text='Elevations',
permissions=['dcim.view_rack']
),
),
),
MenuGroup(
2021-07-22 08:57:16 -04:00
label='Tenancy',
items=(
2021-07-22 08:57:16 -04:00
get_model_item('tenancy', 'tenant', 'Tenants'),
get_model_item('tenancy', 'tenantgroup', 'Tenant Groups'),
),
),
2021-10-18 11:45:05 -04:00
MenuGroup(
label='Contacts',
items=(
get_model_item('tenancy', 'contact', 'Contacts'),
get_model_item('tenancy', 'contactgroup', 'Contact Groups'),
get_model_item('tenancy', 'contactrole', 'Contact Roles'),
),
),
),
)
DEVICES_MENU = Menu(
2021-07-22 08:57:16 -04:00
label='Devices',
icon_class='mdi mdi-server',
groups=(
MenuGroup(
2021-07-22 08:57:16 -04:00
label='Devices',
items=(
2021-07-22 08:57:16 -04:00
get_model_item('dcim', 'device', 'Devices'),
2021-12-17 16:12:03 -05:00
get_model_item('dcim', 'module', 'Modules'),
2021-07-22 08:57:16 -04:00
get_model_item('dcim', 'devicerole', 'Device Roles'),
get_model_item('dcim', 'platform', 'Platforms'),
get_model_item('dcim', 'virtualchassis', 'Virtual Chassis'),
),
),
MenuGroup(
2021-07-22 08:57:16 -04:00
label='Device Types',
items=(
2021-07-22 08:57:16 -04:00
get_model_item('dcim', 'devicetype', 'Device Types'),
2021-12-17 12:18:37 -05:00
get_model_item('dcim', 'moduletype', 'Module Types'),
2021-07-22 08:57:16 -04:00
get_model_item('dcim', 'manufacturer', 'Manufacturers'),
),
),
MenuGroup(
2021-07-22 08:57:16 -04:00
label='Device Components',
items=(
2021-07-22 08:57:16 -04:00
get_model_item('dcim', 'interface', 'Interfaces', actions=['import']),
get_model_item('dcim', 'frontport', 'Front Ports', actions=['import']),
get_model_item('dcim', 'rearport', 'Rear Ports', actions=['import']),
get_model_item('dcim', 'consoleport', 'Console Ports', actions=['import']),
get_model_item('dcim', 'consoleserverport', 'Console Server Ports', actions=['import']),
get_model_item('dcim', 'powerport', 'Power Ports', actions=['import']),
get_model_item('dcim', 'poweroutlet', 'Power Outlets', actions=['import']),
get_model_item('dcim', 'modulebay', 'Module Bays', actions=['import']),
2021-07-22 08:57:16 -04:00
get_model_item('dcim', 'devicebay', 'Device Bays', actions=['import']),
get_model_item('dcim', 'inventoryitem', 'Inventory Items', actions=['import']),
2021-12-27 10:18:39 -05:00
get_model_item('dcim', 'inventoryitemrole', 'Inventory Item Roles'),
),
),
2021-07-22 08:57:16 -04:00
),
)
CONNECTIONS_MENU = Menu(
label='Connections',
2022-07-14 11:02:00 -04:00
icon_class='mdi mdi-connection',
2021-07-22 08:57:16 -04:00
groups=(
MenuGroup(
2021-07-22 08:57:16 -04:00
label='Connections',
items=(
2021-07-22 08:57:16 -04:00
get_model_item('dcim', 'cable', 'Cables', actions=['import']),
get_model_item('wireless', 'wirelesslink', 'Wireless Links', actions=['import']),
2021-07-22 08:57:16 -04:00
MenuItem(
link='dcim:interface_connections_list',
link_text='Interface Connections',
permissions=['dcim.view_interface']
),
MenuItem(
link='dcim:console_connections_list',
link_text='Console Connections',
permissions=['dcim.view_consoleport']
),
MenuItem(
link='dcim:power_connections_list',
link_text='Power Connections',
permissions=['dcim.view_powerport']
),
),
),
),
)
WIRELESS_MENU = Menu(
label='Wireless',
icon_class='mdi mdi-wifi',
groups=(
MenuGroup(
label='Wireless',
items=(
2021-10-12 17:02:53 -04:00
get_model_item('wireless', 'wirelesslan', 'Wireless LANs'),
2021-10-13 16:40:12 -04:00
get_model_item('wireless', 'wirelesslangroup', 'Wireless LAN Groups'),
),
),
),
)
IPAM_MENU = Menu(
2021-07-22 08:57:16 -04:00
label='IPAM',
icon_class='mdi mdi-counter',
groups=(
MenuGroup(
2021-07-22 08:57:16 -04:00
label='IP Addresses',
items=(
2021-07-22 11:30:50 -04:00
get_model_item('ipam', 'ipaddress', 'IP Addresses'),
2021-07-22 08:57:16 -04:00
get_model_item('ipam', 'iprange', 'IP Ranges'),
),
),
MenuGroup(
2021-07-22 08:57:16 -04:00
label='Prefixes',
items=(
2021-07-22 11:30:50 -04:00
get_model_item('ipam', 'prefix', 'Prefixes'),
2021-07-22 08:57:16 -04:00
get_model_item('ipam', 'role', 'Prefix & VLAN Roles'),
),
),
2021-10-24 23:42:47 -05:00
MenuGroup(
label='ASNs',
items=(
get_model_item('ipam', 'asn', 'ASNs'),
),
),
MenuGroup(
2021-07-22 08:57:16 -04:00
label='Aggregates',
items=(
2021-07-22 08:57:16 -04:00
get_model_item('ipam', 'aggregate', 'Aggregates'),
get_model_item('ipam', 'rir', 'RIRs'),
),
),
MenuGroup(
2021-07-22 08:57:16 -04:00
label='VRFs',
items=(
2021-07-22 08:57:16 -04:00
get_model_item('ipam', 'vrf', 'VRFs'),
get_model_item('ipam', 'routetarget', 'Route Targets'),
),
),
MenuGroup(
2021-07-22 08:57:16 -04:00
label='VLANs',
items=(
2021-07-22 08:57:16 -04:00
get_model_item('ipam', 'vlan', 'VLANs'),
get_model_item('ipam', 'vlangroup', 'VLAN Groups'),
),
),
MenuGroup(
2021-11-01 16:14:44 -04:00
label='Other',
2021-07-22 08:57:16 -04:00
items=(
2021-11-01 16:14:44 -04:00
get_model_item('ipam', 'fhrpgroup', 'FHRP Groups'),
2022-01-12 16:42:28 -05:00
get_model_item('ipam', 'servicetemplate', 'Service Templates'),
get_model_item('ipam', 'service', 'Services'),
2021-07-22 08:57:16 -04:00
),
),
),
)
2022-07-14 11:02:00 -04:00
OVERLAY_MENU = Menu(
label='Overlay',
icon_class='mdi mdi-graph-outline',
groups=(
MenuGroup(
label='L2VPNs',
items=(
get_model_item('ipam', 'l2vpn', 'L2VPNs'),
get_model_item('ipam', 'l2vpntermination', 'Terminations'),
),
),
),
)
2021-07-22 10:26:57 -04:00
VIRTUALIZATION_MENU = Menu(
2021-07-22 08:57:16 -04:00
label='Virtualization',
icon_class='mdi mdi-monitor',
groups=(
MenuGroup(
2021-07-22 08:57:16 -04:00
label='Virtual Machines',
items=(
2021-07-22 08:57:16 -04:00
get_model_item('virtualization', 'virtualmachine', 'Virtual Machines'),
get_model_item('virtualization', 'vminterface', 'Interfaces', actions=['import']),
),
),
MenuGroup(
2021-07-22 08:57:16 -04:00
label='Clusters',
items=(
2021-07-22 08:57:16 -04:00
get_model_item('virtualization', 'cluster', 'Clusters'),
get_model_item('virtualization', 'clustertype', 'Cluster Types'),
get_model_item('virtualization', 'clustergroup', 'Cluster Groups'),
),
),
),
)
CIRCUITS_MENU = Menu(
2021-07-22 08:57:16 -04:00
label='Circuits',
icon_class='mdi mdi-transit-connection-variant',
groups=(
MenuGroup(
2021-07-22 08:57:16 -04:00
label='Circuits',
items=(
2021-07-22 08:57:16 -04:00
get_model_item('circuits', 'circuit', 'Circuits'),
get_model_item('circuits', 'circuittype', 'Circuit Types'),
),
),
MenuGroup(
2021-07-22 08:57:16 -04:00
label='Providers',
items=(
2021-07-22 08:57:16 -04:00
get_model_item('circuits', 'provider', 'Providers'),
get_model_item('circuits', 'providernetwork', 'Provider Networks'),
),
),
),
)
POWER_MENU = Menu(
2021-07-22 08:57:16 -04:00
label='Power',
icon_class='mdi mdi-flash',
groups=(
MenuGroup(
2021-07-22 08:57:16 -04:00
label='Power',
items=(
2021-07-22 08:57:16 -04:00
get_model_item('dcim', 'powerfeed', 'Power Feeds'),
get_model_item('dcim', 'powerpanel', 'Power Panels'),
),
),
),
)
OTHER_MENU = Menu(
2021-07-22 08:57:16 -04:00
label='Other',
icon_class='mdi mdi-notification-clear-all',
groups=(
MenuGroup(
2021-07-22 08:57:16 -04:00
label='Logging',
items=(
2021-07-22 08:57:16 -04:00
get_model_item('extras', 'journalentry', 'Journal Entries', actions=[]),
2021-07-22 11:30:50 -04:00
get_model_item('extras', 'objectchange', 'Change Log', actions=[]),
),
),
MenuGroup(
2021-07-22 08:57:16 -04:00
label='Customization',
items=(
2021-07-22 08:57:16 -04:00
get_model_item('extras', 'customfield', 'Custom Fields'),
get_model_item('extras', 'customlink', 'Custom Links'),
get_model_item('extras', 'exporttemplate', 'Export Templates'),
),
),
MenuGroup(
2021-07-22 08:57:16 -04:00
label='Integrations',
items=(
2021-07-22 08:57:16 -04:00
get_model_item('extras', 'webhook', 'Webhooks'),
MenuItem(
link='extras:report_list',
link_text='Reports',
permissions=['extras.view_report']
),
MenuItem(
link='extras:script_list',
link_text='Scripts',
permissions=['extras.view_script']
),
),
),
MenuGroup(
label='Other',
items=(
get_model_item('extras', 'tag', 'Tags'),
get_model_item('extras', 'configcontext', 'Config Contexts', actions=['add']),
),
),
),
)
2021-07-22 08:57:16 -04:00
MENUS = [
ORGANIZATION_MENU,
DEVICES_MENU,
2021-07-22 08:57:16 -04:00
CONNECTIONS_MENU,
WIRELESS_MENU,
IPAM_MENU,
2022-07-14 11:02:00 -04:00
OVERLAY_MENU,
2021-07-22 10:26:57 -04:00
VIRTUALIZATION_MENU,
CIRCUITS_MENU,
POWER_MENU,
OTHER_MENU,
2021-07-22 08:57:16 -04:00
]
#
# Add plugin menus
#
2022-01-27 13:37:24 -05:00
if registry['plugins']['menu_items']:
2021-07-22 08:57:16 -04:00
plugin_menu_groups = []
2022-01-27 13:37:24 -05:00
for plugin_name, items in registry['plugins']['menu_items'].items():
2021-07-22 08:57:16 -04:00
plugin_menu_groups.append(
MenuGroup(
label=plugin_name,
items=items
)
)
PLUGIN_MENU = Menu(
label="Plugins",
icon_class="mdi mdi-puzzle",
groups=plugin_menu_groups
)
MENUS.append(PLUGIN_MENU)