mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-25 18:08:38 -06:00
Enable CSV import for virtual chassis
This commit is contained in:
parent
59c1e34024
commit
36cf40f25c
@ -4306,6 +4306,19 @@ class VirtualChassisBulkEditForm(BootstrapMixin, AddRemoveTagsForm, BulkEditForm
|
|||||||
nullable_fields = ['domain']
|
nullable_fields = ['domain']
|
||||||
|
|
||||||
|
|
||||||
|
class VirtualChassisCSVForm(CSVModelForm):
|
||||||
|
master = CSVModelChoiceField(
|
||||||
|
queryset=Device.objects.all(),
|
||||||
|
to_field_name='name',
|
||||||
|
required=False,
|
||||||
|
help_text='Master device'
|
||||||
|
)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = VirtualChassis
|
||||||
|
fields = VirtualChassis.csv_headers
|
||||||
|
|
||||||
|
|
||||||
class VirtualChassisFilterForm(BootstrapMixin, CustomFieldFilterForm):
|
class VirtualChassisFilterForm(BootstrapMixin, CustomFieldFilterForm):
|
||||||
model = VirtualChassis
|
model = VirtualChassis
|
||||||
q = forms.CharField(
|
q = forms.CharField(
|
||||||
|
@ -1578,7 +1578,6 @@ class VirtualChassisTestCase(ViewTestCases.PrimaryObjectViewTestCase):
|
|||||||
name='Device Role', slug='device-role-1'
|
name='Device Role', slug='device-role-1'
|
||||||
)
|
)
|
||||||
|
|
||||||
# Create 9 member Devices
|
|
||||||
devices = (
|
devices = (
|
||||||
Device(device_type=device_type, device_role=device_role, name='Device 1', site=site),
|
Device(device_type=device_type, device_role=device_role, name='Device 1', site=site),
|
||||||
Device(device_type=device_type, device_role=device_role, name='Device 2', site=site),
|
Device(device_type=device_type, device_role=device_role, name='Device 2', site=site),
|
||||||
@ -1589,10 +1588,13 @@ class VirtualChassisTestCase(ViewTestCases.PrimaryObjectViewTestCase):
|
|||||||
Device(device_type=device_type, device_role=device_role, name='Device 7', site=site),
|
Device(device_type=device_type, device_role=device_role, name='Device 7', site=site),
|
||||||
Device(device_type=device_type, device_role=device_role, name='Device 8', site=site),
|
Device(device_type=device_type, device_role=device_role, name='Device 8', site=site),
|
||||||
Device(device_type=device_type, device_role=device_role, name='Device 9', site=site),
|
Device(device_type=device_type, device_role=device_role, name='Device 9', site=site),
|
||||||
|
Device(device_type=device_type, device_role=device_role, name='Device 10', site=site),
|
||||||
|
Device(device_type=device_type, device_role=device_role, name='Device 11', site=site),
|
||||||
|
Device(device_type=device_type, device_role=device_role, name='Device 12', site=site),
|
||||||
)
|
)
|
||||||
Device.objects.bulk_create(devices)
|
Device.objects.bulk_create(devices)
|
||||||
|
|
||||||
# Create three VirtualChassis with two members each
|
# Create three VirtualChassis with three members each
|
||||||
vc1 = VirtualChassis.objects.create(name='VC1', master=devices[0], domain='domain-1')
|
vc1 = VirtualChassis.objects.create(name='VC1', master=devices[0], domain='domain-1')
|
||||||
Device.objects.filter(pk=devices[0].pk).update(virtual_chassis=vc1, vc_position=1)
|
Device.objects.filter(pk=devices[0].pk).update(virtual_chassis=vc1, vc_position=1)
|
||||||
Device.objects.filter(pk=devices[1].pk).update(virtual_chassis=vc1, vc_position=2)
|
Device.objects.filter(pk=devices[1].pk).update(virtual_chassis=vc1, vc_position=2)
|
||||||
@ -1616,6 +1618,13 @@ class VirtualChassisTestCase(ViewTestCases.PrimaryObjectViewTestCase):
|
|||||||
'form-MAX_NUM_FORMS': 1000,
|
'form-MAX_NUM_FORMS': 1000,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cls.csv_data = (
|
||||||
|
"name,domain,master",
|
||||||
|
"VC4,Domain 4,Device 10",
|
||||||
|
"VC5,Domain 5,Device 11",
|
||||||
|
"VC6,Domain 6,Device 12",
|
||||||
|
)
|
||||||
|
|
||||||
cls.bulk_edit_data = {
|
cls.bulk_edit_data = {
|
||||||
'domain': 'domain-x',
|
'domain': 'domain-x',
|
||||||
}
|
}
|
||||||
|
@ -321,6 +321,7 @@ urlpatterns = [
|
|||||||
# Virtual chassis
|
# Virtual chassis
|
||||||
path('virtual-chassis/', views.VirtualChassisListView.as_view(), name='virtualchassis_list'),
|
path('virtual-chassis/', views.VirtualChassisListView.as_view(), name='virtualchassis_list'),
|
||||||
path('virtual-chassis/add/', views.VirtualChassisCreateView.as_view(), name='virtualchassis_add'),
|
path('virtual-chassis/add/', views.VirtualChassisCreateView.as_view(), name='virtualchassis_add'),
|
||||||
|
path('virtual-chassis/import/', views.VirtualChassisBulkImportView.as_view(), name='virtualchassis_import'),
|
||||||
path('virtual-chassis/edit/', views.VirtualChassisBulkEditView.as_view(), name='virtualchassis_bulk_edit'),
|
path('virtual-chassis/edit/', views.VirtualChassisBulkEditView.as_view(), name='virtualchassis_bulk_edit'),
|
||||||
path('virtual-chassis/delete/', views.VirtualChassisBulkDeleteView.as_view(), name='virtualchassis_bulk_delete'),
|
path('virtual-chassis/delete/', views.VirtualChassisBulkDeleteView.as_view(), name='virtualchassis_bulk_delete'),
|
||||||
path('virtual-chassis/<int:pk>/', views.VirtualChassisView.as_view(), name='virtualchassis'),
|
path('virtual-chassis/<int:pk>/', views.VirtualChassisView.as_view(), name='virtualchassis'),
|
||||||
|
@ -2304,6 +2304,13 @@ class VirtualChassisRemoveMemberView(ObjectPermissionRequiredMixin, GetReturnURL
|
|||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
class VirtualChassisBulkImportView(BulkImportView):
|
||||||
|
queryset = VirtualChassis.objects.all()
|
||||||
|
model_form = forms.VirtualChassisCSVForm
|
||||||
|
table = tables.VirtualChassisTable
|
||||||
|
default_return_url = 'dcim:virtualchassis_list'
|
||||||
|
|
||||||
|
|
||||||
class VirtualChassisBulkEditView(BulkEditView):
|
class VirtualChassisBulkEditView(BulkEditView):
|
||||||
queryset = VirtualChassis.objects.all()
|
queryset = VirtualChassis.objects.all()
|
||||||
filterset = filters.VirtualChassisFilterSet
|
filterset = filters.VirtualChassisFilterSet
|
||||||
|
@ -147,6 +147,7 @@
|
|||||||
{% if perms.dcim.add_virtualchassis %}
|
{% if perms.dcim.add_virtualchassis %}
|
||||||
<div class="buttons pull-right">
|
<div class="buttons pull-right">
|
||||||
<a href="{% url 'dcim:virtualchassis_add' %}" class="btn btn-xs btn-success" title="Add"><i class="fa fa-plus"></i></a>
|
<a href="{% url 'dcim:virtualchassis_add' %}" class="btn btn-xs btn-success" title="Add"><i class="fa fa-plus"></i></a>
|
||||||
|
<a href="{% url 'dcim:virtualchassis_import' %}" class="btn btn-xs btn-info" title="Import"><i class="fa fa-download"></i></a>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<a href="{% url 'dcim:virtualchassis_list' %}">Virtual Chassis</a>
|
<a href="{% url 'dcim:virtualchassis_list' %}">Virtual Chassis</a>
|
||||||
|
Loading…
Reference in New Issue
Block a user