Просмотр исходного кода

Add VMInterface CSV import view

Jeremy Stretch 5 лет назад
Родитель
Сommit
603c804535

+ 0 - 6
netbox/dcim/forms.py

@@ -2963,12 +2963,6 @@ class InterfaceBulkDisconnectForm(ConfirmationForm):
 class InterfaceCSVForm(CSVModelForm):
     device = CSVModelChoiceField(
         queryset=Device.objects.all(),
-        required=False,
-        to_field_name='name'
-    )
-    virtual_machine = CSVModelChoiceField(
-        queryset=VirtualMachine.objects.all(),
-        required=False,
         to_field_name='name'
     )
     lag = CSVModelChoiceField(

+ 1 - 7
netbox/dcim/tables.py

@@ -598,17 +598,11 @@ class InterfaceImportTable(BaseTable):
         viewname='dcim:device',
         args=[Accessor('device.pk')]
     )
-    virtual_machine = tables.LinkColumn(
-        viewname='virtualization:virtualmachine',
-        args=[Accessor('virtual_machine.pk')],
-        verbose_name='Virtual Machine'
-    )
 
     class Meta(BaseTable.Meta):
         model = Interface
         fields = (
-            'device', 'virtual_machine', 'name', 'description', 'lag', 'type', 'enabled', 'mac_address', 'mtu',
-            'mgmt_only', 'mode',
+            'device', 'name', 'description', 'lag', 'type', 'enabled', 'mac_address', 'mtu', 'mgmt_only', 'mode',
         )
         empty_text = False
 

+ 5 - 0
netbox/templates/inc/nav_menu.html

@@ -373,6 +373,11 @@
                             <a href="{% url 'virtualization:virtualmachine_list' %}">Virtual Machines</a>
                         </li>
                         <li{% if not perms.virtualization.view_vminterface%} class="disabled"{% endif %}>
+                            {% if perms.virtualization.add_vminterface %}
+                                <div class="buttons pull-right">
+                                    <a href="{% url 'virtualization:vminterface_import' %}" class="btn btn-xs btn-info" title="Import"><i class="fa fa-download"></i></a>
+                                </div>
+                            {% endif %}
                             <a href="{% url 'virtualization:vminterface_list' %}">Interfaces</a>
                         </li>
                         <li class="divider"></li>

+ 23 - 0
netbox/virtualization/forms.py

@@ -715,6 +715,29 @@ class VMInterfaceCreateForm(BootstrapMixin, forms.Form):
             self.fields['tagged_vlans'].widget.add_additional_query_param('site_id', site.pk)
 
 
+class VMInterfaceCSVForm(CSVModelForm):
+    virtual_machine = CSVModelChoiceField(
+        queryset=VirtualMachine.objects.all(),
+        to_field_name='name'
+    )
+    mode = CSVChoiceField(
+        choices=InterfaceModeChoices,
+        required=False,
+        help_text='IEEE 802.1Q operational mode (for L2 interfaces)'
+    )
+
+    class Meta:
+        model = VMInterface
+        fields = VMInterface.csv_headers
+
+    def clean_enabled(self):
+        # Make sure enabled is True when it's not included in the uploaded data
+        if 'enabled' not in self.data:
+            return True
+        else:
+            return self.cleaned_data['enabled']
+
+
 class VMInterfaceBulkEditForm(BootstrapMixin, BulkEditForm):
     pk = forms.ModelMultipleChoiceField(
         queryset=VMInterface.objects.all(),

+ 8 - 8
netbox/virtualization/tests/test_views.py

@@ -189,16 +189,9 @@ class VirtualMachineTestCase(ViewTestCases.PrimaryObjectViewTestCase):
         }
 
 
-# TODO: Update base class to DeviceComponentViewTestCase
-# Blocked by #4721
 class VMInterfaceTestCase(
-    ViewTestCases.ListObjectsViewTestCase,
     ViewTestCases.GetObjectViewTestCase,
-    ViewTestCases.EditObjectViewTestCase,
-    ViewTestCases.DeleteObjectViewTestCase,
-    ViewTestCases.BulkCreateObjectsViewTestCase,
-    ViewTestCases.BulkEditObjectsViewTestCase,
-    ViewTestCases.BulkDeleteObjectsViewTestCase,
+    ViewTestCases.DeviceComponentViewTestCase,
 ):
     model = VMInterface
 
@@ -257,6 +250,13 @@ class VMInterfaceTestCase(
             'tags': [t.pk for t in tags],
         }
 
+        cls.csv_data = (
+            "virtual_machine,name",
+            "Virtual Machine 2,Interface 4",
+            "Virtual Machine 2,Interface 5",
+            "Virtual Machine 2,Interface 6",
+        )
+
         cls.bulk_edit_data = {
             'virtual_machine': virtualmachines[1].pk,
             'enabled': False,

+ 1 - 0
netbox/virtualization/urls.py

@@ -53,6 +53,7 @@ urlpatterns = [
     # VM interfaces
     path('interfaces/', views.InterfaceListView.as_view(), name='vminterface_list'),
     path('interfaces/add/', views.InterfaceCreateView.as_view(), name='vminterface_add'),
+    path('interfaces/import/', views.InterfaceBulkImportView.as_view(), name='vminterface_import'),
     path('interfaces/edit/', views.InterfaceBulkEditView.as_view(), name='vminterface_bulk_edit'),
     path('interfaces/delete/', views.InterfaceBulkDeleteView.as_view(), name='vminterface_bulk_delete'),
     path('interfaces/<int:pk>/', views.InterfaceView.as_view(), name='vminterface'),

+ 7 - 0
netbox/virtualization/views.py

@@ -349,6 +349,13 @@ class InterfaceDeleteView(ObjectDeleteView):
     queryset = VMInterface.objects.all()
 
 
+class InterfaceBulkImportView(BulkImportView):
+    queryset = VMInterface.objects.all()
+    model_form = forms.VMInterfaceCSVForm
+    table = tables.VMInterfaceTable
+    default_return_url = 'virtualization:vminterface_list'
+
+
 class InterfaceBulkEditView(BulkEditView):
     queryset = VMInterface.objects.all()
     table = tables.VMInterfaceTable