ipfabric_netbox 4.3.0b4__py3-none-any.whl → 4.3.0b6__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of ipfabric_netbox might be problematic. Click here for more details.

@@ -63,8 +63,8 @@ class IPFabricSourceTestCase(
63
63
  ViewTestCases.DeleteObjectViewTestCase,
64
64
  ViewTestCases.ListObjectsViewTestCase,
65
65
  ViewTestCases.BulkDeleteObjectsViewTestCase,
66
- # ViewTestCases.BulkRenameObjectsViewTestCase,
67
- # ViewTestCases.BulkEditObjectsViewTestCase,
66
+ ViewTestCases.BulkRenameObjectsViewTestCase,
67
+ ViewTestCases.BulkEditObjectsViewTestCase,
68
68
  # ViewTestCases.BulkImportObjectsViewTestCase,
69
69
  ):
70
70
  model = IPFabricSource
@@ -84,7 +84,7 @@ class IPFabricSourceTestCase(
84
84
  ),
85
85
  IPFabricSource(
86
86
  name="IP Fabric Source 2",
87
- type=IPFabricSourceTypeChoices.REMOTE,
87
+ type=IPFabricSourceTypeChoices.LOCAL,
88
88
  url="https://ipfabric2.example.com",
89
89
  status=DataSourceStatusChoices.COMPLETED,
90
90
  parameters={"auth": "token2", "verify": False, "timeout": 60},
@@ -488,7 +488,6 @@ class IPFabricSnapshotTestCase(
488
488
  self.assertTrue(response_snapshot.ipf_data.exists())
489
489
 
490
490
 
491
- # TODO: Get back to these tests
492
491
  class IPFabricDataTestCase(
493
492
  PluginPathMixin,
494
493
  # ViewTestCases.GetObjectViewTestCase,
@@ -607,8 +606,8 @@ class IPFabricSyncTestCase(
607
606
  ViewTestCases.DeleteObjectViewTestCase,
608
607
  ViewTestCases.ListObjectsViewTestCase,
609
608
  ViewTestCases.BulkDeleteObjectsViewTestCase,
610
- # ViewTestCases.BulkRenameObjectsViewTestCase,
611
- # ViewTestCases.BulkEditObjectsViewTestCase,
609
+ ViewTestCases.BulkRenameObjectsViewTestCase,
610
+ ViewTestCases.BulkEditObjectsViewTestCase,
612
611
  # ViewTestCases.BulkImportObjectsViewTestCase,
613
612
  ):
614
613
  model = IPFabricSync
@@ -839,9 +838,9 @@ class IPFabricTransformMapGroupTestCase(
839
838
  ViewTestCases.DeleteObjectViewTestCase,
840
839
  ViewTestCases.ListObjectsViewTestCase,
841
840
  ViewTestCases.BulkDeleteObjectsViewTestCase,
842
- # ViewTestCases.BulkRenameObjectsViewTestCase,
843
- # ViewTestCases.BulkEditObjectsViewTestCase,
844
- # ViewTestCases.BulkImportObjectsViewTestCase,
841
+ ViewTestCases.BulkRenameObjectsViewTestCase,
842
+ ViewTestCases.BulkEditObjectsViewTestCase,
843
+ ViewTestCases.BulkImportObjectsViewTestCase,
845
844
  ):
846
845
  model = IPFabricTransformMapGroup
847
846
 
@@ -870,6 +869,21 @@ class IPFabricTransformMapGroupTestCase(
870
869
  "description": "Test group description",
871
870
  }
872
871
 
872
+ cls.bulk_edit_data = {
873
+ "description": "Bulk updated description",
874
+ }
875
+
876
+ cls.csv_data = (
877
+ "name,description",
878
+ "First imported group,import test 1",
879
+ "Second imported group,import test 2",
880
+ )
881
+ cls.csv_update_data = (
882
+ "id,name,description",
883
+ f"{groups[0].pk},First renamed group,changed import test 1", # noqa: E231
884
+ f"{groups[1].pk},Second renamed group,changed import test 2", # noqa: E231
885
+ )
886
+
873
887
 
874
888
  class IPFabricTransformMapTestCase(
875
889
  PluginPathMixin,
@@ -880,9 +894,9 @@ class IPFabricTransformMapTestCase(
880
894
  ViewTestCases.DeleteObjectViewTestCase,
881
895
  ViewTestCases.ListObjectsViewTestCase,
882
896
  ViewTestCases.BulkDeleteObjectsViewTestCase,
883
- # ViewTestCases.BulkRenameObjectsViewTestCase,
884
- # ViewTestCases.BulkEditObjectsViewTestCase,
885
- # ViewTestCases.BulkImportObjectsViewTestCase,
897
+ ViewTestCases.BulkRenameObjectsViewTestCase,
898
+ ViewTestCases.BulkEditObjectsViewTestCase,
899
+ ViewTestCases.BulkImportObjectsViewTestCase,
886
900
  ):
887
901
  model = IPFabricTransformMap
888
902
  user_permissions = (
@@ -893,7 +907,11 @@ class IPFabricTransformMapTestCase(
893
907
  @classmethod
894
908
  def setUpTestData(cls):
895
909
  # Number of IPFabricTransformMaps created during migration
896
- cls.default_maps_count = 14
910
+ # Hardcoded since we need to make sure we have the correct count
911
+ cls.default_maps = IPFabricTransformMap.objects.filter(group__isnull=True)
912
+ assert cls.default_maps.count() == 14
913
+ # Remove all transform maps created in migrations to not interfere with tests
914
+ IPFabricTransformMap.objects.filter(group__isnull=True).delete()
897
915
 
898
916
  # Create required dependencies
899
917
  group = IPFabricTransformMapGroup.objects.create(
@@ -904,14 +922,16 @@ class IPFabricTransformMapTestCase(
904
922
  name="Test Cloning Group",
905
923
  description="Test group for cloning transform maps",
906
924
  )
925
+ bulk_edit_group = IPFabricTransformMapGroup.objects.create(
926
+ name="Test Bulk Edit Group",
927
+ description="Test group for bulk editing transform maps",
928
+ )
907
929
 
908
- # Create IPFabricTransformMap instances with groups for testing
909
930
  maps = (
910
931
  IPFabricTransformMap(
911
932
  name="Device Transform Map",
912
933
  source_model="device",
913
934
  target_model=ContentType.objects.get(app_label="dcim", model="device"),
914
- group=group,
915
935
  ),
916
936
  IPFabricTransformMap(
917
937
  name="Site Transform Map",
@@ -919,10 +939,30 @@ class IPFabricTransformMapTestCase(
919
939
  target_model=ContentType.objects.get(app_label="dcim", model="site"),
920
940
  group=group,
921
941
  ),
942
+ IPFabricTransformMap(
943
+ name="VLAN Transform Map",
944
+ source_model="vlan",
945
+ target_model=ContentType.objects.get(app_label="ipam", model="vlan"),
946
+ group=group,
947
+ ),
922
948
  )
923
949
  for map_obj in maps:
924
950
  map_obj.save()
925
951
 
952
+ IPFabricTransformField.objects.create(
953
+ transform_map=maps[0],
954
+ source_field="hostname",
955
+ target_field="name",
956
+ template="{{ object.hostname }}",
957
+ )
958
+ IPFabricRelationshipField.objects.create(
959
+ transform_map=maps[0],
960
+ source_model=ContentType.objects.get(app_label="dcim", model="site"),
961
+ target_field="site",
962
+ template="{{ object.siteName }}",
963
+ coalesce=True,
964
+ )
965
+
926
966
  cls.form_data = {
927
967
  "name": "Test Transform Map X",
928
968
  "source_model": "device",
@@ -932,6 +972,22 @@ class IPFabricTransformMapTestCase(
932
972
  "group": group.pk,
933
973
  }
934
974
 
975
+ cls.bulk_edit_data = {
976
+ "group": bulk_edit_group.pk,
977
+ }
978
+
979
+ cls.csv_data = (
980
+ "name,source_model,target_model,group",
981
+ "Manufacturer Transform Map,device,dcim.manufacturer,Test Group",
982
+ "IPAddress Transform Map,ipaddress,ipam.ipaddress,Test Group",
983
+ "Platform Transform Map,device,dcim.platform,",
984
+ )
985
+ cls.csv_update_data = (
986
+ "id,name,source_model,target_model,group",
987
+ f"{maps[0].pk},Prefix Transform Map,prefix,ipam.prefix,Test Group", # noqa: E231
988
+ f"{maps[1].pk},Manufacturer Transform Map,device,dcim.manufacturer,", # noqa: E231
989
+ )
990
+
935
991
  @override_settings(EXEMPT_VIEW_PERMISSIONS=["*"])
936
992
  def test_get_relationships(self):
937
993
  transform_map = self._get_queryset().first()
@@ -1166,7 +1222,8 @@ class IPFabricTransformMapTestCase(
1166
1222
  # Should show form errors
1167
1223
  self.assertHttpStatus(response, 200)
1168
1224
  self.assertContains(
1169
- response, "A transform map with this group and target model already exists."
1225
+ response,
1226
+ "A transform map with group 'Test Group' and target model 'DCIM | site' already exists.",
1170
1227
  )
1171
1228
  self.assertIn("X-Debug-HTMX-Partial", response)
1172
1229
 
@@ -1237,10 +1294,7 @@ class IPFabricTransformMapTestCase(
1237
1294
  @override_settings(EXEMPT_VIEW_PERMISSIONS=["*"])
1238
1295
  def test_restore_view_post_success(self):
1239
1296
  """Test POST request to restore view successfully deletes ungrouped maps and rebuilds them."""
1240
- default_maps = list(IPFabricTransformMap.objects.filter(group__isnull=True))
1241
- self.assertEqual(len(default_maps), self.default_maps_count)
1242
-
1243
- # Remove all transform maps created in migrations
1297
+ # Remove all existing transform maps
1244
1298
  IPFabricTransformMap.objects.filter(group__isnull=True).delete()
1245
1299
  self.assertEqual(
1246
1300
  IPFabricTransformMap.objects.filter(group__isnull=True).count(), 0
@@ -1258,9 +1312,9 @@ class IPFabricTransformMapTestCase(
1258
1312
  # Verify ungrouped transform maps were restored
1259
1313
  self.assertEqual(
1260
1314
  IPFabricTransformMap.objects.filter(group__isnull=True).count(),
1261
- self.default_maps_count,
1315
+ self.default_maps.count(),
1262
1316
  )
1263
- for map in default_maps:
1317
+ for map in self.default_maps:
1264
1318
  self.assertTrue(
1265
1319
  IPFabricTransformMap.objects.filter(
1266
1320
  name=map.name,
@@ -1288,140 +1342,139 @@ class IPFabricTransformMapTestCase(
1288
1342
  self.assertIn(response.status_code, [302, 403])
1289
1343
 
1290
1344
 
1291
- # TODO: These have no detail view, so it's failing of finding reverse URL
1292
- # class IPFabricTransformFieldTestCase(
1293
- # PluginPathMixin,
1294
- # # ViewTestCases.GetObjectViewTestCase,
1295
- # # ViewTestCases.GetObjectChangelogViewTestCase,
1296
- # ViewTestCases.CreateObjectViewTestCase,
1297
- # ViewTestCases.EditObjectViewTestCase,
1298
- # ViewTestCases.DeleteObjectViewTestCase,
1299
- # ViewTestCases.ListObjectsViewTestCase,
1300
- # ViewTestCases.BulkDeleteObjectsViewTestCase,
1301
- # # ViewTestCases.BulkRenameObjectsViewTestCase,
1302
- # # ViewTestCases.BulkEditObjectsViewTestCase,
1303
- # # ViewTestCases.BulkImportObjectsViewTestCase,
1304
- # ):
1305
- # model = IPFabricTransformField
1306
- #
1307
- # @classmethod
1308
- # def setUpTestData(cls):
1309
- # # Create required dependencies
1310
- # group = IPFabricTransformMapGroup.objects.create(
1311
- # name="Test Group",
1312
- # description="Test group for transform fields",
1313
- # )
1314
- #
1315
- # transform_map = IPFabricTransformMap.objects.create(
1316
- # name="Test Transform Map",
1317
- # source_model="devices",
1318
- # target_model=ContentType.objects.get(app_label="dcim", model="device"),
1319
- # group=group,
1320
- # )
1321
- #
1322
- # # Create three IPFabricTransformField instances for testing
1323
- # fields = (
1324
- # IPFabricTransformField(
1325
- # transform_map=transform_map,
1326
- # source_field="hostname",
1327
- # target_field="name",
1328
- # coalesce=False,
1329
- # template="{{ object.hostname }}",
1330
- # ),
1331
- # IPFabricTransformField(
1332
- # transform_map=transform_map,
1333
- # source_field="vendor",
1334
- # target_field="manufacturer",
1335
- # coalesce=True,
1336
- # template="{{ object.vendor }}",
1337
- # ),
1338
- # IPFabricTransformField(
1339
- # transform_map=transform_map,
1340
- # source_field="model",
1341
- # target_field="device_type",
1342
- # coalesce=False,
1343
- # template="{{ object.model }}",
1344
- # ),
1345
- # )
1346
- # for field in fields:
1347
- # field.save()
1348
- #
1349
- # cls.form_data = {
1350
- # "transform_map": transform_map.pk,
1351
- # "source_field": "serial_number",
1352
- # "target_field": "serial",
1353
- # "coalesce": False,
1354
- # "template": "{{ object.serial_number }}",
1355
- # }
1356
- #
1357
- #
1358
- # class IPFabricRelationshipFieldTestCase(
1359
- # PluginPathMixin,
1360
- # # ViewTestCases.GetObjectViewTestCase,
1361
- # # ViewTestCases.GetObjectChangelogViewTestCase,
1362
- # ViewTestCases.CreateObjectViewTestCase,
1363
- # ViewTestCases.EditObjectViewTestCase,
1364
- # ViewTestCases.DeleteObjectViewTestCase,
1365
- # ViewTestCases.ListObjectsViewTestCase,
1366
- # ViewTestCases.BulkDeleteObjectsViewTestCase,
1367
- # # ViewTestCases.BulkRenameObjectsViewTestCase,
1368
- # # ViewTestCases.BulkEditObjectsViewTestCase,
1369
- # # ViewTestCases.BulkImportObjectsViewTestCase,
1370
- # ):
1371
- # model = IPFabricRelationshipField
1372
- #
1373
- # @classmethod
1374
- # def setUpTestData(cls):
1375
- # # Create required dependencies
1376
- # group = IPFabricTransformMapGroup.objects.create(
1377
- # name="Test Group",
1378
- # description="Test group for relationship fields",
1379
- # )
1380
- #
1381
- # device_ct = ContentType.objects.get(app_label="dcim", model="device")
1382
- # site_ct = ContentType.objects.get(app_label="dcim", model="site")
1383
- #
1384
- # transform_map = IPFabricTransformMap.objects.create(
1385
- # name="Test Transform Map",
1386
- # source_model="devices",
1387
- # target_model=device_ct,
1388
- # group=group,
1389
- # )
1390
- #
1391
- # # Create three IPFabricRelationshipField instances for testing
1392
- # fields = (
1393
- # IPFabricRelationshipField(
1394
- # transform_map=transform_map,
1395
- # source_model=site_ct,
1396
- # target_field="site",
1397
- # coalesce=False,
1398
- # template="{{ object.site_id }}",
1399
- # ),
1400
- # IPFabricRelationshipField(
1401
- # transform_map=transform_map,
1402
- # source_model=device_ct,
1403
- # target_field="parent_device",
1404
- # coalesce=True,
1405
- # template="{{ object.parent_id }}",
1406
- # ),
1407
- # IPFabricRelationshipField(
1408
- # transform_map=transform_map,
1409
- # source_model=site_ct,
1410
- # target_field="location",
1411
- # coalesce=False,
1412
- # template="{{ object.location_id }}",
1413
- # ),
1414
- # )
1415
- # for field in fields:
1416
- # field.save()
1417
- #
1418
- # cls.form_data = {
1419
- # "transform_map": transform_map.pk,
1420
- # "source_model": site_ct.pk,
1421
- # "target_field": "site",
1422
- # "coalesce": False,
1423
- # "template": "{{ object.site_id }}",
1424
- # }
1345
+ class IPFabricTransformFieldTestCase(
1346
+ PluginPathMixin,
1347
+ # ViewTestCases.GetObjectViewTestCase,
1348
+ # ViewTestCases.GetObjectChangelogViewTestCase,
1349
+ ViewTestCases.CreateObjectViewTestCase,
1350
+ ViewTestCases.EditObjectViewTestCase,
1351
+ ViewTestCases.DeleteObjectViewTestCase,
1352
+ # ViewTestCases.ListObjectsViewTestCase,
1353
+ ViewTestCases.BulkDeleteObjectsViewTestCase,
1354
+ # ViewTestCases.BulkRenameObjectsViewTestCase,
1355
+ # ViewTestCases.BulkEditObjectsViewTestCase,
1356
+ # ViewTestCases.BulkImportObjectsViewTestCase,
1357
+ ):
1358
+ model = IPFabricTransformField
1359
+
1360
+ @classmethod
1361
+ def setUpTestData(cls):
1362
+ # Create required dependencies
1363
+ group = IPFabricTransformMapGroup.objects.create(
1364
+ name="Test Group",
1365
+ description="Test group for transform fields",
1366
+ )
1367
+
1368
+ transform_map = IPFabricTransformMap.objects.create(
1369
+ name="Test Transform Map",
1370
+ source_model="devices",
1371
+ target_model=ContentType.objects.get(app_label="dcim", model="device"),
1372
+ group=group,
1373
+ )
1374
+
1375
+ # Create three IPFabricTransformField instances for testing
1376
+ fields = (
1377
+ IPFabricTransformField(
1378
+ transform_map=transform_map,
1379
+ source_field="hostname",
1380
+ target_field="name",
1381
+ coalesce=False,
1382
+ template="{{ object.hostname }}",
1383
+ ),
1384
+ IPFabricTransformField(
1385
+ transform_map=transform_map,
1386
+ source_field="vendor",
1387
+ target_field="manufacturer",
1388
+ coalesce=True,
1389
+ template="{{ object.vendor }}",
1390
+ ),
1391
+ IPFabricTransformField(
1392
+ transform_map=transform_map,
1393
+ source_field="model",
1394
+ target_field="device_type",
1395
+ coalesce=False,
1396
+ template="{{ object.model }}",
1397
+ ),
1398
+ )
1399
+ for field in fields:
1400
+ field.save()
1401
+
1402
+ cls.form_data = {
1403
+ "transform_map": transform_map.pk,
1404
+ "source_field": "serial_number",
1405
+ "target_field": "serial",
1406
+ "coalesce": False,
1407
+ "template": "{{ object.serial_number }}",
1408
+ }
1409
+
1410
+
1411
+ class IPFabricRelationshipFieldTestCase(
1412
+ PluginPathMixin,
1413
+ # ViewTestCases.GetObjectViewTestCase,
1414
+ # ViewTestCases.GetObjectChangelogViewTestCase,
1415
+ ViewTestCases.CreateObjectViewTestCase,
1416
+ ViewTestCases.EditObjectViewTestCase,
1417
+ ViewTestCases.DeleteObjectViewTestCase,
1418
+ # ViewTestCases.ListObjectsViewTestCase,
1419
+ ViewTestCases.BulkDeleteObjectsViewTestCase,
1420
+ # ViewTestCases.BulkRenameObjectsViewTestCase,
1421
+ # ViewTestCases.BulkEditObjectsViewTestCase,
1422
+ # ViewTestCases.BulkImportObjectsViewTestCase,
1423
+ ):
1424
+ model = IPFabricRelationshipField
1425
+
1426
+ @classmethod
1427
+ def setUpTestData(cls):
1428
+ # Create required dependencies
1429
+ group = IPFabricTransformMapGroup.objects.create(
1430
+ name="Test Group",
1431
+ description="Test group for relationship fields",
1432
+ )
1433
+
1434
+ device_ct = ContentType.objects.get(app_label="dcim", model="device")
1435
+ site_ct = ContentType.objects.get(app_label="dcim", model="site")
1436
+
1437
+ transform_map = IPFabricTransformMap.objects.create(
1438
+ name="Test Transform Map",
1439
+ source_model="devices",
1440
+ target_model=device_ct,
1441
+ group=group,
1442
+ )
1443
+
1444
+ # Create three IPFabricRelationshipField instances for testing
1445
+ fields = (
1446
+ IPFabricRelationshipField(
1447
+ transform_map=transform_map,
1448
+ source_model=site_ct,
1449
+ target_field="site",
1450
+ coalesce=False,
1451
+ template="{{ object.site_id }}",
1452
+ ),
1453
+ IPFabricRelationshipField(
1454
+ transform_map=transform_map,
1455
+ source_model=device_ct,
1456
+ target_field="parent_device",
1457
+ coalesce=True,
1458
+ template="{{ object.parent_id }}",
1459
+ ),
1460
+ IPFabricRelationshipField(
1461
+ transform_map=transform_map,
1462
+ source_model=site_ct,
1463
+ target_field="location",
1464
+ coalesce=False,
1465
+ template="{{ object.location_id }}",
1466
+ ),
1467
+ )
1468
+ for field in fields:
1469
+ field.save()
1470
+
1471
+ cls.form_data = {
1472
+ "transform_map": transform_map.pk,
1473
+ "source_model": site_ct.pk,
1474
+ "target_field": "site",
1475
+ "coalesce": False,
1476
+ "template": "{{ object.site_id }}",
1477
+ }
1425
1478
 
1426
1479
 
1427
1480
  class IPFabricIngestionTestCase(
@@ -1432,7 +1485,7 @@ class IPFabricIngestionTestCase(
1432
1485
  # ViewTestCases.EditObjectViewTestCase,
1433
1486
  # ViewTestCases.DeleteObjectViewTestCase,
1434
1487
  ViewTestCases.ListObjectsViewTestCase,
1435
- # ViewTestCases.BulkDeleteObjectsViewTestCase,
1488
+ ViewTestCases.BulkDeleteObjectsViewTestCase,
1436
1489
  # ViewTestCases.BulkRenameObjectsViewTestCase,
1437
1490
  # ViewTestCases.BulkEditObjectsViewTestCase,
1438
1491
  # ViewTestCases.BulkImportObjectsViewTestCase,