diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index ca37084f2..abe8301a2 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -28,7 +28,9 @@ from utilities.permissions import get_permission_for_model from utilities.query import count_related from utilities.query_functions import CollateAsChar from utilities.views import GetReturnURLMixin, ObjectPermissionRequiredMixin, ViewTab, register_model_view +from virtualization.filtersets import VirtualMachineFilterSet from virtualization.models import VirtualMachine +from virtualization.tables import VirtualMachineTable from . import filtersets, forms, tables from .choices import DeviceFaceChoices from .models import * @@ -2085,6 +2087,25 @@ class DeviceRenderConfigView(generic.ObjectView): } +@register_model_view(Device, 'virtual-machines') +class DeviceVirtualMachinesView(generic.ObjectChildrenView): + queryset = Device.objects.all() + child_model = VirtualMachine + table = VirtualMachineTable + filterset = VirtualMachineFilterSet + template_name = 'generic/object_children.html' + tab = ViewTab( + label=_('Virtual Machines'), + badge=lambda obj: VirtualMachine.objects.filter(cluster=obj.cluster, device=obj).count(), + weight=2200, + hide_if_empty=True, + permission='virtualization.view_virtualmachine' + ) + + def get_children(self, request, parent): + return self.child_model.objects.restrict(request.user, 'view').filter(cluster=parent.cluster, device=parent) + + class DeviceBulkImportView(generic.BulkImportView): queryset = Device.objects.all() model_form = forms.DeviceImportForm