diff --git a/netbox/templates/virtualization/cluster/devices.html b/netbox/templates/virtualization/cluster/devices.html
new file mode 100644
index 000000000..271240ed1
--- /dev/null
+++ b/netbox/templates/virtualization/cluster/devices.html
@@ -0,0 +1,13 @@
+{% extends 'generic/object_children.html' %}
+{% load helpers %}
+
+{% block bulk_delete_controls %}
+ {{ block.super }}
+ {% if 'bulk_remove_devices' in actions %}
+
+ {% endif %}
+{% endblock bulk_delete_controls %}
diff --git a/netbox/templates/virtualization/virtualmachine/interfaces.html b/netbox/templates/virtualization/virtualmachine/interfaces.html
new file mode 100644
index 000000000..ee4e76926
--- /dev/null
+++ b/netbox/templates/virtualization/virtualmachine/interfaces.html
@@ -0,0 +1,13 @@
+{% extends 'generic/object_children.html' %}
+{% load helpers %}
+
+{% block bulk_edit_controls %}
+ {{ block.super }}
+ {% if 'bulk_rename' in actions %}
+
+ {% endif %}
+{% endblock bulk_edit_controls %}
diff --git a/netbox/virtualization/views.py b/netbox/virtualization/views.py
index 41eefc8ac..92a91f47e 100644
--- a/netbox/virtualization/views.py
+++ b/netbox/virtualization/views.py
@@ -1,3 +1,5 @@
+from collections import defaultdict
+
from django.contrib import messages
from django.db import transaction
from django.db.models import Prefetch, Sum
@@ -193,7 +195,14 @@ class ClusterDevicesView(generic.ObjectChildrenView):
child_model = Device
table = DeviceTable
filterset = DeviceFilterSet
- template_name = 'generic/object_children.html'
+ template_name = 'virtualization/cluster/devices.html'
+ actions = ('add', 'import', 'export', 'bulk_edit', 'bulk_remove_devices')
+ action_perms = defaultdict(set, **{
+ 'add': {'add'},
+ 'import': {'add'},
+ 'bulk_edit': {'change'},
+ 'bulk_remove_devices': {'change'},
+ })
tab = ViewTab(
label=_('Devices'),
badge=lambda obj: obj.devices.count(),
@@ -346,13 +355,21 @@ class VirtualMachineInterfacesView(generic.ObjectChildrenView):
child_model = VMInterface
table = tables.VirtualMachineVMInterfaceTable
filterset = filtersets.VMInterfaceFilterSet
- template_name = 'generic/object_children.html'
+ template_name = 'virtualization/virtualmachine/interfaces.html'
tab = ViewTab(
label=_('Interfaces'),
badge=lambda obj: obj.interfaces.count(),
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(