ipfabric_netbox 4.2.0b6__tar.gz → 4.2.0b8__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 (85) hide show
  1. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/PKG-INFO +1 -1
  2. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/__init__.py +1 -1
  3. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/api/serializers.py +0 -1
  4. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/api/views.py +1 -3
  5. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/choices.py +0 -12
  6. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/filtersets.py +2 -5
  7. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/forms.py +3 -12
  8. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/graphql/enums.py +0 -3
  9. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/graphql/filters.py +157 -106
  10. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/graphql/types.py +51 -30
  11. ipfabric_netbox-4.2.0b8/ipfabric_netbox/migrations/0018_remove_type_field.py +17 -0
  12. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/models.py +4 -6
  13. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/tables.py +30 -9
  14. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/tests/api/test_api.py +0 -12
  15. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/tests/test_models.py +0 -1
  16. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/views.py +6 -8
  17. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/pyproject.toml +1 -1
  18. ipfabric_netbox-4.2.0b6/ipfabric_netbox/templates/ipfabric_netbox/ipfabricsync_list.html +0 -71
  19. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/README.md +0 -0
  20. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/api/__init__.py +0 -0
  21. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/api/urls.py +0 -0
  22. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/data/transform_map.json +0 -0
  23. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/exceptions.py +0 -0
  24. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/graphql/__init__.py +0 -0
  25. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/graphql/schema.py +0 -0
  26. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/jobs.py +0 -0
  27. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/migrations/0001_initial.py +0 -0
  28. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/migrations/0001_initial_squashed_0013_switch_to_branching_plugin.py +0 -0
  29. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/migrations/0002_ipfabricsnapshot_status.py +0 -0
  30. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/migrations/0003_ipfabricsource_type_and_more.py +0 -0
  31. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/migrations/0004_ipfabricsync_auto_merge.py +0 -0
  32. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/migrations/0005_alter_ipfabricrelationshipfield_source_model_and_more.py +0 -0
  33. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/migrations/0006_alter_ipfabrictransformmap_target_model.py +0 -0
  34. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/migrations/0007_prepare_custom_fields.py +0 -0
  35. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/migrations/0008_prepare_transform_maps.py +0 -0
  36. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/migrations/0009_transformmap_changes_for_netbox_v4_2.py +0 -0
  37. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/migrations/0010_remove_uuid_from_get_or_create.py +0 -0
  38. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/migrations/0011_update_part_number_DCIM_inventory_item_template.py +0 -0
  39. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/migrations/0012_remove_status_field.py +0 -0
  40. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/migrations/0013_switch_to_branching_plugin.py +0 -0
  41. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/migrations/0014_ipfabrictransformmapgroup_ipfabrictransformmap_group.py +0 -0
  42. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/migrations/0015_ipfabricingestionissue.py +0 -0
  43. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/migrations/0016_tags_and_changelog_for_snapshots.py +0 -0
  44. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/migrations/0017_ipfabricsync_update_custom_fields.py +0 -0
  45. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/migrations/__init__.py +0 -0
  46. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/navigation.py +0 -0
  47. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/signals.py +0 -0
  48. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/template_content.py +0 -0
  49. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/templates/ipfabric_netbox/inc/clone_form.html +0 -0
  50. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/templates/ipfabric_netbox/inc/diff.html +0 -0
  51. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/templates/ipfabric_netbox/inc/json.html +0 -0
  52. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/templates/ipfabric_netbox/inc/logs_pending.html +0 -0
  53. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/templates/ipfabric_netbox/inc/merge_form.html +0 -0
  54. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/templates/ipfabric_netbox/inc/site_topology_button.html +0 -0
  55. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/templates/ipfabric_netbox/inc/site_topology_modal.html +0 -0
  56. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/templates/ipfabric_netbox/inc/snapshotdata.html +0 -0
  57. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/templates/ipfabric_netbox/inc/transform_map_field_map.html +0 -0
  58. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/templates/ipfabric_netbox/inc/transform_map_relationship_map.html +0 -0
  59. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/templates/ipfabric_netbox/ipfabric_table.html +0 -0
  60. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/templates/ipfabric_netbox/ipfabricingestion.html +0 -0
  61. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/templates/ipfabric_netbox/ipfabricsnapshot.html +0 -0
  62. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/templates/ipfabric_netbox/ipfabricsource.html +0 -0
  63. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/templates/ipfabric_netbox/ipfabricsync.html +0 -0
  64. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/templates/ipfabric_netbox/ipfabrictransformmap.html +0 -0
  65. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/templates/ipfabric_netbox/ipfabrictransformmap_list.html +0 -0
  66. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/templates/ipfabric_netbox/ipfabrictransformmap_restore.html +0 -0
  67. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/templates/ipfabric_netbox/ipfabrictransformmapgroup.html +0 -0
  68. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/templates/ipfabric_netbox/partials/ingestion_all.html +0 -0
  69. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/templates/ipfabric_netbox/partials/ingestion_progress.html +0 -0
  70. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/templates/ipfabric_netbox/partials/ingestion_statistics.html +0 -0
  71. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/templates/ipfabric_netbox/partials/ingestion_status.html +0 -0
  72. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/templates/ipfabric_netbox/partials/job_logs.html +0 -0
  73. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/templates/ipfabric_netbox/partials/object_tabs.html +0 -0
  74. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/templates/ipfabric_netbox/partials/sync_last_ingestion.html +0 -0
  75. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/templates/static/ipfabric_netbox/css/rack.css +0 -0
  76. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/templatetags/__init__.py +0 -0
  77. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/templatetags/ipfabric_netbox_helpers.py +0 -0
  78. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/tests/__init__.py +0 -0
  79. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/tests/api/__init__.py +0 -0
  80. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/urls.py +0 -0
  81. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/utilities/__init__.py +0 -0
  82. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/utilities/ipfutils.py +0 -0
  83. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/utilities/logging.py +0 -0
  84. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/utilities/nbutils.py +0 -0
  85. {ipfabric_netbox-4.2.0b6 → ipfabric_netbox-4.2.0b8}/ipfabric_netbox/utilities/transform_map.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: ipfabric_netbox
3
- Version: 4.2.0b6
3
+ Version: 4.2.0b8
4
4
  Summary: NetBox plugin to sync IP Fabric data into NetBox
5
5
  License: MIT
6
6
  Keywords: netbox,ipfabric,plugin,sync
@@ -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.0b6"
9
+ version = "4.2.0b8"
10
10
  base_url = "ipfabric"
11
11
  min_version = "4.2.4"
12
12
 
@@ -183,7 +183,6 @@ class IPFabricSyncSerializer(NestedGroupModelSerializer):
183
183
  "id",
184
184
  "name",
185
185
  "snapshot_data",
186
- "type",
187
186
  "status",
188
187
  "parameters",
189
188
  "auto_merge",
@@ -83,9 +83,7 @@ class IPFabricSnapshotViewSet(NetBoxReadOnlyModelViewSet):
83
83
  with transaction.atomic():
84
84
  IPFabricData.objects.bulk_create(
85
85
  [
86
- IPFabricData(
87
- snapshot_data=snapshot, data=item["data"], type=item["type"]
88
- )
86
+ IPFabricData(snapshot_data=snapshot, data=item["data"])
89
87
  for item in request.data["data"]
90
88
  ],
91
89
  batch_size=5000,
@@ -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"
@@ -74,14 +74,12 @@ class IPFabricDataFilterSet(BaseFilterSet):
74
74
 
75
75
  class Meta:
76
76
  model = IPFabricData
77
- fields = ["snapshot_data", "type"]
77
+ fields = ["snapshot_data"]
78
78
 
79
79
  def search(self, queryset, name, value):
80
80
  if not value.strip():
81
81
  return queryset
82
- return queryset.filter(
83
- Q(snapshot_data__icontains=value) | Q(type__icontains=value)
84
- )
82
+ return queryset.filter(Q(snapshot_data__icontains=value))
85
83
 
86
84
 
87
85
  class IPFabricSnapshotFilterSet(ChangeLoggedModelFilterSet):
@@ -245,7 +243,6 @@ class IPFabricSyncFilterSet(ChangeLoggedModelFilterSet):
245
243
  "name",
246
244
  "snapshot_data",
247
245
  "snapshot_data_id",
248
- "type",
249
246
  "status",
250
247
  "auto_merge",
251
248
  "last_synced",
@@ -488,6 +488,7 @@ class IPFabricSyncForm(NetBoxModelForm):
488
488
  sites = forms.MultipleChoiceField(
489
489
  required=False,
490
490
  label=_("Sites"),
491
+ help_text=_("Defaults to all sites if none selected."),
491
492
  widget=APISelectMultiple(
492
493
  api_url="/api/plugins/ipfabric/snapshot/{{snapshot_data}}/sites/",
493
494
  ),
@@ -527,15 +528,11 @@ class IPFabricSyncForm(NetBoxModelForm):
527
528
  "auto_merge",
528
529
  "update_custom_fields",
529
530
  "sites",
530
- "type",
531
531
  "tags",
532
532
  "scheduled",
533
533
  "interval",
534
534
  )
535
- widgets = {
536
- "source": HTMXSelect(),
537
- "type": HTMXSelect(),
538
- }
535
+ widgets = {"source": HTMXSelect()}
539
536
 
540
537
  @property
541
538
  def fieldsets(self):
@@ -550,7 +547,6 @@ class IPFabricSyncForm(NetBoxModelForm):
550
547
  fieldsets.append(
551
548
  FieldSet("snapshot_data", name=_("Snapshot Information")),
552
549
  )
553
- fieldsets.append(FieldSet("type", name=_("Ingestion Type")))
554
550
  if self.backend_fields:
555
551
  for k, v in self.backend_fields.items():
556
552
  fieldsets.append(FieldSet(*v, name=f"{k.upper()} Parameters"))
@@ -594,12 +590,7 @@ class IPFabricSyncForm(NetBoxModelForm):
594
590
  self.initial["sites"] = self.instance.parameters.get("sites", [])
595
591
  self.initial["groups"] = self.instance.parameters.get("groups", [])
596
592
 
597
- backend_type = get_field_value(self, "type")
598
- backend = {}
599
- if backend_type == "all":
600
- backend = sync_parameters
601
- else:
602
- backend[backend_type] = sync_parameters.get(backend_type)
593
+ backend = sync_parameters
603
594
 
604
595
  now = local_now().strftime("%Y-%m-%d %H:%M:%S")
605
596
  self.fields["scheduled"].help_text += f" (current time: <strong>{now}</strong>)"
@@ -6,7 +6,6 @@ from netbox_branching.choices import BranchStatusChoices
6
6
  from ipfabric_netbox.choices import IPFabricRawDataTypeChoices
7
7
  from ipfabric_netbox.choices import IPFabricSnapshotStatusModelChoices
8
8
  from ipfabric_netbox.choices import IPFabricSourceTypeChoices
9
- from ipfabric_netbox.choices import IPFabricSyncTypeChoices
10
9
  from ipfabric_netbox.choices import IPFabricTransformMapSourceModelChoices
11
10
 
12
11
  __all__ = (
@@ -14,7 +13,6 @@ __all__ = (
14
13
  "IPFabricTransformMapSourceModelEnum",
15
14
  "IPFabricSourceTypeEnum",
16
15
  "IPFabricSnapshotStatusModelEnum",
17
- "IPFabricSyncTypeEnum",
18
16
  "IPFabricRawDataTypeEnum",
19
17
  "BranchStatusEnum",
20
18
  "JobStatusEnum",
@@ -30,7 +28,6 @@ IPFabricSourceTypeEnum = strawberry.enum(
30
28
  IPFabricSnapshotStatusModelEnum = strawberry.enum(
31
29
  IPFabricSnapshotStatusModelChoices.as_enum(prefix="type")
32
30
  )
33
- IPFabricSyncTypeEnum = strawberry.enum(IPFabricSyncTypeChoices.as_enum(prefix="type"))
34
31
  IPFabricRawDataTypeEnum = strawberry.enum(
35
32
  IPFabricRawDataTypeChoices.as_enum(prefix="type")
36
33
  )
@@ -25,7 +25,6 @@ from ipfabric_netbox.graphql.enums import DataSourceStatusEnum
25
25
  from ipfabric_netbox.graphql.enums import IPFabricRawDataTypeEnum
26
26
  from ipfabric_netbox.graphql.enums import IPFabricSnapshotStatusModelEnum
27
27
  from ipfabric_netbox.graphql.enums import IPFabricSourceTypeEnum
28
- from ipfabric_netbox.graphql.enums import IPFabricSyncTypeEnum
29
28
  from ipfabric_netbox.graphql.enums import IPFabricTransformMapSourceModelEnum
30
29
  from ipfabric_netbox.graphql.enums import JobStatusEnum
31
30
 
@@ -56,46 +55,62 @@ class IPFabricTransformMapGroupFilter(NetBoxModelFilterMixin):
56
55
  class IPFabricTransformMapFilter(NetBoxModelFilterMixin):
57
56
  id: ID | None = strawberry_django.filter_field()
58
57
  name: FilterLookup[str] | None = strawberry_django.filter_field()
59
- source_model: Annotated[
60
- "IPFabricTransformMapSourceModelEnum",
61
- strawberry.lazy("ipfabric_netbox.graphql.enums"),
62
- ] | None = strawberry_django.filter_field()
63
- target_model: Annotated[
64
- "ContentTypeFilter", strawberry.lazy("core.graphql.filters")
65
- ] | None = strawberry_django.filter_field()
66
- group: Annotated[
67
- "IPFabricTransformMapGroupFilter",
68
- strawberry.lazy("ipfabric_netbox.graphql.filters"),
69
- ] | None = strawberry_django.filter_field()
58
+ source_model: (
59
+ Annotated[
60
+ "IPFabricTransformMapSourceModelEnum",
61
+ strawberry.lazy("ipfabric_netbox.graphql.enums"),
62
+ ]
63
+ | None
64
+ ) = strawberry_django.filter_field()
65
+ target_model: (
66
+ Annotated["ContentTypeFilter", strawberry.lazy("core.graphql.filters")] | None
67
+ ) = strawberry_django.filter_field()
68
+ group: (
69
+ Annotated[
70
+ "IPFabricTransformMapGroupFilter",
71
+ strawberry.lazy("ipfabric_netbox.graphql.filters"),
72
+ ]
73
+ | None
74
+ ) = strawberry_django.filter_field()
70
75
 
71
76
 
72
77
  @strawberry_django.filter(models.IPFabricTransformField, lookups=True)
73
78
  class IPFabricTransformFieldFilter(BaseFilterMixin):
74
79
  id: ID | None = strawberry_django.filter_field()
75
- transform_map: Annotated[
76
- "IPFabricTransformMapFilter", strawberry.lazy("ipfabric_netbox.graphql.filters")
77
- ] | None = strawberry_django.filter_field()
80
+ transform_map: (
81
+ Annotated[
82
+ "IPFabricTransformMapFilter",
83
+ strawberry.lazy("ipfabric_netbox.graphql.filters"),
84
+ ]
85
+ | None
86
+ ) = strawberry_django.filter_field()
78
87
  source_field: FilterLookup[str] | None = strawberry_django.filter_field()
79
88
  target_field: FilterLookup[str] | None = strawberry_django.filter_field()
80
- coalesce: Annotated[
81
- "IntegerLookup", strawberry.lazy("netbox.graphql.filter_lookups")
82
- ] | None = strawberry_django.filter_field()
89
+ coalesce: (
90
+ Annotated["IntegerLookup", strawberry.lazy("netbox.graphql.filter_lookups")]
91
+ | None
92
+ ) = strawberry_django.filter_field()
83
93
  template: FilterLookup[str] | None = strawberry_django.filter_field()
84
94
 
85
95
 
86
96
  @strawberry_django.filter(models.IPFabricRelationshipField, lookups=True)
87
97
  class IPFabricRelationshipFieldFilter(BaseFilterMixin):
88
98
  id: ID | None = strawberry_django.filter_field()
89
- transform_map: Annotated[
90
- "IPFabricTransformMapFilter", strawberry.lazy("ipfabric_netbox.graphql.filters")
91
- ] | None = strawberry_django.filter_field()
92
- source_model: Annotated[
93
- "ContentTypeFilter", strawberry.lazy("core.graphql.filters")
94
- ] | None = strawberry_django.filter_field()
99
+ transform_map: (
100
+ Annotated[
101
+ "IPFabricTransformMapFilter",
102
+ strawberry.lazy("ipfabric_netbox.graphql.filters"),
103
+ ]
104
+ | None
105
+ ) = strawberry_django.filter_field()
106
+ source_model: (
107
+ Annotated["ContentTypeFilter", strawberry.lazy("core.graphql.filters")] | None
108
+ ) = strawberry_django.filter_field()
95
109
  target_field: FilterLookup[str] | None = strawberry_django.filter_field()
96
- coalesce: Annotated[
97
- "IntegerLookup", strawberry.lazy("netbox.graphql.filter_lookups")
98
- ] | None = strawberry_django.filter_field()
110
+ coalesce: (
111
+ Annotated["IntegerLookup", strawberry.lazy("netbox.graphql.filter_lookups")]
112
+ | None
113
+ ) = strawberry_django.filter_field()
99
114
  template: FilterLookup[str] | None = strawberry_django.filter_field()
100
115
 
101
116
 
@@ -103,16 +118,22 @@ class IPFabricRelationshipFieldFilter(BaseFilterMixin):
103
118
  class IPFabricSourceFilter(PrimaryModelFilterMixin):
104
119
  id: ID | None = strawberry_django.filter_field()
105
120
  name: FilterLookup[str] | None = strawberry_django.filter_field()
106
- type: Annotated[
107
- "IPFabricSourceTypeEnum", strawberry.lazy("ipfabric_netbox.graphql.enums")
108
- ] | None = strawberry_django.filter_field()
121
+ type: (
122
+ Annotated[
123
+ "IPFabricSourceTypeEnum", strawberry.lazy("ipfabric_netbox.graphql.enums")
124
+ ]
125
+ | None
126
+ ) = strawberry_django.filter_field()
109
127
  url: FilterLookup[str] | None = strawberry_django.filter_field()
110
- status: Annotated[
111
- "DataSourceStatusEnum", strawberry.lazy("ipfabric_netbox.graphql.enums")
112
- ] | None = strawberry_django.filter_field()
113
- parameters: Annotated[
114
- "JSONFilter", strawberry.lazy("netbox.graphql.filter_lookups")
115
- ] | None = strawberry_django.filter_field()
128
+ status: (
129
+ Annotated[
130
+ "DataSourceStatusEnum", strawberry.lazy("ipfabric_netbox.graphql.enums")
131
+ ]
132
+ | None
133
+ ) = strawberry_django.filter_field()
134
+ parameters: (
135
+ Annotated["JSONFilter", strawberry.lazy("netbox.graphql.filter_lookups")] | None
136
+ ) = strawberry_django.filter_field()
116
137
  last_synced: DatetimeFilterLookup[
117
138
  datetime
118
139
  ] | None = strawberry_django.filter_field()
@@ -125,45 +146,55 @@ class IPFabricSnapshotFilter(TagsFilterMixin, ChangeLogFilterMixin, BaseFilterMi
125
146
  last_updated: DatetimeFilterLookup[
126
147
  datetime
127
148
  ] | None = strawberry_django.filter_field()
128
- source: Annotated[
129
- "IPFabricSourceFilter", strawberry.lazy("ipfabric_netbox.graphql.filters")
130
- ] | None = strawberry_django.filter_field()
149
+ source: (
150
+ Annotated[
151
+ "IPFabricSourceFilter", strawberry.lazy("ipfabric_netbox.graphql.filters")
152
+ ]
153
+ | None
154
+ ) = strawberry_django.filter_field()
131
155
  name: FilterLookup[str] | None = strawberry_django.filter_field()
132
156
  snapshot_id: FilterLookup[str] | None = strawberry_django.filter_field()
133
- data: Annotated[
134
- "JSONFilter", strawberry.lazy("netbox.graphql.filter_lookups")
135
- ] | None = strawberry_django.filter_field()
157
+ data: (
158
+ Annotated["JSONFilter", strawberry.lazy("netbox.graphql.filter_lookups")] | None
159
+ ) = strawberry_django.filter_field()
136
160
  date: DatetimeFilterLookup[datetime] | None = strawberry_django.filter_field()
137
- status: Annotated[
138
- "IPFabricSnapshotStatusModelEnum",
139
- strawberry.lazy("ipfabric_netbox.graphql.enums"),
140
- ] | None = strawberry_django.filter_field()
161
+ status: (
162
+ Annotated[
163
+ "IPFabricSnapshotStatusModelEnum",
164
+ strawberry.lazy("ipfabric_netbox.graphql.enums"),
165
+ ]
166
+ | None
167
+ ) = strawberry_django.filter_field()
141
168
 
142
169
 
143
170
  @strawberry_django.filter(models.IPFabricSync, lookups=True)
144
171
  class IPFabricSyncFilter(TagsFilterMixin, ChangeLogFilterMixin, BaseFilterMixin):
145
172
  id: ID | None = strawberry_django.filter_field()
146
173
  name: FilterLookup[str] | None = strawberry_django.filter_field()
147
- snapshot_data: Annotated[
148
- "IPFabricSnapshotFilter", strawberry.lazy("ipfabric_netbox.graphql.filters")
149
- ] | None = strawberry_django.filter_field()
150
- type: Annotated[
151
- "IPFabricSyncTypeEnum", strawberry.lazy("ipfabric_netbox.graphql.enums")
152
- ] | None = strawberry_django.filter_field()
153
- status: Annotated[
154
- "DataSourceStatusEnum", strawberry.lazy("ipfabric_netbox.graphql.enums")
155
- ] | None = strawberry_django.filter_field()
156
- parameters: Annotated[
157
- "JSONFilter", strawberry.lazy("netbox.graphql.filter_lookups")
158
- ] | None = strawberry_django.filter_field()
174
+ snapshot_data: (
175
+ Annotated[
176
+ "IPFabricSnapshotFilter", strawberry.lazy("ipfabric_netbox.graphql.filters")
177
+ ]
178
+ | None
179
+ ) = strawberry_django.filter_field()
180
+ status: (
181
+ Annotated[
182
+ "DataSourceStatusEnum", strawberry.lazy("ipfabric_netbox.graphql.enums")
183
+ ]
184
+ | None
185
+ ) = strawberry_django.filter_field()
186
+ parameters: (
187
+ Annotated["JSONFilter", strawberry.lazy("netbox.graphql.filter_lookups")] | None
188
+ ) = strawberry_django.filter_field()
159
189
  auto_merge: FilterLookup[bool] | None = strawberry_django.filter_field()
160
190
  last_synced: DatetimeFilterLookup[
161
191
  datetime
162
192
  ] | None = strawberry_django.filter_field()
163
193
  scheduled: DatetimeFilterLookup[datetime] | None = strawberry_django.filter_field()
164
- interval: Annotated[
165
- "IntegerLookup", strawberry.lazy("netbox.graphql.filter_lookups")
166
- ] | None = strawberry_django.filter_field()
194
+ interval: (
195
+ Annotated["IntegerLookup", strawberry.lazy("netbox.graphql.filter_lookups")]
196
+ | None
197
+ ) = strawberry_django.filter_field()
167
198
  user: Annotated[
168
199
  "UserFilter", strawberry.lazy("users.graphql.filters")
169
200
  ] | None = strawberry_django.filter_field()
@@ -172,23 +203,32 @@ class IPFabricSyncFilter(TagsFilterMixin, ChangeLogFilterMixin, BaseFilterMixin)
172
203
  @strawberry_django.filter(models.IPFabricIngestion, lookups=True)
173
204
  class IPFabricIngestionFilter(BaseFilterMixin):
174
205
  id: ID | None = strawberry_django.filter_field()
175
- sync: Annotated[
176
- "IPFabricSyncFilter", strawberry.lazy("ipfabric_netbox.graphql.filters")
177
- ] | None = strawberry_django.filter_field()
178
- job: Annotated[
179
- "JobFilter", strawberry.lazy("ipfabric_netbox.graphql.filters")
180
- ] | None = strawberry_django.filter_field()
181
- branch: Annotated[
182
- "BranchFilter", strawberry.lazy("ipfabric_netbox.graphql.filters")
183
- ] | None = strawberry_django.filter_field()
206
+ sync: (
207
+ Annotated[
208
+ "IPFabricSyncFilter", strawberry.lazy("ipfabric_netbox.graphql.filters")
209
+ ]
210
+ | None
211
+ ) = strawberry_django.filter_field()
212
+ job: (
213
+ Annotated["JobFilter", strawberry.lazy("ipfabric_netbox.graphql.filters")]
214
+ | None
215
+ ) = strawberry_django.filter_field()
216
+ branch: (
217
+ Annotated["BranchFilter", strawberry.lazy("ipfabric_netbox.graphql.filters")]
218
+ | None
219
+ ) = strawberry_django.filter_field()
184
220
 
185
221
 
186
222
  @strawberry_django.filter(models.IPFabricIngestionIssue, lookups=True)
187
223
  class IPFabricIngestionIssueFilter(BaseFilterMixin):
188
224
  id: ID | None = strawberry_django.filter_field()
189
- ingestion: Annotated[
190
- "IPFabricIngestionFilter", strawberry.lazy("ipfabric_netbox.graphql.filters")
191
- ] | None = strawberry_django.filter_field()
225
+ ingestion: (
226
+ Annotated[
227
+ "IPFabricIngestionFilter",
228
+ strawberry.lazy("ipfabric_netbox.graphql.filters"),
229
+ ]
230
+ | None
231
+ ) = strawberry_django.filter_field()
192
232
  timestamp: DatetimeFilterLookup[datetime] | None = strawberry_django.filter_field()
193
233
  model: FilterLookup[str] | None = strawberry_django.filter_field()
194
234
  message: FilterLookup[str] | None = strawberry_django.filter_field()
@@ -201,15 +241,21 @@ class IPFabricIngestionIssueFilter(BaseFilterMixin):
201
241
  @strawberry_django.filter(models.IPFabricData, lookups=True)
202
242
  class IPFabricDataFilter(BaseFilterMixin):
203
243
  id: ID | None = strawberry_django.filter_field()
204
- snapshot_data: Annotated[
205
- "IPFabricSnapshotFilter", strawberry.lazy("ipfabric_netbox.graphql.filters")
206
- ] | None = strawberry_django.filter_field()
207
- data: Annotated[
208
- "JSONFilter", strawberry.lazy("netbox.graphql.filter_lookups")
209
- ] | None = strawberry_django.filter_field()
210
- type: Annotated[
211
- "IPFabricRawDataTypeEnum", strawberry.lazy("ipfabric_netbox.graphql.enums")
212
- ] | None = strawberry_django.filter_field()
244
+ snapshot_data: (
245
+ Annotated[
246
+ "IPFabricSnapshotFilter", strawberry.lazy("ipfabric_netbox.graphql.filters")
247
+ ]
248
+ | None
249
+ ) = strawberry_django.filter_field()
250
+ data: (
251
+ Annotated["JSONFilter", strawberry.lazy("netbox.graphql.filter_lookups")] | None
252
+ ) = strawberry_django.filter_field()
253
+ type: (
254
+ Annotated[
255
+ "IPFabricRawDataTypeEnum", strawberry.lazy("ipfabric_netbox.graphql.enums")
256
+ ]
257
+ | None
258
+ ) = strawberry_django.filter_field()
213
259
 
214
260
 
215
261
  # These filters are not defined in the libs, so need to define them here
@@ -221,46 +267,51 @@ class BranchFilter(PrimaryModelFilterMixin):
221
267
  "UserFilter", strawberry.lazy("users.graphql.filters")
222
268
  ] | None = strawberry_django.filter_field()
223
269
  schema_id: FilterLookup[str] | None = strawberry_django.filter_field()
224
- status: Annotated[
225
- "BranchStatusEnum", strawberry.lazy("ipfabric_netbox.graphql.enums")
226
- ] | None = strawberry_django.filter_field()
227
- applied_migrations: Annotated[
228
- "StringArrayLookup", strawberry.lazy("netbox.graphql.filter_lookups")
229
- ] | None = strawberry_django.filter_field()
270
+ status: (
271
+ Annotated["BranchStatusEnum", strawberry.lazy("ipfabric_netbox.graphql.enums")]
272
+ | None
273
+ ) = strawberry_django.filter_field()
274
+ applied_migrations: (
275
+ Annotated["StringArrayLookup", strawberry.lazy("netbox.graphql.filter_lookups")]
276
+ | None
277
+ ) = strawberry_django.filter_field()
230
278
  last_sync: DatetimeFilterLookup[datetime] | None = strawberry_django.filter_field()
231
279
  merged_time: DatetimeFilterLookup[
232
280
  datetime
233
281
  ] | None = strawberry_django.filter_field()
234
- merged_by: Annotated[
235
- "UserFilter", strawberry.lazy("users.graphql.filters")
236
- ] | None = strawberry_django.filter_field()
282
+ merged_by: (
283
+ Annotated["UserFilter", strawberry.lazy("users.graphql.filters")] | None
284
+ ) = strawberry_django.filter_field()
237
285
 
238
286
 
239
287
  @strawberry_django.filter(Job, lookups=True)
240
288
  class JobFilter(BaseFilterMixin):
241
289
  id: ID | None = strawberry_django.filter_field()
242
- object_type: Annotated[
243
- "ContentTypeFilter", strawberry.lazy("core.graphql.filters")
244
- ] | None = strawberry_django.filter_field()
245
- object_id: Annotated[
246
- "IntegerLookup", strawberry.lazy("netbox.graphql.filter_lookups")
247
- ] | None = strawberry_django.filter_field()
290
+ object_type: (
291
+ Annotated["ContentTypeFilter", strawberry.lazy("core.graphql.filters")] | None
292
+ ) = strawberry_django.filter_field()
293
+ object_id: (
294
+ Annotated["IntegerLookup", strawberry.lazy("netbox.graphql.filter_lookups")]
295
+ | None
296
+ ) = strawberry_django.filter_field()
248
297
  name: FilterLookup[str] | None = strawberry_django.filter_field()
249
298
  created: DatetimeFilterLookup[datetime] | None = strawberry_django.filter_field()
250
299
  scheduled: DatetimeFilterLookup[datetime] | None = strawberry_django.filter_field()
251
- interval: Annotated[
252
- "IntegerLookup", strawberry.lazy("netbox.graphql.filter_lookups")
253
- ] | None = strawberry_django.filter_field()
300
+ interval: (
301
+ Annotated["IntegerLookup", strawberry.lazy("netbox.graphql.filter_lookups")]
302
+ | None
303
+ ) = strawberry_django.filter_field()
254
304
  started: DatetimeFilterLookup[datetime] | None = strawberry_django.filter_field()
255
305
  completed: DatetimeFilterLookup[datetime] | None = strawberry_django.filter_field()
256
306
  user: Annotated[
257
307
  "UserFilter", strawberry.lazy("users.graphql.filters")
258
308
  ] | None = strawberry_django.filter_field()
259
- status: Annotated[
260
- "JobStatusEnum", strawberry.lazy("ipfabric_netbox.graphql.enums")
261
- ] | None = strawberry_django.filter_field()
262
- data: Annotated[
263
- "JSONFilter", strawberry.lazy("netbox.graphql.filter_lookups")
264
- ] | None = strawberry_django.filter_field()
309
+ status: (
310
+ Annotated["JobStatusEnum", strawberry.lazy("ipfabric_netbox.graphql.enums")]
311
+ | None
312
+ ) = strawberry_django.filter_field()
313
+ data: (
314
+ Annotated["JSONFilter", strawberry.lazy("netbox.graphql.filter_lookups")] | None
315
+ ) = strawberry_django.filter_field()
265
316
  error: FilterLookup[str] | None = strawberry_django.filter_field()
266
317
  job_id: FilterLookup[str] | None = strawberry_django.filter_field()
@@ -58,14 +58,20 @@ class IPFabricTransformMapGroupType(NetBoxObjectType):
58
58
  class IPFabricTransformMapType(NetBoxObjectType):
59
59
  name: str
60
60
  source_model: str
61
- target_model: Annotated[
62
- "ContentTypeType",
63
- strawberry.lazy("netbox.graphql.types"),
64
- ] | None
65
- group: Annotated[
66
- "IPFabricTransformMapGroupType",
67
- strawberry.lazy("ipfabric_netbox.graphql.types"),
68
- ] | None
61
+ target_model: (
62
+ Annotated[
63
+ "ContentTypeType",
64
+ strawberry.lazy("netbox.graphql.types"),
65
+ ]
66
+ | None
67
+ )
68
+ group: (
69
+ Annotated[
70
+ "IPFabricTransformMapGroupType",
71
+ strawberry.lazy("ipfabric_netbox.graphql.types"),
72
+ ]
73
+ | None
74
+ )
69
75
 
70
76
 
71
77
  @strawberry_django.type(
@@ -74,9 +80,12 @@ class IPFabricTransformMapType(NetBoxObjectType):
74
80
  filters=IPFabricTransformFieldFilter,
75
81
  )
76
82
  class IPFabricTransformFieldType(BaseObjectType):
77
- transform_map: Annotated[
78
- "IPFabricTransformMapType", strawberry.lazy("ipfabric_netbox.graphql.types")
79
- ] | None
83
+ transform_map: (
84
+ Annotated[
85
+ "IPFabricTransformMapType", strawberry.lazy("ipfabric_netbox.graphql.types")
86
+ ]
87
+ | None
88
+ )
80
89
  source_field: str
81
90
  target_field: str
82
91
  coalesce: bool
@@ -89,9 +98,12 @@ class IPFabricTransformFieldType(BaseObjectType):
89
98
  filters=IPFabricRelationshipFieldFilter,
90
99
  )
91
100
  class IPFabricRelationshipFieldType(BaseObjectType):
92
- transform_map: Annotated[
93
- "IPFabricTransformMapType", strawberry.lazy("ipfabric_netbox.graphql.types")
94
- ] | None
101
+ transform_map: (
102
+ Annotated[
103
+ "IPFabricTransformMapType", strawberry.lazy("ipfabric_netbox.graphql.types")
104
+ ]
105
+ | None
106
+ )
95
107
  source_model: Annotated["ContentTypeType", strawberry.lazy("netbox.graphql.types")]
96
108
  target_field: str
97
109
  coalesce: bool
@@ -114,9 +126,12 @@ class IPFabricSourceType(OrganizationalObjectType):
114
126
  models.IPFabricSnapshot, fields="__all__", filters=IPFabricSnapshotFilter
115
127
  )
116
128
  class IPFabricSnapshotType(ChangelogMixin, TagsMixin, BaseObjectType):
117
- source: Annotated[
118
- "IPFabricSourceType", strawberry.lazy("ipfabric_netbox.graphql.types")
119
- ] | None
129
+ source: (
130
+ Annotated[
131
+ "IPFabricSourceType", strawberry.lazy("ipfabric_netbox.graphql.types")
132
+ ]
133
+ | None
134
+ )
120
135
  name: str
121
136
  snapshot_id: str
122
137
  data: JSON
@@ -128,10 +143,12 @@ class IPFabricSnapshotType(ChangelogMixin, TagsMixin, BaseObjectType):
128
143
  )
129
144
  class IPFabricSyncType(ChangelogMixin, TagsMixin, BaseObjectType):
130
145
  name: str
131
- snapshot_data: Annotated[
132
- "IPFabricSnapshotType", strawberry.lazy("ipfabric_netbox.graphql.types")
133
- ] | None
134
- type: str
146
+ snapshot_data: (
147
+ Annotated[
148
+ "IPFabricSnapshotType", strawberry.lazy("ipfabric_netbox.graphql.types")
149
+ ]
150
+ | None
151
+ )
135
152
  status: str
136
153
  parameters: JSON
137
154
  auto_merge: bool
@@ -159,13 +176,14 @@ class JobType(BaseObjectType):
159
176
  models.IPFabricIngestion, fields="__all__", filters=IPFabricIngestionFilter
160
177
  )
161
178
  class IPFabricIngestionType(BaseObjectType):
162
- sync: Annotated[
163
- "IPFabricSyncType", strawberry.lazy("ipfabric_netbox.graphql.types")
164
- ] | None
179
+ sync: (
180
+ Annotated["IPFabricSyncType", strawberry.lazy("ipfabric_netbox.graphql.types")]
181
+ | None
182
+ )
165
183
  job: Annotated["JobType", strawberry.lazy("ipfabric_netbox.graphql.types")] | None
166
- branch: Annotated[
167
- "BranchType", strawberry.lazy("ipfabric_netbox.graphql.types")
168
- ] | None
184
+ branch: (
185
+ Annotated["BranchType", strawberry.lazy("ipfabric_netbox.graphql.types")] | None
186
+ )
169
187
 
170
188
 
171
189
  @strawberry_django.type(
@@ -174,9 +192,12 @@ class IPFabricIngestionType(BaseObjectType):
174
192
  filters=IPFabricIngestionIssueFilter,
175
193
  )
176
194
  class IPFabricIngestionIssueType(BaseObjectType):
177
- ingestion: Annotated[
178
- "IPFabricIngestionType", strawberry.lazy("ipfabric_netbox.graphql.types")
179
- ] | None
195
+ ingestion: (
196
+ Annotated[
197
+ "IPFabricIngestionType", strawberry.lazy("ipfabric_netbox.graphql.types")
198
+ ]
199
+ | None
200
+ )
180
201
  timestamp: str
181
202
  model: str | None
182
203
  message: str
@@ -0,0 +1,17 @@
1
+ # Generated by Django 5.2 on 2025-08-25 12:53
2
+ from django.db import migrations
3
+
4
+
5
+ class Migration(migrations.Migration):
6
+ dependencies = [
7
+ (
8
+ "ipfabric_netbox",
9
+ "0017_ipfabricsync_update_custom_fields",
10
+ ),
11
+ ]
12
+ operations = [
13
+ migrations.RemoveField(
14
+ model_name="ipfabricsync",
15
+ name="type",
16
+ ),
17
+ ]
@@ -44,7 +44,6 @@ from utilities.request import NetBoxFakeRequest
44
44
  from .choices import IPFabricRawDataTypeChoices
45
45
  from .choices import IPFabricSnapshotStatusModelChoices
46
46
  from .choices import IPFabricSourceTypeChoices
47
- from .choices import IPFabricSyncTypeChoices
48
47
  from .choices import IPFabricTransformMapSourceModelChoices
49
48
  from .choices import required_transform_map_contenttypes
50
49
  from .signals import clear_other_primary_ip
@@ -598,11 +597,6 @@ class IPFabricSync(IPFabricClient, JobsMixin, TagsMixin, ChangeLoggedModel):
598
597
  on_delete=models.CASCADE,
599
598
  related_name="snapshots",
600
599
  )
601
- type = models.CharField(
602
- max_length=50,
603
- choices=IPFabricSyncTypeChoices,
604
- default=IPFabricSyncTypeChoices.DCIM,
605
- )
606
600
  status = models.CharField(
607
601
  max_length=50,
608
602
  choices=DataSourceStatusChoices,
@@ -667,6 +661,10 @@ class IPFabricSync(IPFabricClient, JobsMixin, TagsMixin, ChangeLoggedModel):
667
661
  else:
668
662
  return False
669
663
 
664
+ @property
665
+ def last_ingestion(self):
666
+ return self.ipfabricingestion_set.last()
667
+
670
668
  @staticmethod
671
669
  def get_transform_maps(group_ids=None):
672
670
  """
@@ -142,20 +142,41 @@ class IPFabricSourceTable(NetBoxTable):
142
142
  default_columns = ("pk", "name", "status", "description", "snapshot_count")
143
143
 
144
144
 
145
- class SyncTable(NetBoxTable):
146
- actions = None
145
+ class IPFabricSyncTable(NetBoxTable):
146
+ name = tables.Column(linkify=True)
147
147
  status = columns.ChoiceFieldColumn()
148
148
  snapshot_name = tables.Column(
149
- verbose_name="Snapshot Name", accessor="snapshot_data"
149
+ verbose_name="Snapshot Name",
150
+ accessor="snapshot_data",
151
+ linkify=True,
152
+ )
153
+ last_ingestion = tables.Column(
154
+ accessor="last_ingestion",
155
+ verbose_name="Last Ingestion",
156
+ linkify=True,
150
157
  )
151
158
 
152
- def render_snapshot_name(self, value):
153
- return value.get("name", "---")
159
+ def render_last_ingestion(self, value: IPFabricIngestion):
160
+ return getattr(value, "name", "---") if value else "---"
161
+
162
+ def render_snapshot_name(self, value: IPFabricSnapshot):
163
+ return getattr(value, "name", "---") if value else "---"
154
164
 
155
165
  class Meta(NetBoxTable.Meta):
156
166
  model = IPFabricSync
157
- fields = ("id", "status", "snapshot_name")
158
- default_columns = ("id", "status", "snapshot_name")
167
+ fields = (
168
+ "auto_merge",
169
+ "id",
170
+ "interval",
171
+ "last_synced",
172
+ "last_ingestion",
173
+ "name",
174
+ "scheduled",
175
+ "status",
176
+ "snapshot_name",
177
+ "user",
178
+ )
179
+ default_columns = ("name", "status", "last_ingestion", "snapshot_name")
159
180
 
160
181
 
161
182
  class IPFabricIngestionChangesTable(NetBoxTable):
@@ -241,5 +262,5 @@ class IPFabricDataTable(NetBoxTable):
241
262
 
242
263
  class Meta(NetBoxTable.Meta):
243
264
  model = IPFabricData
244
- fields = ("snapshot_data", "type", "JSON")
245
- default_columns = ("snapshot_data", "type", "JSON")
265
+ fields = ("snapshot_data", "JSON")
266
+ default_columns = ("snapshot_data", "JSON")
@@ -532,18 +532,15 @@ class IPFabricSyncTest(APIViewTestCases.APIViewTestCase):
532
532
  create_data = [
533
533
  {
534
534
  "name": "Test Sync A",
535
- "type": "dcim",
536
535
  "parameters": {"site": True, "device": False},
537
536
  },
538
537
  {
539
538
  "name": "Test Sync B",
540
- "type": "ipam",
541
539
  "parameters": {"ipaddress": True, "prefix": True},
542
540
  "auto_merge": True,
543
541
  },
544
542
  {
545
543
  "name": "Test Sync C",
546
- "type": "dcim",
547
544
  "parameters": {"device": True, "interface": True},
548
545
  "interval": 60,
549
546
  },
@@ -617,20 +614,17 @@ class IPFabricSyncTest(APIViewTestCases.APIViewTestCase):
617
614
  IPFabricSync.objects.create(
618
615
  name="Sync Test D",
619
616
  snapshot_data=snapshots[0],
620
- type="dcim",
621
617
  parameters={"site": True, "device": False},
622
618
  )
623
619
  IPFabricSync.objects.create(
624
620
  name="Sync Test E",
625
621
  snapshot_data=snapshots[1],
626
- type="dcim",
627
622
  parameters={"device": True, "interface": True},
628
623
  auto_merge=True,
629
624
  )
630
625
  IPFabricSync.objects.create(
631
626
  name="Sync Test F",
632
627
  snapshot_data=snapshots[2],
633
- type="ipam",
634
628
  parameters={"ipaddress": True, "prefix": False},
635
629
  interval=30,
636
630
  )
@@ -724,19 +718,16 @@ class IPFabricIngestionTest(
724
718
  IPFabricSync.objects.create(
725
719
  name="Ingestion Test Sync A",
726
720
  snapshot_data=snapshots[0],
727
- type="dcim",
728
721
  parameters={"site": True, "device": False},
729
722
  ),
730
723
  IPFabricSync.objects.create(
731
724
  name="Ingestion Test Sync B",
732
725
  snapshot_data=snapshots[1],
733
- type="dcim",
734
726
  parameters={"device": True, "interface": True},
735
727
  ),
736
728
  IPFabricSync.objects.create(
737
729
  name="Ingestion Test Sync C",
738
730
  snapshot_data=snapshots[2],
739
- type="ipam",
740
731
  parameters={"ipaddress": True, "prefix": False},
741
732
  ),
742
733
  )
@@ -828,19 +819,16 @@ class IPFabricIngestionIssueTest(
828
819
  IPFabricSync.objects.create(
829
820
  name="Issue Test Sync A",
830
821
  snapshot_data=snapshots[0],
831
- type="dcim",
832
822
  parameters={"site": True, "device": False},
833
823
  ),
834
824
  IPFabricSync.objects.create(
835
825
  name="Issue Test Sync B",
836
826
  snapshot_data=snapshots[1],
837
- type="dcim",
838
827
  parameters={"device": True, "interface": True},
839
828
  ),
840
829
  IPFabricSync.objects.create(
841
830
  name="Issue Test Sync C",
842
831
  snapshot_data=snapshots[2],
843
- type="ipam",
844
832
  parameters={"ipaddress": True, "prefix": False},
845
833
  ),
846
834
  )
@@ -119,7 +119,6 @@ class IPFabricTransformMapModelTestCase(TestCase):
119
119
  )
120
120
  sync = IPFabricSync.objects.create(
121
121
  name="ingest",
122
- type="dcim",
123
122
  status="new",
124
123
  snapshot_data=snapshot,
125
124
  update_custom_fields=True,
@@ -37,6 +37,7 @@ from .filtersets import IPFabricIngestionFilterSet
37
37
  from .filtersets import IPFabricIngestionIssueFilterSet
38
38
  from .filtersets import IPFabricSnapshotFilterSet
39
39
  from .filtersets import IPFabricSourceFilterSet
40
+ from .filtersets import IPFabricSyncFilterSet
40
41
  from .filtersets import IPFabricTransformMapFilterSet
41
42
  from .filtersets import IPFabricTransformMapGroupFilterSet
42
43
  from .forms import IPFabricIngestionFilterForm
@@ -69,6 +70,7 @@ from .tables import IPFabricIngestionTable
69
70
  from .tables import IPFabricRelationshipFieldTable
70
71
  from .tables import IPFabricSnapshotTable
71
72
  from .tables import IPFabricSourceTable
73
+ from .tables import IPFabricSyncTable
72
74
  from .tables import IPFabricTransformFieldTable
73
75
  from .tables import IPFabricTransformMapGroupTable
74
76
  from .tables import IPFabricTransformMapTable
@@ -528,14 +530,10 @@ class IPFabricSourceBulkDeleteView(generic.BulkDeleteView):
528
530
 
529
531
 
530
532
  # Sync
531
- class IPFabricSyncListView(View):
532
- def get(self, request):
533
- syncs = IPFabricSync.objects.prefetch_related("snapshot_data")
534
- return render(
535
- request,
536
- "ipfabric_netbox/ipfabricsync_list.html",
537
- {"model": IPFabricSync, "syncs": syncs},
538
- )
533
+ class IPFabricSyncListView(generic.ObjectListView):
534
+ queryset = IPFabricSync.objects.all()
535
+ table = IPFabricSyncTable
536
+ filterset = IPFabricSyncFilterSet
539
537
 
540
538
 
541
539
  @register_model_view(IPFabricSync, "edit")
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "ipfabric_netbox"
3
- version = "4.2.0b6"
3
+ version = "4.2.0b8"
4
4
  description = "NetBox plugin to sync IP Fabric data into NetBox"
5
5
  authors = ["Solution Architecture <solution.architecture@ipfabric.io>"]
6
6
  license = "MIT"
@@ -1,71 +0,0 @@
1
- {% extends 'base/layout.html' %}
2
- {% load buttons %}
3
- {% load helpers %}
4
- {% load perms %}
5
-
6
- {% block title %}Ingestion{% endblock %}
7
-
8
- {% block tabs %}
9
- <ul class="nav nav-tabs px-3">
10
- <li class="nav-item" role="presentation">
11
- <a class="nav-link active" role="tab">Ingestion</a>
12
- </li>
13
- </ul>
14
- {% endblock tabs %}
15
-
16
- {% block controls %}
17
- <div class="controls">
18
- <div class="control-group">
19
- {% block extra_controls %}{% endblock %}
20
- {% add_button model %}
21
- </div>
22
- </div>
23
- {% endblock controls %}
24
-
25
- {% block content %}
26
- <div class="tab-content">
27
- {% for sync in syncs %}
28
- <div class="card">
29
- <h5 class="card-header d-flex justify-content-between" id="module{{ module.pk }}">
30
- <div>
31
- <i class="mdi mdi-cloud-sync"></i><i class="mdi mdi-sync"></i> <a href="{% url 'plugins:ipfabric_netbox:ipfabricsync' pk=sync.pk %}">{{ sync.name}}</a>
32
- </div>
33
- {% if perms.ipfabric_netbox.delete_ipfabricsync %}
34
- <a href="{% url 'plugins:ipfabric_netbox:ipfabricsync_delete' pk=sync.pk %}" class="btn btn-danger btn-sm">
35
- <i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
36
- </a>
37
- {% endif %}
38
-
39
- </h5>
40
- <div class="card-body">
41
- {% include 'inc/sync_warning.html' with object=module %}
42
- <table class="table table-hover table-headings reports">
43
- <thead>
44
- <tr>
45
- <th width="200">Source</th>
46
- <th width="400">Snapshot</th>
47
- <th>Status</th>
48
- <th>Last Run</th>
49
- </tr>
50
- </thead>
51
- <tbody>
52
- <tr>
53
- <td><a href="{% url 'plugins:ipfabric_netbox:ipfabricsource' pk=sync.snapshot_data.source.pk %}">{{ sync.snapshot_data.source.name }}</a></td>
54
- <td><a href="{% url 'plugins:ipfabric_netbox:ipfabricsnapshot' pk=sync.snapshot_data.pk %}">{{ sync.snapshot_data.name}}</a></td>
55
- <td>{% badge sync.get_status_display last_job.get_status_color %}</td>
56
- <td>{{sync.last_synced}}</td>
57
- </tr>
58
- </tbody>
59
- </table>
60
- </div>
61
- </div>
62
- {% empty %}
63
- <div class="alert alert-info" role="alert">
64
- <h4 class="alert-heading">Sync Jobs Settings Found</h4>
65
- {% if perms.extras.add_reportmodule %}
66
- Get started by <a href="{% url 'plugins:ipfabric_netbox:ipfabricsync_add' %}">creating a sync</a> from an IP Fabric source.
67
- {% endif %}
68
- </div>
69
- {% endfor %}
70
- </div>
71
- {% endblock content %}