mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
Add VMInterface CSV import view
This commit is contained in:
@ -2963,12 +2963,6 @@ class InterfaceBulkDisconnectForm(ConfirmationForm):
|
|||||||
class InterfaceCSVForm(CSVModelForm):
|
class InterfaceCSVForm(CSVModelForm):
|
||||||
device = CSVModelChoiceField(
|
device = CSVModelChoiceField(
|
||||||
queryset=Device.objects.all(),
|
queryset=Device.objects.all(),
|
||||||
required=False,
|
|
||||||
to_field_name='name'
|
|
||||||
)
|
|
||||||
virtual_machine = CSVModelChoiceField(
|
|
||||||
queryset=VirtualMachine.objects.all(),
|
|
||||||
required=False,
|
|
||||||
to_field_name='name'
|
to_field_name='name'
|
||||||
)
|
)
|
||||||
lag = CSVModelChoiceField(
|
lag = CSVModelChoiceField(
|
||||||
|
@ -598,17 +598,11 @@ class InterfaceImportTable(BaseTable):
|
|||||||
viewname='dcim:device',
|
viewname='dcim:device',
|
||||||
args=[Accessor('device.pk')]
|
args=[Accessor('device.pk')]
|
||||||
)
|
)
|
||||||
virtual_machine = tables.LinkColumn(
|
|
||||||
viewname='virtualization:virtualmachine',
|
|
||||||
args=[Accessor('virtual_machine.pk')],
|
|
||||||
verbose_name='Virtual Machine'
|
|
||||||
)
|
|
||||||
|
|
||||||
class Meta(BaseTable.Meta):
|
class Meta(BaseTable.Meta):
|
||||||
model = Interface
|
model = Interface
|
||||||
fields = (
|
fields = (
|
||||||
'device', 'virtual_machine', 'name', 'description', 'lag', 'type', 'enabled', 'mac_address', 'mtu',
|
'device', 'name', 'description', 'lag', 'type', 'enabled', 'mac_address', 'mtu', 'mgmt_only', 'mode',
|
||||||
'mgmt_only', 'mode',
|
|
||||||
)
|
)
|
||||||
empty_text = False
|
empty_text = False
|
||||||
|
|
||||||
|
@ -373,6 +373,11 @@
|
|||||||
<a href="{% url 'virtualization:virtualmachine_list' %}">Virtual Machines</a>
|
<a href="{% url 'virtualization:virtualmachine_list' %}">Virtual Machines</a>
|
||||||
</li>
|
</li>
|
||||||
<li{% if not perms.virtualization.view_vminterface%} class="disabled"{% endif %}>
|
<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>
|
<a href="{% url 'virtualization:vminterface_list' %}">Interfaces</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="divider"></li>
|
<li class="divider"></li>
|
||||||
|
@ -715,6 +715,29 @@ class VMInterfaceCreateForm(BootstrapMixin, forms.Form):
|
|||||||
self.fields['tagged_vlans'].widget.add_additional_query_param('site_id', site.pk)
|
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):
|
class VMInterfaceBulkEditForm(BootstrapMixin, BulkEditForm):
|
||||||
pk = forms.ModelMultipleChoiceField(
|
pk = forms.ModelMultipleChoiceField(
|
||||||
queryset=VMInterface.objects.all(),
|
queryset=VMInterface.objects.all(),
|
||||||
|
@ -189,16 +189,9 @@ class VirtualMachineTestCase(ViewTestCases.PrimaryObjectViewTestCase):
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
# TODO: Update base class to DeviceComponentViewTestCase
|
|
||||||
# Blocked by #4721
|
|
||||||
class VMInterfaceTestCase(
|
class VMInterfaceTestCase(
|
||||||
ViewTestCases.ListObjectsViewTestCase,
|
|
||||||
ViewTestCases.GetObjectViewTestCase,
|
ViewTestCases.GetObjectViewTestCase,
|
||||||
ViewTestCases.EditObjectViewTestCase,
|
ViewTestCases.DeviceComponentViewTestCase,
|
||||||
ViewTestCases.DeleteObjectViewTestCase,
|
|
||||||
ViewTestCases.BulkCreateObjectsViewTestCase,
|
|
||||||
ViewTestCases.BulkEditObjectsViewTestCase,
|
|
||||||
ViewTestCases.BulkDeleteObjectsViewTestCase,
|
|
||||||
):
|
):
|
||||||
model = VMInterface
|
model = VMInterface
|
||||||
|
|
||||||
@ -257,6 +250,13 @@ class VMInterfaceTestCase(
|
|||||||
'tags': [t.pk for t in tags],
|
'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 = {
|
cls.bulk_edit_data = {
|
||||||
'virtual_machine': virtualmachines[1].pk,
|
'virtual_machine': virtualmachines[1].pk,
|
||||||
'enabled': False,
|
'enabled': False,
|
||||||
|
@ -53,6 +53,7 @@ urlpatterns = [
|
|||||||
# VM interfaces
|
# VM interfaces
|
||||||
path('interfaces/', views.InterfaceListView.as_view(), name='vminterface_list'),
|
path('interfaces/', views.InterfaceListView.as_view(), name='vminterface_list'),
|
||||||
path('interfaces/add/', views.InterfaceCreateView.as_view(), name='vminterface_add'),
|
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/edit/', views.InterfaceBulkEditView.as_view(), name='vminterface_bulk_edit'),
|
||||||
path('interfaces/delete/', views.InterfaceBulkDeleteView.as_view(), name='vminterface_bulk_delete'),
|
path('interfaces/delete/', views.InterfaceBulkDeleteView.as_view(), name='vminterface_bulk_delete'),
|
||||||
path('interfaces/<int:pk>/', views.InterfaceView.as_view(), name='vminterface'),
|
path('interfaces/<int:pk>/', views.InterfaceView.as_view(), name='vminterface'),
|
||||||
|
@ -349,6 +349,13 @@ class InterfaceDeleteView(ObjectDeleteView):
|
|||||||
queryset = VMInterface.objects.all()
|
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):
|
class InterfaceBulkEditView(BulkEditView):
|
||||||
queryset = VMInterface.objects.all()
|
queryset = VMInterface.objects.all()
|
||||||
table = tables.VMInterfaceTable
|
table = tables.VMInterfaceTable
|
||||||
|
Reference in New Issue
Block a user