diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index 1e68069aa..c16412927 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -1879,6 +1879,54 @@ class CableCSVForm(forms.ModelForm): return termination_object +class CableBulkEditForm(BootstrapMixin, BulkEditForm): + pk = forms.ModelMultipleChoiceField( + queryset=Cable.objects.all(), + widget=forms.MultipleHiddenInput + ) + type = forms.ChoiceField( + choices=add_blank_choice(CABLE_TYPE_CHOICES), + required=False, + initial='' + ) + status = forms.ChoiceField( + choices=add_blank_choice(CONNECTION_STATUS_CHOICES), + required=False, + initial='' + ) + label = forms.CharField( + max_length=100, + required=False + ) + color = forms.CharField( + max_length=6, + required=False, + widget=ColorSelect() + ) + length = forms.IntegerField( + min_value=1, + required=False + ) + length_unit = forms.ChoiceField( + choices=add_blank_choice(LENGTH_UNIT_CHOICES), + required=False, + initial='' + ) + + class Meta: + nullable_fields = ['type', 'status', 'label', 'color', 'length'] + + def clean(self): + + # Validate length/unit + length = self.cleaned_data.get('length') + length_unit = self.cleaned_data.get('length_unit') + if length and not length_unit: + raise forms.ValidationError({ + 'length_unit': "Must specify a unit when setting length" + }) + + class CableFilterForm(BootstrapMixin, forms.Form): model = Cable q = forms.CharField(required=False, label='Search') diff --git a/netbox/dcim/tables.py b/netbox/dcim/tables.py index d94fa6780..3ffaded78 100644 --- a/netbox/dcim/tables.py +++ b/netbox/dcim/tables.py @@ -621,12 +621,13 @@ class DeviceBayTable(BaseTable): # class CableTable(BaseTable): - # django-tables2 adds CSS `class="label"` which causes rendering issues - pk = tables.LinkColumn( + pk = ToggleColumn() + id = tables.LinkColumn( viewname='dcim:cable', args=[Accessor('pk')], - verbose_name='PK' + verbose_name='ID' ) + # django-tables2 adds CSS `class="label"` which causes rendering issues label_ = tables.Column( accessor=Accessor('label'), verbose_name='Label' @@ -663,7 +664,9 @@ class CableTable(BaseTable): class Meta(BaseTable.Meta): model = Cable - fields = ('pk', 'label_', 'device_a', 'termination_a', 'device_b', 'termination_b', 'status', 'type', 'color') + fields = ( + 'pk', 'id', 'label_', 'device_a', 'termination_a', 'device_b', 'termination_b', 'status', 'type', 'color', + ) # diff --git a/netbox/dcim/urls.py b/netbox/dcim/urls.py index 583948b0e..24c6d6a9a 100644 --- a/netbox/dcim/urls.py +++ b/netbox/dcim/urls.py @@ -252,6 +252,8 @@ urlpatterns = [ # Cables url(r'^cables/$', views.CableListView.as_view(), name='cable_list'), url(r'^cables/import/$', views.CableBulkImportView.as_view(), name='cable_import'), + url(r'^cables/edit/$', views.CableBulkEditView.as_view(), name='cable_bulk_edit'), + url(r'^cables/delete/$', views.CableBulkDeleteView.as_view(), name='cable_bulk_delete'), url(r'^cables/(?P\d+)/$', views.CableView.as_view(), name='cable'), url(r'^cables/(?P\d+)/edit/$', views.CableEditView.as_view(), name='cable_edit'), url(r'^cables/(?P\d+)/delete/$', views.CableDeleteView.as_view(), name='cable_delete'), diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 8f973d064..9f27f2e72 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -1683,6 +1683,23 @@ class CableBulkImportView(PermissionRequiredMixin, BulkImportView): default_return_url = 'dcim:cable_list' +class CableBulkEditView(PermissionRequiredMixin, BulkEditView): + permission_required = 'dcim.change_cable' + queryset = Cable.objects.prefetch_related('termination_a', 'termination_b') + filter = filters.CableFilter + table = tables.CableTable + form = forms.CableBulkEditForm + default_return_url = 'dcim:cable_list' + + +class CableBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): + permission_required = 'dcim.delete_cable' + queryset = Cable.objects.prefetch_related('termination_a', 'termination_b') + filter = filters.CableFilter + table = tables.CableTable + default_return_url = 'dcim:cable_list' + + # # Connections # diff --git a/netbox/templates/dcim/cable_list.html b/netbox/templates/dcim/cable_list.html index b942986e3..255a4b113 100644 --- a/netbox/templates/dcim/cable_list.html +++ b/netbox/templates/dcim/cable_list.html @@ -8,7 +8,7 @@

{% block title %}Cables{% endblock %}

- {% include 'responsive_table.html' %} + {% include 'utilities/obj_table.html' with bulk_edit_url='dcim:cable_bulk_edit' bulk_delete_url='dcim:cable_bulk_delete' %}
{% include 'inc/search_panel.html' %}