diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 5b93e5f0b..fca222f47 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -1,4 +1,5 @@ import traceback +from collections import defaultdict from django.contrib import messages from django.contrib.contenttypes.models import ContentType @@ -45,6 +46,15 @@ CABLE_TERMINATION_TYPES = { class DeviceComponentsView(generic.ObjectChildrenView): + actions = ('add', 'import', 'export', 'bulk_edit', 'bulk_delete', 'bulk_rename', 'bulk_disconnect') + action_perms = defaultdict(set, **{ + 'add': {'add'}, + 'import': {'add'}, + 'bulk_edit': {'change'}, + 'bulk_delete': {'delete'}, + 'bulk_rename': {'change'}, + 'bulk_disconnect': {'change'}, + }) queryset = Device.objects.all() def get_children(self, request, parent): @@ -1997,6 +2007,7 @@ class DeviceModuleBaysView(DeviceComponentsView): table = tables.DeviceModuleBayTable filterset = filtersets.ModuleBayFilterSet template_name = 'dcim/device/modulebays.html' + actions = ('add', 'import', 'export', 'bulk_edit', 'bulk_delete', 'bulk_rename') tab = ViewTab( label=_('Module Bays'), badge=lambda obj: obj.modulebays.count(), @@ -2012,6 +2023,7 @@ class DeviceDeviceBaysView(DeviceComponentsView): table = tables.DeviceDeviceBayTable filterset = filtersets.DeviceBayFilterSet template_name = 'dcim/device/devicebays.html' + actions = ('add', 'import', 'export', 'bulk_edit', 'bulk_delete', 'bulk_rename') tab = ViewTab( label=_('Device Bays'), badge=lambda obj: obj.devicebays.count(), @@ -2023,6 +2035,7 @@ class DeviceDeviceBaysView(DeviceComponentsView): @register_model_view(Device, 'inventory') class DeviceInventoryView(DeviceComponentsView): + actions = ('add', 'import', 'export', 'bulk_edit', 'bulk_delete', 'bulk_rename') child_model = InventoryItem table = tables.DeviceInventoryItemTable filterset = filtersets.InventoryItemFilterSet diff --git a/netbox/templates/dcim/device/consoleports.html b/netbox/templates/dcim/device/consoleports.html index 247d66732..a79f5af4f 100644 --- a/netbox/templates/dcim/device/consoleports.html +++ b/netbox/templates/dcim/device/consoleports.html @@ -1,6 +1,20 @@ {% extends 'generic/objectchildren_list.html' %} +{% load helpers %} -{% block bulk_controls %} +{% block bulk_delete_controls %} + {{ block.super }} + {% with bulk_disconnect_view=child_model|validated_viewname:"bulk_disconnect" %} + {% if 'bulk_disconnect' in actions and bulk_disconnect_view %} + + {% endif %} + {% endwith %} +{% endblock bulk_delete_controls %} + +{% block bulk_extra_controls %} {{ block.super }} {% if perms.dcim.add_consoleport %}
{% endif %} -{% endblock %} +{% endblock bulk_extra_controls %} diff --git a/netbox/templates/dcim/device/consoleserverports.html b/netbox/templates/dcim/device/consoleserverports.html index 1387fb690..3d7c444d6 100644 --- a/netbox/templates/dcim/device/consoleserverports.html +++ b/netbox/templates/dcim/device/consoleserverports.html @@ -1,6 +1,20 @@ {% extends 'generic/objectchildren_list.html' %} +{% load helpers %} -{% block bulk_controls %} +{% block bulk_delete_controls %} + {{ block.super }} + {% with bulk_disconnect_view=child_model|validated_viewname:"bulk_disconnect" %} + {% if 'bulk_disconnect' in actions and bulk_disconnect_view %} + + {% endif %} + {% endwith %} +{% endblock bulk_delete_controls %} + +{% block bulk_extra_controls %} {{ block.super }} {% if perms.dcim.add_consoleserverport %} {% endif %} -{% endblock %} \ No newline at end of file +{% endblock bulk_extra_controls %} \ No newline at end of file diff --git a/netbox/templates/dcim/device/devicebays.html b/netbox/templates/dcim/device/devicebays.html index cf28e139b..f996278f6 100644 --- a/netbox/templates/dcim/device/devicebays.html +++ b/netbox/templates/dcim/device/devicebays.html @@ -1,6 +1,6 @@ {% extends 'generic/objectchildren_list.html' %} -{% block bulk_controls %} +{% block bulk_extra_controls %} {{ block.super }} {% if perms.dcim.add_devicebay %} {% endif %} -{% endblock %} +{% endblock bulk_extra_controls %} diff --git a/netbox/templates/dcim/device/frontports.html b/netbox/templates/dcim/device/frontports.html index 9985e4389..e2502ce10 100644 --- a/netbox/templates/dcim/device/frontports.html +++ b/netbox/templates/dcim/device/frontports.html @@ -1,6 +1,20 @@ {% extends 'generic/objectchildren_list.html' %} +{% load helpers %} -{% block bulk_controls %} +{% block bulk_delete_controls %} + {{ block.super }} + {% with bulk_disconnect_view=child_model|validated_viewname:"bulk_disconnect" %} + {% if 'bulk_disconnect' in actions and bulk_disconnect_view %} + + {% endif %} + {% endwith %} +{% endblock bulk_delete_controls %} + +{% block bulk_extra_controls %} {{ block.super }} {% if perms.dcim.add_frontport %} {% endif %} -{% endblock %} \ No newline at end of file +{% endblock bulk_extra_controls %} \ No newline at end of file diff --git a/netbox/templates/dcim/device/interfaces.html b/netbox/templates/dcim/device/interfaces.html index 92a9cfdbb..38167fe63 100644 --- a/netbox/templates/dcim/device/interfaces.html +++ b/netbox/templates/dcim/device/interfaces.html @@ -1,6 +1,20 @@ {% extends 'generic/objectchildren_list.html' %} +{% load helpers %} -{% block bulk_controls %} +{% block bulk_delete_controls %} + {{ block.super }} + {% with bulk_disconnect_view=child_model|validated_viewname:"bulk_disconnect" %} + {% if 'bulk_disconnect' in actions and bulk_disconnect_view %} + + {% endif %} + {% endwith %} +{% endblock bulk_delete_controls %} + +{% block bulk_extra_controls %} {{ block.super }} {% if perms.dcim.add_interface %} {% endif %} -{% endblock %} \ No newline at end of file +{% endblock bulk_extra_controls %} diff --git a/netbox/templates/dcim/device/inventory.html b/netbox/templates/dcim/device/inventory.html index bcce09db4..73e64b14b 100644 --- a/netbox/templates/dcim/device/inventory.html +++ b/netbox/templates/dcim/device/inventory.html @@ -1,6 +1,6 @@ {% extends 'generic/objectchildren_list.html' %} -{% block bulk_controls %} +{% block bulk_extra_controls %} {{ block.super }} {% if perms.dcim.add_inventoryitem %} {% endif %} -{% endblock %} +{% endblock bulk_extra_controls %} diff --git a/netbox/templates/dcim/device/modulebays.html b/netbox/templates/dcim/device/modulebays.html index 583d64da4..69a9539bf 100644 --- a/netbox/templates/dcim/device/modulebays.html +++ b/netbox/templates/dcim/device/modulebays.html @@ -1,6 +1,6 @@ {% extends 'generic/objectchildren_list.html' %} -{% block bulk_controls %} +{% block bulk_extra_controls %} {{ block.super }} {% if perms.dcim.add_modulebay %} {% endif %} -{% endblock %} \ No newline at end of file +{% endblock bulk_extra_controls %} \ No newline at end of file diff --git a/netbox/templates/dcim/device/poweroutlets.html b/netbox/templates/dcim/device/poweroutlets.html index 9d7ac35f4..af076b23d 100644 --- a/netbox/templates/dcim/device/poweroutlets.html +++ b/netbox/templates/dcim/device/poweroutlets.html @@ -1,6 +1,20 @@ {% extends 'generic/objectchildren_list.html' %} +{% load helpers %} -{% block bulk_controls %} +{% block bulk_delete_controls %} + {{ block.super }} + {% with bulk_disconnect_view=child_model|validated_viewname:"bulk_disconnect" %} + {% if 'bulk_disconnect' in actions and bulk_disconnect_view %} + + {% endif %} + {% endwith %} +{% endblock bulk_delete_controls %} + +{% block bulk_extra_controls %} {{ block.super }} {% if perms.dcim.add_poweroutlet %} {% endif %} -{% endblock %} +{% endblock bulk_extra_controls %} diff --git a/netbox/templates/dcim/device/powerports.html b/netbox/templates/dcim/device/powerports.html index 60c1aaf64..01ee6fa62 100644 --- a/netbox/templates/dcim/device/powerports.html +++ b/netbox/templates/dcim/device/powerports.html @@ -1,6 +1,20 @@ {% extends 'generic/objectchildren_list.html' %} +{% load helpers %} -{% block bulk_controls %} +{% block bulk_delete_controls %} + {{ block.super }} + {% with bulk_disconnect_view=child_model|validated_viewname:"bulk_disconnect" %} + {% if 'bulk_disconnect' in actions and bulk_disconnect_view %} + + {% endif %} + {% endwith %} +{% endblock bulk_delete_controls %} + +{% block bulk_extra_controls %} {{ block.super }} {% if perms.dcim.add_powerport %} {% endif %} -{% endblock %} \ No newline at end of file +{% endblock bulk_extra_controls %} diff --git a/netbox/templates/dcim/device/rearports.html b/netbox/templates/dcim/device/rearports.html index f0ea500d8..d72515d25 100644 --- a/netbox/templates/dcim/device/rearports.html +++ b/netbox/templates/dcim/device/rearports.html @@ -1,6 +1,20 @@ {% extends 'generic/objectchildren_list.html' %} +{% load helpers %} -{% block bulk_controls %} +{% block bulk_delete_controls %} + {{ block.super }} + {% with bulk_disconnect_view=child_model|validated_viewname:"bulk_disconnect" %} + {% if 'bulk_disconnect' in actions and bulk_disconnect_view %} + + {% endif %} + {% endwith %} +{% endblock bulk_delete_controls %} + +{% block bulk_extra_controls %} {{ block.super }} {% if perms.dcim.add_rearport %} {% endif %} -{% endblock %} \ No newline at end of file +{% endblock bulk_extra_controls %} \ No newline at end of file diff --git a/netbox/templates/dcim/rack/non_racked_devices.html b/netbox/templates/dcim/rack/non_racked_devices.html index 923699c42..0850eef8d 100644 --- a/netbox/templates/dcim/rack/non_racked_devices.html +++ b/netbox/templates/dcim/rack/non_racked_devices.html @@ -1,5 +1,4 @@ {% extends 'generic/objectchildren_list.html' %} -{% load helpers %} {% block extra_controls %} {% if perms.dcim.add_device %} @@ -10,4 +9,4 @@ {% endif %} -{% endblock %} +{% endblock extra_controls %} diff --git a/netbox/templates/dcim/rack/reservations.html b/netbox/templates/dcim/rack/reservations.html index f0989d016..21de66cf6 100644 --- a/netbox/templates/dcim/rack/reservations.html +++ b/netbox/templates/dcim/rack/reservations.html @@ -1,5 +1,4 @@ {% extends 'generic/objectchildren_list.html' %} -{% load helpers %} {% block extra_controls %} {% if perms.dcim.add_rackreservation %} @@ -10,4 +9,4 @@ {% endif %} -{% endblock %} +{% endblock extra_controls %} diff --git a/netbox/templates/generic/objectchildren_list.html b/netbox/templates/generic/objectchildren_list.html index ed2c91c6b..d0d96ac83 100644 --- a/netbox/templates/generic/objectchildren_list.html +++ b/netbox/templates/generic/objectchildren_list.html @@ -10,14 +10,14 @@ {% include 'htmx/table.html' %} - {% endblock content %} diff --git a/netbox/templates/ipam/aggregate/prefixes.html b/netbox/templates/ipam/aggregate/prefixes.html index 5fc12de85..e8f1dcf33 100644 --- a/netbox/templates/ipam/aggregate/prefixes.html +++ b/netbox/templates/ipam/aggregate/prefixes.html @@ -1,5 +1,4 @@ {% extends 'generic/objectchildren_list.html' %} -{% load helpers %} {% block extra_controls %} {% include 'ipam/inc/toggle_available.html' %} @@ -9,4 +8,4 @@ {% endif %} {{ block.super }} -{% endblock %} +{% endblock extra_controls %} diff --git a/netbox/templates/ipam/iprange/ip_addresses.html b/netbox/templates/ipam/iprange/ip_addresses.html index 414201b28..9f6503753 100644 --- a/netbox/templates/ipam/iprange/ip_addresses.html +++ b/netbox/templates/ipam/iprange/ip_addresses.html @@ -1,10 +1,9 @@ {% extends 'generic/objectchildren_list.html' %} -{% load helpers %} {% block extra_controls %} - {% if perms.ipam.add_ipaddress and active_tab == 'ip-addresses' and object.first_available_ip %} + {% if perms.ipam.add_ipaddress and object.first_available_ip %} Add IP Address {% endif %} -{% endblock %} +{% endblock extra_controls %} diff --git a/netbox/templates/ipam/prefix/ip_addresses.html b/netbox/templates/ipam/prefix/ip_addresses.html index 73af33c64..2fa33e4c2 100644 --- a/netbox/templates/ipam/prefix/ip_addresses.html +++ b/netbox/templates/ipam/prefix/ip_addresses.html @@ -1,5 +1,4 @@ {% extends 'generic/objectchildren_list.html' %} -{% load helpers %} {% block extra_controls %} {% if perms.ipam.add_ipaddress and first_available_ip %} @@ -7,4 +6,4 @@ Add IP Address {% endif %} -{% endblock %} +{% endblock extra_controls %} diff --git a/netbox/templates/ipam/prefix/ip_ranges.html b/netbox/templates/ipam/prefix/ip_ranges.html index 65ca3e51b..acd3f86b2 100644 --- a/netbox/templates/ipam/prefix/ip_ranges.html +++ b/netbox/templates/ipam/prefix/ip_ranges.html @@ -1,5 +1,4 @@ {% extends 'generic/objectchildren_list.html' %} -{% load helpers %} {% block extra_controls %} {% if perms.ipam.add_iprange and first_available_ip %} @@ -7,4 +6,4 @@ Add IP Range {% endif %} -{% endblock %} +{% endblock extra_controls %} diff --git a/netbox/templates/ipam/prefix/prefixes.html b/netbox/templates/ipam/prefix/prefixes.html index 9dacf55d0..100c514ae 100644 --- a/netbox/templates/ipam/prefix/prefixes.html +++ b/netbox/templates/ipam/prefix/prefixes.html @@ -1,5 +1,4 @@ {% extends 'generic/objectchildren_list.html' %} -{% load helpers %} {% block extra_controls %} {% include 'ipam/inc/toggle_available.html' %} @@ -8,5 +7,4 @@ Add Prefix {% endif %} - {{ block.super }} -{% endblock %} +{% endblock extra_controls %}