diff --git a/netbox/virtualization/urls.py b/netbox/virtualization/urls.py index 6d90645a3..2aeeead77 100644 --- a/netbox/virtualization/urls.py +++ b/netbox/virtualization/urls.py @@ -6,57 +6,33 @@ from . import views app_name = 'virtualization' urlpatterns = [ - # Cluster types - path('cluster-types/', views.ClusterTypeListView.as_view(), name='clustertype_list'), - path('cluster-types/add/', views.ClusterTypeEditView.as_view(), name='clustertype_add'), - path('cluster-types/import/', views.ClusterTypeBulkImportView.as_view(), name='clustertype_import'), - path('cluster-types/edit/', views.ClusterTypeBulkEditView.as_view(), name='clustertype_bulk_edit'), - path('cluster-types/delete/', views.ClusterTypeBulkDeleteView.as_view(), name='clustertype_bulk_delete'), + path('cluster-types/', include(get_model_urls('virtualization', 'clustertype', detail=False))), path('cluster-types//', include(get_model_urls('virtualization', 'clustertype'))), - # Cluster groups - path('cluster-groups/', views.ClusterGroupListView.as_view(), name='clustergroup_list'), - path('cluster-groups/add/', views.ClusterGroupEditView.as_view(), name='clustergroup_add'), - path('cluster-groups/import/', views.ClusterGroupBulkImportView.as_view(), name='clustergroup_import'), - path('cluster-groups/edit/', views.ClusterGroupBulkEditView.as_view(), name='clustergroup_bulk_edit'), - path('cluster-groups/delete/', views.ClusterGroupBulkDeleteView.as_view(), name='clustergroup_bulk_delete'), + path('cluster-groups/', include(get_model_urls('virtualization', 'clustergroup', detail=False))), path('cluster-groups//', include(get_model_urls('virtualization', 'clustergroup'))), - # Clusters - path('clusters/', views.ClusterListView.as_view(), name='cluster_list'), - path('clusters/add/', views.ClusterEditView.as_view(), name='cluster_add'), - path('clusters/import/', views.ClusterBulkImportView.as_view(), name='cluster_import'), - path('clusters/edit/', views.ClusterBulkEditView.as_view(), name='cluster_bulk_edit'), - path('clusters/delete/', views.ClusterBulkDeleteView.as_view(), name='cluster_bulk_delete'), + path('clusters/', include(get_model_urls('virtualization', 'cluster', detail=False))), path('clusters//', include(get_model_urls('virtualization', 'cluster'))), - # Virtual machines - path('virtual-machines/', views.VirtualMachineListView.as_view(), name='virtualmachine_list'), - path('virtual-machines/add/', views.VirtualMachineEditView.as_view(), name='virtualmachine_add'), - path('virtual-machines/import/', views.VirtualMachineBulkImportView.as_view(), name='virtualmachine_import'), - path('virtual-machines/edit/', views.VirtualMachineBulkEditView.as_view(), name='virtualmachine_bulk_edit'), - path('virtual-machines/delete/', views.VirtualMachineBulkDeleteView.as_view(), name='virtualmachine_bulk_delete'), + path('virtual-machines/', include(get_model_urls('virtualization', 'virtualmachine', detail=False))), path('virtual-machines//', include(get_model_urls('virtualization', 'virtualmachine'))), - # VM interfaces - path('interfaces/', views.VMInterfaceListView.as_view(), name='vminterface_list'), - path('interfaces/add/', views.VMInterfaceCreateView.as_view(), name='vminterface_add'), - path('interfaces/import/', views.VMInterfaceBulkImportView.as_view(), name='vminterface_import'), - path('interfaces/edit/', views.VMInterfaceBulkEditView.as_view(), name='vminterface_bulk_edit'), - path('interfaces/rename/', views.VMInterfaceBulkRenameView.as_view(), name='vminterface_bulk_rename'), - path('interfaces/delete/', views.VMInterfaceBulkDeleteView.as_view(), name='vminterface_bulk_delete'), + path('interfaces/', include(get_model_urls('virtualization', 'vminterface', detail=False))), path('interfaces//', include(get_model_urls('virtualization', 'vminterface'))), - path('virtual-machines/interfaces/add/', views.VirtualMachineBulkAddInterfaceView.as_view(), name='virtualmachine_bulk_add_vminterface'), + path( + 'virtual-machines/interfaces/add/', + views.VirtualMachineBulkAddInterfaceView.as_view(), + name='virtualmachine_bulk_add_vminterface' + ), - # Virtual disks - path('virtual-disks/', views.VirtualDiskListView.as_view(), name='virtualdisk_list'), - path('virtual-disks/add/', views.VirtualDiskCreateView.as_view(), name='virtualdisk_add'), - path('virtual-disks/import/', views.VirtualDiskBulkImportView.as_view(), name='virtualdisk_import'), - path('virtual-disks/edit/', views.VirtualDiskBulkEditView.as_view(), name='virtualdisk_bulk_edit'), - path('virtual-disks/rename/', views.VirtualDiskBulkRenameView.as_view(), name='virtualdisk_bulk_rename'), - path('virtual-disks/delete/', views.VirtualDiskBulkDeleteView.as_view(), name='virtualdisk_bulk_delete'), + path('virtual-disks/', include(get_model_urls('virtualization', 'virtualdisk', detail=False))), path('virtual-disks//', include(get_model_urls('virtualization', 'virtualdisk'))), - path('virtual-machines/disks/add/', views.VirtualMachineBulkAddVirtualDiskView.as_view(), name='virtualmachine_bulk_add_virtualdisk'), + path( + 'virtual-machines/disks/add/', + views.VirtualMachineBulkAddVirtualDiskView.as_view(), + name='virtualmachine_bulk_add_virtualdisk' + ), # TODO: Remove in v4.2 # Redirect old (pre-v4.1) URLs for VirtualDisk views diff --git a/netbox/virtualization/views.py b/netbox/virtualization/views.py index 35f2f8f75..605de0911 100644 --- a/netbox/virtualization/views.py +++ b/netbox/virtualization/views.py @@ -31,6 +31,7 @@ from .models import * # Cluster types # +@register_model_view(ClusterType, 'list', path='', detail=False) class ClusterTypeListView(generic.ObjectListView): queryset = ClusterType.objects.annotate( cluster_count=count_related(Cluster, 'type') @@ -50,6 +51,7 @@ class ClusterTypeView(GetRelatedModelsMixin, generic.ObjectView): } +@register_model_view(ClusterType, 'add', detail=False) @register_model_view(ClusterType, 'edit') class ClusterTypeEditView(generic.ObjectEditView): queryset = ClusterType.objects.all() @@ -61,11 +63,13 @@ class ClusterTypeDeleteView(generic.ObjectDeleteView): queryset = ClusterType.objects.all() +@register_model_view(ClusterType, 'import', detail=False) class ClusterTypeBulkImportView(generic.BulkImportView): queryset = ClusterType.objects.all() model_form = forms.ClusterTypeImportForm +@register_model_view(ClusterType, 'bulk_edit', path='edit', detail=False) class ClusterTypeBulkEditView(generic.BulkEditView): queryset = ClusterType.objects.annotate( cluster_count=count_related(Cluster, 'type') @@ -75,6 +79,7 @@ class ClusterTypeBulkEditView(generic.BulkEditView): form = forms.ClusterTypeBulkEditForm +@register_model_view(ClusterType, 'bulk_delete', path='delete', detail=False) class ClusterTypeBulkDeleteView(generic.BulkDeleteView): queryset = ClusterType.objects.annotate( cluster_count=count_related(Cluster, 'type') @@ -87,6 +92,7 @@ class ClusterTypeBulkDeleteView(generic.BulkDeleteView): # Cluster groups # +@register_model_view(ClusterGroup, 'list', path='', detail=False) class ClusterGroupListView(generic.ObjectListView): queryset = ClusterGroup.objects.annotate( cluster_count=count_related(Cluster, 'group') @@ -106,6 +112,7 @@ class ClusterGroupView(GetRelatedModelsMixin, generic.ObjectView): } +@register_model_view(ClusterGroup, 'add', detail=False) @register_model_view(ClusterGroup, 'edit') class ClusterGroupEditView(generic.ObjectEditView): queryset = ClusterGroup.objects.all() @@ -117,6 +124,7 @@ class ClusterGroupDeleteView(generic.ObjectDeleteView): queryset = ClusterGroup.objects.all() +@register_model_view(ClusterGroup, 'import', detail=False) class ClusterGroupBulkImportView(generic.BulkImportView): queryset = ClusterGroup.objects.annotate( cluster_count=count_related(Cluster, 'group') @@ -124,6 +132,7 @@ class ClusterGroupBulkImportView(generic.BulkImportView): model_form = forms.ClusterGroupImportForm +@register_model_view(ClusterGroup, 'bulk_edit', path='edit', detail=False) class ClusterGroupBulkEditView(generic.BulkEditView): queryset = ClusterGroup.objects.annotate( cluster_count=count_related(Cluster, 'group') @@ -133,6 +142,7 @@ class ClusterGroupBulkEditView(generic.BulkEditView): form = forms.ClusterGroupBulkEditForm +@register_model_view(ClusterGroup, 'bulk_delete', path='delete', detail=False) class ClusterGroupBulkDeleteView(generic.BulkDeleteView): queryset = ClusterGroup.objects.annotate( cluster_count=count_related(Cluster, 'group') @@ -150,6 +160,7 @@ class ClusterGroupContactsView(ObjectContactsView): # Clusters # +@register_model_view(Cluster, 'list', path='', detail=False) class ClusterListView(generic.ObjectListView): permission_required = 'virtualization.view_cluster' queryset = Cluster.objects.annotate( @@ -213,6 +224,7 @@ class ClusterDevicesView(generic.ObjectChildrenView): return Device.objects.restrict(request.user, 'view').filter(cluster=parent) +@register_model_view(Cluster, 'add', detail=False) @register_model_view(Cluster, 'edit') class ClusterEditView(generic.ObjectEditView): queryset = Cluster.objects.all() @@ -224,11 +236,13 @@ class ClusterDeleteView(generic.ObjectDeleteView): queryset = Cluster.objects.all() +@register_model_view(Cluster, 'import', detail=False) class ClusterBulkImportView(generic.BulkImportView): queryset = Cluster.objects.all() model_form = forms.ClusterImportForm +@register_model_view(Cluster, 'bulk_edit', path='edit', detail=False) class ClusterBulkEditView(generic.BulkEditView): queryset = Cluster.objects.all() filterset = filtersets.ClusterFilterSet @@ -236,6 +250,7 @@ class ClusterBulkEditView(generic.BulkEditView): form = forms.ClusterBulkEditForm +@register_model_view(Cluster, 'bulk_delete', path='delete', detail=False) class ClusterBulkDeleteView(generic.BulkDeleteView): queryset = Cluster.objects.all() filterset = filtersets.ClusterFilterSet @@ -337,6 +352,7 @@ class ClusterContactsView(ObjectContactsView): # Virtual machines # +@register_model_view(VirtualMachine, 'list', path='', detail=False) class VirtualMachineListView(generic.ObjectListView): queryset = VirtualMachine.objects.prefetch_related('primary_ip4', 'primary_ip6') filterset = filtersets.VirtualMachineFilterSet @@ -457,6 +473,7 @@ class VirtualMachineRenderConfigView(generic.ObjectView): } +@register_model_view(VirtualMachine, 'add', detail=False) @register_model_view(VirtualMachine, 'edit') class VirtualMachineEditView(generic.ObjectEditView): queryset = VirtualMachine.objects.all() @@ -468,11 +485,13 @@ class VirtualMachineDeleteView(generic.ObjectDeleteView): queryset = VirtualMachine.objects.all() +@register_model_view(VirtualMachine, 'import', detail=False) class VirtualMachineBulkImportView(generic.BulkImportView): queryset = VirtualMachine.objects.all() model_form = forms.VirtualMachineImportForm +@register_model_view(VirtualMachine, 'bulk_edit', path='edit', detail=False) class VirtualMachineBulkEditView(generic.BulkEditView): queryset = VirtualMachine.objects.prefetch_related('primary_ip4', 'primary_ip6') filterset = filtersets.VirtualMachineFilterSet @@ -480,6 +499,7 @@ class VirtualMachineBulkEditView(generic.BulkEditView): form = forms.VirtualMachineBulkEditForm +@register_model_view(VirtualMachine, 'bulk_delete', path='delete', detail=False) class VirtualMachineBulkDeleteView(generic.BulkDeleteView): queryset = VirtualMachine.objects.prefetch_related('primary_ip4', 'primary_ip6') filterset = filtersets.VirtualMachineFilterSet @@ -495,6 +515,7 @@ class VirtualMachineContactsView(ObjectContactsView): # VM interfaces # +@register_model_view(VMInterface, 'list', path='', detail=False) class VMInterfaceListView(generic.ObjectListView): queryset = VMInterface.objects.all() filterset = filtersets.VMInterfaceFilterSet @@ -545,6 +566,7 @@ class VMInterfaceView(generic.ObjectView): } +@register_model_view(VMInterface, 'add', detail=False) class VMInterfaceCreateView(generic.ComponentCreateView): queryset = VMInterface.objects.all() form = forms.VMInterfaceCreateForm @@ -562,11 +584,13 @@ class VMInterfaceDeleteView(generic.ObjectDeleteView): queryset = VMInterface.objects.all() +@register_model_view(VMInterface, 'import', detail=False) class VMInterfaceBulkImportView(generic.BulkImportView): queryset = VMInterface.objects.all() model_form = forms.VMInterfaceImportForm +@register_model_view(VMInterface, 'bulk_edit', path='edit', detail=False) class VMInterfaceBulkEditView(generic.BulkEditView): queryset = VMInterface.objects.all() filterset = filtersets.VMInterfaceFilterSet @@ -574,11 +598,13 @@ class VMInterfaceBulkEditView(generic.BulkEditView): form = forms.VMInterfaceBulkEditForm +@register_model_view(VMInterface, 'bulk_rename', path='rename', detail=False) class VMInterfaceBulkRenameView(generic.BulkRenameView): queryset = VMInterface.objects.all() form = forms.VMInterfaceBulkRenameForm +@register_model_view(VMInterface, 'bulk_delete', path='delete', detail=False) class VMInterfaceBulkDeleteView(generic.BulkDeleteView): # Ensure child interfaces are deleted prior to their parents queryset = VMInterface.objects.order_by('virtual_machine', 'parent', CollateAsChar('_name')) @@ -590,6 +616,7 @@ class VMInterfaceBulkDeleteView(generic.BulkDeleteView): # Virtual disks # +@register_model_view(VirtualDisk, 'list', path='', detail=False) class VirtualDiskListView(generic.ObjectListView): queryset = VirtualDisk.objects.all() filterset = filtersets.VirtualDiskFilterSet @@ -602,6 +629,7 @@ class VirtualDiskView(generic.ObjectView): queryset = VirtualDisk.objects.all() +@register_model_view(VirtualDisk, 'add', detail=False) class VirtualDiskCreateView(generic.ComponentCreateView): queryset = VirtualDisk.objects.all() form = forms.VirtualDiskCreateForm @@ -619,11 +647,13 @@ class VirtualDiskDeleteView(generic.ObjectDeleteView): queryset = VirtualDisk.objects.all() +@register_model_view(VirtualDisk, 'import', detail=False) class VirtualDiskBulkImportView(generic.BulkImportView): queryset = VirtualDisk.objects.all() model_form = forms.VirtualDiskImportForm +@register_model_view(VirtualDisk, 'bulk_edit', path='edit', detail=False) class VirtualDiskBulkEditView(generic.BulkEditView): queryset = VirtualDisk.objects.all() filterset = filtersets.VirtualDiskFilterSet @@ -631,11 +661,13 @@ class VirtualDiskBulkEditView(generic.BulkEditView): form = forms.VirtualDiskBulkEditForm +@register_model_view(VirtualDisk, 'bulk_rename', path='rename', detail=False) class VirtualDiskBulkRenameView(generic.BulkRenameView): queryset = VirtualDisk.objects.all() form = forms.VirtualDiskBulkRenameForm +@register_model_view(VirtualDisk, 'bulk_delete', path='delete', detail=False) class VirtualDiskBulkDeleteView(generic.BulkDeleteView): queryset = VirtualDisk.objects.all() filterset = filtersets.VirtualDiskFilterSet