diff --git a/netbox_topology_views/forms.py b/netbox_topology_views/forms.py index 472357a..4db5727 100644 --- a/netbox_topology_views/forms.py +++ b/netbox_topology_views/forms.py @@ -12,7 +12,7 @@ from dcim.choices import DeviceStatusChoices from tenancy.models import TenantGroup, Tenant from tenancy.forms import TenancyFilterForm from django.conf import settings -from netbox.forms import NetBoxModelFilterSetForm, NetBoxModelForm +from netbox.forms import NetBoxModelFilterSetForm, NetBoxModelForm, NetBoxModelImportForm from utilities.forms.fields import ( TagFilterField, DynamicModelMultipleChoiceField, @@ -159,6 +159,11 @@ class CoordinateGroupsForm(NetBoxModelForm): model = CoordinateGroup fields = ('name', 'description') +class CoordinateGroupsImportForm(NetBoxModelImportForm): + class Meta: + model = CoordinateGroup + fields = ('name', 'description') + class CoordinatesForm(NetBoxModelForm): fieldsets = ( ('Coordinate', ('group', 'device', 'x', 'y')), @@ -168,6 +173,11 @@ class CoordinatesForm(NetBoxModelForm): model = Coordinate fields = ('group', 'device', 'x', 'y') +class CoordinatesImportForm(NetBoxModelImportForm): + class Meta: + model = Coordinate + fields = ('group', 'device', 'x', 'y') + class CoordinatesFilterForm(NetBoxModelFilterSetForm): model = Coordinate fieldsets = ( diff --git a/netbox_topology_views/navigation.py b/netbox_topology_views/navigation.py index 3d1a88a..3b7a53e 100644 --- a/netbox_topology_views/navigation.py +++ b/netbox_topology_views/navigation.py @@ -1,23 +1,35 @@ from extras.plugins import PluginMenu, PluginMenuItem, PluginMenuButton from utilities.choices import ButtonColorChoices -coordinategroup_buttons = [ +coordinategroup_buttons = ( PluginMenuButton( link='plugins:netbox_topology_views:coordinategroup_add', title='Add', icon_class='mdi mdi-plus-thick', color=ButtonColorChoices.GREEN, + ), + PluginMenuButton( + link='plugins:netbox_topology_views:coordinategroup_import', + title='Import', + icon_class='mdi mdi-upload', + color=ButtonColorChoices.CYAN, ) -] +) -coordinate_buttons = [ +coordinate_buttons = ( PluginMenuButton( link='plugins:netbox_topology_views:coordinate_add', title='Add', icon_class='mdi mdi-plus-thick', color=ButtonColorChoices.GREEN, + ), + PluginMenuButton( + link='plugins:netbox_topology_views:coordinate_import', + title='Import', + icon_class='mdi mdi-upload', + color=ButtonColorChoices.CYAN, ) -] +) menu = PluginMenu( label='Topology Views', diff --git a/netbox_topology_views/urls.py b/netbox_topology_views/urls.py index 2da3a95..7773bb5 100644 --- a/netbox_topology_views/urls.py +++ b/netbox_topology_views/urls.py @@ -14,6 +14,7 @@ urlpatterns = ( # Coordinate Group path("coordinate-groups/", views.CoordinateGroupListView.as_view(), name="coordinategroup_list"), path("coordinate-groups/add/", views.CoordinateGroupAddView.as_view(), name="coordinategroup_add"), + path('coordinate/import/', views.CoordinateGroupBulkImportView.as_view(), name='coordinategroup_import'), path("coordinate-groups//", views.CoordinateGroupView.as_view(), name="coordinategroup"), path("coordinate-groups//edit/", views.CoordinateGroupEditView.as_view(), name="coordinategroup_edit"), path("coordinate-groups//delete/", views.CoordinateGroupDeleteView.as_view(), name="coordinategroup_delete"), @@ -22,6 +23,7 @@ urlpatterns = ( # Coordinate path("coordinate/", views.CoordinateListView.as_view(), name="coordinate_list"), path("coordinate/add/", views.CoordinateAddView.as_view(), name="coordinate_add"), + path('coordinate/import/', views.CoordinateBulkImportView.as_view(), name='coordinate_import'), path("coordinate//", views.CoordinateView.as_view(), name="coordinate"), path("coordinate//edit/", views.CoordinateEditView.as_view(), name="coordinate_edit"), path("coordinate//delete/", views.CoordinateDeleteView.as_view(), name="coordinate_delete"), diff --git a/netbox_topology_views/views.py b/netbox_topology_views/views.py index 3286cdd..9343242 100644 --- a/netbox_topology_views/views.py +++ b/netbox_topology_views/views.py @@ -29,11 +29,26 @@ from django.shortcuts import render, get_object_or_404 from django.views.generic import View from extras.models import Tag from wireless.models import WirelessLink -from netbox.views.generic import ObjectView, ObjectListView, ObjectEditView, ObjectDeleteView, ObjectChangeLogView +from netbox.views.generic import ( + ObjectView, + ObjectListView, + ObjectEditView, + ObjectDeleteView, + ObjectChangeLogView, + BulkImportView +) from netbox_topology_views.filters import DeviceFilterSet, CoordinatesFilterSet -from netbox_topology_views.forms import DeviceFilterForm, IndividualOptionsForm, CoordinateGroupsForm, CoordinatesForm, CoordinatesFilterForm +from netbox_topology_views.forms import ( + DeviceFilterForm, + IndividualOptionsForm, + CoordinateGroupsForm, + CoordinatesForm, + CoordinatesFilterForm, + CoordinateGroupsImportForm, + CoordinatesImportForm +) from netbox_topology_views.models import RoleImage, CoordinateGroup, Coordinate, IndividualOptions from netbox_topology_views.tables import CoordinateGroupListTable, CoordinateListTable from netbox_topology_views.utils import ( @@ -791,6 +806,10 @@ class CoordinateAddView(PermissionRequiredMixin, ObjectEditView): form = CoordinatesForm template_name = 'netbox_topology_views/coordinate_add.html' +class CoordinateBulkImportView(BulkImportView): + queryset = Coordinate.objects.all() + model_form = CoordinatesImportForm + class CoordinateListView(PermissionRequiredMixin, ObjectListView): permission_required = 'netbox_topology_views.view_coordinate' @@ -837,6 +856,10 @@ class CoordinateGroupAddView(PermissionRequiredMixin, ObjectEditView): form = CoordinateGroupsForm template_name = 'netbox_topology_views/coordinategroup_add.html' +class CoordinateGroupBulkImportView(BulkImportView): + queryset = CoordinateGroup.objects.all() + model_form = CoordinateGroupsImportForm + class CoordinateGroupListView(PermissionRequiredMixin, ObjectListView): permission_required = 'netbox_topology_views.view_coordinategroup'