diff --git a/netbox/dcim/tests/test_views.py b/netbox/dcim/tests/test_views.py index e1ba63ded..21d9e80aa 100644 --- a/netbox/dcim/tests/test_views.py +++ b/netbox/dcim/tests/test_views.py @@ -986,6 +986,59 @@ inventory-items: ii1 = InventoryItemTemplate.objects.first() self.assertEqual(ii1.name, 'Inventory Item 1') + @override_settings(EXEMPT_VIEW_PERMISSIONS=['*']) + def test_import_error_numbering(self): + # Add all required permissions to the test user + self.add_permissions( + 'dcim.view_devicetype', + 'dcim.add_devicetype', + 'dcim.add_consoleporttemplate', + 'dcim.add_consoleserverporttemplate', + 'dcim.add_powerporttemplate', + 'dcim.add_poweroutlettemplate', + 'dcim.add_interfacetemplate', + 'dcim.add_frontporttemplate', + 'dcim.add_rearporttemplate', + 'dcim.add_modulebaytemplate', + 'dcim.add_devicebaytemplate', + 'dcim.add_inventoryitemtemplate', + ) + + import_data = ''' +--- +manufacturer: Manufacturer 1 +model: TEST-2001 +slug: test-2001 +u_height: 1 +module-bays: + - name: Module Bay 1-1 + - name: Module Bay 1-2 +--- +- manufacturer: Manufacturer 1 + model: TEST-2002 + slug: test-2002 + u_height: 1 + module-bays: + - name: Module Bay 2-1 + - name: Module Bay 2-2 + - not_name: Module Bay 2-3 +- manufacturer: Manufacturer 1 + model: TEST-2003 + slug: test-2003 + u_height: 1 + module-bays: + - name: Module Bay 3-1 +''' + form_data = { + 'data': import_data, + 'format': 'yaml' + } + + response = self.client.post(reverse('dcim:devicetype_bulk_import'), data=form_data, follow=True) + self.assertHttpStatus(response, 200) + # TODO record index should be 2 + self.assertContains(response, "Record 3 module-bays[3].name: This field is required.") + def test_export_objects(self): url = reverse('dcim:devicetype_list') self.add_permissions('dcim.view_devicetype') diff --git a/netbox/netbox/views/generic/bulk_views.py b/netbox/netbox/views/generic/bulk_views.py index 36c8ce1c4..228e79d7c 100644 --- a/netbox/netbox/views/generic/bulk_views.py +++ b/netbox/netbox/views/generic/bulk_views.py @@ -382,7 +382,7 @@ class BulkImportView(GetReturnURLMixin, BaseMultiObjectView): for field_name, related_object_form in self.related_object_forms.items(): related_obj_pks = [] - for i, rel_obj_data in enumerate(model_form.data.get(field_name, list())): + for i, rel_obj_data in enumerate(model_form.data.get(field_name, list()), start=1): rel_obj_data = self.prep_related_object_data(obj, rel_obj_data) f = related_object_form(rel_obj_data)