diff --git a/netbox/templates/virtualization/virtualmachine/virtual_disks.html b/netbox/templates/virtualization/virtualmachine/virtual_disks.html new file mode 100644 index 000000000..b68872da8 --- /dev/null +++ b/netbox/templates/virtualization/virtualmachine/virtual_disks.html @@ -0,0 +1,14 @@ +{% extends 'generic/object_children.html' %} +{% load helpers %} +{% load i18n %} + +{% block bulk_edit_controls %} + {{ block.super }} + {% if 'bulk_rename' in actions %} + + {% endif %} +{% endblock bulk_edit_controls %} diff --git a/netbox/virtualization/tables/virtualmachines.py b/netbox/virtualization/tables/virtualmachines.py index 4328c12e7..aab7e997a 100644 --- a/netbox/virtualization/tables/virtualmachines.py +++ b/netbox/virtualization/tables/virtualmachines.py @@ -9,6 +9,7 @@ from virtualization.models import VirtualDisk, VirtualMachine, VMInterface __all__ = ( 'VirtualDiskTable', 'VirtualMachineTable', + 'VirtualMachineVirtualDiskTable', 'VirtualMachineVMInterfaceTable', 'VMInterfaceTable', ) @@ -161,7 +162,31 @@ class VirtualMachineVMInterfaceTable(VMInterfaceTable): } -class VirtualDiskTable(VMInterfaceTable): +class VirtualDiskTable(NetBoxTable): + virtual_machine = tables.Column( + verbose_name=_('Virtual Machine'), + linkify=True + ) + name = tables.Column( + verbose_name=_('Name'), + linkify=True + ) + tags = columns.TagColumn( + url_name='virtualization:virtualdisk_list' + ) + + class Meta(NetBoxTable.Meta): + model = VirtualDisk + fields = ( + 'pk', 'id', 'name', 'size', 'tags', + ) + default_columns = ('pk', 'name', 'size') + row_attrs = { + 'data-name': lambda record: record.name, + } + + +class VirtualMachineVirtualDiskTable(VirtualDiskTable): actions = columns.ActionsColumn( actions=('edit', 'delete'), ) @@ -169,9 +194,9 @@ class VirtualDiskTable(VMInterfaceTable): class Meta(NetBoxTable.Meta): model = VirtualDisk fields = ( - 'pk', 'id', 'name', 'size', 'tags', 'actions', + 'pk', 'id', 'name', 'tags', 'actions', ) - default_columns = ('pk', 'name', 'size') + default_columns = ('pk', 'name',) row_attrs = { 'data-name': lambda record: record.name, } diff --git a/netbox/virtualization/views.py b/netbox/virtualization/views.py index 0dafb97a5..eb6a26b9e 100644 --- a/netbox/virtualization/views.py +++ b/netbox/virtualization/views.py @@ -365,8 +365,31 @@ class VirtualMachineInterfacesView(generic.ObjectChildrenView): permission='virtualization.view_vminterface', weight=500 ) + actions = ('add', 'import', 'export', 'bulk_edit', 'bulk_delete', 'bulk_rename') + action_perms = defaultdict(set, **{ + 'add': {'add'}, + 'import': {'add'}, + 'bulk_edit': {'change'}, + 'bulk_delete': {'delete'}, + 'bulk_rename': {'change'}, + }) + + def get_children(self, request, parent): + return parent.interfaces.restrict(request.user, 'view').prefetch_related( + Prefetch('ip_addresses', queryset=IPAddress.objects.restrict(request.user)), + 'tags', + ) + + +@register_model_view(VirtualMachine, 'disks') +class VirtualMachineVirtualDisksView(generic.ObjectChildrenView): + queryset = VirtualMachine.objects.all() + child_model = VirtualDisk + table = tables.VirtualMachineVirtualDiskTable + filterset = filtersets.VirtualDiskFilterSet + template_name = 'virtualization/virtualmachine/virtual_disks.html' tab = ViewTab( - label=_('Disks'), + label=_('Virtual Disks'), badge=lambda obj: obj.virtual_disk_count, permission='virtualization.view_virtual_disk', weight=500 @@ -381,8 +404,7 @@ class VirtualMachineInterfacesView(generic.ObjectChildrenView): }) def get_children(self, request, parent): - return parent.interfaces.restrict(request.user, 'view').prefetch_related( - Prefetch('ip_addresses', queryset=IPAddress.objects.restrict(request.user)), + return parent.virtualdisks.restrict(request.user, 'view').prefetch_related( 'tags', )