mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
Closes #4389: Add a bulk edit view for device bays
This commit is contained in:
@ -12,6 +12,7 @@
|
|||||||
* [#4381](https://github.com/netbox-community/netbox/issues/4381) - Enable export templates for rack reservations
|
* [#4381](https://github.com/netbox-community/netbox/issues/4381) - Enable export templates for rack reservations
|
||||||
* [#4382](https://github.com/netbox-community/netbox/issues/4382) - Enable custom links for rack reservations
|
* [#4382](https://github.com/netbox-community/netbox/issues/4382) - Enable custom links for rack reservations
|
||||||
* [#4386](https://github.com/netbox-community/netbox/issues/4386) - Update admin links for Django RQ to reflect multiple queues
|
* [#4386](https://github.com/netbox-community/netbox/issues/4386) - Update admin links for Django RQ to reflect multiple queues
|
||||||
|
* [#4389](https://github.com/netbox-community/netbox/issues/4389) - Add a bulk edit view for device bays
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|
||||||
|
@ -3982,6 +3982,22 @@ class PopulateDeviceBayForm(BootstrapMixin, forms.Form):
|
|||||||
).exclude(pk=device_bay.device.pk)
|
).exclude(pk=device_bay.device.pk)
|
||||||
|
|
||||||
|
|
||||||
|
class DeviceBayBulkEditForm(BootstrapMixin, AddRemoveTagsForm, BulkEditForm):
|
||||||
|
pk = forms.ModelMultipleChoiceField(
|
||||||
|
queryset=DeviceBay.objects.all(),
|
||||||
|
widget=forms.MultipleHiddenInput()
|
||||||
|
)
|
||||||
|
description = forms.CharField(
|
||||||
|
max_length=100,
|
||||||
|
required=False
|
||||||
|
)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
nullable_fields = (
|
||||||
|
'description',
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class DeviceBayCSVForm(forms.ModelForm):
|
class DeviceBayCSVForm(forms.ModelForm):
|
||||||
device = FlexibleModelChoiceField(
|
device = FlexibleModelChoiceField(
|
||||||
queryset=Device.objects.all(),
|
queryset=Device.objects.all(),
|
||||||
|
@ -857,7 +857,7 @@ class DeviceBayTable(BaseTable):
|
|||||||
|
|
||||||
class Meta(BaseTable.Meta):
|
class Meta(BaseTable.Meta):
|
||||||
model = DeviceBay
|
model = DeviceBay
|
||||||
fields = ('name',)
|
fields = ('name', 'description')
|
||||||
|
|
||||||
|
|
||||||
class DeviceBayDetailTable(DeviceComponentDetailTable):
|
class DeviceBayDetailTable(DeviceComponentDetailTable):
|
||||||
@ -865,8 +865,8 @@ class DeviceBayDetailTable(DeviceComponentDetailTable):
|
|||||||
installed_device = tables.LinkColumn()
|
installed_device = tables.LinkColumn()
|
||||||
|
|
||||||
class Meta(DeviceBayTable.Meta):
|
class Meta(DeviceBayTable.Meta):
|
||||||
fields = ('pk', 'name', 'device', 'installed_device')
|
fields = ('pk', 'name', 'device', 'installed_device', 'description')
|
||||||
sequence = ('pk', 'name', 'device', 'installed_device')
|
sequence = ('pk', 'name', 'device', 'installed_device', 'description')
|
||||||
exclude = ('cable',)
|
exclude = ('cable',)
|
||||||
|
|
||||||
|
|
||||||
|
@ -1329,37 +1329,37 @@ class RearPortTestCase(ViewTestCases.DeviceComponentViewTestCase):
|
|||||||
class DeviceBayTestCase(ViewTestCases.DeviceComponentViewTestCase):
|
class DeviceBayTestCase(ViewTestCases.DeviceComponentViewTestCase):
|
||||||
model = DeviceBay
|
model = DeviceBay
|
||||||
|
|
||||||
# Disable inapplicable views
|
|
||||||
test_bulk_edit_objects = None
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def setUpTestData(cls):
|
def setUpTestData(cls):
|
||||||
device1 = create_test_device('Device 1')
|
device = create_test_device('Device 1')
|
||||||
device2 = create_test_device('Device 2')
|
|
||||||
|
|
||||||
# Update the DeviceType subdevice role to allow adding DeviceBays
|
# Update the DeviceType subdevice role to allow adding DeviceBays
|
||||||
DeviceType.objects.update(subdevice_role=SubdeviceRoleChoices.ROLE_PARENT)
|
DeviceType.objects.update(subdevice_role=SubdeviceRoleChoices.ROLE_PARENT)
|
||||||
|
|
||||||
DeviceBay.objects.bulk_create([
|
DeviceBay.objects.bulk_create([
|
||||||
DeviceBay(device=device1, name='Device Bay 1'),
|
DeviceBay(device=device, name='Device Bay 1'),
|
||||||
DeviceBay(device=device1, name='Device Bay 2'),
|
DeviceBay(device=device, name='Device Bay 2'),
|
||||||
DeviceBay(device=device1, name='Device Bay 3'),
|
DeviceBay(device=device, name='Device Bay 3'),
|
||||||
])
|
])
|
||||||
|
|
||||||
cls.form_data = {
|
cls.form_data = {
|
||||||
'device': device2.pk,
|
'device': device.pk,
|
||||||
'name': 'Device Bay X',
|
'name': 'Device Bay X',
|
||||||
'description': 'A device bay',
|
'description': 'A device bay',
|
||||||
'tags': 'Alpha,Bravo,Charlie',
|
'tags': 'Alpha,Bravo,Charlie',
|
||||||
}
|
}
|
||||||
|
|
||||||
cls.bulk_create_data = {
|
cls.bulk_create_data = {
|
||||||
'device': device2.pk,
|
'device': device.pk,
|
||||||
'name_pattern': 'Device Bay [4-6]',
|
'name_pattern': 'Device Bay [4-6]',
|
||||||
'description': 'A device bay',
|
'description': 'A device bay',
|
||||||
'tags': 'Alpha,Bravo,Charlie',
|
'tags': 'Alpha,Bravo,Charlie',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cls.bulk_edit_data = {
|
||||||
|
'description': 'New description',
|
||||||
|
}
|
||||||
|
|
||||||
cls.csv_data = (
|
cls.csv_data = (
|
||||||
"device,name",
|
"device,name",
|
||||||
"Device 1,Device Bay 4",
|
"Device 1,Device Bay 4",
|
||||||
|
@ -284,7 +284,7 @@ urlpatterns = [
|
|||||||
path('device-bays/', views.DeviceBayListView.as_view(), name='devicebay_list'),
|
path('device-bays/', views.DeviceBayListView.as_view(), name='devicebay_list'),
|
||||||
path('device-bays/add/', views.DeviceBayCreateView.as_view(), name='devicebay_add'),
|
path('device-bays/add/', views.DeviceBayCreateView.as_view(), name='devicebay_add'),
|
||||||
path('device-bays/import/', views.DeviceBayBulkImportView.as_view(), name='devicebay_import'),
|
path('device-bays/import/', views.DeviceBayBulkImportView.as_view(), name='devicebay_import'),
|
||||||
# TODO: Bulk edit view for DeviceBays
|
path('device-bays/edit/', views.DeviceBayBulkEditView.as_view(), name='devicebay_bulk_edit'),
|
||||||
path('device-bays/rename/', views.DeviceBayBulkRenameView.as_view(), name='devicebay_bulk_rename'),
|
path('device-bays/rename/', views.DeviceBayBulkRenameView.as_view(), name='devicebay_bulk_rename'),
|
||||||
path('device-bays/delete/', views.DeviceBayBulkDeleteView.as_view(), name='devicebay_bulk_delete'),
|
path('device-bays/delete/', views.DeviceBayBulkDeleteView.as_view(), name='devicebay_bulk_delete'),
|
||||||
path('device-bays/<int:pk>/edit/', views.DeviceBayEditView.as_view(), name='devicebay_edit'),
|
path('device-bays/<int:pk>/edit/', views.DeviceBayEditView.as_view(), name='devicebay_edit'),
|
||||||
|
@ -1893,6 +1893,14 @@ class DeviceBayBulkImportView(PermissionRequiredMixin, BulkImportView):
|
|||||||
default_return_url = 'dcim:devicebay_list'
|
default_return_url = 'dcim:devicebay_list'
|
||||||
|
|
||||||
|
|
||||||
|
class DeviceBayBulkEditView(PermissionRequiredMixin, BulkEditView):
|
||||||
|
permission_required = 'dcim.change_devicebay'
|
||||||
|
queryset = DeviceBay.objects.all()
|
||||||
|
filterset = filters.DeviceBayFilterSet
|
||||||
|
table = tables.DeviceBayTable
|
||||||
|
form = forms.DeviceBayBulkEditForm
|
||||||
|
|
||||||
|
|
||||||
class DeviceBayBulkRenameView(PermissionRequiredMixin, BulkRenameView):
|
class DeviceBayBulkRenameView(PermissionRequiredMixin, BulkRenameView):
|
||||||
permission_required = 'dcim.change_devicebay'
|
permission_required = 'dcim.change_devicebay'
|
||||||
queryset = DeviceBay.objects.all()
|
queryset = DeviceBay.objects.all()
|
||||||
|
Reference in New Issue
Block a user