ipfabric_netbox 4.2.2__tar.gz → 4.2.2b1__tar.gz

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.

Files changed (89) hide show
  1. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/PKG-INFO +8 -7
  2. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/__init__.py +1 -1
  3. ipfabric_netbox-4.2.2b1/ipfabric_netbox/api/__init__.py +1 -0
  4. ipfabric_netbox-4.2.2b1/ipfabric_netbox/api/serializers.py +246 -0
  5. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/api/urls.py +4 -4
  6. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/api/views.py +18 -19
  7. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/choices.py +0 -12
  8. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/filtersets.py +67 -4
  9. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/forms.py +99 -140
  10. ipfabric_netbox-4.2.2b1/ipfabric_netbox/graphql/__init__.py +23 -0
  11. ipfabric_netbox-4.2.2b1/ipfabric_netbox/graphql/enums.py +35 -0
  12. ipfabric_netbox-4.2.2b1/ipfabric_netbox/graphql/filters.py +317 -0
  13. ipfabric_netbox-4.2.2b1/ipfabric_netbox/graphql/schema.py +101 -0
  14. ipfabric_netbox-4.2.2b1/ipfabric_netbox/graphql/types.py +216 -0
  15. ipfabric_netbox-4.2.2b1/ipfabric_netbox/migrations/0016_tags_and_changelog_for_snapshots.py +31 -0
  16. ipfabric_netbox-4.2.2b1/ipfabric_netbox/migrations/0017_ipfabricsync_update_custom_fields.py +17 -0
  17. ipfabric_netbox-4.2.2b1/ipfabric_netbox/migrations/0018_remove_type_field.py +17 -0
  18. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/models.py +10 -10
  19. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/tables.py +30 -9
  20. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/templates/ipfabric_netbox/ipfabricsource.html +1 -1
  21. ipfabric_netbox-4.2.2b1/ipfabric_netbox/tests/api/test_api.py +879 -0
  22. ipfabric_netbox-4.2.2b1/ipfabric_netbox/tests/test_forms.py +1440 -0
  23. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/tests/test_models.py +47 -11
  24. ipfabric_netbox-4.2.2b1/ipfabric_netbox/utilities/__init__.py +0 -0
  25. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/utilities/ipfutils.py +43 -23
  26. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/views.py +6 -8
  27. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/pyproject.toml +6 -6
  28. ipfabric_netbox-4.2.2/ipfabric_netbox/api/__init__.py +0 -2
  29. ipfabric_netbox-4.2.2/ipfabric_netbox/api/nested_serializers.py +0 -78
  30. ipfabric_netbox-4.2.2/ipfabric_netbox/api/serializers.py +0 -189
  31. ipfabric_netbox-4.2.2/ipfabric_netbox/templates/ipfabric_netbox/ipfabricsync_list.html +0 -71
  32. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/README.md +0 -0
  33. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/data/transform_map.json +0 -0
  34. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/exceptions.py +0 -0
  35. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/jobs.py +0 -0
  36. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/migrations/0001_initial.py +0 -0
  37. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/migrations/0001_initial_squashed_0013_switch_to_branching_plugin.py +0 -0
  38. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/migrations/0002_ipfabricsnapshot_status.py +0 -0
  39. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/migrations/0003_ipfabricsource_type_and_more.py +0 -0
  40. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/migrations/0004_ipfabricsync_auto_merge.py +0 -0
  41. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/migrations/0005_alter_ipfabricrelationshipfield_source_model_and_more.py +0 -0
  42. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/migrations/0006_alter_ipfabrictransformmap_target_model.py +0 -0
  43. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/migrations/0007_prepare_custom_fields.py +0 -0
  44. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/migrations/0008_prepare_transform_maps.py +0 -0
  45. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/migrations/0009_transformmap_changes_for_netbox_v4_2.py +0 -0
  46. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/migrations/0010_remove_uuid_from_get_or_create.py +0 -0
  47. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/migrations/0011_update_part_number_DCIM_inventory_item_template.py +0 -0
  48. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/migrations/0012_remove_status_field.py +0 -0
  49. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/migrations/0013_switch_to_branching_plugin.py +0 -0
  50. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/migrations/0014_ipfabrictransformmapgroup_ipfabrictransformmap_group.py +0 -0
  51. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/migrations/0015_ipfabricingestionissue.py +0 -0
  52. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/migrations/__init__.py +0 -0
  53. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/navigation.py +0 -0
  54. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/signals.py +0 -0
  55. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/template_content.py +0 -0
  56. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/templates/ipfabric_netbox/inc/clone_form.html +0 -0
  57. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/templates/ipfabric_netbox/inc/diff.html +0 -0
  58. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/templates/ipfabric_netbox/inc/json.html +0 -0
  59. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/templates/ipfabric_netbox/inc/logs_pending.html +0 -0
  60. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/templates/ipfabric_netbox/inc/merge_form.html +0 -0
  61. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/templates/ipfabric_netbox/inc/site_topology_button.html +0 -0
  62. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/templates/ipfabric_netbox/inc/site_topology_modal.html +0 -0
  63. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/templates/ipfabric_netbox/inc/snapshotdata.html +0 -0
  64. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/templates/ipfabric_netbox/inc/transform_map_field_map.html +0 -0
  65. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/templates/ipfabric_netbox/inc/transform_map_relationship_map.html +0 -0
  66. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/templates/ipfabric_netbox/ipfabric_table.html +0 -0
  67. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/templates/ipfabric_netbox/ipfabricingestion.html +0 -0
  68. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/templates/ipfabric_netbox/ipfabricsnapshot.html +0 -0
  69. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/templates/ipfabric_netbox/ipfabricsync.html +0 -0
  70. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/templates/ipfabric_netbox/ipfabrictransformmap.html +0 -0
  71. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/templates/ipfabric_netbox/ipfabrictransformmap_list.html +0 -0
  72. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/templates/ipfabric_netbox/ipfabrictransformmap_restore.html +0 -0
  73. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/templates/ipfabric_netbox/ipfabrictransformmapgroup.html +0 -0
  74. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/templates/ipfabric_netbox/partials/ingestion_all.html +0 -0
  75. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/templates/ipfabric_netbox/partials/ingestion_progress.html +0 -0
  76. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/templates/ipfabric_netbox/partials/ingestion_statistics.html +0 -0
  77. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/templates/ipfabric_netbox/partials/ingestion_status.html +0 -0
  78. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/templates/ipfabric_netbox/partials/job_logs.html +0 -0
  79. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/templates/ipfabric_netbox/partials/object_tabs.html +0 -0
  80. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/templates/ipfabric_netbox/partials/sync_last_ingestion.html +0 -0
  81. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/templates/static/ipfabric_netbox/css/rack.css +0 -0
  82. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/templatetags/__init__.py +0 -0
  83. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/templatetags/ipfabric_netbox_helpers.py +0 -0
  84. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/tests/__init__.py +0 -0
  85. {ipfabric_netbox-4.2.2/ipfabric_netbox/utilities → ipfabric_netbox-4.2.2b1/ipfabric_netbox/tests/api}/__init__.py +0 -0
  86. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/urls.py +0 -0
  87. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/utilities/logging.py +0 -0
  88. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/utilities/nbutils.py +0 -0
  89. {ipfabric_netbox-4.2.2 → ipfabric_netbox-4.2.2b1}/ipfabric_netbox/utilities/transform_map.py +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.4
2
2
  Name: ipfabric_netbox
3
- Version: 4.2.2
3
+ Version: 4.2.2b1
4
4
  Summary: NetBox plugin to sync IP Fabric data into NetBox
5
5
  License: MIT
6
6
  Keywords: netbox,ipfabric,plugin,sync
@@ -14,15 +14,16 @@ Classifier: Programming Language :: Python :: 3.10
14
14
  Classifier: Programming Language :: Python :: 3.11
15
15
  Classifier: Programming Language :: Python :: 3.12
16
16
  Classifier: Programming Language :: Python :: 3.13
17
+ Classifier: Programming Language :: Python :: 3.14
17
18
  Provides-Extra: ipfabric-6-10
18
19
  Provides-Extra: ipfabric-7-0
19
20
  Provides-Extra: ipfabric-7-2
20
21
  Provides-Extra: ipfabric-7-3
21
- Requires-Dist: ipfabric (>=6.10.0,<6.11.0) ; extra == "ipfabric_6_10" and extra != "ipfabric_7_0" and extra != "ipfabric_7_2"
22
- Requires-Dist: ipfabric (>=6.6.4) ; extra != "ipfabric_6_10" and extra != "ipfabric_7_0" and extra != "ipfabric_7_2"
23
- Requires-Dist: ipfabric (>=7.0.0,<7.1.0) ; extra != "ipfabric_6_10" and extra == "ipfabric_7_0" and extra != "ipfabric_7_2"
24
- Requires-Dist: ipfabric (>=7.2.0,<7.3.0) ; extra == "ipfabric-6-10" or extra == "ipfabric-7-0" or extra == "ipfabric-7-2" or extra == "ipfabric-7-3"
25
- Requires-Dist: ipfabric (>=7.3.0,<7.4.0) ; extra == "ipfabric-6-10" or extra == "ipfabric-7-0" or extra == "ipfabric-7-2" or extra == "ipfabric-7-3"
22
+ Requires-Dist: ipfabric (>=6.10.0,<6.11.0) ; extra == "ipfabric_6_10" and extra != "ipfabric_7_0" and extra != "ipfabric_7_2" and extra != "ipfabric_7_3"
23
+ Requires-Dist: ipfabric (>=6.6.4) ; extra != "ipfabric_6_10" and extra != "ipfabric_7_0" and extra != "ipfabric_7_2" and extra != "ipfabric_7_3"
24
+ Requires-Dist: ipfabric (>=7.0.0,<7.1.0) ; extra != "ipfabric_6_10" and extra == "ipfabric_7_0" and extra != "ipfabric_7_2" and extra != "ipfabric_7_3"
25
+ Requires-Dist: ipfabric (>=7.2.0,<7.3.0) ; extra != "ipfabric_6_10" and extra != "ipfabric_7_0" and extra == "ipfabric_7_2" and extra != "ipfabric_7_3"
26
+ Requires-Dist: ipfabric (>=7.3.0,<7.4.0) ; extra != "ipfabric_6_10" and extra != "ipfabric_7_0" and extra != "ipfabric_7_2" and extra == "ipfabric_7_3"
26
27
  Requires-Dist: netboxlabs-netbox-branching (>=0.5.5,<0.6.0)
27
28
  Requires-Dist: netutils
28
29
  Project-URL: Bug Tracker, https://gitlab.com/ip-fabric/integrations/ipfabric-netbox-sync/-/issues
@@ -6,7 +6,7 @@ class NetboxIPFabricConfig(PluginConfig):
6
6
  name = "ipfabric_netbox"
7
7
  verbose_name = "NetBox IP Fabric SoT Plugin"
8
8
  description = "Sync IP Fabric into NetBox"
9
- version = "4.2.2"
9
+ version = "4.2.2b1"
10
10
  base_url = "ipfabric"
11
11
  min_version = "4.2.4"
12
12
 
@@ -0,0 +1 @@
1
+ from .serializers import * # noqa: F401, F403
@@ -0,0 +1,246 @@
1
+ from core.choices import DataSourceStatusChoices
2
+ from django.contrib.contenttypes.models import ContentType
3
+ from netbox.api.fields import ChoiceField
4
+ from netbox.api.fields import ContentTypeField
5
+ from netbox.api.fields import RelatedObjectCountField
6
+ from netbox.api.serializers import NestedGroupModelSerializer
7
+ from netbox_branching.api.serializers import BranchSerializer
8
+ from rest_framework import serializers
9
+
10
+ from ipfabric_netbox.models import IPFabricIngestion
11
+ from ipfabric_netbox.models import IPFabricIngestionIssue
12
+ from ipfabric_netbox.models import IPFabricRelationshipField
13
+ from ipfabric_netbox.models import IPFabricRelationshipFieldSourceModels
14
+ from ipfabric_netbox.models import IPFabricSnapshot
15
+ from ipfabric_netbox.models import IPFabricSource
16
+ from ipfabric_netbox.models import IPFabricSupportedSyncModels
17
+ from ipfabric_netbox.models import IPFabricSync
18
+ from ipfabric_netbox.models import IPFabricTransformField
19
+ from ipfabric_netbox.models import IPFabricTransformMap
20
+ from ipfabric_netbox.models import IPFabricTransformMapGroup
21
+
22
+ __all__ = (
23
+ "IPFabricSyncSerializer",
24
+ "IPFabricSnapshotSerializer",
25
+ "IPFabricRelationshipFieldSerializer",
26
+ "IPFabricTransformFieldSerializer",
27
+ "IPFabricTransformMapSerializer",
28
+ "IPFabricTransformMapGroupSerializer",
29
+ "IPFabricIngestionSerializer",
30
+ "IPFabricIngestionIssueSerializer",
31
+ "IPFabricSourceSerializer",
32
+ )
33
+
34
+
35
+ class IPFabricTransformMapGroupSerializer(NestedGroupModelSerializer):
36
+ transform_maps_count = RelatedObjectCountField("transform_maps")
37
+
38
+ class Meta:
39
+ model = IPFabricTransformMapGroup
40
+ fields = (
41
+ "id",
42
+ "name",
43
+ "description",
44
+ "transform_maps_count",
45
+ "created",
46
+ "last_updated",
47
+ )
48
+ brief_fields = (
49
+ "id",
50
+ "name",
51
+ "description",
52
+ )
53
+
54
+
55
+ class IPFabricTransformMapSerializer(NestedGroupModelSerializer):
56
+ group = IPFabricTransformMapGroupSerializer(
57
+ nested=True, required=False, allow_null=True
58
+ )
59
+ target_model = ContentTypeField(
60
+ queryset=ContentType.objects.filter(IPFabricSupportedSyncModels)
61
+ )
62
+
63
+ class Meta:
64
+ model = IPFabricTransformMap
65
+ fields = (
66
+ "id",
67
+ "name",
68
+ "group",
69
+ "source_model",
70
+ "target_model",
71
+ "created",
72
+ "last_updated",
73
+ )
74
+ brief_fields = (
75
+ "id",
76
+ "name",
77
+ "group",
78
+ "source_model",
79
+ "target_model",
80
+ )
81
+
82
+
83
+ class IPFabricTransformFieldSerializer(NestedGroupModelSerializer):
84
+ transform_map = IPFabricTransformMapSerializer(nested=True)
85
+
86
+ class Meta:
87
+ model = IPFabricTransformField
88
+ fields = (
89
+ "id",
90
+ "transform_map",
91
+ "source_field",
92
+ "target_field",
93
+ "coalesce",
94
+ "template",
95
+ )
96
+
97
+
98
+ class IPFabricRelationshipFieldSerializer(NestedGroupModelSerializer):
99
+ transform_map = IPFabricTransformMapSerializer(nested=True)
100
+ source_model = ContentTypeField(
101
+ queryset=ContentType.objects.filter(IPFabricRelationshipFieldSourceModels)
102
+ )
103
+
104
+ class Meta:
105
+ model = IPFabricRelationshipField
106
+ fields = (
107
+ "id",
108
+ "transform_map",
109
+ "source_model",
110
+ "target_field",
111
+ "coalesce",
112
+ "template",
113
+ )
114
+
115
+
116
+ class IPFabricSourceSerializer(NestedGroupModelSerializer):
117
+ status = ChoiceField(choices=DataSourceStatusChoices, read_only=True)
118
+ url = serializers.URLField()
119
+
120
+ class Meta:
121
+ model = IPFabricSource
122
+ fields = (
123
+ "id",
124
+ "url",
125
+ "display",
126
+ "name",
127
+ "type",
128
+ "status",
129
+ "last_synced",
130
+ "description",
131
+ "comments",
132
+ "parameters",
133
+ "created",
134
+ "last_updated",
135
+ )
136
+ brief_fields = (
137
+ "display",
138
+ "id",
139
+ "name",
140
+ "status",
141
+ "type",
142
+ "url",
143
+ )
144
+
145
+
146
+ class IPFabricSnapshotSerializer(NestedGroupModelSerializer):
147
+ source = IPFabricSourceSerializer(nested=True, read_only=True)
148
+ data = serializers.JSONField()
149
+ display = serializers.CharField(source="__str__", read_only=True)
150
+
151
+ class Meta:
152
+ model = IPFabricSnapshot
153
+ fields = (
154
+ "id",
155
+ "display",
156
+ "name",
157
+ "source",
158
+ "snapshot_id",
159
+ "status",
160
+ "data",
161
+ "date",
162
+ "created",
163
+ "last_updated",
164
+ )
165
+ brief_fields = (
166
+ "display",
167
+ "id",
168
+ "name",
169
+ "source",
170
+ "snapshot_id",
171
+ "status",
172
+ "data",
173
+ "date",
174
+ )
175
+
176
+
177
+ class IPFabricSyncSerializer(NestedGroupModelSerializer):
178
+ snapshot_data = IPFabricSnapshotSerializer(nested=True)
179
+
180
+ class Meta:
181
+ model = IPFabricSync
182
+ fields = (
183
+ "id",
184
+ "name",
185
+ "snapshot_data",
186
+ "status",
187
+ "parameters",
188
+ "auto_merge",
189
+ "last_synced",
190
+ "scheduled",
191
+ "interval",
192
+ "user",
193
+ )
194
+ brief_fields = (
195
+ "auto_merge",
196
+ "id",
197
+ "last_synced",
198
+ "name",
199
+ "parameters",
200
+ "status",
201
+ )
202
+
203
+
204
+ class IPFabricIngestionSerializer(NestedGroupModelSerializer):
205
+ branch = BranchSerializer(read_only=True)
206
+ sync = IPFabricSyncSerializer(nested=True)
207
+
208
+ class Meta:
209
+ model = IPFabricIngestion
210
+ fields = (
211
+ "id",
212
+ "name",
213
+ "branch",
214
+ "sync",
215
+ )
216
+ brief_fields = (
217
+ "id",
218
+ "name",
219
+ "branch",
220
+ "sync",
221
+ )
222
+
223
+
224
+ class IPFabricIngestionIssueSerializer(NestedGroupModelSerializer):
225
+ ingestion = IPFabricIngestionSerializer(nested=True)
226
+
227
+ class Meta:
228
+ model = IPFabricIngestionIssue
229
+ fields = (
230
+ "id",
231
+ "ingestion",
232
+ "timestamp",
233
+ "model",
234
+ "message",
235
+ "raw_data",
236
+ "coalesce_fields",
237
+ "defaults",
238
+ "exception",
239
+ )
240
+ brief_fields = (
241
+ "exception",
242
+ "id",
243
+ "ingestion",
244
+ "message",
245
+ "model",
246
+ )
@@ -3,11 +3,11 @@ from netbox.api.routers import NetBoxRouter
3
3
 
4
4
  from ipfabric_netbox.api.views import IPFabricIngestionIssueViewSet
5
5
  from ipfabric_netbox.api.views import IPFabricIngestionViewSet
6
- from ipfabric_netbox.api.views import IPFabricRelationshipFieldiewSet
6
+ from ipfabric_netbox.api.views import IPFabricRelationshipFieldViewSet
7
7
  from ipfabric_netbox.api.views import IPFabricSnapshotViewSet
8
8
  from ipfabric_netbox.api.views import IPFabricSourceViewSet
9
9
  from ipfabric_netbox.api.views import IPFabricSyncViewSet
10
- from ipfabric_netbox.api.views import IPFabricTransformFieldiewSet
10
+ from ipfabric_netbox.api.views import IPFabricTransformFieldViewSet
11
11
  from ipfabric_netbox.api.views import IPFabricTransformMapGroupViewSet
12
12
  from ipfabric_netbox.api.views import IPFabricTransformMapViewSet
13
13
 
@@ -20,6 +20,6 @@ router.register("transform-map", IPFabricTransformMapViewSet)
20
20
  router.register("sync", IPFabricSyncViewSet)
21
21
  router.register("ingestion", IPFabricIngestionViewSet)
22
22
  router.register("ingestion-issues", IPFabricIngestionIssueViewSet)
23
- router.register("transform-field", IPFabricTransformFieldiewSet)
24
- router.register("relationship-field", IPFabricRelationshipFieldiewSet)
23
+ router.register("transform-field", IPFabricTransformFieldViewSet)
24
+ router.register("relationship-field", IPFabricRelationshipFieldViewSet)
25
25
  urlpatterns = router.urls
@@ -14,6 +14,7 @@ from .serializers import IPFabricSyncSerializer
14
14
  from .serializers import IPFabricTransformFieldSerializer
15
15
  from .serializers import IPFabricTransformMapGroupSerializer
16
16
  from .serializers import IPFabricTransformMapSerializer
17
+ from ipfabric_netbox.filtersets import IPFabricRelationshipFieldFilterSet
17
18
  from ipfabric_netbox.filtersets import IPFabricSnapshotFilterSet
18
19
  from ipfabric_netbox.filtersets import IPFabricSourceFilterSet
19
20
  from ipfabric_netbox.filtersets import IPFabricTransformFieldFilterSet
@@ -29,29 +30,29 @@ from ipfabric_netbox.models import IPFabricTransformMap
29
30
  from ipfabric_netbox.models import IPFabricTransformMapGroup
30
31
 
31
32
 
32
- class IPFabricTransformMapGroupViewSet(NetBoxReadOnlyModelViewSet):
33
+ class IPFabricTransformMapGroupViewSet(NetBoxModelViewSet):
33
34
  queryset = IPFabricTransformMapGroup.objects.all()
34
35
  serializer_class = IPFabricTransformMapGroupSerializer
35
36
 
36
37
 
37
- class IPFabricTransformMapViewSet(NetBoxReadOnlyModelViewSet):
38
+ class IPFabricTransformMapViewSet(NetBoxModelViewSet):
38
39
  queryset = IPFabricTransformMap.objects.all()
39
40
  serializer_class = IPFabricTransformMapSerializer
40
41
 
41
42
 
42
- class IPFabricTransformFieldiewSet(NetBoxReadOnlyModelViewSet):
43
+ class IPFabricTransformFieldViewSet(NetBoxModelViewSet):
43
44
  queryset = IPFabricTransformField.objects.all()
44
45
  serializer_class = IPFabricTransformFieldSerializer
45
46
  filterset_class = IPFabricTransformFieldFilterSet
46
47
 
47
48
 
48
- class IPFabricRelationshipFieldiewSet(NetBoxReadOnlyModelViewSet):
49
+ class IPFabricRelationshipFieldViewSet(NetBoxModelViewSet):
49
50
  queryset = IPFabricRelationshipField.objects.all()
50
51
  serializer_class = IPFabricRelationshipFieldSerializer
51
- filterset_class = IPFabricTransformFieldFilterSet
52
+ filterset_class = IPFabricRelationshipFieldFilterSet
52
53
 
53
54
 
54
- class IPFabricSyncViewSet(NetBoxReadOnlyModelViewSet):
55
+ class IPFabricSyncViewSet(NetBoxModelViewSet):
55
56
  queryset = IPFabricSync.objects.all()
56
57
  serializer_class = IPFabricSyncSerializer
57
58
 
@@ -66,7 +67,7 @@ class IPFabricIngestionIssueViewSet(NetBoxReadOnlyModelViewSet):
66
67
  serializer_class = IPFabricIngestionIssueSerializer
67
68
 
68
69
 
69
- class IPFabricSnapshotViewSet(NetBoxModelViewSet):
70
+ class IPFabricSnapshotViewSet(NetBoxReadOnlyModelViewSet):
70
71
  queryset = IPFabricSnapshot.objects.all()
71
72
  serializer_class = IPFabricSnapshotSerializer
72
73
  filterset_class = IPFabricSnapshotFilterSet
@@ -79,24 +80,21 @@ class IPFabricSnapshotViewSet(NetBoxModelViewSet):
79
80
  raw_data._raw_delete(raw_data.db)
80
81
  return Response({"status": "success"})
81
82
  elif request.method == "PATCH":
82
- transaction.set_autocommit(False)
83
- IPFabricData.objects.bulk_create(
84
- [
85
- IPFabricData(
86
- snapshot_data=snapshot, data=item["data"], type=item["type"]
87
- )
88
- for item in request.data["data"]
89
- ],
90
- batch_size=5000,
91
- )
92
- transaction.commit()
83
+ with transaction.atomic():
84
+ IPFabricData.objects.bulk_create(
85
+ [
86
+ IPFabricData(snapshot_data=snapshot, data=item["data"])
87
+ for item in request.data["data"]
88
+ ],
89
+ batch_size=5000,
90
+ )
93
91
  return Response({"status": "success"})
94
92
 
95
93
  @action(detail=True, methods=["get"], url_path="sites")
96
94
  def sites(self, request, pk):
97
95
  q = request.GET.get("q", None)
98
96
  snapshot = IPFabricSnapshot.objects.get(pk=pk)
99
- new_sites = {"results": []}
97
+ new_sites = {"count": 0, "results": []}
100
98
  if snapshot.data:
101
99
  sites = snapshot.data.get("sites", None)
102
100
  num = 0
@@ -112,6 +110,7 @@ class IPFabricSnapshotViewSet(NetBoxModelViewSet):
112
110
  {"display": site, "name": site, "id": site}
113
111
  )
114
112
  num += 1
113
+ new_sites["count"] = num
115
114
  return Response(new_sites)
116
115
  else:
117
116
  return Response([])
@@ -198,18 +198,6 @@ class IPFabricSnapshotStatusModelChoices(ChoiceSet):
198
198
  ]
199
199
 
200
200
 
201
- class IPFabricSyncTypeChoices(ChoiceSet):
202
- ALL = "all"
203
- DCIM = "dcim"
204
- IPAM = "ipam"
205
-
206
- CHOICES = (
207
- (ALL, _("All"), "gray"),
208
- (DCIM, _("DCIM"), "blue"),
209
- (IPAM, _("IPAM"), "blue"),
210
- )
211
-
212
-
213
201
  class IPFabricSourceTypeChoices(ChoiceSet):
214
202
  LOCAL = "local"
215
203
  REMOTE = "remote"
@@ -11,9 +11,11 @@ from netbox_branching.models import ChangeDiff
11
11
  from .models import IPFabricData
12
12
  from .models import IPFabricIngestion
13
13
  from .models import IPFabricIngestionIssue
14
+ from .models import IPFabricRelationshipField
14
15
  from .models import IPFabricSnapshot
15
16
  from .models import IPFabricSource
16
17
  from .models import IPFabricSync
18
+ from .models import IPFabricTransformField
17
19
  from .models import IPFabricTransformMap
18
20
  from .models import IPFabricTransformMapGroup
19
21
 
@@ -72,14 +74,12 @@ class IPFabricDataFilterSet(BaseFilterSet):
72
74
 
73
75
  class Meta:
74
76
  model = IPFabricData
75
- fields = ["snapshot_data", "type"]
77
+ fields = ["snapshot_data"]
76
78
 
77
79
  def search(self, queryset, name, value):
78
80
  if not value.strip():
79
81
  return queryset
80
- return queryset.filter(
81
- Q(snapshot_data__icontains=value) | Q(type__icontains=value)
82
- )
82
+ return queryset.filter(Q(snapshot_data__icontains=value))
83
83
 
84
84
 
85
85
  class IPFabricSnapshotFilterSet(ChangeLoggedModelFilterSet):
@@ -193,3 +193,66 @@ class IPFabricTransformFieldFilterSet(BaseFilterSet):
193
193
  transform_map = django_filters.ModelMultipleChoiceFilter(
194
194
  queryset=IPFabricTransformMap.objects.all(), label=_("Transform Map")
195
195
  )
196
+
197
+ class Meta:
198
+ model = IPFabricTransformField
199
+ fields = (
200
+ "id",
201
+ "transform_map",
202
+ "source_field",
203
+ "target_field",
204
+ "coalesce",
205
+ "template",
206
+ )
207
+
208
+
209
+ class IPFabricRelationshipFieldFilterSet(BaseFilterSet):
210
+ transform_map = django_filters.ModelMultipleChoiceFilter(
211
+ queryset=IPFabricTransformMap.objects.all(), label=_("Transform Map")
212
+ )
213
+
214
+ class Meta:
215
+ model = IPFabricRelationshipField
216
+ fields = (
217
+ "id",
218
+ "transform_map",
219
+ "source_model",
220
+ "target_field",
221
+ "coalesce",
222
+ "template",
223
+ )
224
+
225
+
226
+ class IPFabricSyncFilterSet(ChangeLoggedModelFilterSet):
227
+ q = django_filters.CharFilter(method="search")
228
+ snapshot_data_id = django_filters.ModelMultipleChoiceFilter(
229
+ queryset=IPFabricSnapshot.objects.all(),
230
+ label=_("Snapshot (ID)"),
231
+ )
232
+ snapshot_data = django_filters.ModelMultipleChoiceFilter(
233
+ field_name="snapshot_data__name",
234
+ queryset=IPFabricSnapshot.objects.all(),
235
+ to_field_name="name",
236
+ label=_("Snapshot (name)"),
237
+ )
238
+
239
+ class Meta:
240
+ model = IPFabricSync
241
+ fields = (
242
+ "id",
243
+ "name",
244
+ "snapshot_data",
245
+ "snapshot_data_id",
246
+ "status",
247
+ "auto_merge",
248
+ "last_synced",
249
+ "scheduled",
250
+ "interval",
251
+ )
252
+
253
+ def search(self, queryset, name, value):
254
+ if not value.strip():
255
+ return queryset
256
+ return queryset.filter(
257
+ Q(name__icontains=value) | Q(snapshot_data__name__icontains=value)
258
+ )