diff --git a/docs/release-notes/version-2.9.md b/docs/release-notes/version-2.9.md index 1d20201e9..c0d51afc2 100644 --- a/docs/release-notes/version-2.9.md +++ b/docs/release-notes/version-2.9.md @@ -18,6 +18,7 @@ NetBox v2.9 replaces Django's built-in permissions framework with one that suppo * [#4792](https://github.com/netbox-community/netbox/issues/4792) - Add bulk rename capability for console and power ports * [#4793](https://github.com/netbox-community/netbox/issues/4793) - Add `description` field to device component templates * [#4795](https://github.com/netbox-community/netbox/issues/4795) - Add bulk disconnect capability for console and power ports +* [#4807](https://github.com/netbox-community/netbox/issues/4807) - Add bulk edit ability for device bay templates ### Configuration Changes diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index 2244ef443..374f5fa4b 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -1486,15 +1486,17 @@ class DeviceBayTemplateCreateForm(ComponentTemplateCreateForm): ) -# TODO: DeviceBayTemplate has no fields suitable for bulk-editing yet -# class DeviceBayTemplateBulkEditForm(BootstrapMixin, BulkEditForm): -# pk = forms.ModelMultipleChoiceField( -# queryset=FrontPortTemplate.objects.all(), -# widget=forms.MultipleHiddenInput() -# ) -# -# class Meta: -# nullable_fields = () +class DeviceBayTemplateBulkEditForm(BootstrapMixin, BulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=DeviceBayTemplate.objects.all(), + widget=forms.MultipleHiddenInput() + ) + description = forms.CharField( + required=False + ) + + class Meta: + nullable_fields = ('description',) # diff --git a/netbox/dcim/tests/test_views.py b/netbox/dcim/tests/test_views.py index 079f26fdf..b3994ea8c 100644 --- a/netbox/dcim/tests/test_views.py +++ b/netbox/dcim/tests/test_views.py @@ -813,14 +813,7 @@ class RearPortTemplateTestCase(ViewTestCases.DeviceComponentTemplateViewTestCase } -# TODO: Change base class to DeviceComponentTemplateViewTestCase -# Blocked by absence of bulk edit view for DeviceBays -class DeviceBayTemplateTestCase( - ViewTestCases.EditObjectViewTestCase, - ViewTestCases.DeleteObjectViewTestCase, - ViewTestCases.BulkCreateObjectsViewTestCase, - ViewTestCases.BulkDeleteObjectsViewTestCase -): +class DeviceBayTemplateTestCase(ViewTestCases.DeviceComponentTemplateViewTestCase): model = DeviceBayTemplate @classmethod @@ -848,6 +841,10 @@ class DeviceBayTemplateTestCase( 'name_pattern': 'Device Bay Template [4-6]', } + cls.bulk_edit_data = { + 'description': 'Foo bar', + } + class DeviceRoleTestCase(ViewTestCases.OrganizationalObjectViewTestCase): model = DeviceRole diff --git a/netbox/dcim/urls.py b/netbox/dcim/urls.py index 45b10cd0c..087f9db62 100644 --- a/netbox/dcim/urls.py +++ b/netbox/dcim/urls.py @@ -142,7 +142,7 @@ urlpatterns = [ # Device bay templates path('device-bay-templates/add/', views.DeviceBayTemplateCreateView.as_view(), name='devicebaytemplate_add'), - # path('device-bay-templates/edit/', views.DeviceBayTemplateBulkEditView.as_view(), name='devicebaytemplate_bulk_edit'), + path('device-bay-templates/edit/', views.DeviceBayTemplateBulkEditView.as_view(), name='devicebaytemplate_bulk_edit'), 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'), path('device-bay-templates//delete/', views.DeviceBayTemplateDeleteView.as_view(), name='devicebaytemplate_delete'), diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 0ce35aa19..864665701 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -867,10 +867,10 @@ class DeviceBayTemplateDeleteView(ObjectDeleteView): queryset = DeviceBayTemplate.objects.all() -# class DeviceBayTemplateBulkEditView(BulkEditView): -# queryset = DeviceBayTemplate.objects.all() -# table = tables.DeviceBayTemplateTable -# form = forms.DeviceBayTemplateBulkEditForm +class DeviceBayTemplateBulkEditView(BulkEditView): + queryset = DeviceBayTemplate.objects.all() + table = tables.DeviceBayTemplateTable + form = forms.DeviceBayTemplateBulkEditForm class DeviceBayTemplateBulkDeleteView(BulkDeleteView): diff --git a/netbox/templates/dcim/devicetype.html b/netbox/templates/dcim/devicetype.html index 669456c10..7ca29a1f7 100644 --- a/netbox/templates/dcim/devicetype.html +++ b/netbox/templates/dcim/devicetype.html @@ -173,7 +173,7 @@ {% 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' edit_url=None 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='dcim:devicebaytemplate_bulk_edit' delete_url='dcim:devicebaytemplate_bulk_delete' %}
{% endif %}