From f551c8b7f5d5803c9f48faa025927a2708b09eba Mon Sep 17 00:00:00 2001 From: Jon Schewe Date: Fri, 1 Dec 2023 16:47:00 -0600 Subject: [PATCH] Add support for displaying device information to VirtualChassis This allows one to see all interfaces, front ports and rear ports on the virtual chassis object itself rather than looking at the master device to see this information. --- netbox/dcim/views.py | 58 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 4071b686f..6681998bd 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -3465,6 +3465,64 @@ class VirtualChassisAddMemberView(ObjectPermissionRequiredMixin, GetReturnURLMix }) +class VirtualChassisComponentsView(generic.ObjectChildrenView): + queryset = VirtualChassis.objects.all() + + +@register_model_view(VirtualChassis, 'interfaces') +class VirtualChassisInterfacesView(VirtualChassisComponentsView): + child_model = Interface + table = tables.DeviceInterfaceTable + filterset = filtersets.InterfaceFilterSet + template_name = 'dcim/device/interfaces.html' + tab = ViewTab( + label=_('Interfaces'), + badge=lambda obj: obj.master.vc_interfaces().count(), + permission='dcim.view_interface', + weight=520, + hide_if_empty=True + ) + + def get_children(self, request, parent): + return parent.master.vc_interfaces().restrict(request.user, 'view') + + +@register_model_view(VirtualChassis, 'frontports', path='front-ports') +class VirtualChassisFrontPortsView(VirtualChassisComponentsView): + child_model = FrontPort + table = tables.DeviceFrontPortTable + filterset = filtersets.FrontPortFilterSet + template_name = 'dcim/device/frontports.html' + tab = ViewTab( + label=_('Front Ports'), + badge=lambda obj: obj.master.vc_front_ports().count(), + permission='dcim.view_frontport', + weight=520, + hide_if_empty=True + ) + + def get_children(self, request, parent): + return parent.master.vc_front_ports().restrict(request.user, 'view') + + +@register_model_view(VirtualChassis, 'rearports', path='rear-ports') +class VirtualChassisRearPortsView(VirtualChassisComponentsView): + child_model = RearPort + table = tables.DeviceRearPortTable + filterset = filtersets.RearPortFilterSet + template_name = 'dcim/device/rearports.html' + tab = ViewTab( + label=_('Rear Ports'), + badge=lambda obj: obj.master.vc_rear_ports().count(), + permission='dcim.view_rearport', + weight=520, + hide_if_empty=True + ) + + def get_children(self, request, parent): + return parent.master.vc_rear_ports().restrict(request.user, 'view') + + class VirtualChassisRemoveMemberView(ObjectPermissionRequiredMixin, GetReturnURLMixin, View): queryset = Device.objects.all()