@@ -986,6 +986,131 @@ def test_import_objects(self):
986986 ii1 = InventoryItemTemplate .objects .first ()
987987 self .assertEqual (ii1 .name , 'Inventory Item 1' )
988988
989+ @override_settings (EXEMPT_VIEW_PERMISSIONS = ['*' ])
990+ def test_import_error_numbering (self ):
991+ # Add all required permissions to the test user
992+ self .add_permissions (
993+ 'dcim.view_devicetype' ,
994+ 'dcim.add_devicetype' ,
995+ 'dcim.add_consoleporttemplate' ,
996+ 'dcim.add_consoleserverporttemplate' ,
997+ 'dcim.add_powerporttemplate' ,
998+ 'dcim.add_poweroutlettemplate' ,
999+ 'dcim.add_interfacetemplate' ,
1000+ 'dcim.add_frontporttemplate' ,
1001+ 'dcim.add_rearporttemplate' ,
1002+ 'dcim.add_modulebaytemplate' ,
1003+ 'dcim.add_devicebaytemplate' ,
1004+ 'dcim.add_inventoryitemtemplate' ,
1005+ )
1006+
1007+ import_data = '''
1008+ ---
1009+ manufacturer: Manufacturer 1
1010+ model: TEST-2001
1011+ slug: test-2001
1012+ u_height: 1
1013+ module-bays:
1014+ - name: Module Bay 1-1
1015+ - name: Module Bay 1-2
1016+ ---
1017+ - manufacturer: Manufacturer 1
1018+ model: TEST-2002
1019+ slug: test-2002
1020+ u_height: 1
1021+ module-bays:
1022+ - name: Module Bay 2-1
1023+ - name: Module Bay 2-2
1024+ - not_name: Module Bay 2-3
1025+ - manufacturer: Manufacturer 1
1026+ model: TEST-2003
1027+ slug: test-2003
1028+ u_height: 1
1029+ module-bays:
1030+ - name: Module Bay 3-1
1031+ '''
1032+ form_data = {
1033+ 'data' : import_data ,
1034+ 'format' : 'yaml'
1035+ }
1036+
1037+ response = self .client .post (reverse ('dcim:devicetype_bulk_import' ), data = form_data , follow = True )
1038+ self .assertHttpStatus (response , 200 )
1039+ self .assertContains (response , "Record 2 module-bays[3].name: This field is required." )
1040+
1041+ @override_settings (EXEMPT_VIEW_PERMISSIONS = ['*' ])
1042+ def test_import_nolist (self ):
1043+ # Add all required permissions to the test user
1044+ self .add_permissions (
1045+ 'dcim.view_devicetype' ,
1046+ 'dcim.add_devicetype' ,
1047+ 'dcim.add_consoleporttemplate' ,
1048+ 'dcim.add_consoleserverporttemplate' ,
1049+ 'dcim.add_powerporttemplate' ,
1050+ 'dcim.add_poweroutlettemplate' ,
1051+ 'dcim.add_interfacetemplate' ,
1052+ 'dcim.add_frontporttemplate' ,
1053+ 'dcim.add_rearporttemplate' ,
1054+ 'dcim.add_modulebaytemplate' ,
1055+ 'dcim.add_devicebaytemplate' ,
1056+ 'dcim.add_inventoryitemtemplate' ,
1057+ )
1058+
1059+ for value in ('' , 'null' , '3' , '"My console port"' , '{name: "My other console port"}' ):
1060+ with self .subTest (value = value ):
1061+ import_data = f'''
1062+ manufacturer: Manufacturer 1
1063+ model: TEST-3000
1064+ slug: test-3000
1065+ u_height: 1
1066+ console-ports: { value }
1067+ '''
1068+ form_data = {
1069+ 'data' : import_data ,
1070+ 'format' : 'yaml'
1071+ }
1072+
1073+ response = self .client .post (reverse ('dcim:devicetype_bulk_import' ), data = form_data , follow = True )
1074+ self .assertHttpStatus (response , 200 )
1075+ self .assertContains (response , "Record 1 console-ports: Must be a list." )
1076+
1077+ @override_settings (EXEMPT_VIEW_PERMISSIONS = ['*' ])
1078+ def test_import_nodict (self ):
1079+ # Add all required permissions to the test user
1080+ self .add_permissions (
1081+ 'dcim.view_devicetype' ,
1082+ 'dcim.add_devicetype' ,
1083+ 'dcim.add_consoleporttemplate' ,
1084+ 'dcim.add_consoleserverporttemplate' ,
1085+ 'dcim.add_powerporttemplate' ,
1086+ 'dcim.add_poweroutlettemplate' ,
1087+ 'dcim.add_interfacetemplate' ,
1088+ 'dcim.add_frontporttemplate' ,
1089+ 'dcim.add_rearporttemplate' ,
1090+ 'dcim.add_modulebaytemplate' ,
1091+ 'dcim.add_devicebaytemplate' ,
1092+ 'dcim.add_inventoryitemtemplate' ,
1093+ )
1094+
1095+ for value in ('' , 'null' , '3' , '"My console port"' , '["My other console port"]' ):
1096+ with self .subTest (value = value ):
1097+ import_data = f'''
1098+ manufacturer: Manufacturer 1
1099+ model: TEST-4000
1100+ slug: test-4000
1101+ u_height: 1
1102+ console-ports:
1103+ - { value }
1104+ '''
1105+ form_data = {
1106+ 'data' : import_data ,
1107+ 'format' : 'yaml'
1108+ }
1109+
1110+ response = self .client .post (reverse ('dcim:devicetype_bulk_import' ), data = form_data , follow = True )
1111+ self .assertHttpStatus (response , 200 )
1112+ self .assertContains (response , "Record 1 console-ports[1]: Must be a dictionary." )
1113+
9891114 def test_export_objects (self ):
9901115 url = reverse ('dcim:devicetype_list' )
9911116 self .add_permissions ('dcim.view_devicetype' )
0 commit comments