From aebfb143e0df611ef1eda92f3e821170afa4b108 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 6 Feb 2020 12:07:00 -0500 Subject: [PATCH 1/5] Rename component template deletion URLs --- netbox/dcim/urls.py | 16 ++++++++-------- netbox/dcim/views.py | 8 -------- netbox/templates/dcim/devicetype.html | 16 ++++++++-------- .../dcim/inc/devicetype_component_table.html | 2 +- 4 files changed, 17 insertions(+), 25 deletions(-) diff --git a/netbox/dcim/urls.py b/netbox/dcim/urls.py index 0d49d2231..1e9783d2a 100644 --- a/netbox/dcim/urls.py +++ b/netbox/dcim/urls.py @@ -92,43 +92,43 @@ urlpatterns = [ # Console port templates path('device-types//console-ports/add/', views.ConsolePortTemplateCreateView.as_view(), name='devicetype_add_consoleport'), - path('device-types//console-ports/delete/', views.ConsolePortTemplateBulkDeleteView.as_view(), name='devicetype_delete_consoleport'), + path('console-port-templates/delete/', views.ConsolePortTemplateBulkDeleteView.as_view(), name='consoleporttemplate_bulk_delete'), path('console-port-templates//edit/', views.ConsolePortTemplateEditView.as_view(), name='consoleporttemplate_edit'), # Console server port templates path('device-types//console-server-ports/add/', views.ConsoleServerPortTemplateCreateView.as_view(), name='devicetype_add_consoleserverport'), - path('device-types//console-server-ports/delete/', views.ConsoleServerPortTemplateBulkDeleteView.as_view(), name='devicetype_delete_consoleserverport'), + path('console-server-port-templates/delete/', views.ConsoleServerPortTemplateBulkDeleteView.as_view(), name='consoleserverporttemplate_bulk_delete'), path('console-server-port-templates//edit/', views.ConsoleServerPortTemplateEditView.as_view(), name='consoleserverporttemplate_edit'), # Power port templates path('device-types//power-ports/add/', views.PowerPortTemplateCreateView.as_view(), name='devicetype_add_powerport'), - path('device-types//power-ports/delete/', views.PowerPortTemplateBulkDeleteView.as_view(), name='devicetype_delete_powerport'), + path('power-port-templates/delete/', views.PowerPortTemplateBulkDeleteView.as_view(), name='powerporttemplate_bulk_delete'), path('power-port-templates//edit/', views.PowerPortTemplateEditView.as_view(), name='powerporttemplate_edit'), # Power outlet templates path('device-types//power-outlets/add/', views.PowerOutletTemplateCreateView.as_view(), name='devicetype_add_poweroutlet'), - path('device-types//power-outlets/delete/', views.PowerOutletTemplateBulkDeleteView.as_view(), name='devicetype_delete_poweroutlet'), + path('power-outlet-templates/delete/', views.PowerOutletTemplateBulkDeleteView.as_view(), name='poweroutlettemplate_bulk_delete'), path('power-outlet-templates//edit/', views.PowerOutletTemplateEditView.as_view(), name='poweroutlettemplate_edit'), # Interface templates path('device-types//interfaces/add/', views.InterfaceTemplateCreateView.as_view(), name='devicetype_add_interface'), path('device-types//interfaces/edit/', views.InterfaceTemplateBulkEditView.as_view(), name='devicetype_bulkedit_interface'), - path('device-types//interfaces/delete/', views.InterfaceTemplateBulkDeleteView.as_view(), name='devicetype_delete_interface'), + path('interface-templates/delete/', views.InterfaceTemplateBulkDeleteView.as_view(), name='interfacetemplate_bulk_delete'), path('interface-templates//edit/', views.InterfaceTemplateEditView.as_view(), name='interfacetemplate_edit'), # Front port templates path('device-types//front-ports/add/', views.FrontPortTemplateCreateView.as_view(), name='devicetype_add_frontport'), - path('device-types//front-ports/delete/', views.FrontPortTemplateBulkDeleteView.as_view(), name='devicetype_delete_frontport'), + path('front-port-templates/delete/', views.FrontPortTemplateBulkDeleteView.as_view(), name='frontporttemplate_bulk_delete'), path('front-port-templates//edit/', views.FrontPortTemplateEditView.as_view(), name='frontporttemplate_edit'), # Rear port templates path('device-types//rear-ports/add/', views.RearPortTemplateCreateView.as_view(), name='devicetype_add_rearport'), - path('device-types//rear-ports/delete/', views.RearPortTemplateBulkDeleteView.as_view(), name='devicetype_delete_rearport'), + path('rear-port-templates/delete/', views.RearPortTemplateBulkDeleteView.as_view(), name='rearporttemplate_bulk_delete'), path('rear-port-templates//edit/', views.RearPortTemplateEditView.as_view(), name='rearporttemplate_edit'), # Device bay templates path('device-types//device-bays/add/', views.DeviceBayTemplateCreateView.as_view(), name='devicetype_add_devicebay'), - path('device-types//device-bays/delete/', views.DeviceBayTemplateBulkDeleteView.as_view(), name='devicetype_delete_devicebay'), + path('device-bay-templates/delete/', views.DeviceBayTemplateBulkDeleteView.as_view(), name='devicebaytemplate_bulk_delete'), path('device-bay-templates//edit/', views.DeviceBayTemplateEditView.as_view(), name='devicebaytemplate_edit'), # Device roles diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index ee5ea876c..7447b5258 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -722,7 +722,6 @@ class ConsolePortTemplateEditView(PermissionRequiredMixin, ObjectEditView): class ConsolePortTemplateBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): permission_required = 'dcim.delete_consoleporttemplate' queryset = ConsolePortTemplate.objects.all() - parent_model = DeviceType table = tables.ConsolePortTemplateTable @@ -745,7 +744,6 @@ class ConsoleServerPortTemplateEditView(PermissionRequiredMixin, ObjectEditView) class ConsoleServerPortTemplateBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): permission_required = 'dcim.delete_consoleserverporttemplate' queryset = ConsoleServerPortTemplate.objects.all() - parent_model = DeviceType table = tables.ConsoleServerPortTemplateTable @@ -768,7 +766,6 @@ class PowerPortTemplateEditView(PermissionRequiredMixin, ObjectEditView): class PowerPortTemplateBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): permission_required = 'dcim.delete_powerporttemplate' queryset = PowerPortTemplate.objects.all() - parent_model = DeviceType table = tables.PowerPortTemplateTable @@ -791,7 +788,6 @@ class PowerOutletTemplateEditView(PermissionRequiredMixin, ObjectEditView): class PowerOutletTemplateBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): permission_required = 'dcim.delete_poweroutlettemplate' queryset = PowerOutletTemplate.objects.all() - parent_model = DeviceType table = tables.PowerOutletTemplateTable @@ -822,7 +818,6 @@ class InterfaceTemplateBulkEditView(PermissionRequiredMixin, BulkEditView): class InterfaceTemplateBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): permission_required = 'dcim.delete_interfacetemplate' queryset = InterfaceTemplate.objects.all() - parent_model = DeviceType table = tables.InterfaceTemplateTable @@ -845,7 +840,6 @@ class FrontPortTemplateEditView(PermissionRequiredMixin, ObjectEditView): class FrontPortTemplateBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): permission_required = 'dcim.delete_frontporttemplate' queryset = FrontPortTemplate.objects.all() - parent_model = DeviceType table = tables.FrontPortTemplateTable @@ -868,7 +862,6 @@ class RearPortTemplateEditView(PermissionRequiredMixin, ObjectEditView): class RearPortTemplateBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): permission_required = 'dcim.delete_rearporttemplate' queryset = RearPortTemplate.objects.all() - parent_model = DeviceType table = tables.RearPortTemplateTable @@ -891,7 +884,6 @@ class DeviceBayTemplateEditView(PermissionRequiredMixin, ObjectEditView): class DeviceBayTemplateBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): permission_required = 'dcim.delete_devicebaytemplate' queryset = DeviceBayTemplate.objects.all() - parent_model = DeviceType table = tables.DeviceBayTemplateTable diff --git a/netbox/templates/dcim/devicetype.html b/netbox/templates/dcim/devicetype.html index 14a2d5690..05fafa89c 100644 --- a/netbox/templates/dcim/devicetype.html +++ b/netbox/templates/dcim/devicetype.html @@ -136,48 +136,48 @@ {% if devicetype.consoleport_templates.exists or devicetype.powerport_templates.exists %}
- {% include 'dcim/inc/devicetype_component_table.html' with table=consoleport_table title='Console Ports' add_url='dcim:devicetype_add_consoleport' delete_url='dcim:devicetype_delete_consoleport' %} + {% include 'dcim/inc/devicetype_component_table.html' with table=consoleport_table title='Console Ports' add_url='dcim:devicetype_add_consoleport' delete_url='dcim:consoleporttemplate_bulk_delete' %}
- {% include 'dcim/inc/devicetype_component_table.html' with table=powerport_table title='Power Ports' add_url='dcim:devicetype_add_powerport' delete_url='dcim:devicetype_delete_powerport' %} + {% include 'dcim/inc/devicetype_component_table.html' with table=powerport_table title='Power Ports' add_url='dcim:devicetype_add_powerport' delete_url='dcim:powerporttemplate_bulk_delete' %}
{% endif %} {% if devicetype.is_parent_device or devicebay_table.rows %}
- {% include 'dcim/inc/devicetype_component_table.html' with table=devicebay_table title='Device Bays' add_url='dcim:devicetype_add_devicebay' delete_url='dcim:devicetype_delete_devicebay' %} + {% include 'dcim/inc/devicetype_component_table.html' with table=devicebay_table title='Device Bays' add_url='dcim:devicetype_add_devicebay' delete_url='dcim:devicebaytemplate_bulk_delete' %}
{% endif %} {% if devicetype.consoleserverport_templates.exists %}
- {% include 'dcim/inc/devicetype_component_table.html' with table=consoleserverport_table title='Console Server Ports' add_url='dcim:devicetype_add_consoleserverport' delete_url='dcim:devicetype_delete_consoleserverport' %} + {% include 'dcim/inc/devicetype_component_table.html' with table=consoleserverport_table title='Console Server Ports' add_url='dcim:devicetype_add_consoleserverport' delete_url='dcim:consoleserverporttemplate_bulk_delete' %}
{% endif %} {% if devicetype.poweroutlet_templates.exists %}
- {% include 'dcim/inc/devicetype_component_table.html' with table=poweroutlet_table title='Power Outlets' add_url='dcim:devicetype_add_poweroutlet' delete_url='dcim:devicetype_delete_poweroutlet' %} + {% include 'dcim/inc/devicetype_component_table.html' with table=poweroutlet_table title='Power Outlets' add_url='dcim:devicetype_add_poweroutlet' delete_url='dcim:poweroutlettemplate_bulk_delete' %}
{% endif %} {% if devicetype.interface_templates.exists %}
- {% include 'dcim/inc/devicetype_component_table.html' with table=interface_table title='Interfaces' add_url='dcim:devicetype_add_interface' delete_url='dcim:devicetype_delete_interface' %} + {% include 'dcim/inc/devicetype_component_table.html' with table=interface_table title='Interfaces' add_url='dcim:devicetype_add_interface' delete_url='dcim:interfacetemplate_bulk_delete' %}
{% endif %} {% if devicetype.frontport_templates.exists or devicetype.rearport_templates.exists %}
- {% include 'dcim/inc/devicetype_component_table.html' with table=front_port_table title='Front Ports' add_url='dcim:devicetype_add_frontport' delete_url='dcim:devicetype_delete_frontport' %} + {% include 'dcim/inc/devicetype_component_table.html' with table=front_port_table title='Front Ports' add_url='dcim:devicetype_add_frontport' delete_url='dcim:frontporttemplate_bulk_delete' %}
- {% include 'dcim/inc/devicetype_component_table.html' with table=rear_port_table title='Rear Ports' add_url='dcim:devicetype_add_rearport' delete_url='dcim:devicetype_delete_rearport' %} + {% include 'dcim/inc/devicetype_component_table.html' with table=rear_port_table title='Rear Ports' add_url='dcim:devicetype_add_rearport' delete_url='dcim:rearporttemplate_bulk_delete' %}
{% endif %} diff --git a/netbox/templates/dcim/inc/devicetype_component_table.html b/netbox/templates/dcim/inc/devicetype_component_table.html index b47992074..4cb584bd5 100644 --- a/netbox/templates/dcim/inc/devicetype_component_table.html +++ b/netbox/templates/dcim/inc/devicetype_component_table.html @@ -14,7 +14,7 @@ {% endif %} {% if delete_url %} - {% endif %} From c1792653cc608108229c71dfc3f5460c2e0ec334 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 6 Feb 2020 12:18:53 -0500 Subject: [PATCH 2/5] Rename device component edit URLs --- netbox/dcim/urls.py | 2 +- netbox/dcim/views.py | 1 - netbox/templates/dcim/devicetype.html | 2 +- netbox/templates/dcim/inc/devicetype_component_table.html | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/netbox/dcim/urls.py b/netbox/dcim/urls.py index 1e9783d2a..25c2b3525 100644 --- a/netbox/dcim/urls.py +++ b/netbox/dcim/urls.py @@ -112,7 +112,7 @@ urlpatterns = [ # Interface templates path('device-types//interfaces/add/', views.InterfaceTemplateCreateView.as_view(), name='devicetype_add_interface'), - path('device-types//interfaces/edit/', views.InterfaceTemplateBulkEditView.as_view(), name='devicetype_bulkedit_interface'), + path('interface-templates/edit/', views.InterfaceTemplateBulkEditView.as_view(), name='interfacetemplate_bulk_edit'), path('interface-templates/delete/', views.InterfaceTemplateBulkDeleteView.as_view(), name='interfacetemplate_bulk_delete'), path('interface-templates//edit/', views.InterfaceTemplateEditView.as_view(), name='interfacetemplate_edit'), diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 7447b5258..2ba3557da 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -810,7 +810,6 @@ class InterfaceTemplateEditView(PermissionRequiredMixin, ObjectEditView): class InterfaceTemplateBulkEditView(PermissionRequiredMixin, BulkEditView): permission_required = 'dcim.change_interfacetemplate' queryset = InterfaceTemplate.objects.all() - parent_model = DeviceType table = tables.InterfaceTemplateTable form = forms.InterfaceTemplateBulkEditForm diff --git a/netbox/templates/dcim/devicetype.html b/netbox/templates/dcim/devicetype.html index 05fafa89c..9c0419043 100644 --- a/netbox/templates/dcim/devicetype.html +++ b/netbox/templates/dcim/devicetype.html @@ -167,7 +167,7 @@ {% if devicetype.interface_templates.exists %}
- {% include 'dcim/inc/devicetype_component_table.html' with table=interface_table title='Interfaces' add_url='dcim:devicetype_add_interface' delete_url='dcim:interfacetemplate_bulk_delete' %} + {% include 'dcim/inc/devicetype_component_table.html' with table=interface_table title='Interfaces' add_url='dcim:devicetype_add_interface' edit_url='dcim:interfacetemplate_bulk_edit' delete_url='dcim:interfacetemplate_bulk_delete' %}
{% endif %} diff --git a/netbox/templates/dcim/inc/devicetype_component_table.html b/netbox/templates/dcim/inc/devicetype_component_table.html index 4cb584bd5..0fbf2c246 100644 --- a/netbox/templates/dcim/inc/devicetype_component_table.html +++ b/netbox/templates/dcim/inc/devicetype_component_table.html @@ -9,7 +9,7 @@ {% endif %} @@ -136,48 +136,48 @@ {% if devicetype.consoleport_templates.exists or devicetype.powerport_templates.exists %}
- {% include 'dcim/inc/devicetype_component_table.html' with table=consoleport_table title='Console Ports' add_url='dcim:devicetype_add_consoleport' delete_url='dcim:consoleporttemplate_bulk_delete' %} + {% include 'dcim/inc/devicetype_component_table.html' with table=consoleport_table title='Console Ports' add_url='dcim:consoleporttemplate_add' delete_url='dcim:consoleporttemplate_bulk_delete' %}
- {% include 'dcim/inc/devicetype_component_table.html' with table=powerport_table title='Power Ports' add_url='dcim:devicetype_add_powerport' delete_url='dcim:powerporttemplate_bulk_delete' %} + {% include 'dcim/inc/devicetype_component_table.html' with table=powerport_table title='Power Ports' add_url='dcim:powerporttemplate_add' delete_url='dcim:powerporttemplate_bulk_delete' %}
{% endif %} {% if devicetype.is_parent_device or devicebay_table.rows %}
- {% include 'dcim/inc/devicetype_component_table.html' with table=devicebay_table title='Device Bays' add_url='dcim:devicetype_add_devicebay' delete_url='dcim:devicebaytemplate_bulk_delete' %} + {% include 'dcim/inc/devicetype_component_table.html' with table=devicebay_table title='Device Bays' add_url='dcim:devicebaytemplate_add' delete_url='dcim:devicebaytemplate_bulk_delete' %}
{% endif %} {% if devicetype.consoleserverport_templates.exists %}
- {% include 'dcim/inc/devicetype_component_table.html' with table=consoleserverport_table title='Console Server Ports' add_url='dcim:devicetype_add_consoleserverport' delete_url='dcim:consoleserverporttemplate_bulk_delete' %} + {% include 'dcim/inc/devicetype_component_table.html' with table=consoleserverport_table title='Console Server Ports' add_url='dcim:consoleserverporttemplate_add' delete_url='dcim:consoleserverporttemplate_bulk_delete' %}
{% endif %} {% if devicetype.poweroutlet_templates.exists %}
- {% include 'dcim/inc/devicetype_component_table.html' with table=poweroutlet_table title='Power Outlets' add_url='dcim:devicetype_add_poweroutlet' delete_url='dcim:poweroutlettemplate_bulk_delete' %} + {% include 'dcim/inc/devicetype_component_table.html' with table=poweroutlet_table title='Power Outlets' add_url='dcim:poweroutlettemplate_add' delete_url='dcim:poweroutlettemplate_bulk_delete' %}
{% endif %} {% if devicetype.interface_templates.exists %}
- {% include 'dcim/inc/devicetype_component_table.html' with table=interface_table title='Interfaces' add_url='dcim:devicetype_add_interface' edit_url='dcim:interfacetemplate_bulk_edit' delete_url='dcim:interfacetemplate_bulk_delete' %} + {% include 'dcim/inc/devicetype_component_table.html' with table=interface_table title='Interfaces' add_url='dcim:interfacetemplate_add' edit_url='dcim:interfacetemplate_bulk_edit' delete_url='dcim:interfacetemplate_bulk_delete' %}
{% endif %} {% if devicetype.frontport_templates.exists or devicetype.rearport_templates.exists %}
- {% include 'dcim/inc/devicetype_component_table.html' with table=front_port_table title='Front Ports' add_url='dcim:devicetype_add_frontport' delete_url='dcim:frontporttemplate_bulk_delete' %} + {% include 'dcim/inc/devicetype_component_table.html' with table=front_port_table title='Front Ports' add_url='dcim:frontporttemplate_add' delete_url='dcim:frontporttemplate_bulk_delete' %}
- {% include 'dcim/inc/devicetype_component_table.html' with table=rear_port_table title='Rear Ports' add_url='dcim:devicetype_add_rearport' delete_url='dcim:rearporttemplate_bulk_delete' %} + {% include 'dcim/inc/devicetype_component_table.html' with table=rear_port_table title='Rear Ports' add_url='dcim:rearporttemplate_add' delete_url='dcim:rearporttemplate_bulk_delete' %}
{% endif %} diff --git a/netbox/templates/dcim/inc/devicetype_component_table.html b/netbox/templates/dcim/inc/devicetype_component_table.html index 0fbf2c246..6e81e65b8 100644 --- a/netbox/templates/dcim/inc/devicetype_component_table.html +++ b/netbox/templates/dcim/inc/devicetype_component_table.html @@ -20,7 +20,7 @@ {% endif %} {% endif %}
- + Add {{ title }} diff --git a/netbox/utilities/views.py b/netbox/utilities/views.py index 7c7ea9eb5..7c38aceee 100644 --- a/netbox/utilities/views.py +++ b/netbox/utilities/views.py @@ -825,8 +825,6 @@ class ComponentCreateView(GetReturnURLMixin, View): """ Add one or more components (e.g. interfaces, console ports, etc.) to a Device or VirtualMachine. """ - parent_model = None - parent_field = None model = None form = None model_form = None From f7ca97d51fc38bb38d8f20eb611a1e5ace12de6c Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 6 Feb 2020 13:19:25 -0500 Subject: [PATCH 4/5] Fix bulk edit buttons --- netbox/templates/dcim/devicetype.html | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/netbox/templates/dcim/devicetype.html b/netbox/templates/dcim/devicetype.html index 5e3e07252..bba259ee4 100644 --- a/netbox/templates/dcim/devicetype.html +++ b/netbox/templates/dcim/devicetype.html @@ -136,31 +136,31 @@ {% if devicetype.consoleport_templates.exists or devicetype.powerport_templates.exists %}
- {% include 'dcim/inc/devicetype_component_table.html' with table=consoleport_table title='Console Ports' add_url='dcim:consoleporttemplate_add' delete_url='dcim:consoleporttemplate_bulk_delete' %} + {% include 'dcim/inc/devicetype_component_table.html' with table=consoleport_table title='Console Ports' add_url='dcim:consoleporttemplate_add' edit_url=None delete_url='dcim:consoleporttemplate_bulk_delete' %}
- {% include 'dcim/inc/devicetype_component_table.html' with table=powerport_table title='Power Ports' add_url='dcim:powerporttemplate_add' delete_url='dcim:powerporttemplate_bulk_delete' %} + {% include 'dcim/inc/devicetype_component_table.html' with table=powerport_table title='Power Ports' add_url='dcim:powerporttemplate_add' edit_url=None delete_url='dcim:powerporttemplate_bulk_delete' %}
{% endif %} {% if devicetype.is_parent_device or devicebay_table.rows %}
- {% include 'dcim/inc/devicetype_component_table.html' with table=devicebay_table title='Device Bays' add_url='dcim:devicebaytemplate_add' delete_url='dcim:devicebaytemplate_bulk_delete' %} + {% include 'dcim/inc/devicetype_component_table.html' with table=devicebay_table title='Device Bays' add_url='dcim:devicebaytemplate_add' edit_url=None delete_url='dcim:devicebaytemplate_bulk_delete' %}
{% endif %} {% if devicetype.consoleserverport_templates.exists %}
- {% include 'dcim/inc/devicetype_component_table.html' with table=consoleserverport_table title='Console Server Ports' add_url='dcim:consoleserverporttemplate_add' delete_url='dcim:consoleserverporttemplate_bulk_delete' %} + {% include 'dcim/inc/devicetype_component_table.html' with table=consoleserverport_table title='Console Server Ports' add_url='dcim:consoleserverporttemplate_add' edit_url=None delete_url='dcim:consoleserverporttemplate_bulk_delete' %}
{% endif %} {% if devicetype.poweroutlet_templates.exists %}
- {% include 'dcim/inc/devicetype_component_table.html' with table=poweroutlet_table title='Power Outlets' add_url='dcim:poweroutlettemplate_add' delete_url='dcim:poweroutlettemplate_bulk_delete' %} + {% include 'dcim/inc/devicetype_component_table.html' with table=poweroutlet_table title='Power Outlets' add_url='dcim:poweroutlettemplate_add' edit_url=None delete_url='dcim:poweroutlettemplate_bulk_delete' %}
{% endif %} @@ -174,10 +174,10 @@ {% if devicetype.frontport_templates.exists or devicetype.rearport_templates.exists %}
- {% include 'dcim/inc/devicetype_component_table.html' with table=front_port_table title='Front Ports' add_url='dcim:frontporttemplate_add' delete_url='dcim:frontporttemplate_bulk_delete' %} + {% include 'dcim/inc/devicetype_component_table.html' with table=front_port_table title='Front Ports' add_url='dcim:frontporttemplate_add' edit_url=None delete_url='dcim:frontporttemplate_bulk_delete' %}
- {% include 'dcim/inc/devicetype_component_table.html' with table=rear_port_table title='Rear Ports' add_url='dcim:rearporttemplate_add' delete_url='dcim:rearporttemplate_bulk_delete' %} + {% include 'dcim/inc/devicetype_component_table.html' with table=rear_port_table title='Rear Ports' add_url='dcim:rearporttemplate_add' edit_url=None delete_url='dcim:rearporttemplate_bulk_delete' %}
{% endif %} From 5620fdc63ec0c759be5c8cc89d55a92eb4567910 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 6 Feb 2020 14:39:36 -0500 Subject: [PATCH 5/5] Add tests for device type component views --- netbox/dcim/forms.py | 9 +- netbox/dcim/tests/test_views.py | 366 ++++++++++++++++++++++++++++++++ 2 files changed, 373 insertions(+), 2 deletions(-) diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index 0b303d663..dfcb9e977 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -1174,8 +1174,11 @@ class PowerOutletTemplateCreateForm(BootstrapMixin, forms.Form): super().__init__(*args, **kwargs) # Limit power_port choices to current DeviceType + device_type = DeviceType.objects.get( + pk=self.initial.get('device_type') or self.data.get('device_type') + ) self.fields['power_port'].queryset = PowerPortTemplate.objects.filter( - device_type=self.initial.get('device_type') + device_type=device_type ) @@ -1278,7 +1281,9 @@ class FrontPortTemplateCreateForm(BootstrapMixin, forms.Form): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - device_type = DeviceType.objects.filter(pk=self.initial.get('device_type')).first() + device_type = DeviceType.objects.get( + pk=self.initial.get('device_type') or self.data.get('device_type') + ) # Determine which rear port positions are occupied. These will be excluded from the list of available mappings. occupied_port_positions = [ diff --git a/netbox/dcim/tests/test_views.py b/netbox/dcim/tests/test_views.py index 5bf8963de..48f7a4f24 100644 --- a/netbox/dcim/tests/test_views.py +++ b/netbox/dcim/tests/test_views.py @@ -524,6 +524,372 @@ device-bays: self.assertEqual(data[0]['model'], 'Device Type 1') +# +# DeviceType components +# + +class ConsolePortTemplateTestCase(StandardTestCases.Views): + model = ConsolePortTemplate + + # Disable inapplicable views + test_get_object = None + test_list_objects = None + test_create_object = None + test_delete_object = None + test_import_objects = None + test_bulk_edit_objects = None + + def test_bulk_create_objects(self): + return self._test_bulk_create_objects(expected_count=3) + + @classmethod + def setUpTestData(cls): + manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1') + devicetypes = ( + DeviceType(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1'), + DeviceType(manufacturer=manufacturer, model='Device Type 2', slug='device-type-2'), + ) + DeviceType.objects.bulk_create(devicetypes) + + ConsolePortTemplate.objects.bulk_create(( + ConsolePortTemplate(device_type=devicetypes[0], name='Console Port Template 1'), + ConsolePortTemplate(device_type=devicetypes[0], name='Console Port Template 2'), + ConsolePortTemplate(device_type=devicetypes[0], name='Console Port Template 3'), + )) + + cls.form_data = { + 'device_type': devicetypes[1].pk, + 'name': 'Console Port Template X', + 'type': ConsolePortTypeChoices.TYPE_RJ45, + } + + cls.bulk_create_data = { + 'device_type': devicetypes[1].pk, + 'name_pattern': 'Console Port Template [4-6]', + 'type': ConsolePortTypeChoices.TYPE_RJ45, + } + + +class ConsoleServerPortTemplateTestCase(StandardTestCases.Views): + model = ConsoleServerPortTemplate + + # Disable inapplicable views + test_get_object = None + test_list_objects = None + test_create_object = None + test_delete_object = None + test_import_objects = None + test_bulk_edit_objects = None + + def test_bulk_create_objects(self): + return self._test_bulk_create_objects(expected_count=3) + + @classmethod + def setUpTestData(cls): + manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1') + devicetypes = ( + DeviceType(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1'), + DeviceType(manufacturer=manufacturer, model='Device Type 2', slug='device-type-2'), + ) + DeviceType.objects.bulk_create(devicetypes) + + ConsoleServerPortTemplate.objects.bulk_create(( + ConsoleServerPortTemplate(device_type=devicetypes[0], name='Console Server Port Template 1'), + ConsoleServerPortTemplate(device_type=devicetypes[0], name='Console Server Port Template 2'), + ConsoleServerPortTemplate(device_type=devicetypes[0], name='Console Server Port Template 3'), + )) + + cls.form_data = { + 'device_type': devicetypes[1].pk, + 'name': 'Console Server Port Template X', + 'type': ConsolePortTypeChoices.TYPE_RJ45, + } + + cls.bulk_create_data = { + 'device_type': devicetypes[1].pk, + 'name_pattern': 'Console Server Port Template [4-6]', + 'type': ConsolePortTypeChoices.TYPE_RJ45, + } + + +class PowerPortTemplateTestCase(StandardTestCases.Views): + model = PowerPortTemplate + + # Disable inapplicable views + test_get_object = None + test_list_objects = None + test_create_object = None + test_delete_object = None + test_import_objects = None + test_bulk_edit_objects = None + + def test_bulk_create_objects(self): + return self._test_bulk_create_objects(expected_count=3) + + @classmethod + def setUpTestData(cls): + manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1') + devicetypes = ( + DeviceType(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1'), + DeviceType(manufacturer=manufacturer, model='Device Type 2', slug='device-type-2'), + ) + DeviceType.objects.bulk_create(devicetypes) + + PowerPortTemplate.objects.bulk_create(( + PowerPortTemplate(device_type=devicetypes[0], name='Power Port Template 1'), + PowerPortTemplate(device_type=devicetypes[0], name='Power Port Template 2'), + PowerPortTemplate(device_type=devicetypes[0], name='Power Port Template 3'), + )) + + cls.form_data = { + 'device_type': devicetypes[1].pk, + 'name': 'Power Port Template X', + 'type': PowerPortTypeChoices.TYPE_IEC_C14, + 'maxiumum_draw': 100, + 'allocated_draw': 50, + } + + cls.bulk_create_data = { + 'device_type': devicetypes[1].pk, + 'name_pattern': 'Power Port Template [4-6]', + 'type': PowerPortTypeChoices.TYPE_IEC_C14, + 'maxiumum_draw': 100, + 'allocated_draw': 50, + } + + +class PowerOutletTemplateTestCase(StandardTestCases.Views): + model = PowerOutletTemplate + + # Disable inapplicable views + test_get_object = None + test_list_objects = None + test_create_object = None + test_delete_object = None + test_import_objects = None + test_bulk_edit_objects = None + + def test_bulk_create_objects(self): + return self._test_bulk_create_objects(expected_count=3) + + @classmethod + def setUpTestData(cls): + manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1') + devicetype = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1') + + PowerOutletTemplate.objects.bulk_create(( + PowerOutletTemplate(device_type=devicetype, name='Power Outlet Template 1'), + PowerOutletTemplate(device_type=devicetype, name='Power Outlet Template 2'), + PowerOutletTemplate(device_type=devicetype, name='Power Outlet Template 3'), + )) + + powerports = ( + PowerPortTemplate(device_type=devicetype, name='Power Port Template 1'), + ) + PowerPortTemplate.objects.bulk_create(powerports) + + cls.form_data = { + 'device_type': devicetype.pk, + 'name': 'Power Outlet Template X', + 'type': PowerOutletTypeChoices.TYPE_IEC_C13, + 'power_port': powerports[0].pk, + 'feed_leg': PowerOutletFeedLegChoices.FEED_LEG_B, + } + + cls.bulk_create_data = { + 'device_type': devicetype.pk, + 'name_pattern': 'Power Outlet Template [4-6]', + 'type': PowerOutletTypeChoices.TYPE_IEC_C13, + 'power_port': powerports[0].pk, + 'feed_leg': PowerOutletFeedLegChoices.FEED_LEG_B, + } + + +class InterfaceTemplateTestCase(StandardTestCases.Views): + model = InterfaceTemplate + + # Disable inapplicable views + test_get_object = None + test_list_objects = None + test_create_object = None + test_delete_object = None + test_import_objects = None + + def test_bulk_create_objects(self): + return self._test_bulk_create_objects(expected_count=3) + + @classmethod + def setUpTestData(cls): + manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1') + devicetypes = ( + DeviceType(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1'), + DeviceType(manufacturer=manufacturer, model='Device Type 2', slug='device-type-2'), + ) + DeviceType.objects.bulk_create(devicetypes) + + InterfaceTemplate.objects.bulk_create(( + InterfaceTemplate(device_type=devicetypes[0], name='Interface Template 1'), + InterfaceTemplate(device_type=devicetypes[0], name='Interface Template 2'), + InterfaceTemplate(device_type=devicetypes[0], name='Interface Template 3'), + )) + + cls.form_data = { + 'device_type': devicetypes[1].pk, + 'name': 'Interface Template X', + 'type': InterfaceTypeChoices.TYPE_1GE_GBIC, + 'mgmt_only': True, + } + + cls.bulk_create_data = { + 'device_type': devicetypes[1].pk, + 'name_pattern': 'Interface Template [4-6]', + 'type': InterfaceTypeChoices.TYPE_1GE_GBIC, + 'mgmt_only': True, + } + + cls.bulk_edit_data = { + 'type': InterfaceTypeChoices.TYPE_1GE_GBIC, + 'mgmt_only': True, + } + + +class FrontPortTemplateTestCase(StandardTestCases.Views): + model = FrontPortTemplate + + # Disable inapplicable views + test_get_object = None + test_list_objects = None + test_create_object = None + test_delete_object = None + test_import_objects = None + test_bulk_edit_objects = None + + def test_bulk_create_objects(self): + return self._test_bulk_create_objects(expected_count=3) + + @classmethod + def setUpTestData(cls): + manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1') + devicetype = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1') + + rearports = ( + RearPortTemplate(device_type=devicetype, name='Rear Port Template 1'), + RearPortTemplate(device_type=devicetype, name='Rear Port Template 2'), + RearPortTemplate(device_type=devicetype, name='Rear Port Template 3'), + RearPortTemplate(device_type=devicetype, name='Rear Port Template 4'), + RearPortTemplate(device_type=devicetype, name='Rear Port Template 5'), + RearPortTemplate(device_type=devicetype, name='Rear Port Template 6'), + ) + RearPortTemplate.objects.bulk_create(rearports) + + FrontPortTemplate.objects.bulk_create(( + FrontPortTemplate(device_type=devicetype, name='Front Port Template 1', rear_port=rearports[0], rear_port_position=1), + FrontPortTemplate(device_type=devicetype, name='Front Port Template 2', rear_port=rearports[1], rear_port_position=1), + FrontPortTemplate(device_type=devicetype, name='Front Port Template 3', rear_port=rearports[2], rear_port_position=1), + )) + + cls.form_data = { + 'device_type': devicetype.pk, + 'name': 'Front Port X', + 'type': PortTypeChoices.TYPE_8P8C, + 'rear_port': rearports[3].pk, + 'rear_port_position': 1, + } + + cls.bulk_create_data = { + 'device_type': devicetype.pk, + 'name_pattern': 'Front Port [4-6]', + 'type': PortTypeChoices.TYPE_8P8C, + 'rear_port_set': [ + '{}:1'.format(rp.pk) for rp in rearports[3:6] + ], + } + + +class RearPortTemplateTestCase(StandardTestCases.Views): + model = RearPortTemplate + + # Disable inapplicable views + test_get_object = None + test_list_objects = None + test_create_object = None + test_delete_object = None + test_import_objects = None + test_bulk_edit_objects = None + + def test_bulk_create_objects(self): + return self._test_bulk_create_objects(expected_count=3) + + @classmethod + def setUpTestData(cls): + manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1') + devicetypes = ( + DeviceType(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1'), + DeviceType(manufacturer=manufacturer, model='Device Type 2', slug='device-type-2'), + ) + DeviceType.objects.bulk_create(devicetypes) + + RearPortTemplate.objects.bulk_create(( + RearPortTemplate(device_type=devicetypes[0], name='Rear Port Template 1'), + RearPortTemplate(device_type=devicetypes[0], name='Rear Port Template 2'), + RearPortTemplate(device_type=devicetypes[0], name='Rear Port Template 3'), + )) + + cls.form_data = { + 'device_type': devicetypes[1].pk, + 'name': 'Rear Port Template X', + 'type': PortTypeChoices.TYPE_8P8C, + 'positions': 2, + } + + cls.bulk_create_data = { + 'device_type': devicetypes[1].pk, + 'name_pattern': 'Rear Port Template [4-6]', + 'type': PortTypeChoices.TYPE_8P8C, + 'positions': 2, + } + + +class DeviceBayTemplateTestCase(StandardTestCases.Views): + model = DeviceBayTemplate + + # Disable inapplicable views + test_get_object = None + test_list_objects = None + test_create_object = None + test_delete_object = None + test_import_objects = None + test_bulk_edit_objects = None + + def test_bulk_create_objects(self): + return self._test_bulk_create_objects(expected_count=3) + + @classmethod + def setUpTestData(cls): + manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1') + devicetypes = ( + DeviceType(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1'), + DeviceType(manufacturer=manufacturer, model='Device Type 2', slug='device-type-2'), + ) + DeviceType.objects.bulk_create(devicetypes) + + DeviceBayTemplate.objects.bulk_create(( + DeviceBayTemplate(device_type=devicetypes[0], name='Device Bay Template 1'), + DeviceBayTemplate(device_type=devicetypes[0], name='Device Bay Template 2'), + DeviceBayTemplate(device_type=devicetypes[0], name='Device Bay Template 3'), + )) + + cls.form_data = { + 'device_type': devicetypes[1].pk, + 'name': 'Device Bay Template X', + } + + cls.bulk_create_data = { + 'device_type': devicetypes[1].pk, + 'name_pattern': 'Device Bay Template [4-6]', + } + + class DeviceRoleTestCase(StandardTestCases.Views): model = DeviceRole