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.

ipfabric_netbox/views.py CHANGED
@@ -17,6 +17,11 @@ from django.views.generic import View
17
17
  from django_tables2 import RequestConfig
18
18
  from ipfabric.diagrams import Network
19
19
  from ipfabric.diagrams import NetworkSettings
20
+ from netbox.object_actions import AddObject
21
+ from netbox.object_actions import BulkDelete
22
+ from netbox.object_actions import BulkEdit
23
+ from netbox.object_actions import BulkExport
24
+ from netbox.object_actions import BulkRename
20
25
  from netbox.views import generic
21
26
  from netbox.views.generic.base import BaseObjectView
22
27
  from netbox_branching.models import ChangeDiff
@@ -44,13 +49,19 @@ from .forms import IPFabricIngestionFilterForm
44
49
  from .forms import IPFabricIngestionMergeForm
45
50
  from .forms import IPFabricRelationshipFieldForm
46
51
  from .forms import IPFabricSnapshotFilterForm
52
+ from .forms import IPFabricSourceBulkEditForm
47
53
  from .forms import IPFabricSourceFilterForm
48
54
  from .forms import IPFabricSourceForm
55
+ from .forms import IPFabricSyncBulkEditForm
49
56
  from .forms import IPFabricSyncForm
50
57
  from .forms import IPFabricTableForm
51
58
  from .forms import IPFabricTransformFieldForm
59
+ from .forms import IPFabricTransformMapBulkEditForm
60
+ from .forms import IPFabricTransformMapBulkImportForm
52
61
  from .forms import IPFabricTransformMapCloneForm
53
62
  from .forms import IPFabricTransformMapForm
63
+ from .forms import IPFabricTransformMapGroupBulkEditForm
64
+ from .forms import IPFabricTransformMapGroupBulkImportForm
54
65
  from .forms import IPFabricTransformMapGroupForm
55
66
  from .models import IPFabricData
56
67
  from .models import IPFabricIngestion
@@ -79,9 +90,10 @@ from .utilities.transform_map import build_transform_maps
79
90
  from .utilities.transform_map import get_transform_map
80
91
 
81
92
 
82
- # Transform Map Relationship Field
93
+ # region - Transform Map Relationship Field
83
94
 
84
95
 
96
+ @register_model_view(IPFabricRelationshipField, "add", detail=False)
85
97
  @register_model_view(IPFabricRelationshipField, "edit")
86
98
  class IPFabricRelationshipFieldEditView(generic.ObjectEditView):
87
99
  queryset = IPFabricRelationshipField.objects.all()
@@ -89,37 +101,33 @@ class IPFabricRelationshipFieldEditView(generic.ObjectEditView):
89
101
  default_return_url = "plugins:ipfabric_netbox:ipfabricrelationshipfield_list"
90
102
 
91
103
 
104
+ @register_model_view(IPFabricRelationshipField, "delete")
92
105
  class IPFabricRelationshipFieldDeleteView(generic.ObjectDeleteView):
93
106
  queryset = IPFabricRelationshipField.objects.all()
94
107
  default_return_url = "plugins:ipfabric_netbox:ipfabricrelationshipfield_list"
95
108
 
96
109
 
97
- @register_model_view(IPFabricTransformMap, "relationships")
98
- class IPFabricTransformRelationshipView(generic.ObjectChildrenView):
99
- queryset = IPFabricTransformMap.objects.all()
100
- child_model = IPFabricRelationshipField
110
+ @register_model_view(
111
+ IPFabricRelationshipField, "bulk_delete", path="delete", detail=False
112
+ )
113
+ class IPFabricRelationshipFieldBulkDeleteView(generic.BulkDeleteView):
114
+ queryset = IPFabricRelationshipField.objects.all()
101
115
  table = IPFabricRelationshipFieldTable
102
- template_name = "ipfabric_netbox/inc/transform_map_relationship_map.html"
103
- tab = ViewTab(
104
- label="Relationship Maps",
105
- badge=lambda obj: IPFabricRelationshipField.objects.filter(
106
- transform_map=obj
107
- ).count(),
108
- permission="ipfabric_netbox.view_ipfabricrelationshipfield",
109
- )
110
-
111
- def get_children(self, request, parent):
112
- return self.child_model.objects.filter(transform_map=parent)
113
116
 
114
117
 
118
+ # This list is not linked in navigation, but it's needed for tests
119
+ @register_model_view(IPFabricRelationshipField, "list", path="", detail=False)
115
120
  class IPFabricRelationshipFieldListView(generic.ObjectListView):
116
121
  queryset = IPFabricRelationshipField.objects.all()
117
122
  table = IPFabricRelationshipFieldTable
123
+ actions = ()
118
124
 
119
125
 
120
- # Transform Map Group
126
+ # endregion
127
+ # region - Transform Map Group
121
128
 
122
129
 
130
+ @register_model_view(IPFabricTransformMapGroup, "list", path="", detail=False)
123
131
  class IPFabricTransformMapGroupListView(generic.ObjectListView):
124
132
  queryset = IPFabricTransformMapGroup.objects.annotate(
125
133
  maps_count=models.Count("transform_maps")
@@ -128,6 +136,7 @@ class IPFabricTransformMapGroupListView(generic.ObjectListView):
128
136
  filterset = IPFabricTransformMapGroupFilterSet
129
137
 
130
138
 
139
+ @register_model_view(IPFabricTransformMapGroup, "add", detail=False)
131
140
  @register_model_view(IPFabricTransformMapGroup, "edit")
132
141
  class IPFabricTransformMapGroupEditView(generic.ObjectEditView):
133
142
  queryset = IPFabricTransformMapGroup.objects.all()
@@ -135,11 +144,37 @@ class IPFabricTransformMapGroupEditView(generic.ObjectEditView):
135
144
  default_return_url = "plugins:ipfabric_netbox:ipfabrictransformmapgroup_list"
136
145
 
137
146
 
147
+ @register_model_view(IPFabricTransformMapGroup, "delete")
138
148
  class IPFabricTransformMapGroupDeleteView(generic.ObjectDeleteView):
139
149
  queryset = IPFabricTransformMapGroup.objects.all()
140
150
  default_return_url = "plugins:ipfabric_netbox:ipfabrictransformmapgroup_list"
141
151
 
142
152
 
153
+ @register_model_view(
154
+ IPFabricTransformMapGroup, "bulk_import", path="import", detail=False
155
+ )
156
+ class IPFabricTransformMapGroupBulkImportView(generic.BulkImportView):
157
+ queryset = IPFabricTransformMapGroup.objects.all()
158
+ model_form = IPFabricTransformMapGroupBulkImportForm
159
+
160
+
161
+ @register_model_view(IPFabricTransformMapGroup, "bulk_edit", path="edit", detail=False)
162
+ class IPFabricTransformMapGroupBulkEditView(generic.BulkEditView):
163
+ queryset = IPFabricTransformMapGroup.objects.all()
164
+ table = IPFabricTransformMapGroupTable
165
+ form = IPFabricTransformMapGroupBulkEditForm
166
+
167
+
168
+ @register_model_view(
169
+ IPFabricTransformMapGroup, "bulk_rename", path="rename", detail=False
170
+ )
171
+ class IPFabricTransformMapGroupBulkRenameView(generic.BulkRenameView):
172
+ queryset = IPFabricTransformMapGroup.objects.all()
173
+
174
+
175
+ @register_model_view(
176
+ IPFabricTransformMapGroup, "bulk_delete", path="delete", detail=False
177
+ )
143
178
  class IPFabricTransformMapGroupBulkDeleteView(generic.BulkDeleteView):
144
179
  queryset = IPFabricTransformMapGroup.objects.all()
145
180
  table = IPFabricTransformMapGroupTable
@@ -155,9 +190,11 @@ class IPFabricTransformMapGroupView(GetRelatedModelsMixin, generic.ObjectView):
155
190
  }
156
191
 
157
192
 
158
- # Transform Map
193
+ # endregion
194
+ # region - Transform Map
159
195
 
160
196
 
197
+ @register_model_view(IPFabricTransformMap, "list", path="", detail=False)
161
198
  class IPFabricTransformMapListView(generic.ObjectListView):
162
199
  queryset = IPFabricTransformMap.objects.all()
163
200
  table = IPFabricTransformMapTable
@@ -165,6 +202,50 @@ class IPFabricTransformMapListView(generic.ObjectListView):
165
202
  filterset = IPFabricTransformMapFilterSet
166
203
 
167
204
 
205
+ @register_model_view(IPFabricTransformMap, "add", detail=False)
206
+ @register_model_view(IPFabricTransformMap, "edit")
207
+ class IPFabricTransformMapEditView(generic.ObjectEditView):
208
+ queryset = IPFabricTransformMap.objects.all()
209
+ form = IPFabricTransformMapForm
210
+ default_return_url = "plugins:ipfabric_netbox:ipfabrictransformmap_list"
211
+
212
+
213
+ @register_model_view(IPFabricTransformMap, "delete")
214
+ class IPFabricTransformMapDeleteView(generic.ObjectDeleteView):
215
+ queryset = IPFabricTransformMap.objects.all()
216
+ default_return_url = "plugins:ipfabric_netbox:ipfabrictransformmap_list"
217
+
218
+
219
+ @register_model_view(IPFabricTransformMap, "bulk_import", path="import", detail=False)
220
+ class IPFabricTransformMapBulkImportView(generic.BulkImportView):
221
+ queryset = IPFabricTransformMap.objects.all()
222
+ model_form = IPFabricTransformMapBulkImportForm
223
+
224
+
225
+ @register_model_view(IPFabricTransformMap, "bulk_edit", path="edit", detail=False)
226
+ class IPFabricTransformMapBulkEditView(generic.BulkEditView):
227
+ queryset = IPFabricTransformMap.objects.all()
228
+ table = IPFabricTransformMapTable
229
+ form = IPFabricTransformMapBulkEditForm
230
+
231
+
232
+ @register_model_view(IPFabricTransformMap, "bulk_rename", path="rename", detail=False)
233
+ class IPFabricTransformMapBulkRenameView(generic.BulkRenameView):
234
+ queryset = IPFabricTransformMap.objects.all()
235
+
236
+
237
+ @register_model_view(IPFabricTransformMap, "bulk_delete", path="delete", detail=False)
238
+ class IPFabricTransformMapBulkDeleteView(generic.BulkDeleteView):
239
+ queryset = IPFabricTransformMap.objects.all()
240
+ table = IPFabricTransformMapTable
241
+
242
+
243
+ @register_model_view(IPFabricTransformMap)
244
+ class IPFabricTransformMapView(generic.ObjectView):
245
+ queryset = IPFabricTransformMap.objects.all()
246
+
247
+
248
+ @register_model_view(IPFabricTransformMap, "restore", detail=False)
168
249
  class IPFabricTransformMapRestoreView(generic.ObjectListView):
169
250
  queryset = IPFabricTransformMap.objects.all()
170
251
  table = IPFabricTransformMapTable
@@ -205,13 +286,6 @@ class IPFabricTransformMapRestoreView(generic.ObjectListView):
205
286
  return redirect("plugins:ipfabric_netbox:ipfabrictransformmap_list")
206
287
 
207
288
 
208
- @register_model_view(IPFabricTransformMap, "edit")
209
- class IPFabricTransformMapEditView(generic.ObjectEditView):
210
- queryset = IPFabricTransformMap.objects.all()
211
- form = IPFabricTransformMapForm
212
- default_return_url = "plugins:ipfabric_netbox:ipfabrictransformmap_list"
213
-
214
-
215
289
  @register_model_view(IPFabricTransformMap, "clone")
216
290
  class IPFabricTransformMapCloneView(BaseObjectView):
217
291
  queryset = IPFabricTransformMap.objects.all()
@@ -329,65 +403,85 @@ class IPFabricTransformMapCloneView(BaseObjectView):
329
403
  )
330
404
 
331
405
 
332
- class IPFabricTransformMapDeleteView(generic.ObjectDeleteView):
406
+ @register_model_view(IPFabricTransformMap, "fields")
407
+ class IPFabricTransformFieldView(generic.ObjectChildrenView):
333
408
  queryset = IPFabricTransformMap.objects.all()
334
- default_return_url = "plugins:ipfabric_netbox:ipfabrictransformmap_list"
335
-
409
+ child_model = IPFabricTransformField
410
+ table = IPFabricTransformFieldTable
411
+ template_name = "ipfabric_netbox/inc/transform_map_field_map.html"
412
+ actions = (AddObject, BulkDelete)
413
+ tab = ViewTab(
414
+ label="Field Maps",
415
+ badge=lambda obj: IPFabricTransformField.objects.filter(
416
+ transform_map=obj
417
+ ).count(),
418
+ permission="ipfabric_netbox.view_ipfabrictransformfield",
419
+ )
336
420
 
337
- class IPFabricTransformMapBulkDeleteView(generic.BulkDeleteView):
338
- queryset = IPFabricTransformMap.objects.all()
339
- table = IPFabricTransformMapTable
421
+ def get_children(self, request, parent):
422
+ return self.child_model.objects.filter(transform_map=parent)
340
423
 
341
424
 
342
- @register_model_view(IPFabricTransformMap)
343
- class IPFabricTransformMapView(generic.ObjectView):
425
+ @register_model_view(IPFabricTransformMap, "relationships")
426
+ class IPFabricTransformRelationshipView(generic.ObjectChildrenView):
344
427
  queryset = IPFabricTransformMap.objects.all()
428
+ child_model = IPFabricRelationshipField
429
+ table = IPFabricRelationshipFieldTable
430
+ template_name = "ipfabric_netbox/inc/transform_map_relationship_map.html"
431
+ actions = (AddObject, BulkDelete)
432
+ tab = ViewTab(
433
+ label="Relationship Maps",
434
+ badge=lambda obj: IPFabricRelationshipField.objects.filter(
435
+ transform_map=obj
436
+ ).count(),
437
+ permission="ipfabric_netbox.view_ipfabricrelationshipfield",
438
+ )
439
+
440
+ def get_children(self, request, parent):
441
+ return self.child_model.objects.filter(transform_map=parent)
345
442
 
346
443
 
347
- # Transform Map Field
444
+ # endregion
445
+ # region - Transform Map Field
348
446
 
349
447
 
448
+ # This list is not linked in navigation, but it's needed for tests
449
+ @register_model_view(IPFabricTransformField, "list", path="", detail=False)
350
450
  class IPFabricTransformFieldListView(generic.ObjectListView):
351
451
  queryset = IPFabricTransformField.objects.all()
352
452
  table = IPFabricTransformFieldTable
453
+ actions = ()
353
454
 
354
455
 
456
+ @register_model_view(IPFabricTransformField, "add", detail=False)
355
457
  @register_model_view(IPFabricTransformField, "edit")
356
458
  class IPFabricTransformFieldEditView(generic.ObjectEditView):
357
459
  queryset = IPFabricTransformField.objects.all()
358
460
  form = IPFabricTransformFieldForm
359
461
 
360
462
 
463
+ @register_model_view(IPFabricTransformField, "delete")
361
464
  class IPFabricTransformFieldDeleteView(generic.ObjectDeleteView):
362
465
  queryset = IPFabricTransformField.objects.all()
363
466
 
364
467
 
365
- @register_model_view(IPFabricTransformMap, "fields")
366
- class IPFabricTransformFieldView(generic.ObjectChildrenView):
367
- queryset = IPFabricTransformMap.objects.all()
368
- child_model = IPFabricTransformField
468
+ @register_model_view(IPFabricTransformField, "bulk_delete", path="delete", detail=False)
469
+ class IPFabricTransformFieldBulkDeleteView(generic.BulkDeleteView):
470
+ queryset = IPFabricTransformField.objects.all()
369
471
  table = IPFabricTransformFieldTable
370
- template_name = "ipfabric_netbox/inc/transform_map_field_map.html"
371
- tab = ViewTab(
372
- label="Field Maps",
373
- badge=lambda obj: IPFabricTransformField.objects.filter(
374
- transform_map=obj
375
- ).count(),
376
- permission="ipfabric_netbox.view_ipfabrictransformfield",
377
- )
378
-
379
- def get_children(self, request, parent):
380
- return self.child_model.objects.filter(transform_map=parent)
381
472
 
382
473
 
383
- # Snapshot
474
+ # endregion
475
+ # region - Snapshot
384
476
 
385
477
 
478
+ @register_model_view(IPFabricSnapshot, "list", path="", detail=False)
386
479
  class IPFabricSnapshotListView(generic.ObjectListView):
387
480
  queryset = IPFabricSnapshot.objects.all()
388
481
  table = IPFabricSnapshotTable
389
482
  filterset = IPFabricSnapshotFilterSet
390
483
  filterset_form = IPFabricSnapshotFilterForm
484
+ actions = (BulkExport, BulkDelete)
391
485
 
392
486
 
393
487
  @register_model_view(IPFabricSnapshot)
@@ -395,10 +489,12 @@ class IPFabricSnapshotView(generic.ObjectView):
395
489
  queryset = IPFabricSnapshot.objects.all()
396
490
 
397
491
 
492
+ @register_model_view(IPFabricSnapshot, "delete")
398
493
  class IPFabricSnapshotDeleteView(generic.ObjectDeleteView):
399
494
  queryset = IPFabricSnapshot.objects.all()
400
495
 
401
496
 
497
+ @register_model_view(IPFabricSnapshot, "bulk_delete", path="delete", detail=False)
402
498
  class IPFabricSnapshotBulkDeleteView(generic.BulkDeleteView):
403
499
  queryset = IPFabricSnapshot.objects.all()
404
500
  filterset = IPFabricSnapshotFilterSet
@@ -422,10 +518,16 @@ class IPFabricSnapshotRawView(generic.ObjectChildrenView):
422
518
  return self.child_model.objects.filter(snapshot_data=parent)
423
519
 
424
520
 
521
+ # endregion
522
+ # region - Snapshot Data
523
+
524
+
525
+ @register_model_view(IPFabricData, "delete")
425
526
  class IPFabricSnapshotDataDeleteView(generic.ObjectDeleteView):
426
527
  queryset = IPFabricData.objects.all()
427
528
 
428
529
 
530
+ @register_model_view(IPFabricData, "bulk_delete", path="delete", detail=False)
429
531
  class IPFabricSnapshotDataBulkDeleteView(generic.BulkDeleteView):
430
532
  queryset = IPFabricData.objects.all()
431
533
  filterset = IPFabricDataFilterSet
@@ -461,9 +563,11 @@ class IPFabricSnapshotDataJSONView(generic.ObjectView):
461
563
  )
462
564
 
463
565
 
464
- # Source
566
+ # endregion
567
+ # region - Source
465
568
 
466
569
 
570
+ @register_model_view(IPFabricSource, "list", path="", detail=False)
467
571
  class IPFabricSourceListView(generic.ObjectListView):
468
572
  queryset = IPFabricSource.objects.annotate(
469
573
  snapshot_count=count_related(IPFabricSnapshot, "source")
@@ -471,8 +575,10 @@ class IPFabricSourceListView(generic.ObjectListView):
471
575
  filterset = IPFabricSourceFilterSet
472
576
  filterset_form = IPFabricSourceFilterForm
473
577
  table = IPFabricSourceTable
578
+ actions = (AddObject, BulkExport, BulkEdit, BulkRename, BulkDelete)
474
579
 
475
580
 
581
+ @register_model_view(IPFabricSource, "add", detail=False)
476
582
  @register_model_view(IPFabricSource, "edit")
477
583
  class IPFabricSourceEditView(generic.ObjectEditView):
478
584
  queryset = IPFabricSource.objects.all()
@@ -518,19 +624,115 @@ class IPFabricSourceDeleteView(generic.ObjectDeleteView):
518
624
  queryset = IPFabricSource.objects.all()
519
625
 
520
626
 
627
+ @register_model_view(IPFabricSource, "bulk_edit", path="edit", detail=False)
628
+ class IPFabricSourceBulkEditView(generic.BulkEditView):
629
+ queryset = IPFabricSource.objects.all()
630
+ table = IPFabricSourceTable
631
+ form = IPFabricSourceBulkEditForm
632
+
633
+
634
+ @register_model_view(IPFabricSource, "bulk_rename", path="rename", detail=False)
635
+ class IPFabricSourceBulkRenameView(generic.BulkRenameView):
636
+ queryset = IPFabricSource.objects.all()
637
+
638
+
639
+ @register_model_view(IPFabricSource, "bulk_delete", path="delete", detail=False)
521
640
  class IPFabricSourceBulkDeleteView(generic.BulkDeleteView):
522
641
  queryset = IPFabricSource.objects.all()
523
642
  filterset = IPFabricSourceFilterSet
524
643
  table = IPFabricSourceTable
525
644
 
526
645
 
527
- # Sync
646
+ @register_model_view(
647
+ IPFabricSource,
648
+ name="topology",
649
+ path="topology/<int:site>",
650
+ kwargs={"snapshot": ""},
651
+ )
652
+ class IPFabricSourceTopology(LoginRequiredMixin, View):
653
+ template_name = "ipfabric_netbox/inc/site_topology_modal.html"
654
+
655
+ def get(self, request, pk, site, **kwargs):
656
+ if request.htmx:
657
+ try:
658
+ site = get_object_or_404(Site, pk=site)
659
+ source_id = request.GET.get("source")
660
+ if not source_id:
661
+ raise Exception("Source ID not available in request.")
662
+ source = get_object_or_404(IPFabricSource, pk=source_id)
663
+ snapshot = request.GET.get("snapshot")
664
+ if not snapshot:
665
+ raise Exception("Snapshot ID not available in request.")
666
+
667
+ source.parameters.update(
668
+ {"snapshot_id": snapshot, "base_url": source.url}
669
+ )
670
+
671
+ ipf = IPFabric(parameters=source.parameters)
672
+ snapshot_data = ipf.ipf.snapshots.get(snapshot)
673
+ if not snapshot_data:
674
+ raise Exception(
675
+ f"Snapshot ({snapshot}) not available in IP Fabric." # noqa E713
676
+ )
677
+
678
+ sites = ipf.ipf.inventory.sites.all(
679
+ filters={"siteName": ["eq", site.name]}
680
+ )
681
+ if not sites:
682
+ raise Exception(
683
+ f"{site.name} not available in snapshot ({snapshot})." # noqa E713
684
+ )
685
+
686
+ net = Network(sites=site.name, all_network=False)
687
+ settings = NetworkSettings()
688
+ settings.hide_protocol("xdp")
689
+ settings.hiddenDeviceTypes.extend(["transit", "cloud"])
690
+
691
+ link = ipf.ipf.diagram.share_link(net, graph_settings=settings)
692
+ svg_data = ipf.ipf.diagram.svg(net, graph_settings=settings).decode(
693
+ "utf-8"
694
+ )
695
+ error = None
696
+ except Exception as e:
697
+ error = e
698
+ svg_data = link = snapshot_data = source = None
699
+
700
+ return render(
701
+ request,
702
+ self.template_name,
703
+ {
704
+ "site": site,
705
+ "source": source,
706
+ "svg": svg_data,
707
+ "size": "xl",
708
+ "link": link,
709
+ "time": timezone.now(),
710
+ "snapshot": snapshot_data,
711
+ "error": error,
712
+ },
713
+ )
714
+ return render(
715
+ request,
716
+ self.template_name,
717
+ {
718
+ "site": site,
719
+ "size": "xl",
720
+ "time": timezone.now(),
721
+ },
722
+ )
723
+
724
+
725
+ # endregion
726
+ # region - Sync
727
+ @register_model_view(IPFabricSync, "list", path="", detail=False)
528
728
  class IPFabricSyncListView(generic.ObjectListView):
529
729
  queryset = IPFabricSync.objects.all()
530
730
  table = IPFabricSyncTable
531
731
  filterset = IPFabricSyncFilterSet
732
+ actions = (AddObject, BulkExport, BulkEdit, BulkRename, BulkDelete)
532
733
 
533
734
 
735
+ @register_model_view(IPFabricSync, "add", detail=False)
534
736
  @register_model_view(IPFabricSync, "edit")
535
737
  class IPFabricSyncEditView(generic.ObjectEditView):
536
738
  queryset = IPFabricSync.objects.all()
@@ -608,6 +810,19 @@ class IPFabricSyncDeleteView(generic.ObjectDeleteView):
608
810
  default_return_url = "plugins:ipfabric_netbox:ipfabricsync_list"
609
811
 
610
812
 
813
+ @register_model_view(IPFabricSync, "bulk_edit", path="edit", detail=False)
814
+ class IPFabricSyncBulkEditView(generic.BulkEditView):
815
+ queryset = IPFabricSync.objects.all()
816
+ table = IPFabricSyncTable
817
+ form = IPFabricSyncBulkEditForm
818
+
819
+
820
+ @register_model_view(IPFabricSync, "bulk_rename", path="rename", detail=False)
821
+ class IPFabricSyncBulkRenameView(generic.BulkRenameView):
822
+ queryset = IPFabricSync.objects.all()
823
+
824
+
825
+ @register_model_view(IPFabricSync, "bulk_delete", path="delete", detail=False)
611
826
  class IPFabricSyncBulkDeleteView(generic.BulkDeleteView):
612
827
  queryset = IPFabricSync.objects.all()
613
828
  filterset = IPFabricSnapshotFilterSet
@@ -620,6 +835,7 @@ class IPFabricTransformMapTabView(generic.ObjectChildrenView):
620
835
  child_model = IPFabricTransformMap
621
836
  table = IPFabricTransformMapTable
622
837
  template_name = "generic/object_children.html"
838
+ actions = (AddObject, BulkDelete)
623
839
  tab = ViewTab(
624
840
  label="Transform Maps",
625
841
  badge=lambda obj: obj.get_transform_maps(
@@ -640,6 +856,7 @@ class IPFabricIngestionTabView(generic.ObjectChildrenView):
640
856
  child_model = IPFabricIngestion
641
857
  table = IPFabricIngestionTable
642
858
  filterset = IPFabricIngestionFilterSet
859
+ actions = (AddObject, BulkDelete)
643
860
  tab = ViewTab(
644
861
  label="Ingestions",
645
862
  badge=lambda obj: IPFabricIngestion.objects.filter(sync=obj).count(),
@@ -654,7 +871,11 @@ class IPFabricIngestionTabView(generic.ObjectChildrenView):
654
871
  )
655
872
 
656
873
 
657
- # Ingestion
874
+ # endregion
875
+ # region - Ingestion
876
+
877
+
878
+ @register_model_view(IPFabricIngestion, "list", path="", detail=False)
658
879
  class IPFabricIngestionListView(generic.ObjectListView):
659
880
  queryset = IPFabricIngestion.objects.annotate(
660
881
  description=models.F("branch__description"),
@@ -664,6 +885,7 @@ class IPFabricIngestionListView(generic.ObjectListView):
664
885
  filterset = IPFabricIngestionFilterSet
665
886
  filterset_form = IPFabricIngestionFilterForm
666
887
  table = IPFabricIngestionTable
888
+ actions = (AddObject, BulkExport, BulkDelete)
667
889
 
668
890
 
669
891
  def annotate_statistics(queryset):
@@ -868,6 +1090,7 @@ class IPFabricIngestionIssuesView(generic.ObjectChildrenView):
868
1090
  table = IPFabricIngestionIssuesTable
869
1091
  template_name = "generic/object_children.html"
870
1092
  filterset = IPFabricIngestionIssueFilterSet
1093
+ actions = (AddObject, BulkDelete)
871
1094
  tab = ViewTab(
872
1095
  label="Ingestion Issues",
873
1096
  badge=lambda obj: IPFabricIngestionIssue.objects.filter(ingestion=obj).count(),
@@ -883,6 +1106,12 @@ class IPFabricIngestionDeleteView(generic.ObjectDeleteView):
883
1106
  queryset = IPFabricIngestion.objects.all()
884
1107
 
885
1108
 
1109
+ @register_model_view(IPFabricIngestion, "bulk_delete", path="delete", detail=False)
1110
+ class IPFabricIngestionBulkDeleteView(generic.BulkDeleteView):
1111
+ queryset = IPFabricIngestion.objects.all()
1112
+ table = IPFabricIngestionTable
1113
+
1114
+
886
1115
  @register_model_view(Device, "ipfabric")
887
1116
  class IPFabricTable(generic.ObjectView):
888
1117
  template_name = "ipfabric_netbox/ipfabric_table.html"
@@ -985,80 +1214,4 @@ class IPFabricTable(generic.ObjectView):
985
1214
  return super().get(request, **kwargs)
986
1215
 
987
1216
 
988
- @register_model_view(
989
- IPFabricSource,
990
- name="topology",
991
- path="topology/<int:site>",
992
- kwargs={"snapshot": ""},
993
- )
994
- class IPFabricSourceTopology(LoginRequiredMixin, View):
995
- template_name = "ipfabric_netbox/inc/site_topology_modal.html"
996
-
997
- def get(self, request, pk, site, **kwargs):
998
- if request.htmx:
999
- try:
1000
- site = get_object_or_404(Site, pk=site)
1001
- source_id = request.GET.get("source")
1002
- if not source_id:
1003
- raise Exception("Source ID not available in request.")
1004
- source = get_object_or_404(IPFabricSource, pk=source_id)
1005
- snapshot = request.GET.get("snapshot")
1006
- if not snapshot:
1007
- raise Exception("Snapshot ID not available in request.")
1008
-
1009
- source.parameters.update(
1010
- {"snapshot_id": snapshot, "base_url": source.url}
1011
- )
1012
-
1013
- ipf = IPFabric(parameters=source.parameters)
1014
- snapshot_data = ipf.ipf.snapshots.get(snapshot)
1015
- if not snapshot_data:
1016
- raise Exception(
1017
- f"Snapshot ({snapshot}) not available in IP Fabric." # noqa E713
1018
- )
1019
-
1020
- sites = ipf.ipf.inventory.sites.all(
1021
- filters={"siteName": ["eq", site.name]}
1022
- )
1023
- if not sites:
1024
- raise Exception(
1025
- f"{site.name} not available in snapshot ({snapshot})." # noqa E713
1026
- )
1027
-
1028
- net = Network(sites=site.name, all_network=False)
1029
- settings = NetworkSettings()
1030
- settings.hide_protocol("xdp")
1031
- settings.hiddenDeviceTypes.extend(["transit", "cloud"])
1032
-
1033
- link = ipf.ipf.diagram.share_link(net, graph_settings=settings)
1034
- svg_data = ipf.ipf.diagram.svg(net, graph_settings=settings).decode(
1035
- "utf-8"
1036
- )
1037
- error = None
1038
- except Exception as e:
1039
- error = e
1040
- svg_data = link = snapshot_data = source = None
1041
-
1042
- return render(
1043
- request,
1044
- self.template_name,
1045
- {
1046
- "site": site,
1047
- "source": source,
1048
- "svg": svg_data,
1049
- "size": "xl",
1050
- "link": link,
1051
- "time": timezone.now(),
1052
- "snapshot": snapshot_data,
1053
- "error": error,
1054
- },
1055
- )
1056
- return render(
1057
- request,
1058
- self.template_name,
1059
- {
1060
- "site": site,
1061
- "size": "xl",
1062
- "time": timezone.now(),
1063
- },
1064
- )
1217
+ # endregion
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ipfabric_netbox
3
- Version: 4.3.0b4
3
+ Version: 4.3.0b6
4
4
  Summary: NetBox plugin to sync IP Fabric data into NetBox
5
5
  License: MIT
6
6
  Keywords: netbox,ipfabric,plugin,sync