diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index c51332b76..765ad699b 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -3304,6 +3304,50 @@ class FrontPortCreateForm(BootstrapMixin, forms.Form): } +# class FrontPortBulkCreateForm( +# form_from_model(FrontPort, ['type', 'description', 'tags']), +# DeviceBulkAddComponentForm +# ): +# tags = TagField( +# required=False +# ) + + +class FrontPortBulkEditForm(BootstrapMixin, AddRemoveTagsForm, BulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=FrontPort.objects.all(), + widget=forms.MultipleHiddenInput() + ) + type = forms.ChoiceField( + choices=add_blank_choice(PortTypeChoices), + required=False, + widget=StaticSelect2() + ) + description = forms.CharField( + max_length=100, + required=False + ) + + class Meta: + nullable_fields = [ + 'description', + ] + + +class FrontPortBulkRenameForm(BulkRenameForm): + pk = forms.ModelMultipleChoiceField( + queryset=FrontPort.objects.all(), + widget=forms.MultipleHiddenInput + ) + + +class FrontPortBulkDisconnectForm(ConfirmationForm): + pk = forms.ModelMultipleChoiceField( + queryset=FrontPort.objects.all(), + widget=forms.MultipleHiddenInput + ) + + class FrontPortCSVForm(forms.ModelForm): device = FlexibleModelChoiceField( queryset=Device.objects.all(), @@ -3352,50 +3396,6 @@ class FrontPortCSVForm(forms.ModelForm): self.fields['rear_port'].queryset = RearPort.objects.none() -# class FrontPortBulkCreateForm( -# form_from_model(FrontPort, ['type', 'description', 'tags']), -# DeviceBulkAddComponentForm -# ): -# tags = TagField( -# required=False -# ) - - -class FrontPortBulkEditForm(BootstrapMixin, AddRemoveTagsForm, BulkEditForm): - pk = forms.ModelMultipleChoiceField( - queryset=FrontPort.objects.all(), - widget=forms.MultipleHiddenInput() - ) - type = forms.ChoiceField( - choices=add_blank_choice(PortTypeChoices), - required=False, - widget=StaticSelect2() - ) - description = forms.CharField( - max_length=100, - required=False - ) - - class Meta: - nullable_fields = [ - 'description', - ] - - -class FrontPortBulkRenameForm(BulkRenameForm): - pk = forms.ModelMultipleChoiceField( - queryset=FrontPort.objects.all(), - widget=forms.MultipleHiddenInput - ) - - -class FrontPortBulkDisconnectForm(ConfirmationForm): - pk = forms.ModelMultipleChoiceField( - queryset=FrontPort.objects.all(), - widget=forms.MultipleHiddenInput - ) - - # # Rear pass-through ports # @@ -3448,31 +3448,13 @@ class RearPortCreateForm(BootstrapMixin, forms.Form): ) -class RearPortCSVForm(forms.ModelForm): - device = FlexibleModelChoiceField( - queryset=Device.objects.all(), - to_field_name='name', - help_text='Name or ID of device', - error_messages={ - 'invalid_choice': 'Device not found.', - } +class RearPortBulkCreateForm( + form_from_model(RearPort, ['type', 'positions', 'description', 'tags']), + DeviceBulkAddComponentForm +): + tags = TagField( + required=False ) - type = CSVChoiceField( - choices=PortTypeChoices, - ) - - class Meta: - model = RearPort - fields = RearPort.csv_headers - - -# class RearPortBulkCreateForm( -# form_from_model(RearPort, ['type', 'positions', 'description', 'tags']), -# DeviceBulkAddComponentForm -# ): -# tags = TagField( -# required=False -# ) class RearPortBulkEditForm(BootstrapMixin, AddRemoveTagsForm, BulkEditForm): @@ -3510,6 +3492,24 @@ class RearPortBulkDisconnectForm(ConfirmationForm): ) +class RearPortCSVForm(forms.ModelForm): + device = FlexibleModelChoiceField( + queryset=Device.objects.all(), + to_field_name='name', + help_text='Name or ID of device', + error_messages={ + 'invalid_choice': 'Device not found.', + } + ) + type = CSVChoiceField( + choices=PortTypeChoices, + ) + + class Meta: + model = RearPort + fields = RearPort.csv_headers + + # # Cables # diff --git a/netbox/dcim/urls.py b/netbox/dcim/urls.py index c62800386..36a272cf8 100644 --- a/netbox/dcim/urls.py +++ b/netbox/dcim/urls.py @@ -278,7 +278,7 @@ urlpatterns = [ path('rear-ports//edit/', views.RearPortEditView.as_view(), name='rearport_edit'), path('rear-ports//delete/', views.RearPortDeleteView.as_view(), name='rearport_delete'), path('rear-ports//trace/', views.CableTraceView.as_view(), name='rearport_trace', kwargs={'model': RearPort}), - # path('devices/rear-ports/add/', views.DeviceBulkAddRearPortView.as_view(), name='device_bulk_add_rearport'), + path('devices/rear-ports/add/', views.DeviceBulkAddRearPortView.as_view(), name='device_bulk_add_rearport'), # Device bays path('device-bays/', views.DeviceBayListView.as_view(), name='devicebay_list'), diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index cc8f285c8..9ca4c2edc 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -1986,6 +1986,30 @@ class DeviceBulkAddInterfaceView(PermissionRequiredMixin, BulkComponentCreateVie default_return_url = 'dcim:device_list' +# class DeviceBulkAddFrontPortView(PermissionRequiredMixin, BulkComponentCreateView): +# permission_required = 'dcim.add_frontport' +# parent_model = Device +# parent_field = 'device' +# form = forms.FrontPortBulkCreateForm +# model = FrontPort +# model_form = forms.FrontPortForm +# filterset = filters.DeviceFilterSet +# table = tables.DeviceTable +# default_return_url = 'dcim:device_list' + + +class DeviceBulkAddRearPortView(PermissionRequiredMixin, BulkComponentCreateView): + permission_required = 'dcim.add_rearport' + parent_model = Device + parent_field = 'device' + form = forms.RearPortBulkCreateForm + model = RearPort + model_form = forms.RearPortForm + filterset = filters.DeviceFilterSet + table = tables.DeviceTable + default_return_url = 'dcim:device_list' + + class DeviceBulkAddDeviceBayView(PermissionRequiredMixin, BulkComponentCreateView): permission_required = 'dcim.add_devicebay' parent_model = Device diff --git a/netbox/templates/dcim/device_list.html b/netbox/templates/dcim/device_list.html index b12e4b5a8..ebee21d18 100644 --- a/netbox/templates/dcim/device_list.html +++ b/netbox/templates/dcim/device_list.html @@ -12,6 +12,7 @@ {% if perms.dcim.add_powerport %}
  • Power Ports
  • {% endif %} {% if perms.dcim.add_poweroutlet %}
  • Power Outlets
  • {% endif %} {% if perms.dcim.add_interface %}
  • Interfaces
  • {% endif %} + {% if perms.dcim.add_rearport %}
  • Rear Ports
  • {% endif %} {% if perms.dcim.add_devicebay %}
  • Device Bays
  • {% endif %}