From 4be5c3390583005a0da91f7d5e3107326ad2a1e0 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 26 Jul 2016 10:14:51 -0400 Subject: [PATCH] Enabled bulk deletion of device bays, interfaces, console server ports, and power outlets from devices --- netbox/dcim/urls.py | 8 +- netbox/dcim/views.py | 38 ++++- netbox/templates/dcim/device.html | 132 ++++++++++++++---- netbox/templates/dcim/inc/_consoleport.html | 5 + .../dcim/inc/_consoleserverport.html | 5 + netbox/templates/dcim/inc/_devicebay.html | 5 + netbox/templates/dcim/inc/_interface.html | 5 + netbox/templates/dcim/inc/_poweroutlet.html | 5 + netbox/templates/dcim/inc/_powerport.html | 5 + netbox/templates/dcim/inc/device_table.html | 2 +- ...bulk_add.html => interface_add_multi.html} | 0 11 files changed, 178 insertions(+), 32 deletions(-) rename netbox/templates/dcim/{interface_bulk_add.html => interface_add_multi.html} (100%) diff --git a/netbox/dcim/urls.py b/netbox/dcim/urls.py index dd0cf0504..ea9d96211 100644 --- a/netbox/dcim/urls.py +++ b/netbox/dcim/urls.py @@ -103,6 +103,7 @@ urlpatterns = [ # Console ports url(r'^devices/(?P\d+)/console-ports/add/$', views.consoleport_add, name='consoleport_add'), + url(r'^devices/(?P\d+)/console-ports/delete/$', views.ConsolePortBulkDeleteView.as_view(), name='consoleport_bulk_delete'), url(r'^console-ports/(?P\d+)/connect/$', views.consoleport_connect, name='consoleport_connect'), url(r'^console-ports/(?P\d+)/disconnect/$', views.consoleport_disconnect, name='consoleport_disconnect'), url(r'^console-ports/(?P\d+)/edit/$', views.consoleport_edit, name='consoleport_edit'), @@ -110,6 +111,7 @@ urlpatterns = [ # Console server ports url(r'^devices/(?P\d+)/console-server-ports/add/$', views.consoleserverport_add, name='consoleserverport_add'), + url(r'^devices/(?P\d+)/console-server-ports/delete/$', views.ConsoleServerPortBulkDeleteView.as_view(), name='consoleserverport_bulk_delete'), url(r'^console-server-ports/(?P\d+)/connect/$', views.consoleserverport_connect, name='consoleserverport_connect'), url(r'^console-server-ports/(?P\d+)/disconnect/$', views.consoleserverport_disconnect, name='consoleserverport_disconnect'), url(r'^console-server-ports/(?P\d+)/edit/$', views.consoleserverport_edit, name='consoleserverport_edit'), @@ -117,6 +119,7 @@ urlpatterns = [ # Power ports url(r'^devices/(?P\d+)/power-ports/add/$', views.powerport_add, name='powerport_add'), + url(r'^devices/(?P\d+)/power-ports/delete/$', views.PowerPortBulkDeleteView.as_view(), name='powerport_bulk_delete'), url(r'^power-ports/(?P\d+)/connect/$', views.powerport_connect, name='powerport_connect'), url(r'^power-ports/(?P\d+)/disconnect/$', views.powerport_disconnect, name='powerport_disconnect'), url(r'^power-ports/(?P\d+)/edit/$', views.powerport_edit, name='powerport_edit'), @@ -124,6 +127,7 @@ urlpatterns = [ # Power outlets url(r'^devices/(?P\d+)/power-outlets/add/$', views.poweroutlet_add, name='poweroutlet_add'), + url(r'^devices/(?P\d+)/power-outlets/delete/$', views.PowerOutletBulkDeleteView.as_view(), name='poweroutlet_bulk_delete'), url(r'^power-outlets/(?P\d+)/connect/$', views.poweroutlet_connect, name='poweroutlet_connect'), url(r'^power-outlets/(?P\d+)/disconnect/$', views.poweroutlet_disconnect, name='poweroutlet_disconnect'), url(r'^power-outlets/(?P\d+)/edit/$', views.poweroutlet_edit, name='poweroutlet_edit'), @@ -131,6 +135,7 @@ urlpatterns = [ # Device bays url(r'^devices/(?P\d+)/bays/add/$', views.devicebay_add, name='devicebay_add'), + url(r'^devices/(?P\d+)/bays/delete/$', views.DeviceBayBulkDeleteView.as_view(), name='devicebay_bulk_delete'), url(r'^device-bays/(?P\d+)/edit/$', views.devicebay_edit, name='devicebay_edit'), url(r'^device-bays/(?P\d+)/delete/$', views.devicebay_delete, name='devicebay_delete'), url(r'^device-bays/(?P\d+)/populate/$', views.devicebay_populate, name='devicebay_populate'), @@ -145,8 +150,9 @@ urlpatterns = [ url(r'^interface-connections/import/$', views.InterfaceConnectionsBulkImportView.as_view(), name='interface_connections_import'), # Interfaces - url(r'^devices/interfaces/add/$', views.InterfaceBulkAddView.as_view(), name='interface_bulk_add'), + url(r'^devices/interfaces/add/$', views.InterfaceBulkAddView.as_view(), name='interface_add_multi'), url(r'^devices/(?P\d+)/interfaces/add/$', views.interface_add, name='interface_add'), + url(r'^devices/(?P\d+)/interfaces/delete/$', views.InterfaceBulkDeleteView.as_view(), name='interface_bulk_delete'), url(r'^devices/(?P\d+)/interface-connections/add/$', views.interfaceconnection_add, name='interfaceconnection_add'), url(r'^interface-connections/(?P\d+)/delete/$', views.interfaceconnection_delete, name='interfaceconnection_delete'), url(r'^interfaces/(?P\d+)/edit/$', views.interface_edit, name='interface_edit'), diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 5d7af8bef..464418ac8 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -813,6 +813,12 @@ def consoleport_delete(request, pk): }) +class ConsolePortBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): + permission_required = 'dcim.delete_consoleport' + cls = ConsolePort + parent_cls = Device + + class ConsoleConnectionsBulkImportView(PermissionRequiredMixin, BulkImportView): permission_required = 'dcim.change_consoleport' form = forms.ConsoleConnectionImportForm @@ -968,6 +974,12 @@ def consoleserverport_delete(request, pk): }) +class ConsoleServerPortBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): + permission_required = 'dcim.delete_consoleserverport' + cls = ConsoleServerPort + parent_cls = Device + + # # Power ports # @@ -1113,6 +1125,12 @@ def powerport_delete(request, pk): }) +class PowerPortBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): + permission_required = 'dcim.delete_powerport' + cls = PowerPort + parent_cls = Device + + class PowerConnectionsBulkImportView(PermissionRequiredMixin, BulkImportView): permission_required = 'dcim.change_powerport' form = forms.PowerConnectionImportForm @@ -1266,6 +1284,12 @@ def poweroutlet_delete(request, pk): }) +class PowerOutletBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): + permission_required = 'dcim.delete_poweroutlet' + cls = PowerOutlet + parent_cls = Device + + # # Interfaces # @@ -1360,7 +1384,7 @@ class InterfaceBulkAddView(PermissionRequiredMixin, BulkEditView): permission_required = 'dcim.add_interface' cls = Device form = forms.InterfaceBulkCreateForm - template_name = 'dcim/interface_bulk_add.html' + template_name = 'dcim/interface_add_multi.html' default_redirect_url = 'dcim:device_list' def update_objects(self, pk_list, form): @@ -1389,6 +1413,12 @@ class InterfaceBulkAddView(PermissionRequiredMixin, BulkEditView): len(selected_devices))) +class InterfaceBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): + permission_required = 'dcim.delete_interface' + cls = Interface + parent_cls = Device + + # # Device bays # @@ -1526,6 +1556,12 @@ def devicebay_depopulate(request, pk): }) +class DeviceBayBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): + permission_required = 'dcim.delete_devicebay' + cls = DeviceBay + parent_cls = Device + + # # Interface connections # diff --git a/netbox/templates/dcim/device.html b/netbox/templates/dcim/device.html index 0f405b68e..eadf8a1e2 100644 --- a/netbox/templates/dcim/device.html +++ b/netbox/templates/dcim/device.html @@ -289,97 +289,171 @@
{% if device_bays or device.device_type.is_parent_device %} + {% if perms.dcim.delete_devicebay %} +
+ {% csrf_token %} + {% endif %}
Device Bays
{% for devicebay in device_bays %} - {% include 'dcim/inc/_devicebay.html' %} + {% include 'dcim/inc/_devicebay.html' with selectable=True %} {% empty %} {% endfor %}
No device bays defined
- {% if perms.dcim.add_devicebay %} - + {% if perms.dcim.add_devicebay or perms.dcim.delete_devicebay %} + {% endif %}
{% endif %} {% if interfaces or device.device_type.is_network_device %} + {% if perms.dcim.delete_interface %} + + {% csrf_token %} + {% endif %}
Interfaces
{% for iface in interfaces %} - {% include 'dcim/inc/_interface.html' %} + {% include 'dcim/inc/_interface.html' with selectable=True %} {% empty %} {% endfor %}
No interfaces defined
- {% if perms.dcim.add_interface %} - + {% if perms.dcim.delete_interface %} + + {% endif %} {% endif %} {% if cs_ports or device.device_type.is_console_server %} + {% if perms.dcim.delete_consoleserverport %} +
+ {% csrf_token %} + {% endif %}
Console Server Ports
{% for csp in cs_ports %} - {% include 'dcim/inc/_consoleserverport.html' %} + {% include 'dcim/inc/_consoleserverport.html' with selectable=True %} {% empty %} {% endfor %}
No console server ports defined
- {% if perms.dcim.add_consoleserverport %} - + {% if perms.dcim.delete_consoleserverport %} + + {% endif %} {% endif %} {% if power_outlets or device.device_type.is_pdu %} + {% if perms.dcim.delete_poweroutlet %} +
+ {% csrf_token %} + {% endif %}
Power Outlets
{% for po in power_outlets %} - {% include 'dcim/inc/_poweroutlet.html' %} + {% include 'dcim/inc/_poweroutlet.html' with selectable=True %} {% empty %} {% endfor %}
No power outlets defined
- {% if perms.dcim.add_poweroutlet %} - diff --git a/netbox/templates/dcim/inc/_consoleport.html b/netbox/templates/dcim/inc/_consoleport.html index 373d41204..43b353bb1 100644 --- a/netbox/templates/dcim/inc/_consoleport.html +++ b/netbox/templates/dcim/inc/_consoleport.html @@ -1,4 +1,9 @@ + {% if selectable and perms.dcim.delete_consoleport %} + + + + {% endif %} {{ cp.name }} diff --git a/netbox/templates/dcim/inc/_consoleserverport.html b/netbox/templates/dcim/inc/_consoleserverport.html index 3d6308e2b..b9c5e8e59 100644 --- a/netbox/templates/dcim/inc/_consoleserverport.html +++ b/netbox/templates/dcim/inc/_consoleserverport.html @@ -1,4 +1,9 @@ + {% if selectable and perms.dcim.delete_consoleserverport %} + + + + {% endif %} {{ csp.name }} diff --git a/netbox/templates/dcim/inc/_devicebay.html b/netbox/templates/dcim/inc/_devicebay.html index b9fbf1395..aaa9099c6 100644 --- a/netbox/templates/dcim/inc/_devicebay.html +++ b/netbox/templates/dcim/inc/_devicebay.html @@ -1,4 +1,9 @@ + {% if selectable and perms.dcim.delete_devicebay %} + + + + {% endif %} {{ devicebay.name }} diff --git a/netbox/templates/dcim/inc/_interface.html b/netbox/templates/dcim/inc/_interface.html index fc435ce98..0c9d17751 100644 --- a/netbox/templates/dcim/inc/_interface.html +++ b/netbox/templates/dcim/inc/_interface.html @@ -1,4 +1,9 @@ + {% if selectable and perms.dcim.delete_interface %} + + + + {% endif %} {{ iface.name }} {% if iface.description %} diff --git a/netbox/templates/dcim/inc/_poweroutlet.html b/netbox/templates/dcim/inc/_poweroutlet.html index b77252cc1..18619a37d 100644 --- a/netbox/templates/dcim/inc/_poweroutlet.html +++ b/netbox/templates/dcim/inc/_poweroutlet.html @@ -1,4 +1,9 @@ + {% if selectable and perms.dcim.delete_poweroutlet %} + + + + {% endif %} {{ po.name }} diff --git a/netbox/templates/dcim/inc/_powerport.html b/netbox/templates/dcim/inc/_powerport.html index 077cc7aa6..7d519599d 100644 --- a/netbox/templates/dcim/inc/_powerport.html +++ b/netbox/templates/dcim/inc/_powerport.html @@ -1,4 +1,9 @@ + {% if selectable and perms.dcim.delete_powerport %} + + + + {% endif %} {{ pp.name }} diff --git a/netbox/templates/dcim/inc/device_table.html b/netbox/templates/dcim/inc/device_table.html index 38ab5fe36..2f585968f 100644 --- a/netbox/templates/dcim/inc/device_table.html +++ b/netbox/templates/dcim/inc/device_table.html @@ -7,7 +7,7 @@ {% render_table table table_template|default:'table.html' %} {% if perms.dcim.add_interface %} - diff --git a/netbox/templates/dcim/interface_bulk_add.html b/netbox/templates/dcim/interface_add_multi.html similarity index 100% rename from netbox/templates/dcim/interface_bulk_add.html rename to netbox/templates/dcim/interface_add_multi.html