From 1a8913f625c87ae19944b0fb0651af29dfbf0fc3 Mon Sep 17 00:00:00 2001 From: Joseph Kennedy Date: Tue, 1 Aug 2017 16:51:42 -0400 Subject: [PATCH] Changes to allow import of interfaces and show descriptions inline in interface...some work on description column display --- netbox/dcim/forms.py | 35 ++++++++++++++++++++++++ netbox/dcim/models.py | 11 ++++++++ netbox/dcim/tables.py | 13 +++++++++ netbox/dcim/urls.py | 1 + netbox/templates/_base.html | 3 ++ netbox/templates/dcim/device.html | 8 ++++++ netbox/templates/dcim/inc/interface.html | 5 ++++ 7 files changed, 76 insertions(+) diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index 440c12623..ef3ff3873 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -1696,6 +1696,41 @@ class InterfaceConnectionCSVForm(forms.ModelForm): return interface +class InterfaceCSVForm(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.'} + ) + name = forms.CharField( + help_text='Name of interface' + ) + mac_address = forms.CharField( + required=False, + help_text='MAC address of interface' + ) + description = forms.CharField( + required=False, + help_text='Description for interface' + ) + + class Meta: + model = Interface + fields = [ + 'device', 'name', 'mac_address', 'description' + ] + + + def clean_interface(self): + + interface_name = self.cleaned_data.get('interface_name') + if not interface: + return None + + return interface + + class InterfaceConnectionDeletionForm(ConfirmationForm): # Used for HTTP redirect upon successful deletion device = forms.ModelChoiceField(queryset=Device.objects.all(), widget=forms.HiddenInput(), required=False) diff --git a/netbox/dcim/models.py b/netbox/dcim/models.py index 8dd11e663..43e3d561f 100644 --- a/netbox/dcim/models.py +++ b/netbox/dcim/models.py @@ -1233,6 +1233,17 @@ class Interface(models.Model): pass return None + # Used for export + def to_csv(self): + return csv_format([ + self.device.identifier, + self.lag, + self.name, + self.mac, + self.form_factor, + self.description, + ]) + class InterfaceConnection(models.Model): """ diff --git a/netbox/dcim/tables.py b/netbox/dcim/tables.py index 427f0bb42..087473b11 100644 --- a/netbox/dcim/tables.py +++ b/netbox/dcim/tables.py @@ -523,3 +523,16 @@ class InterfaceConnectionTable(BaseTable): class Meta(BaseTable.Meta): model = Interface fields = ('device_a', 'interface_a', 'device_b', 'interface_b') + + +class InterfaceImportTable(BaseTable): + device = tables.LinkColumn('dcim:device', accessor=Accessor('interface.device'), + args=[Accessor('interface.device.pk')], verbose_name='Device') + name = tables.Column(verbose_name='Interface') + form_factor = tables.Column(verbose_name='Form Factor') + mac_address = tables.Column(verbose_name='MAC Address') + description = tables.Column(verbose_name='Description') + + class Meta(BaseTable.Meta): + model = Interface + fields = ('device', 'name', 'form_factor','mac_address', 'description') diff --git a/netbox/dcim/urls.py b/netbox/dcim/urls.py index 172f634fb..dbf85292b 100644 --- a/netbox/dcim/urls.py +++ b/netbox/dcim/urls.py @@ -177,6 +177,7 @@ urlpatterns = [ url(r'^interface-connections/(?P\d+)/delete/$', views.interfaceconnection_delete, name='interfaceconnection_delete'), url(r'^interfaces/(?P\d+)/edit/$', views.InterfaceEditView.as_view(), name='interface_edit'), url(r'^interfaces/(?P\d+)/delete/$', views.InterfaceDeleteView.as_view(), name='interface_delete'), + url(r'^interfaces/import/$', views.InterfacesBulkImportView.as_view(), name='interfaces_import'), # Device bays url(r'^devices/device-bays/add/$', views.DeviceBulkAddDeviceBayView.as_view(), name='device_bulk_add_devicebay'), diff --git a/netbox/templates/_base.html b/netbox/templates/_base.html index 10b4970a8..134ffff4e 100644 --- a/netbox/templates/_base.html +++ b/netbox/templates/_base.html @@ -85,6 +85,9 @@
  • Add a Device
  • Import Devices
  • {% endif %} + {% if perms.dcim.add_interface %} +
  • Import Interfaces
  • + {% endif %} {% if perms.ipam.add_device or perms.ipam.add_devicetype %}
  • {% endif %} diff --git a/netbox/templates/dcim/device.html b/netbox/templates/dcim/device.html index 3bf92fbca..ce18148c5 100644 --- a/netbox/templates/dcim/device.html +++ b/netbox/templates/dcim/device.html @@ -374,6 +374,14 @@ {% endif %}
    +
    + {% if perms.dcim.add_interface %} + + + Import Interfaces + + {% endif %} + {% include 'inc/export_button.html' with obj_type='interfaces' %}
    Interfaces
    diff --git a/netbox/templates/dcim/inc/interface.html b/netbox/templates/dcim/inc/interface.html index 75d0f027d..bdda8eace 100644 --- a/netbox/templates/dcim/inc/interface.html +++ b/netbox/templates/dcim/inc/interface.html @@ -13,6 +13,11 @@ {% if iface.description %} {% endif %} + + {% if iface.description %} + {{ iface.description }} + {% endif %} + {{ iface.mtu|default:"" }} {{ iface.mac_address|default:"" }}