diff --git a/docs/release-notes/version-2.7.md b/docs/release-notes/version-2.7.md index 07457fba8..8d95390bc 100644 --- a/docs/release-notes/version-2.7.md +++ b/docs/release-notes/version-2.7.md @@ -1,3 +1,11 @@ +# v2.7.10 (FUTURE) + +## Enhancements + +* [#4323](https://github.com/netbox-community/netbox/issues/4323) - Add bulk edit view for power panels + +--- + # v2.7.9 (2020-03-06) **Note:** This release will deploy a Python virtual environment on upgrade in the `venv/` directory. This will require modifying the paths to your Python and gunicorn executables in the systemd service files. For more detail, please see the [upgrade instructions](https://netbox.readthedocs.io/en/stable/installation/upgrading/). diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index 9ba5cb7c2..2b5aaee7e 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -4621,6 +4621,35 @@ class PowerPanelCSVForm(forms.ModelForm): ) +class PowerPanelBulkEditForm(BootstrapMixin, BulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=PowerPanel.objects.all(), + widget=forms.MultipleHiddenInput + ) + site = DynamicModelChoiceField( + queryset=Site.objects.all(), + required=False, + widget=APISelect( + api_url="/api/dcim/sites/", + filter_for={ + 'rack_group': 'site_id', + } + ) + ) + rack_group = DynamicModelChoiceField( + queryset=RackGroup.objects.all(), + required=False, + widget=APISelect( + api_url="/api/dcim/rack-groups/" + ) + ) + + class Meta: + nullable_fields = ( + 'rack_group', + ) + + class PowerPanelFilterForm(BootstrapMixin, CustomFieldFilterForm): model = PowerPanel q = forms.CharField( diff --git a/netbox/dcim/tests/test_views.py b/netbox/dcim/tests/test_views.py index 704dedb40..997626152 100644 --- a/netbox/dcim/tests/test_views.py +++ b/netbox/dcim/tests/test_views.py @@ -1553,9 +1553,6 @@ class VirtualChassisTestCase(ViewTestCases.PrimaryObjectViewTestCase): class PowerPanelTestCase(ViewTestCases.PrimaryObjectViewTestCase): model = PowerPanel - # Disable inapplicable tests - test_bulk_edit_objects = None - @classmethod def setUpTestData(cls): @@ -1590,6 +1587,11 @@ class PowerPanelTestCase(ViewTestCases.PrimaryObjectViewTestCase): "Site 1,Rack Group 1,Power Panel 6", ) + cls.bulk_edit_data = { + 'site': sites[1].pk, + 'rack_group': rackgroups[1].pk, + } + class PowerFeedTestCase(ViewTestCases.PrimaryObjectViewTestCase): model = PowerFeed diff --git a/netbox/dcim/urls.py b/netbox/dcim/urls.py index 165ca9e02..130a79199 100644 --- a/netbox/dcim/urls.py +++ b/netbox/dcim/urls.py @@ -331,6 +331,7 @@ urlpatterns = [ path('power-panels/', views.PowerPanelListView.as_view(), name='powerpanel_list'), path('power-panels/add/', views.PowerPanelCreateView.as_view(), name='powerpanel_add'), path('power-panels/import/', views.PowerPanelBulkImportView.as_view(), name='powerpanel_import'), + path('power-panels/edit/', views.PowerPanelBulkEditView.as_view(), name='powerpanel_bulk_edit'), path('power-panels/delete/', views.PowerPanelBulkDeleteView.as_view(), name='powerpanel_bulk_delete'), path('power-panels//', views.PowerPanelView.as_view(), name='powerpanel'), path('power-panels//edit/', views.PowerPanelEditView.as_view(), name='powerpanel_edit'), diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 8f9da2d68..0a6888884 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -2569,6 +2569,15 @@ class PowerPanelBulkImportView(PermissionRequiredMixin, BulkImportView): default_return_url = 'dcim:powerpanel_list' +class PowerPanelBulkEditView(PermissionRequiredMixin, BulkEditView): + permission_required = 'dcim.change_powerpanel' + queryset = PowerPanel.objects.prefetch_related('site', 'rack_group') + filterset = filters.PowerPanelFilterSet + table = tables.PowerPanelTable + form = forms.PowerPanelBulkEditForm + default_return_url = 'dcim:powerpanel_list' + + class PowerPanelBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): permission_required = 'dcim.delete_powerpanel' queryset = PowerPanel.objects.prefetch_related(