Closes #10608: Register all core model views using register_model_view()

This commit is contained in:
jeremystretch 2022-10-07 17:17:58 -04:00
parent a3dbf4023c
commit b0ba9bd83d
16 changed files with 389 additions and 344 deletions

View File

@ -1,9 +1,7 @@
from django.urls import include, path
from dcim.views import PathTraceView
from utilities.urls import get_model_urls
from . import views
from .models import CircuitTermination
app_name = 'circuits'
urlpatterns = [
@ -14,9 +12,6 @@ urlpatterns = [
path('providers/import/', views.ProviderBulkImportView.as_view(), name='provider_import'),
path('providers/edit/', views.ProviderBulkEditView.as_view(), name='provider_bulk_edit'),
path('providers/delete/', views.ProviderBulkDeleteView.as_view(), name='provider_bulk_delete'),
path('providers/<int:pk>/', views.ProviderView.as_view(), name='provider'),
path('providers/<int:pk>/edit/', views.ProviderEditView.as_view(), name='provider_edit'),
path('providers/<int:pk>/delete/', views.ProviderDeleteView.as_view(), name='provider_delete'),
path('providers/<int:pk>/', include(get_model_urls('circuits', 'provider'))),
# Provider networks
@ -25,9 +20,6 @@ urlpatterns = [
path('provider-networks/import/', views.ProviderNetworkBulkImportView.as_view(), name='providernetwork_import'),
path('provider-networks/edit/', views.ProviderNetworkBulkEditView.as_view(), name='providernetwork_bulk_edit'),
path('provider-networks/delete/', views.ProviderNetworkBulkDeleteView.as_view(), name='providernetwork_bulk_delete'),
path('provider-networks/<int:pk>/', views.ProviderNetworkView.as_view(), name='providernetwork'),
path('provider-networks/<int:pk>/edit/', views.ProviderNetworkEditView.as_view(), name='providernetwork_edit'),
path('provider-networks/<int:pk>/delete/', views.ProviderNetworkDeleteView.as_view(), name='providernetwork_delete'),
path('provider-networks/<int:pk>/', include(get_model_urls('circuits', 'providernetwork'))),
# Circuit types
@ -36,9 +28,6 @@ urlpatterns = [
path('circuit-types/import/', views.CircuitTypeBulkImportView.as_view(), name='circuittype_import'),
path('circuit-types/edit/', views.CircuitTypeBulkEditView.as_view(), name='circuittype_bulk_edit'),
path('circuit-types/delete/', views.CircuitTypeBulkDeleteView.as_view(), name='circuittype_bulk_delete'),
path('circuit-types/<int:pk>/', views.CircuitTypeView.as_view(), name='circuittype'),
path('circuit-types/<int:pk>/edit/', views.CircuitTypeEditView.as_view(), name='circuittype_edit'),
path('circuit-types/<int:pk>/delete/', views.CircuitTypeDeleteView.as_view(), name='circuittype_delete'),
path('circuit-types/<int:pk>/', include(get_model_urls('circuits', 'circuittype'))),
# Circuits
@ -47,16 +36,11 @@ urlpatterns = [
path('circuits/import/', views.CircuitBulkImportView.as_view(), name='circuit_import'),
path('circuits/edit/', views.CircuitBulkEditView.as_view(), name='circuit_bulk_edit'),
path('circuits/delete/', views.CircuitBulkDeleteView.as_view(), name='circuit_bulk_delete'),
path('circuits/<int:pk>/', views.CircuitView.as_view(), name='circuit'),
path('circuits/<int:pk>/edit/', views.CircuitEditView.as_view(), name='circuit_edit'),
path('circuits/<int:pk>/delete/', views.CircuitDeleteView.as_view(), name='circuit_delete'),
path('circuits/<int:pk>/terminations/swap/', views.CircuitSwapTerminations.as_view(), name='circuit_terminations_swap'),
path('circuits/<int:pk>/', include(get_model_urls('circuits', 'circuit'))),
# Circuit terminations
path('circuit-terminations/add/', views.CircuitTerminationEditView.as_view(), name='circuittermination_add'),
path('circuit-terminations/<int:pk>/edit/', views.CircuitTerminationEditView.as_view(), name='circuittermination_edit'),
path('circuit-terminations/<int:pk>/delete/', views.CircuitTerminationDeleteView.as_view(), name='circuittermination_delete'),
path('circuit-terminations/<int:pk>/trace/', PathTraceView.as_view(), name='circuittermination_trace', kwargs={'model': CircuitTermination}),
path('circuit-terminations/<int:pk>/', include(get_model_urls('circuits', 'circuittermination'))),
]

View File

@ -3,9 +3,11 @@ from django.db import transaction
from django.db.models import Q
from django.shortcuts import get_object_or_404, redirect, render
from dcim.views import PathTraceView
from netbox.views import generic
from utilities.forms import ConfirmationForm
from utilities.utils import count_related
from utilities.views import register_model_view
from . import filtersets, forms, tables
from .models import *
@ -23,6 +25,7 @@ class ProviderListView(generic.ObjectListView):
table = tables.ProviderTable
@register_model_view(Provider)
class ProviderView(generic.ObjectView):
queryset = Provider.objects.all()
@ -41,11 +44,13 @@ class ProviderView(generic.ObjectView):
}
@register_model_view(Provider, 'edit')
class ProviderEditView(generic.ObjectEditView):
queryset = Provider.objects.all()
form = forms.ProviderForm
@register_model_view(Provider, 'delete')
class ProviderDeleteView(generic.ObjectDeleteView):
queryset = Provider.objects.all()
@ -84,6 +89,7 @@ class ProviderNetworkListView(generic.ObjectListView):
table = tables.ProviderNetworkTable
@register_model_view(ProviderNetwork)
class ProviderNetworkView(generic.ObjectView):
queryset = ProviderNetwork.objects.all()
@ -103,11 +109,13 @@ class ProviderNetworkView(generic.ObjectView):
}
@register_model_view(ProviderNetwork, 'edit')
class ProviderNetworkEditView(generic.ObjectEditView):
queryset = ProviderNetwork.objects.all()
form = forms.ProviderNetworkForm
@register_model_view(ProviderNetwork, 'delete')
class ProviderNetworkDeleteView(generic.ObjectDeleteView):
queryset = ProviderNetwork.objects.all()
@ -144,6 +152,7 @@ class CircuitTypeListView(generic.ObjectListView):
table = tables.CircuitTypeTable
@register_model_view(CircuitType)
class CircuitTypeView(generic.ObjectView):
queryset = CircuitType.objects.all()
@ -157,11 +166,13 @@ class CircuitTypeView(generic.ObjectView):
}
@register_model_view(CircuitType, 'edit')
class CircuitTypeEditView(generic.ObjectEditView):
queryset = CircuitType.objects.all()
form = forms.CircuitTypeForm
@register_model_view(CircuitType, 'delete')
class CircuitTypeDeleteView(generic.ObjectDeleteView):
queryset = CircuitType.objects.all()
@ -202,15 +213,18 @@ class CircuitListView(generic.ObjectListView):
table = tables.CircuitTable
@register_model_view(Circuit)
class CircuitView(generic.ObjectView):
queryset = Circuit.objects.all()
@register_model_view(Circuit, 'edit')
class CircuitEditView(generic.ObjectEditView):
queryset = Circuit.objects.all()
form = forms.CircuitForm
@register_model_view(Circuit, 'delete')
class CircuitDeleteView(generic.ObjectDeleteView):
queryset = Circuit.objects.all()
@ -318,11 +332,17 @@ class CircuitSwapTerminations(generic.ObjectEditView):
# Circuit terminations
#
@register_model_view(CircuitTermination, 'edit')
class CircuitTerminationEditView(generic.ObjectEditView):
queryset = CircuitTermination.objects.all()
form = forms.CircuitTerminationForm
template_name = 'circuits/circuittermination_edit.html'
@register_model_view(CircuitTermination, 'delete')
class CircuitTerminationDeleteView(generic.ObjectDeleteView):
queryset = CircuitTermination.objects.all()
# Trace view
register_model_view(CircuitTermination, 'trace', kwargs={'model': CircuitTermination})(PathTraceView)

View File

@ -2,9 +2,6 @@ from django.urls import include, path
from utilities.urls import get_model_urls
from . import views
from .models import (
ConsolePort, ConsoleServerPort, FrontPort, Interface, PowerFeed, PowerPort, PowerOutlet, RearPort,
)
app_name = 'dcim'
urlpatterns = [
@ -15,9 +12,6 @@ urlpatterns = [
path('regions/import/', views.RegionBulkImportView.as_view(), name='region_import'),
path('regions/edit/', views.RegionBulkEditView.as_view(), name='region_bulk_edit'),
path('regions/delete/', views.RegionBulkDeleteView.as_view(), name='region_bulk_delete'),
path('regions/<int:pk>/', views.RegionView.as_view(), name='region'),
path('regions/<int:pk>/edit/', views.RegionEditView.as_view(), name='region_edit'),
path('regions/<int:pk>/delete/', views.RegionDeleteView.as_view(), name='region_delete'),
path('regions/<int:pk>/', include(get_model_urls('dcim', 'region'))),
# Site groups
@ -26,9 +20,6 @@ urlpatterns = [
path('site-groups/import/', views.SiteGroupBulkImportView.as_view(), name='sitegroup_import'),
path('site-groups/edit/', views.SiteGroupBulkEditView.as_view(), name='sitegroup_bulk_edit'),
path('site-groups/delete/', views.SiteGroupBulkDeleteView.as_view(), name='sitegroup_bulk_delete'),
path('site-groups/<int:pk>/', views.SiteGroupView.as_view(), name='sitegroup'),
path('site-groups/<int:pk>/edit/', views.SiteGroupEditView.as_view(), name='sitegroup_edit'),
path('site-groups/<int:pk>/delete/', views.SiteGroupDeleteView.as_view(), name='sitegroup_delete'),
path('site-groups/<int:pk>/', include(get_model_urls('dcim', 'sitegroup'))),
# Sites
@ -37,9 +28,6 @@ urlpatterns = [
path('sites/import/', views.SiteBulkImportView.as_view(), name='site_import'),
path('sites/edit/', views.SiteBulkEditView.as_view(), name='site_bulk_edit'),
path('sites/delete/', views.SiteBulkDeleteView.as_view(), name='site_bulk_delete'),
path('sites/<int:pk>/', views.SiteView.as_view(), name='site'),
path('sites/<int:pk>/edit/', views.SiteEditView.as_view(), name='site_edit'),
path('sites/<int:pk>/delete/', views.SiteDeleteView.as_view(), name='site_delete'),
path('sites/<int:pk>/', include(get_model_urls('dcim', 'site'))),
# Locations
@ -48,9 +36,6 @@ urlpatterns = [
path('locations/import/', views.LocationBulkImportView.as_view(), name='location_import'),
path('locations/edit/', views.LocationBulkEditView.as_view(), name='location_bulk_edit'),
path('locations/delete/', views.LocationBulkDeleteView.as_view(), name='location_bulk_delete'),
path('locations/<int:pk>/', views.LocationView.as_view(), name='location'),
path('locations/<int:pk>/edit/', views.LocationEditView.as_view(), name='location_edit'),
path('locations/<int:pk>/delete/', views.LocationDeleteView.as_view(), name='location_delete'),
path('locations/<int:pk>/', include(get_model_urls('dcim', 'location'))),
# Rack roles
@ -59,9 +44,6 @@ urlpatterns = [
path('rack-roles/import/', views.RackRoleBulkImportView.as_view(), name='rackrole_import'),
path('rack-roles/edit/', views.RackRoleBulkEditView.as_view(), name='rackrole_bulk_edit'),
path('rack-roles/delete/', views.RackRoleBulkDeleteView.as_view(), name='rackrole_bulk_delete'),
path('rack-roles/<int:pk>/', views.RackRoleView.as_view(), name='rackrole'),
path('rack-roles/<int:pk>/edit/', views.RackRoleEditView.as_view(), name='rackrole_edit'),
path('rack-roles/<int:pk>/delete/', views.RackRoleDeleteView.as_view(), name='rackrole_delete'),
path('rack-roles/<int:pk>/', include(get_model_urls('dcim', 'rackrole'))),
# Rack reservations
@ -70,9 +52,6 @@ urlpatterns = [
path('rack-reservations/import/', views.RackReservationImportView.as_view(), name='rackreservation_import'),
path('rack-reservations/edit/', views.RackReservationBulkEditView.as_view(), name='rackreservation_bulk_edit'),
path('rack-reservations/delete/', views.RackReservationBulkDeleteView.as_view(), name='rackreservation_bulk_delete'),
path('rack-reservations/<int:pk>/', views.RackReservationView.as_view(), name='rackreservation'),
path('rack-reservations/<int:pk>/edit/', views.RackReservationEditView.as_view(), name='rackreservation_edit'),
path('rack-reservations/<int:pk>/delete/', views.RackReservationDeleteView.as_view(), name='rackreservation_delete'),
path('rack-reservations/<int:pk>/', include(get_model_urls('dcim', 'rackreservation'))),
# Racks
@ -82,9 +61,6 @@ urlpatterns = [
path('racks/import/', views.RackBulkImportView.as_view(), name='rack_import'),
path('racks/edit/', views.RackBulkEditView.as_view(), name='rack_bulk_edit'),
path('racks/delete/', views.RackBulkDeleteView.as_view(), name='rack_bulk_delete'),
path('racks/<int:pk>/', views.RackView.as_view(), name='rack'),
path('racks/<int:pk>/edit/', views.RackEditView.as_view(), name='rack_edit'),
path('racks/<int:pk>/delete/', views.RackDeleteView.as_view(), name='rack_delete'),
path('racks/<int:pk>/', include(get_model_urls('dcim', 'rack'))),
# Manufacturers
@ -93,9 +69,6 @@ urlpatterns = [
path('manufacturers/import/', views.ManufacturerBulkImportView.as_view(), name='manufacturer_import'),
path('manufacturers/edit/', views.ManufacturerBulkEditView.as_view(), name='manufacturer_bulk_edit'),
path('manufacturers/delete/', views.ManufacturerBulkDeleteView.as_view(), name='manufacturer_bulk_delete'),
path('manufacturers/<int:pk>/', views.ManufacturerView.as_view(), name='manufacturer'),
path('manufacturers/<int:pk>/edit/', views.ManufacturerEditView.as_view(), name='manufacturer_edit'),
path('manufacturers/<int:pk>/delete/', views.ManufacturerDeleteView.as_view(), name='manufacturer_delete'),
path('manufacturers/<int:pk>/', include(get_model_urls('dcim', 'manufacturer'))),
# Device types
@ -104,9 +77,6 @@ urlpatterns = [
path('device-types/import/', views.DeviceTypeImportView.as_view(), name='devicetype_import'),
path('device-types/edit/', views.DeviceTypeBulkEditView.as_view(), name='devicetype_bulk_edit'),
path('device-types/delete/', views.DeviceTypeBulkDeleteView.as_view(), name='devicetype_bulk_delete'),
path('device-types/<int:pk>/', views.DeviceTypeView.as_view(), name='devicetype'),
path('device-types/<int:pk>/edit/', views.DeviceTypeEditView.as_view(), name='devicetype_edit'),
path('device-types/<int:pk>/delete/', views.DeviceTypeDeleteView.as_view(), name='devicetype_delete'),
path('device-types/<int:pk>/', include(get_model_urls('dcim', 'devicetype'))),
# Module types
@ -115,9 +85,6 @@ urlpatterns = [
path('module-types/import/', views.ModuleTypeImportView.as_view(), name='moduletype_import'),
path('module-types/edit/', views.ModuleTypeBulkEditView.as_view(), name='moduletype_bulk_edit'),
path('module-types/delete/', views.ModuleTypeBulkDeleteView.as_view(), name='moduletype_bulk_delete'),
path('module-types/<int:pk>/', views.ModuleTypeView.as_view(), name='moduletype'),
path('module-types/<int:pk>/edit/', views.ModuleTypeEditView.as_view(), name='moduletype_edit'),
path('module-types/<int:pk>/delete/', views.ModuleTypeDeleteView.as_view(), name='moduletype_delete'),
path('module-types/<int:pk>/', include(get_model_urls('dcim', 'moduletype'))),
# Console port templates
@ -125,80 +92,70 @@ urlpatterns = [
path('console-port-templates/edit/', views.ConsolePortTemplateBulkEditView.as_view(), name='consoleporttemplate_bulk_edit'),
path('console-port-templates/rename/', views.ConsolePortTemplateBulkRenameView.as_view(), name='consoleporttemplate_bulk_rename'),
path('console-port-templates/delete/', views.ConsolePortTemplateBulkDeleteView.as_view(), name='consoleporttemplate_bulk_delete'),
path('console-port-templates/<int:pk>/edit/', views.ConsolePortTemplateEditView.as_view(), name='consoleporttemplate_edit'),
path('console-port-templates/<int:pk>/delete/', views.ConsolePortTemplateDeleteView.as_view(), name='consoleporttemplate_delete'),
path('console-port-templates/<int:pk>/', include(get_model_urls('dcim', 'consoleporttemplate'))),
# Console server port templates
path('console-server-port-templates/add/', views.ConsoleServerPortTemplateCreateView.as_view(), name='consoleserverporttemplate_add'),
path('console-server-port-templates/edit/', views.ConsoleServerPortTemplateBulkEditView.as_view(), name='consoleserverporttemplate_bulk_edit'),
path('console-server-port-templates/rename/', views.ConsoleServerPortTemplateBulkRenameView.as_view(), name='consoleserverporttemplate_bulk_rename'),
path('console-server-port-templates/delete/', views.ConsoleServerPortTemplateBulkDeleteView.as_view(), name='consoleserverporttemplate_bulk_delete'),
path('console-server-port-templates/<int:pk>/edit/', views.ConsoleServerPortTemplateEditView.as_view(), name='consoleserverporttemplate_edit'),
path('console-server-port-templates/<int:pk>/delete/', views.ConsoleServerPortTemplateDeleteView.as_view(), name='consoleserverporttemplate_delete'),
path('console-server-port-templates/<int:pk>/', include(get_model_urls('dcim', 'consoleserverporttemplate'))),
# Power port templates
path('power-port-templates/add/', views.PowerPortTemplateCreateView.as_view(), name='powerporttemplate_add'),
path('power-port-templates/edit/', views.PowerPortTemplateBulkEditView.as_view(), name='powerporttemplate_bulk_edit'),
path('power-port-templates/rename/', views.PowerPortTemplateBulkRenameView.as_view(), name='powerporttemplate_bulk_rename'),
path('power-port-templates/delete/', views.PowerPortTemplateBulkDeleteView.as_view(), name='powerporttemplate_bulk_delete'),
path('power-port-templates/<int:pk>/edit/', views.PowerPortTemplateEditView.as_view(), name='powerporttemplate_edit'),
path('power-port-templates/<int:pk>/delete/', views.PowerPortTemplateDeleteView.as_view(), name='powerporttemplate_delete'),
path('power-port-templates/<int:pk>/', include(get_model_urls('dcim', 'powerporttemplate'))),
# Power outlet templates
path('power-outlet-templates/add/', views.PowerOutletTemplateCreateView.as_view(), name='poweroutlettemplate_add'),
path('power-outlet-templates/edit/', views.PowerOutletTemplateBulkEditView.as_view(), name='poweroutlettemplate_bulk_edit'),
path('power-outlet-templates/rename/', views.PowerOutletTemplateBulkRenameView.as_view(), name='poweroutlettemplate_bulk_rename'),
path('power-outlet-templates/delete/', views.PowerOutletTemplateBulkDeleteView.as_view(), name='poweroutlettemplate_bulk_delete'),
path('power-outlet-templates/<int:pk>/edit/', views.PowerOutletTemplateEditView.as_view(), name='poweroutlettemplate_edit'),
path('power-outlet-templates/<int:pk>/delete/', views.PowerOutletTemplateDeleteView.as_view(), name='poweroutlettemplate_delete'),
path('power-outlet-templates/<int:pk>/', include(get_model_urls('dcim', 'poweroutlettemplate'))),
# Interface templates
path('interface-templates/add/', views.InterfaceTemplateCreateView.as_view(), name='interfacetemplate_add'),
path('interface-templates/edit/', views.InterfaceTemplateBulkEditView.as_view(), name='interfacetemplate_bulk_edit'),
path('interface-templates/rename/', views.InterfaceTemplateBulkRenameView.as_view(), name='interfacetemplate_bulk_rename'),
path('interface-templates/delete/', views.InterfaceTemplateBulkDeleteView.as_view(), name='interfacetemplate_bulk_delete'),
path('interface-templates/<int:pk>/edit/', views.InterfaceTemplateEditView.as_view(), name='interfacetemplate_edit'),
path('interface-templates/<int:pk>/delete/', views.InterfaceTemplateDeleteView.as_view(), name='interfacetemplate_delete'),
path('interface-templates/<int:pk>/', include(get_model_urls('dcim', 'interfacetemplate'))),
# Front port templates
path('front-port-templates/add/', views.FrontPortTemplateCreateView.as_view(), name='frontporttemplate_add'),
path('front-port-templates/edit/', views.FrontPortTemplateBulkEditView.as_view(), name='frontporttemplate_bulk_edit'),
path('front-port-templates/rename/', views.FrontPortTemplateBulkRenameView.as_view(), name='frontporttemplate_bulk_rename'),
path('front-port-templates/delete/', views.FrontPortTemplateBulkDeleteView.as_view(), name='frontporttemplate_bulk_delete'),
path('front-port-templates/<int:pk>/edit/', views.FrontPortTemplateEditView.as_view(), name='frontporttemplate_edit'),
path('front-port-templates/<int:pk>/delete/', views.FrontPortTemplateDeleteView.as_view(), name='frontporttemplate_delete'),
path('front-port-templates/<int:pk>/', include(get_model_urls('dcim', 'frontporttemplate'))),
# Rear port templates
path('rear-port-templates/add/', views.RearPortTemplateCreateView.as_view(), name='rearporttemplate_add'),
path('rear-port-templates/edit/', views.RearPortTemplateBulkEditView.as_view(), name='rearporttemplate_bulk_edit'),
path('rear-port-templates/rename/', views.RearPortTemplateBulkRenameView.as_view(), name='rearporttemplate_bulk_rename'),
path('rear-port-templates/delete/', views.RearPortTemplateBulkDeleteView.as_view(), name='rearporttemplate_bulk_delete'),
path('rear-port-templates/<int:pk>/edit/', views.RearPortTemplateEditView.as_view(), name='rearporttemplate_edit'),
path('rear-port-templates/<int:pk>/delete/', views.RearPortTemplateDeleteView.as_view(), name='rearporttemplate_delete'),
path('rear-port-templates/<int:pk>/', include(get_model_urls('dcim', 'rearporttemplate'))),
# Device bay templates
path('device-bay-templates/add/', views.DeviceBayTemplateCreateView.as_view(), name='devicebaytemplate_add'),
path('device-bay-templates/edit/', views.DeviceBayTemplateBulkEditView.as_view(), name='devicebaytemplate_bulk_edit'),
path('device-bay-templates/rename/', views.DeviceBayTemplateBulkRenameView.as_view(), name='devicebaytemplate_bulk_rename'),
path('device-bay-templates/delete/', views.DeviceBayTemplateBulkDeleteView.as_view(), name='devicebaytemplate_bulk_delete'),
path('device-bay-templates/<int:pk>/edit/', views.DeviceBayTemplateEditView.as_view(), name='devicebaytemplate_edit'),
path('device-bay-templates/<int:pk>/delete/', views.DeviceBayTemplateDeleteView.as_view(), name='devicebaytemplate_delete'),
path('device-bay-templates/<int:pk>/', include(get_model_urls('dcim', 'devicebaytemplate'))),
# Module bay templates
path('module-bay-templates/add/', views.ModuleBayTemplateCreateView.as_view(), name='modulebaytemplate_add'),
path('module-bay-templates/edit/', views.ModuleBayTemplateBulkEditView.as_view(), name='modulebaytemplate_bulk_edit'),
path('module-bay-templates/rename/', views.ModuleBayTemplateBulkRenameView.as_view(), name='modulebaytemplate_bulk_rename'),
path('module-bay-templates/delete/', views.ModuleBayTemplateBulkDeleteView.as_view(), name='modulebaytemplate_bulk_delete'),
path('module-bay-templates/<int:pk>/edit/', views.ModuleBayTemplateEditView.as_view(), name='modulebaytemplate_edit'),
path('module-bay-templates/<int:pk>/delete/', views.ModuleBayTemplateDeleteView.as_view(), name='modulebaytemplate_delete'),
path('module-bay-templates/<int:pk>/', include(get_model_urls('dcim', 'modulebaytemplate'))),
# Inventory item templates
path('inventory-item-templates/add/', views.InventoryItemTemplateCreateView.as_view(), name='inventoryitemtemplate_add'),
path('inventory-item-templates/edit/', views.InventoryItemTemplateBulkEditView.as_view(), name='inventoryitemtemplate_bulk_edit'),
path('inventory-item-templates/rename/', views.InventoryItemTemplateBulkRenameView.as_view(), name='inventoryitemtemplate_bulk_rename'),
path('inventory-item-templates/delete/', views.InventoryItemTemplateBulkDeleteView.as_view(), name='inventoryitemtemplate_bulk_delete'),
path('inventory-item-templates/<int:pk>/edit/', views.InventoryItemTemplateEditView.as_view(), name='inventoryitemtemplate_edit'),
path('inventory-item-templates/<int:pk>/delete/', views.InventoryItemTemplateDeleteView.as_view(), name='inventoryitemtemplate_delete'),
path('inventory-item-templates/<int:pk>/', include(get_model_urls('dcim', 'inventoryitemtemplate'))),
# Device roles
path('device-roles/', views.DeviceRoleListView.as_view(), name='devicerole_list'),
@ -206,9 +163,6 @@ urlpatterns = [
path('device-roles/import/', views.DeviceRoleBulkImportView.as_view(), name='devicerole_import'),
path('device-roles/edit/', views.DeviceRoleBulkEditView.as_view(), name='devicerole_bulk_edit'),
path('device-roles/delete/', views.DeviceRoleBulkDeleteView.as_view(), name='devicerole_bulk_delete'),
path('device-roles/<int:pk>/', views.DeviceRoleView.as_view(), name='devicerole'),
path('device-roles/<int:pk>/edit/', views.DeviceRoleEditView.as_view(), name='devicerole_edit'),
path('device-roles/<int:pk>/delete/', views.DeviceRoleDeleteView.as_view(), name='devicerole_delete'),
path('device-roles/<int:pk>/', include(get_model_urls('dcim', 'devicerole'))),
# Platforms
@ -217,9 +171,6 @@ urlpatterns = [
path('platforms/import/', views.PlatformBulkImportView.as_view(), name='platform_import'),
path('platforms/edit/', views.PlatformBulkEditView.as_view(), name='platform_bulk_edit'),
path('platforms/delete/', views.PlatformBulkDeleteView.as_view(), name='platform_bulk_delete'),
path('platforms/<int:pk>/', views.PlatformView.as_view(), name='platform'),
path('platforms/<int:pk>/edit/', views.PlatformEditView.as_view(), name='platform_edit'),
path('platforms/<int:pk>/delete/', views.PlatformDeleteView.as_view(), name='platform_delete'),
path('platforms/<int:pk>/', include(get_model_urls('dcim', 'platform'))),
# Devices
@ -230,9 +181,6 @@ urlpatterns = [
path('devices/edit/', views.DeviceBulkEditView.as_view(), name='device_bulk_edit'),
path('devices/rename/', views.DeviceBulkRenameView.as_view(), name='device_bulk_rename'),
path('devices/delete/', views.DeviceBulkDeleteView.as_view(), name='device_bulk_delete'),
path('devices/<int:pk>/', views.DeviceView.as_view(), name='device'),
path('devices/<int:pk>/edit/', views.DeviceEditView.as_view(), name='device_edit'),
path('devices/<int:pk>/delete/', views.DeviceDeleteView.as_view(), name='device_delete'),
path('devices/<int:pk>/', include(get_model_urls('dcim', 'device'))),
# Modules
@ -241,9 +189,6 @@ urlpatterns = [
path('modules/import/', views.ModuleBulkImportView.as_view(), name='module_import'),
path('modules/edit/', views.ModuleBulkEditView.as_view(), name='module_bulk_edit'),
path('modules/delete/', views.ModuleBulkDeleteView.as_view(), name='module_bulk_delete'),
path('modules/<int:pk>/', views.ModuleView.as_view(), name='module'),
path('modules/<int:pk>/edit/', views.ModuleEditView.as_view(), name='module_edit'),
path('modules/<int:pk>/delete/', views.ModuleDeleteView.as_view(), name='module_delete'),
path('modules/<int:pk>/', include(get_model_urls('dcim', 'module'))),
# Console ports
@ -254,10 +199,6 @@ urlpatterns = [
path('console-ports/rename/', views.ConsolePortBulkRenameView.as_view(), name='consoleport_bulk_rename'),
path('console-ports/disconnect/', views.ConsolePortBulkDisconnectView.as_view(), name='consoleport_bulk_disconnect'),
path('console-ports/delete/', views.ConsolePortBulkDeleteView.as_view(), name='consoleport_bulk_delete'),
path('console-ports/<int:pk>/', views.ConsolePortView.as_view(), name='consoleport'),
path('console-ports/<int:pk>/edit/', views.ConsolePortEditView.as_view(), name='consoleport_edit'),
path('console-ports/<int:pk>/delete/', views.ConsolePortDeleteView.as_view(), name='consoleport_delete'),
path('console-ports/<int:pk>/trace/', views.PathTraceView.as_view(), name='consoleport_trace', kwargs={'model': ConsolePort}),
path('console-ports/<int:pk>/', include(get_model_urls('dcim', 'consoleport'))),
path('devices/console-ports/add/', views.DeviceBulkAddConsolePortView.as_view(), name='device_bulk_add_consoleport'),
@ -269,10 +210,6 @@ urlpatterns = [
path('console-server-ports/rename/', views.ConsoleServerPortBulkRenameView.as_view(), name='consoleserverport_bulk_rename'),
path('console-server-ports/disconnect/', views.ConsoleServerPortBulkDisconnectView.as_view(), name='consoleserverport_bulk_disconnect'),
path('console-server-ports/delete/', views.ConsoleServerPortBulkDeleteView.as_view(), name='consoleserverport_bulk_delete'),
path('console-server-ports/<int:pk>/', views.ConsoleServerPortView.as_view(), name='consoleserverport'),
path('console-server-ports/<int:pk>/edit/', views.ConsoleServerPortEditView.as_view(), name='consoleserverport_edit'),
path('console-server-ports/<int:pk>/delete/', views.ConsoleServerPortDeleteView.as_view(), name='consoleserverport_delete'),
path('console-server-ports/<int:pk>/trace/', views.PathTraceView.as_view(), name='consoleserverport_trace', kwargs={'model': ConsoleServerPort}),
path('console-server-ports/<int:pk>/', include(get_model_urls('dcim', 'consoleserverport'))),
path('devices/console-server-ports/add/', views.DeviceBulkAddConsoleServerPortView.as_view(), name='device_bulk_add_consoleserverport'),
@ -284,10 +221,6 @@ urlpatterns = [
path('power-ports/rename/', views.PowerPortBulkRenameView.as_view(), name='powerport_bulk_rename'),
path('power-ports/disconnect/', views.PowerPortBulkDisconnectView.as_view(), name='powerport_bulk_disconnect'),
path('power-ports/delete/', views.PowerPortBulkDeleteView.as_view(), name='powerport_bulk_delete'),
path('power-ports/<int:pk>/', views.PowerPortView.as_view(), name='powerport'),
path('power-ports/<int:pk>/edit/', views.PowerPortEditView.as_view(), name='powerport_edit'),
path('power-ports/<int:pk>/delete/', views.PowerPortDeleteView.as_view(), name='powerport_delete'),
path('power-ports/<int:pk>/trace/', views.PathTraceView.as_view(), name='powerport_trace', kwargs={'model': PowerPort}),
path('power-ports/<int:pk>/', include(get_model_urls('dcim', 'powerport'))),
path('devices/power-ports/add/', views.DeviceBulkAddPowerPortView.as_view(), name='device_bulk_add_powerport'),
@ -299,10 +232,6 @@ urlpatterns = [
path('power-outlets/rename/', views.PowerOutletBulkRenameView.as_view(), name='poweroutlet_bulk_rename'),
path('power-outlets/disconnect/', views.PowerOutletBulkDisconnectView.as_view(), name='poweroutlet_bulk_disconnect'),
path('power-outlets/delete/', views.PowerOutletBulkDeleteView.as_view(), name='poweroutlet_bulk_delete'),
path('power-outlets/<int:pk>/', views.PowerOutletView.as_view(), name='poweroutlet'),
path('power-outlets/<int:pk>/edit/', views.PowerOutletEditView.as_view(), name='poweroutlet_edit'),
path('power-outlets/<int:pk>/delete/', views.PowerOutletDeleteView.as_view(), name='poweroutlet_delete'),
path('power-outlets/<int:pk>/trace/', views.PathTraceView.as_view(), name='poweroutlet_trace', kwargs={'model': PowerOutlet}),
path('power-outlets/<int:pk>/', include(get_model_urls('dcim', 'poweroutlet'))),
path('devices/power-outlets/add/', views.DeviceBulkAddPowerOutletView.as_view(), name='device_bulk_add_poweroutlet'),
@ -314,10 +243,6 @@ urlpatterns = [
path('interfaces/rename/', views.InterfaceBulkRenameView.as_view(), name='interface_bulk_rename'),
path('interfaces/disconnect/', views.InterfaceBulkDisconnectView.as_view(), name='interface_bulk_disconnect'),
path('interfaces/delete/', views.InterfaceBulkDeleteView.as_view(), name='interface_bulk_delete'),
path('interfaces/<int:pk>/', views.InterfaceView.as_view(), name='interface'),
path('interfaces/<int:pk>/edit/', views.InterfaceEditView.as_view(), name='interface_edit'),
path('interfaces/<int:pk>/delete/', views.InterfaceDeleteView.as_view(), name='interface_delete'),
path('interfaces/<int:pk>/trace/', views.PathTraceView.as_view(), name='interface_trace', kwargs={'model': Interface}),
path('interfaces/<int:pk>/', include(get_model_urls('dcim', 'interface'))),
path('devices/interfaces/add/', views.DeviceBulkAddInterfaceView.as_view(), name='device_bulk_add_interface'),
@ -329,10 +254,6 @@ urlpatterns = [
path('front-ports/rename/', views.FrontPortBulkRenameView.as_view(), name='frontport_bulk_rename'),
path('front-ports/disconnect/', views.FrontPortBulkDisconnectView.as_view(), name='frontport_bulk_disconnect'),
path('front-ports/delete/', views.FrontPortBulkDeleteView.as_view(), name='frontport_bulk_delete'),
path('front-ports/<int:pk>/', views.FrontPortView.as_view(), name='frontport'),
path('front-ports/<int:pk>/edit/', views.FrontPortEditView.as_view(), name='frontport_edit'),
path('front-ports/<int:pk>/delete/', views.FrontPortDeleteView.as_view(), name='frontport_delete'),
path('front-ports/<int:pk>/trace/', views.PathTraceView.as_view(), name='frontport_trace', kwargs={'model': FrontPort}),
path('front-ports/<int:pk>/', include(get_model_urls('dcim', 'frontport'))),
# path('devices/front-ports/add/', views.DeviceBulkAddFrontPortView.as_view(), name='device_bulk_add_frontport'),
@ -344,10 +265,6 @@ urlpatterns = [
path('rear-ports/rename/', views.RearPortBulkRenameView.as_view(), name='rearport_bulk_rename'),
path('rear-ports/disconnect/', views.RearPortBulkDisconnectView.as_view(), name='rearport_bulk_disconnect'),
path('rear-ports/delete/', views.RearPortBulkDeleteView.as_view(), name='rearport_bulk_delete'),
path('rear-ports/<int:pk>/', views.RearPortView.as_view(), name='rearport'),
path('rear-ports/<int:pk>/edit/', views.RearPortEditView.as_view(), name='rearport_edit'),
path('rear-ports/<int:pk>/delete/', views.RearPortDeleteView.as_view(), name='rearport_delete'),
path('rear-ports/<int:pk>/trace/', views.PathTraceView.as_view(), name='rearport_trace', kwargs={'model': RearPort}),
path('rear-ports/<int:pk>/', include(get_model_urls('dcim', 'rearport'))),
path('devices/rear-ports/add/', views.DeviceBulkAddRearPortView.as_view(), name='device_bulk_add_rearport'),
@ -358,9 +275,6 @@ urlpatterns = [
path('module-bays/edit/', views.ModuleBayBulkEditView.as_view(), name='modulebay_bulk_edit'),
path('module-bays/rename/', views.ModuleBayBulkRenameView.as_view(), name='modulebay_bulk_rename'),
path('module-bays/delete/', views.ModuleBayBulkDeleteView.as_view(), name='modulebay_bulk_delete'),
path('module-bays/<int:pk>/', views.ModuleBayView.as_view(), name='modulebay'),
path('module-bays/<int:pk>/edit/', views.ModuleBayEditView.as_view(), name='modulebay_edit'),
path('module-bays/<int:pk>/delete/', views.ModuleBayDeleteView.as_view(), name='modulebay_delete'),
path('module-bays/<int:pk>/', include(get_model_urls('dcim', 'modulebay'))),
path('devices/module-bays/add/', views.DeviceBulkAddModuleBayView.as_view(), name='device_bulk_add_modulebay'),
@ -371,11 +285,6 @@ urlpatterns = [
path('device-bays/edit/', views.DeviceBayBulkEditView.as_view(), name='devicebay_bulk_edit'),
path('device-bays/rename/', views.DeviceBayBulkRenameView.as_view(), name='devicebay_bulk_rename'),
path('device-bays/delete/', views.DeviceBayBulkDeleteView.as_view(), name='devicebay_bulk_delete'),
path('device-bays/<int:pk>/', views.DeviceBayView.as_view(), name='devicebay'),
path('device-bays/<int:pk>/edit/', views.DeviceBayEditView.as_view(), name='devicebay_edit'),
path('device-bays/<int:pk>/delete/', views.DeviceBayDeleteView.as_view(), name='devicebay_delete'),
path('device-bays/<int:pk>/populate/', views.DeviceBayPopulateView.as_view(), name='devicebay_populate'),
path('device-bays/<int:pk>/depopulate/', views.DeviceBayDepopulateView.as_view(), name='devicebay_depopulate'),
path('device-bays/<int:pk>/', include(get_model_urls('dcim', 'devicebay'))),
path('devices/device-bays/add/', views.DeviceBulkAddDeviceBayView.as_view(), name='device_bulk_add_devicebay'),
@ -386,9 +295,6 @@ urlpatterns = [
path('inventory-items/edit/', views.InventoryItemBulkEditView.as_view(), name='inventoryitem_bulk_edit'),
path('inventory-items/rename/', views.InventoryItemBulkRenameView.as_view(), name='inventoryitem_bulk_rename'),
path('inventory-items/delete/', views.InventoryItemBulkDeleteView.as_view(), name='inventoryitem_bulk_delete'),
path('inventory-items/<int:pk>/', views.InventoryItemView.as_view(), name='inventoryitem'),
path('inventory-items/<int:pk>/edit/', views.InventoryItemEditView.as_view(), name='inventoryitem_edit'),
path('inventory-items/<int:pk>/delete/', views.InventoryItemDeleteView.as_view(), name='inventoryitem_delete'),
path('inventory-items/<int:pk>/', include(get_model_urls('dcim', 'inventoryitem'))),
path('devices/inventory-items/add/', views.DeviceBulkAddInventoryItemView.as_view(), name='device_bulk_add_inventoryitem'),
@ -398,9 +304,6 @@ urlpatterns = [
path('inventory-item-roles/import/', views.InventoryItemRoleBulkImportView.as_view(), name='inventoryitemrole_import'),
path('inventory-item-roles/edit/', views.InventoryItemRoleBulkEditView.as_view(), name='inventoryitemrole_bulk_edit'),
path('inventory-item-roles/delete/', views.InventoryItemRoleBulkDeleteView.as_view(), name='inventoryitemrole_bulk_delete'),
path('inventory-item-roles/<int:pk>/', views.InventoryItemRoleView.as_view(), name='inventoryitemrole'),
path('inventory-item-roles/<int:pk>/edit/', views.InventoryItemRoleEditView.as_view(), name='inventoryitemrole_edit'),
path('inventory-item-roles/<int:pk>/delete/', views.InventoryItemRoleDeleteView.as_view(), name='inventoryitemrole_delete'),
path('inventory-item-roles/<int:pk>/', include(get_model_urls('dcim', 'inventoryitemrole'))),
# Cables
@ -409,9 +312,6 @@ urlpatterns = [
path('cables/import/', views.CableBulkImportView.as_view(), name='cable_import'),
path('cables/edit/', views.CableBulkEditView.as_view(), name='cable_bulk_edit'),
path('cables/delete/', views.CableBulkDeleteView.as_view(), name='cable_bulk_delete'),
path('cables/<int:pk>/', views.CableView.as_view(), name='cable'),
path('cables/<int:pk>/edit/', views.CableEditView.as_view(), name='cable_edit'),
path('cables/<int:pk>/delete/', views.CableDeleteView.as_view(), name='cable_delete'),
path('cables/<int:pk>/', include(get_model_urls('dcim', 'cable'))),
# Console/power/interface connections (read-only)
@ -425,10 +325,6 @@ urlpatterns = [
path('virtual-chassis/import/', views.VirtualChassisBulkImportView.as_view(), name='virtualchassis_import'),
path('virtual-chassis/edit/', views.VirtualChassisBulkEditView.as_view(), name='virtualchassis_bulk_edit'),
path('virtual-chassis/delete/', views.VirtualChassisBulkDeleteView.as_view(), name='virtualchassis_bulk_delete'),
path('virtual-chassis/<int:pk>/', views.VirtualChassisView.as_view(), name='virtualchassis'),
path('virtual-chassis/<int:pk>/edit/', views.VirtualChassisEditView.as_view(), name='virtualchassis_edit'),
path('virtual-chassis/<int:pk>/delete/', views.VirtualChassisDeleteView.as_view(), name='virtualchassis_delete'),
path('virtual-chassis/<int:pk>/add-member/', views.VirtualChassisAddMemberView.as_view(), name='virtualchassis_add_member'),
path('virtual-chassis/<int:pk>/', include(get_model_urls('dcim', 'virtualchassis'))),
path('virtual-chassis-members/<int:pk>/delete/', views.VirtualChassisRemoveMemberView.as_view(), name='virtualchassis_remove_member'),
@ -438,9 +334,6 @@ urlpatterns = [
path('power-panels/import/', views.PowerPanelBulkImportView.as_view(), name='powerpanel_import'),
path('power-panels/edit/', views.PowerPanelBulkEditView.as_view(), name='powerpanel_bulk_edit'),
path('power-panels/delete/', views.PowerPanelBulkDeleteView.as_view(), name='powerpanel_bulk_delete'),
path('power-panels/<int:pk>/', views.PowerPanelView.as_view(), name='powerpanel'),
path('power-panels/<int:pk>/edit/', views.PowerPanelEditView.as_view(), name='powerpanel_edit'),
path('power-panels/<int:pk>/delete/', views.PowerPanelDeleteView.as_view(), name='powerpanel_delete'),
path('power-panels/<int:pk>/', include(get_model_urls('dcim', 'powerpanel'))),
# Power feeds
@ -450,10 +343,6 @@ urlpatterns = [
path('power-feeds/edit/', views.PowerFeedBulkEditView.as_view(), name='powerfeed_bulk_edit'),
path('power-feeds/disconnect/', views.PowerFeedBulkDisconnectView.as_view(), name='powerfeed_bulk_disconnect'),
path('power-feeds/delete/', views.PowerFeedBulkDeleteView.as_view(), name='powerfeed_bulk_delete'),
path('power-feeds/<int:pk>/', views.PowerFeedView.as_view(), name='powerfeed'),
path('power-feeds/<int:pk>/edit/', views.PowerFeedEditView.as_view(), name='powerfeed_edit'),
path('power-feeds/<int:pk>/delete/', views.PowerFeedDeleteView.as_view(), name='powerfeed_delete'),
path('power-feeds/<int:pk>/trace/', views.PathTraceView.as_view(), name='powerfeed_trace', kwargs={'model': PowerFeed}),
path('power-feeds/<int:pk>/', include(get_model_urls('dcim', 'powerfeed'))),
]

View File

@ -134,6 +134,61 @@ class BulkDisconnectView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View)
})
class PathTraceView(generic.ObjectView):
"""
Trace a cable path beginning from the given path endpoint (origin).
"""
additional_permissions = ['dcim.view_cable']
template_name = 'dcim/cable_trace.html'
def dispatch(self, request, *args, **kwargs):
model = kwargs.pop('model')
self.queryset = model.objects.all()
return super().dispatch(request, *args, **kwargs)
def get_extra_context(self, request, instance):
related_paths = []
# If tracing a PathEndpoint, locate the CablePath (if one exists) by its origin
if isinstance(instance, PathEndpoint):
path = instance._path
# Otherwise, find all CablePaths which traverse the specified object
else:
related_paths = CablePath.objects.filter(_nodes__contains=instance)
# Check for specification of a particular path (when tracing pass-through ports)
try:
path_id = int(request.GET.get('cablepath_id'))
except TypeError:
path_id = None
if path_id in list(related_paths.values_list('pk', flat=True)):
path = CablePath.objects.get(pk=path_id)
else:
path = related_paths.first()
# No paths found
if path is None:
return {
'path': None
}
# Get the total length of the cable and whether the length is definitive (fully defined)
total_length, is_definitive = path.get_total_length() if path else (None, False)
# Determine the path to the SVG trace image
api_viewname = f"{path.origin_type.app_label}-api:{path.origin_type.model}-trace"
svg_url = f"{reverse(api_viewname, kwargs={'pk': path.origins[0].pk})}?render=svg"
return {
'path': path,
'related_paths': related_paths,
'total_length': total_length,
'is_definitive': is_definitive,
'svg_url': svg_url,
}
#
# Regions
#
@ -151,6 +206,7 @@ class RegionListView(generic.ObjectListView):
table = tables.RegionTable
@register_model_view(Region)
class RegionView(generic.ObjectView):
queryset = Region.objects.all()
@ -179,11 +235,13 @@ class RegionView(generic.ObjectView):
}
@register_model_view(Region, 'edit')
class RegionEditView(generic.ObjectEditView):
queryset = Region.objects.all()
form = forms.RegionForm
@register_model_view(Region, 'delete')
class RegionDeleteView(generic.ObjectDeleteView):
queryset = Region.objects.all()
@ -236,6 +294,7 @@ class SiteGroupListView(generic.ObjectListView):
table = tables.SiteGroupTable
@register_model_view(SiteGroup)
class SiteGroupView(generic.ObjectView):
queryset = SiteGroup.objects.all()
@ -264,11 +323,13 @@ class SiteGroupView(generic.ObjectView):
}
@register_model_view(SiteGroup, 'edit')
class SiteGroupEditView(generic.ObjectEditView):
queryset = SiteGroup.objects.all()
form = forms.SiteGroupForm
@register_model_view(SiteGroup, 'delete')
class SiteGroupDeleteView(generic.ObjectDeleteView):
queryset = SiteGroup.objects.all()
@ -315,6 +376,7 @@ class SiteListView(generic.ObjectListView):
table = tables.SiteTable
@register_model_view(Site)
class SiteView(generic.ObjectView):
queryset = Site.objects.prefetch_related('tenant__group')
@ -367,11 +429,13 @@ class SiteView(generic.ObjectView):
}
@register_model_view(Site, 'edit')
class SiteEditView(generic.ObjectEditView):
queryset = Site.objects.all()
form = forms.SiteForm
@register_model_view(Site, 'delete')
class SiteDeleteView(generic.ObjectDeleteView):
queryset = Site.objects.all()
@ -418,6 +482,7 @@ class LocationListView(generic.ObjectListView):
table = tables.LocationTable
@register_model_view(Location)
class LocationView(generic.ObjectView):
queryset = Location.objects.all()
@ -457,11 +522,13 @@ class LocationView(generic.ObjectView):
}
@register_model_view(Location, 'edit')
class LocationEditView(generic.ObjectEditView):
queryset = Location.objects.all()
form = forms.LocationForm
@register_model_view(Location, 'delete')
class LocationDeleteView(generic.ObjectDeleteView):
queryset = Location.objects.all()
@ -510,6 +577,7 @@ class RackRoleListView(generic.ObjectListView):
table = tables.RackRoleTable
@register_model_view(RackRole)
class RackRoleView(generic.ObjectView):
queryset = RackRole.objects.all()
@ -528,11 +596,13 @@ class RackRoleView(generic.ObjectView):
}
@register_model_view(RackRole, 'edit')
class RackRoleEditView(generic.ObjectEditView):
queryset = RackRole.objects.all()
form = forms.RackRoleForm
@register_model_view(RackRole, 'delete')
class RackRoleDeleteView(generic.ObjectDeleteView):
queryset = RackRole.objects.all()
@ -623,6 +693,7 @@ class RackElevationListView(generic.ObjectListView):
})
@register_model_view(Rack)
class RackView(generic.ObjectView):
queryset = Rack.objects.prefetch_related('site__region', 'tenant__group', 'location', 'role')
@ -666,12 +737,14 @@ class RackView(generic.ObjectView):
}
@register_model_view(Rack, 'edit')
class RackEditView(generic.ObjectEditView):
queryset = Rack.objects.all()
form = forms.RackForm
template_name = 'dcim/rack_edit.html'
@register_model_view(Rack, 'delete')
class RackDeleteView(generic.ObjectDeleteView):
queryset = Rack.objects.all()
@ -706,10 +779,12 @@ class RackReservationListView(generic.ObjectListView):
table = tables.RackReservationTable
@register_model_view(RackReservation)
class RackReservationView(generic.ObjectView):
queryset = RackReservation.objects.all()
@register_model_view(RackReservation, 'edit')
class RackReservationEditView(generic.ObjectEditView):
queryset = RackReservation.objects.all()
form = forms.RackReservationForm
@ -722,6 +797,7 @@ class RackReservationEditView(generic.ObjectEditView):
return obj
@register_model_view(RackReservation, 'delete')
class RackReservationDeleteView(generic.ObjectDeleteView):
queryset = RackReservation.objects.all()
@ -770,6 +846,7 @@ class ManufacturerListView(generic.ObjectListView):
table = tables.ManufacturerTable
@register_model_view(Manufacturer)
class ManufacturerView(generic.ObjectView):
queryset = Manufacturer.objects.all()
@ -796,11 +873,13 @@ class ManufacturerView(generic.ObjectView):
}
@register_model_view(Manufacturer, 'edit')
class ManufacturerEditView(generic.ObjectEditView):
queryset = Manufacturer.objects.all()
form = forms.ManufacturerForm
@register_model_view(Manufacturer, 'delete')
class ManufacturerDeleteView(generic.ObjectDeleteView):
queryset = Manufacturer.objects.all()
@ -840,6 +919,7 @@ class DeviceTypeListView(generic.ObjectListView):
table = tables.DeviceTypeTable
@register_model_view(DeviceType)
class DeviceTypeView(generic.ObjectView):
queryset = DeviceType.objects.all()
@ -851,6 +931,17 @@ class DeviceTypeView(generic.ObjectView):
}
@register_model_view(DeviceType, 'edit')
class DeviceTypeEditView(generic.ObjectEditView):
queryset = DeviceType.objects.all()
form = forms.DeviceTypeForm
@register_model_view(DeviceType, 'delete')
class DeviceTypeDeleteView(generic.ObjectDeleteView):
queryset = DeviceType.objects.all()
@register_model_view(DeviceType, 'consoleports', path='console-ports')
class DeviceTypeConsolePortsView(DeviceTypeComponentsView):
child_model = ConsolePortTemplate
@ -981,15 +1072,6 @@ class DeviceTypeInventoryItemsView(DeviceTypeComponentsView):
)
class DeviceTypeEditView(generic.ObjectEditView):
queryset = DeviceType.objects.all()
form = forms.DeviceTypeForm
class DeviceTypeDeleteView(generic.ObjectDeleteView):
queryset = DeviceType.objects.all()
class DeviceTypeImportView(generic.ObjectImportView):
additional_permissions = [
'dcim.add_devicetype',
@ -1054,6 +1136,7 @@ class ModuleTypeListView(generic.ObjectListView):
table = tables.ModuleTypeTable
@register_model_view(ModuleType)
class ModuleTypeView(generic.ObjectView):
queryset = ModuleType.objects.all()
@ -1065,6 +1148,17 @@ class ModuleTypeView(generic.ObjectView):
}
@register_model_view(ModuleType, 'edit')
class ModuleTypeEditView(generic.ObjectEditView):
queryset = ModuleType.objects.all()
form = forms.ModuleTypeForm
@register_model_view(ModuleType, 'delete')
class ModuleTypeDeleteView(generic.ObjectDeleteView):
queryset = ModuleType.objects.all()
@register_model_view(ModuleType, 'consoleports', path='console-ports')
class ModuleTypeConsolePortsView(ModuleTypeComponentsView):
child_model = ConsolePortTemplate
@ -1156,15 +1250,6 @@ class ModuleTypeRearPortsView(ModuleTypeComponentsView):
)
class ModuleTypeEditView(generic.ObjectEditView):
queryset = ModuleType.objects.all()
form = forms.ModuleTypeForm
class ModuleTypeDeleteView(generic.ObjectDeleteView):
queryset = ModuleType.objects.all()
class ModuleTypeImportView(generic.ObjectImportView):
additional_permissions = [
'dcim.add_moduletype',
@ -1220,11 +1305,13 @@ class ConsolePortTemplateCreateView(generic.ComponentCreateView):
model_form = forms.ConsolePortTemplateForm
@register_model_view(ConsolePortTemplate, 'edit')
class ConsolePortTemplateEditView(generic.ObjectEditView):
queryset = ConsolePortTemplate.objects.all()
form = forms.ConsolePortTemplateForm
@register_model_view(ConsolePortTemplate, 'delete')
class ConsolePortTemplateDeleteView(generic.ObjectDeleteView):
queryset = ConsolePortTemplate.objects.all()
@ -1254,11 +1341,13 @@ class ConsoleServerPortTemplateCreateView(generic.ComponentCreateView):
model_form = forms.ConsoleServerPortTemplateForm
@register_model_view(ConsoleServerPortTemplate, 'edit')
class ConsoleServerPortTemplateEditView(generic.ObjectEditView):
queryset = ConsoleServerPortTemplate.objects.all()
form = forms.ConsoleServerPortTemplateForm
@register_model_view(ConsoleServerPortTemplate, 'delete')
class ConsoleServerPortTemplateDeleteView(generic.ObjectDeleteView):
queryset = ConsoleServerPortTemplate.objects.all()
@ -1288,11 +1377,13 @@ class PowerPortTemplateCreateView(generic.ComponentCreateView):
model_form = forms.PowerPortTemplateForm
@register_model_view(PowerPortTemplate, 'edit')
class PowerPortTemplateEditView(generic.ObjectEditView):
queryset = PowerPortTemplate.objects.all()
form = forms.PowerPortTemplateForm
@register_model_view(PowerPortTemplate, 'delete')
class PowerPortTemplateDeleteView(generic.ObjectDeleteView):
queryset = PowerPortTemplate.objects.all()
@ -1322,11 +1413,13 @@ class PowerOutletTemplateCreateView(generic.ComponentCreateView):
model_form = forms.PowerOutletTemplateForm
@register_model_view(PowerOutletTemplate, 'edit')
class PowerOutletTemplateEditView(generic.ObjectEditView):
queryset = PowerOutletTemplate.objects.all()
form = forms.PowerOutletTemplateForm
@register_model_view(PowerOutletTemplate, 'delete')
class PowerOutletTemplateDeleteView(generic.ObjectDeleteView):
queryset = PowerOutletTemplate.objects.all()
@ -1356,11 +1449,13 @@ class InterfaceTemplateCreateView(generic.ComponentCreateView):
model_form = forms.InterfaceTemplateForm
@register_model_view(InterfaceTemplate, 'edit')
class InterfaceTemplateEditView(generic.ObjectEditView):
queryset = InterfaceTemplate.objects.all()
form = forms.InterfaceTemplateForm
@register_model_view(InterfaceTemplate, 'delete')
class InterfaceTemplateDeleteView(generic.ObjectDeleteView):
queryset = InterfaceTemplate.objects.all()
@ -1390,11 +1485,13 @@ class FrontPortTemplateCreateView(generic.ComponentCreateView):
model_form = forms.FrontPortTemplateForm
@register_model_view(FrontPortTemplate, 'edit')
class FrontPortTemplateEditView(generic.ObjectEditView):
queryset = FrontPortTemplate.objects.all()
form = forms.FrontPortTemplateForm
@register_model_view(FrontPortTemplate, 'delete')
class FrontPortTemplateDeleteView(generic.ObjectDeleteView):
queryset = FrontPortTemplate.objects.all()
@ -1424,11 +1521,13 @@ class RearPortTemplateCreateView(generic.ComponentCreateView):
model_form = forms.RearPortTemplateForm
@register_model_view(RearPortTemplate, 'edit')
class RearPortTemplateEditView(generic.ObjectEditView):
queryset = RearPortTemplate.objects.all()
form = forms.RearPortTemplateForm
@register_model_view(RearPortTemplate, 'delete')
class RearPortTemplateDeleteView(generic.ObjectDeleteView):
queryset = RearPortTemplate.objects.all()
@ -1458,11 +1557,13 @@ class ModuleBayTemplateCreateView(generic.ComponentCreateView):
model_form = forms.ModuleBayTemplateForm
@register_model_view(ModuleBayTemplate, 'edit')
class ModuleBayTemplateEditView(generic.ObjectEditView):
queryset = ModuleBayTemplate.objects.all()
form = forms.ModuleBayTemplateForm
@register_model_view(ModuleBayTemplate, 'delete')
class ModuleBayTemplateDeleteView(generic.ObjectDeleteView):
queryset = ModuleBayTemplate.objects.all()
@ -1492,11 +1593,13 @@ class DeviceBayTemplateCreateView(generic.ComponentCreateView):
model_form = forms.DeviceBayTemplateForm
@register_model_view(DeviceBayTemplate, 'edit')
class DeviceBayTemplateEditView(generic.ObjectEditView):
queryset = DeviceBayTemplate.objects.all()
form = forms.DeviceBayTemplateForm
@register_model_view(DeviceBayTemplate, 'delete')
class DeviceBayTemplateDeleteView(generic.ObjectDeleteView):
queryset = DeviceBayTemplate.objects.all()
@ -1537,11 +1640,13 @@ class InventoryItemTemplateCreateView(generic.ComponentCreateView):
return instance
@register_model_view(InventoryItemTemplate, 'edit')
class InventoryItemTemplateEditView(generic.ObjectEditView):
queryset = InventoryItemTemplate.objects.all()
form = forms.InventoryItemTemplateForm
@register_model_view(InventoryItemTemplate, 'delete')
class InventoryItemTemplateDeleteView(generic.ObjectDeleteView):
queryset = InventoryItemTemplate.objects.all()
@ -1575,6 +1680,7 @@ class DeviceRoleListView(generic.ObjectListView):
table = tables.DeviceRoleTable
@register_model_view(DeviceRole)
class DeviceRoleView(generic.ObjectView):
queryset = DeviceRole.objects.all()
@ -1592,11 +1698,13 @@ class DeviceRoleView(generic.ObjectView):
}
@register_model_view(DeviceRole, 'edit')
class DeviceRoleEditView(generic.ObjectEditView):
queryset = DeviceRole.objects.all()
form = forms.DeviceRoleForm
@register_model_view(DeviceRole, 'delete')
class DeviceRoleDeleteView(generic.ObjectDeleteView):
queryset = DeviceRole.objects.all()
@ -1639,6 +1747,7 @@ class PlatformListView(generic.ObjectListView):
filterset_form = forms.PlatformFilterForm
@register_model_view(Platform)
class PlatformView(generic.ObjectView):
queryset = Platform.objects.all()
@ -1655,11 +1764,13 @@ class PlatformView(generic.ObjectView):
}
@register_model_view(Platform, 'edit')
class PlatformEditView(generic.ObjectEditView):
queryset = Platform.objects.all()
form = forms.PlatformForm
@register_model_view(Platform, 'delete')
class PlatformDeleteView(generic.ObjectDeleteView):
queryset = Platform.objects.all()
@ -1694,6 +1805,7 @@ class DeviceListView(generic.ObjectListView):
template_name = 'dcim/device_list.html'
@register_model_view(Device)
class DeviceView(generic.ObjectView):
queryset = Device.objects.all()
@ -1716,6 +1828,18 @@ class DeviceView(generic.ObjectView):
}
@register_model_view(Device, 'edit')
class DeviceEditView(generic.ObjectEditView):
queryset = Device.objects.all()
form = forms.DeviceForm
template_name = 'dcim/device_edit.html'
@register_model_view(Device, 'delete')
class DeviceDeleteView(generic.ObjectDeleteView):
queryset = Device.objects.all()
@register_model_view(Device, 'consoleports', path='console-ports')
class DeviceConsolePortsView(DeviceComponentsView):
child_model = ConsolePort
@ -1862,16 +1986,6 @@ class DeviceConfigContextView(ObjectConfigContextView):
)
class DeviceEditView(generic.ObjectEditView):
queryset = Device.objects.all()
form = forms.DeviceForm
template_name = 'dcim/device_edit.html'
class DeviceDeleteView(generic.ObjectDeleteView):
queryset = Device.objects.all()
class DeviceBulkImportView(generic.BulkImportView):
queryset = Device.objects.all()
model_form = forms.DeviceCSVForm
@ -1988,15 +2102,18 @@ class ModuleListView(generic.ObjectListView):
table = tables.ModuleTable
@register_model_view(Module)
class ModuleView(generic.ObjectView):
queryset = Module.objects.all()
@register_model_view(Module, 'edit')
class ModuleEditView(generic.ObjectEditView):
queryset = Module.objects.all()
form = forms.ModuleForm
@register_model_view(Module, 'delete')
class ModuleDeleteView(generic.ObjectDeleteView):
queryset = Module.objects.all()
@ -2032,6 +2149,7 @@ class ConsolePortListView(generic.ObjectListView):
actions = ('import', 'export', 'bulk_edit', 'bulk_delete')
@register_model_view(ConsolePort)
class ConsolePortView(generic.ObjectView):
queryset = ConsolePort.objects.all()
@ -2042,11 +2160,13 @@ class ConsolePortCreateView(generic.ComponentCreateView):
model_form = forms.ConsolePortForm
@register_model_view(ConsolePort, 'edit')
class ConsolePortEditView(generic.ObjectEditView):
queryset = ConsolePort.objects.all()
form = forms.ConsolePortForm
@register_model_view(ConsolePort, 'delete')
class ConsolePortDeleteView(generic.ObjectDeleteView):
queryset = ConsolePort.objects.all()
@ -2078,6 +2198,10 @@ class ConsolePortBulkDeleteView(generic.BulkDeleteView):
table = tables.ConsolePortTable
# Trace view
register_model_view(ConsolePort, 'trace', kwargs={'model': ConsolePort})(PathTraceView)
#
# Console server ports
#
@ -2090,6 +2214,7 @@ class ConsoleServerPortListView(generic.ObjectListView):
actions = ('import', 'export', 'bulk_edit', 'bulk_delete')
@register_model_view(ConsoleServerPort)
class ConsoleServerPortView(generic.ObjectView):
queryset = ConsoleServerPort.objects.all()
@ -2100,11 +2225,13 @@ class ConsoleServerPortCreateView(generic.ComponentCreateView):
model_form = forms.ConsoleServerPortForm
@register_model_view(ConsoleServerPort, 'edit')
class ConsoleServerPortEditView(generic.ObjectEditView):
queryset = ConsoleServerPort.objects.all()
form = forms.ConsoleServerPortForm
@register_model_view(ConsoleServerPort, 'delete')
class ConsoleServerPortDeleteView(generic.ObjectDeleteView):
queryset = ConsoleServerPort.objects.all()
@ -2136,6 +2263,10 @@ class ConsoleServerPortBulkDeleteView(generic.BulkDeleteView):
table = tables.ConsoleServerPortTable
# Trace view
register_model_view(ConsoleServerPort, 'trace', kwargs={'model': ConsoleServerPort})(PathTraceView)
#
# Power ports
#
@ -2148,6 +2279,7 @@ class PowerPortListView(generic.ObjectListView):
actions = ('import', 'export', 'bulk_edit', 'bulk_delete')
@register_model_view(PowerPort)
class PowerPortView(generic.ObjectView):
queryset = PowerPort.objects.all()
@ -2158,11 +2290,13 @@ class PowerPortCreateView(generic.ComponentCreateView):
model_form = forms.PowerPortForm
@register_model_view(PowerPort, 'edit')
class PowerPortEditView(generic.ObjectEditView):
queryset = PowerPort.objects.all()
form = forms.PowerPortForm
@register_model_view(PowerPort, 'delete')
class PowerPortDeleteView(generic.ObjectDeleteView):
queryset = PowerPort.objects.all()
@ -2194,6 +2328,10 @@ class PowerPortBulkDeleteView(generic.BulkDeleteView):
table = tables.PowerPortTable
# Trace view
register_model_view(PowerPort, 'trace', kwargs={'model': PowerPort})(PathTraceView)
#
# Power outlets
#
@ -2206,6 +2344,7 @@ class PowerOutletListView(generic.ObjectListView):
actions = ('import', 'export', 'bulk_edit', 'bulk_delete')
@register_model_view(PowerOutlet)
class PowerOutletView(generic.ObjectView):
queryset = PowerOutlet.objects.all()
@ -2216,11 +2355,13 @@ class PowerOutletCreateView(generic.ComponentCreateView):
model_form = forms.PowerOutletForm
@register_model_view(PowerOutlet, 'edit')
class PowerOutletEditView(generic.ObjectEditView):
queryset = PowerOutlet.objects.all()
form = forms.PowerOutletForm
@register_model_view(PowerOutlet, 'delete')
class PowerOutletDeleteView(generic.ObjectDeleteView):
queryset = PowerOutlet.objects.all()
@ -2252,6 +2393,10 @@ class PowerOutletBulkDeleteView(generic.BulkDeleteView):
table = tables.PowerOutletTable
# Trace view
register_model_view(PowerOutlet, 'trace', kwargs={'model': PowerOutlet})(PathTraceView)
#
# Interfaces
#
@ -2264,6 +2409,7 @@ class InterfaceListView(generic.ObjectListView):
actions = ('import', 'export', 'bulk_edit', 'bulk_delete')
@register_model_view(Interface)
class InterfaceView(generic.ObjectView):
queryset = Interface.objects.all()
@ -2318,11 +2464,13 @@ class InterfaceCreateView(generic.ComponentCreateView):
model_form = forms.InterfaceForm
@register_model_view(Interface, 'edit')
class InterfaceEditView(generic.ObjectEditView):
queryset = Interface.objects.all()
form = forms.InterfaceForm
@register_model_view(Interface, 'delete')
class InterfaceDeleteView(generic.ObjectDeleteView):
queryset = Interface.objects.all()
@ -2354,6 +2502,10 @@ class InterfaceBulkDeleteView(generic.BulkDeleteView):
table = tables.InterfaceTable
# Trace view
register_model_view(Interface, 'trace', kwargs={'model': Interface})(PathTraceView)
#
# Front ports
#
@ -2366,6 +2518,7 @@ class FrontPortListView(generic.ObjectListView):
actions = ('import', 'export', 'bulk_edit', 'bulk_delete')
@register_model_view(FrontPort)
class FrontPortView(generic.ObjectView):
queryset = FrontPort.objects.all()
@ -2376,11 +2529,13 @@ class FrontPortCreateView(generic.ComponentCreateView):
model_form = forms.FrontPortForm
@register_model_view(FrontPort, 'edit')
class FrontPortEditView(generic.ObjectEditView):
queryset = FrontPort.objects.all()
form = forms.FrontPortForm
@register_model_view(FrontPort, 'delete')
class FrontPortDeleteView(generic.ObjectDeleteView):
queryset = FrontPort.objects.all()
@ -2412,6 +2567,10 @@ class FrontPortBulkDeleteView(generic.BulkDeleteView):
table = tables.FrontPortTable
# Trace view
register_model_view(FrontPort, 'trace', kwargs={'model': FrontPort})(PathTraceView)
#
# Rear ports
#
@ -2424,6 +2583,7 @@ class RearPortListView(generic.ObjectListView):
actions = ('import', 'export', 'bulk_edit', 'bulk_delete')
@register_model_view(RearPort)
class RearPortView(generic.ObjectView):
queryset = RearPort.objects.all()
@ -2434,11 +2594,13 @@ class RearPortCreateView(generic.ComponentCreateView):
model_form = forms.RearPortForm
@register_model_view(RearPort, 'edit')
class RearPortEditView(generic.ObjectEditView):
queryset = RearPort.objects.all()
form = forms.RearPortForm
@register_model_view(RearPort, 'delete')
class RearPortDeleteView(generic.ObjectDeleteView):
queryset = RearPort.objects.all()
@ -2470,6 +2632,10 @@ class RearPortBulkDeleteView(generic.BulkDeleteView):
table = tables.RearPortTable
# Trace view
register_model_view(RearPort, 'trace', kwargs={'model': RearPort})(PathTraceView)
#
# Module bays
#
@ -2482,6 +2648,7 @@ class ModuleBayListView(generic.ObjectListView):
actions = ('import', 'export', 'bulk_edit', 'bulk_delete')
@register_model_view(ModuleBay)
class ModuleBayView(generic.ObjectView):
queryset = ModuleBay.objects.all()
@ -2492,11 +2659,13 @@ class ModuleBayCreateView(generic.ComponentCreateView):
model_form = forms.ModuleBayForm
@register_model_view(ModuleBay, 'edit')
class ModuleBayEditView(generic.ObjectEditView):
queryset = ModuleBay.objects.all()
form = forms.ModuleBayForm
@register_model_view(ModuleBay, 'delete')
class ModuleBayDeleteView(generic.ObjectDeleteView):
queryset = ModuleBay.objects.all()
@ -2536,6 +2705,7 @@ class DeviceBayListView(generic.ObjectListView):
actions = ('import', 'export', 'bulk_edit', 'bulk_delete')
@register_model_view(DeviceBay)
class DeviceBayView(generic.ObjectView):
queryset = DeviceBay.objects.all()
@ -2546,15 +2716,18 @@ class DeviceBayCreateView(generic.ComponentCreateView):
model_form = forms.DeviceBayForm
@register_model_view(DeviceBay, 'edit')
class DeviceBayEditView(generic.ObjectEditView):
queryset = DeviceBay.objects.all()
form = forms.DeviceBayForm
@register_model_view(DeviceBay, 'delete')
class DeviceBayDeleteView(generic.ObjectDeleteView):
queryset = DeviceBay.objects.all()
@register_model_view(DeviceBay, 'populate')
class DeviceBayPopulateView(generic.ObjectEditView):
queryset = DeviceBay.objects.all()
@ -2588,6 +2761,7 @@ class DeviceBayPopulateView(generic.ObjectEditView):
})
@register_model_view(DeviceBay, 'depopulate')
class DeviceBayDepopulateView(generic.ObjectEditView):
queryset = DeviceBay.objects.all()
@ -2657,10 +2831,12 @@ class InventoryItemListView(generic.ObjectListView):
actions = ('import', 'export', 'bulk_edit', 'bulk_delete')
@register_model_view(InventoryItem)
class InventoryItemView(generic.ObjectView):
queryset = InventoryItem.objects.all()
@register_model_view(InventoryItem, 'edit')
class InventoryItemEditView(generic.ObjectEditView):
queryset = InventoryItem.objects.all()
form = forms.InventoryItemForm
@ -2683,6 +2859,7 @@ class InventoryItemCreateView(generic.ComponentCreateView):
return instance
@register_model_view(InventoryItem, 'delete')
class InventoryItemDeleteView(generic.ObjectDeleteView):
queryset = InventoryItem.objects.all()
@ -2723,6 +2900,7 @@ class InventoryItemRoleListView(generic.ObjectListView):
table = tables.InventoryItemRoleTable
@register_model_view(InventoryItemRole)
class InventoryItemRoleView(generic.ObjectView):
queryset = InventoryItemRole.objects.all()
@ -2732,11 +2910,13 @@ class InventoryItemRoleView(generic.ObjectView):
}
@register_model_view(InventoryItemRole, 'edit')
class InventoryItemRoleEditView(generic.ObjectEditView):
queryset = InventoryItemRole.objects.all()
form = forms.InventoryItemRoleForm
@register_model_view(InventoryItemRole, 'delete')
class InventoryItemRoleDeleteView(generic.ObjectDeleteView):
queryset = InventoryItemRole.objects.all()
@ -2892,65 +3072,12 @@ class CableListView(generic.ObjectListView):
actions = ('import', 'export', 'bulk_edit', 'bulk_delete')
@register_model_view(Cable)
class CableView(generic.ObjectView):
queryset = Cable.objects.all()
class PathTraceView(generic.ObjectView):
"""
Trace a cable path beginning from the given path endpoint (origin).
"""
additional_permissions = ['dcim.view_cable']
template_name = 'dcim/cable_trace.html'
def dispatch(self, request, *args, **kwargs):
model = kwargs.pop('model')
self.queryset = model.objects.all()
return super().dispatch(request, *args, **kwargs)
def get_extra_context(self, request, instance):
related_paths = []
# If tracing a PathEndpoint, locate the CablePath (if one exists) by its origin
if isinstance(instance, PathEndpoint):
path = instance._path
# Otherwise, find all CablePaths which traverse the specified object
else:
related_paths = CablePath.objects.filter(_nodes__contains=instance)
# Check for specification of a particular path (when tracing pass-through ports)
try:
path_id = int(request.GET.get('cablepath_id'))
except TypeError:
path_id = None
if path_id in list(related_paths.values_list('pk', flat=True)):
path = CablePath.objects.get(pk=path_id)
else:
path = related_paths.first()
# No paths found
if path is None:
return {
'path': None
}
# Get the total length of the cable and whether the length is definitive (fully defined)
total_length, is_definitive = path.get_total_length() if path else (None, False)
# Determine the path to the SVG trace image
api_viewname = f"{path.origin_type.app_label}-api:{path.origin_type.model}-trace"
svg_url = f"{reverse(api_viewname, kwargs={'pk': path.origins[0].pk})}?render=svg"
return {
'path': path,
'related_paths': related_paths,
'total_length': total_length,
'is_definitive': is_definitive,
'svg_url': svg_url,
}
@register_model_view(Cable, 'edit')
class CableEditView(generic.ObjectEditView):
queryset = Cable.objects.all()
template_name = 'dcim/cable_edit.html'
@ -2984,6 +3111,7 @@ class CableEditView(generic.ObjectEditView):
return obj
@register_model_view(Cable, 'delete')
class CableDeleteView(generic.ObjectDeleteView):
queryset = Cable.objects.all()
@ -3072,6 +3200,7 @@ class VirtualChassisListView(generic.ObjectListView):
filterset_form = forms.VirtualChassisFilterForm
@register_model_view(VirtualChassis)
class VirtualChassisView(generic.ObjectView):
queryset = VirtualChassis.objects.all()
@ -3089,6 +3218,7 @@ class VirtualChassisCreateView(generic.ObjectEditView):
template_name = 'dcim/virtualchassis_add.html'
@register_model_view(VirtualChassis, 'edit')
class VirtualChassisEditView(ObjectPermissionRequiredMixin, GetReturnURLMixin, View):
queryset = VirtualChassis.objects.all()
@ -3157,10 +3287,12 @@ class VirtualChassisEditView(ObjectPermissionRequiredMixin, GetReturnURLMixin, V
})
@register_model_view(VirtualChassis, 'delete')
class VirtualChassisDeleteView(generic.ObjectDeleteView):
queryset = VirtualChassis.objects.all()
@register_model_view(VirtualChassis, 'add_member', path='add-member')
class VirtualChassisAddMemberView(ObjectPermissionRequiredMixin, GetReturnURLMixin, View):
queryset = VirtualChassis.objects.all()
@ -3299,6 +3431,7 @@ class PowerPanelListView(generic.ObjectListView):
table = tables.PowerPanelTable
@register_model_view(PowerPanel)
class PowerPanelView(generic.ObjectView):
queryset = PowerPanel.objects.all()
@ -3317,11 +3450,13 @@ class PowerPanelView(generic.ObjectView):
}
@register_model_view(PowerPanel, 'edit')
class PowerPanelEditView(generic.ObjectEditView):
queryset = PowerPanel.objects.all()
form = forms.PowerPanelForm
@register_model_view(PowerPanel, 'delete')
class PowerPanelDeleteView(generic.ObjectDeleteView):
queryset = PowerPanel.objects.all()
@ -3358,15 +3493,18 @@ class PowerFeedListView(generic.ObjectListView):
table = tables.PowerFeedTable
@register_model_view(PowerFeed)
class PowerFeedView(generic.ObjectView):
queryset = PowerFeed.objects.all()
@register_model_view(PowerFeed, 'edit')
class PowerFeedEditView(generic.ObjectEditView):
queryset = PowerFeed.objects.all()
form = forms.PowerFeedForm
@register_model_view(PowerFeed, 'delete')
class PowerFeedDeleteView(generic.ObjectDeleteView):
queryset = PowerFeed.objects.all()
@ -3392,3 +3530,7 @@ class PowerFeedBulkDeleteView(generic.BulkDeleteView):
queryset = PowerFeed.objects.all()
filterset = filtersets.PowerFeedFilterSet
table = tables.PowerFeedTable
# Trace view
register_model_view(PowerFeed, 'trace', kwargs={'model': PowerFeed})(PathTraceView)

View File

@ -13,9 +13,6 @@ urlpatterns = [
path('custom-fields/import/', views.CustomFieldBulkImportView.as_view(), name='customfield_import'),
path('custom-fields/edit/', views.CustomFieldBulkEditView.as_view(), name='customfield_bulk_edit'),
path('custom-fields/delete/', views.CustomFieldBulkDeleteView.as_view(), name='customfield_bulk_delete'),
path('custom-fields/<int:pk>/', views.CustomFieldView.as_view(), name='customfield'),
path('custom-fields/<int:pk>/edit/', views.CustomFieldEditView.as_view(), name='customfield_edit'),
path('custom-fields/<int:pk>/delete/', views.CustomFieldDeleteView.as_view(), name='customfield_delete'),
path('custom-fields/<int:pk>/', include(get_model_urls('extras', 'customfield'))),
# Custom links
@ -24,9 +21,6 @@ urlpatterns = [
path('custom-links/import/', views.CustomLinkBulkImportView.as_view(), name='customlink_import'),
path('custom-links/edit/', views.CustomLinkBulkEditView.as_view(), name='customlink_bulk_edit'),
path('custom-links/delete/', views.CustomLinkBulkDeleteView.as_view(), name='customlink_bulk_delete'),
path('custom-links/<int:pk>/', views.CustomLinkView.as_view(), name='customlink'),
path('custom-links/<int:pk>/edit/', views.CustomLinkEditView.as_view(), name='customlink_edit'),
path('custom-links/<int:pk>/delete/', views.CustomLinkDeleteView.as_view(), name='customlink_delete'),
path('custom-links/<int:pk>/', include(get_model_urls('extras', 'customlink'))),
# Export templates
@ -35,9 +29,6 @@ urlpatterns = [
path('export-templates/import/', views.ExportTemplateBulkImportView.as_view(), name='exporttemplate_import'),
path('export-templates/edit/', views.ExportTemplateBulkEditView.as_view(), name='exporttemplate_bulk_edit'),
path('export-templates/delete/', views.ExportTemplateBulkDeleteView.as_view(), name='exporttemplate_bulk_delete'),
path('export-templates/<int:pk>/', views.ExportTemplateView.as_view(), name='exporttemplate'),
path('export-templates/<int:pk>/edit/', views.ExportTemplateEditView.as_view(), name='exporttemplate_edit'),
path('export-templates/<int:pk>/delete/', views.ExportTemplateDeleteView.as_view(), name='exporttemplate_delete'),
path('export-templates/<int:pk>/', include(get_model_urls('extras', 'exporttemplate'))),
# Webhooks
@ -46,9 +37,6 @@ urlpatterns = [
path('webhooks/import/', views.WebhookBulkImportView.as_view(), name='webhook_import'),
path('webhooks/edit/', views.WebhookBulkEditView.as_view(), name='webhook_bulk_edit'),
path('webhooks/delete/', views.WebhookBulkDeleteView.as_view(), name='webhook_bulk_delete'),
path('webhooks/<int:pk>/', views.WebhookView.as_view(), name='webhook'),
path('webhooks/<int:pk>/edit/', views.WebhookEditView.as_view(), name='webhook_edit'),
path('webhooks/<int:pk>/delete/', views.WebhookDeleteView.as_view(), name='webhook_delete'),
path('webhooks/<int:pk>/', include(get_model_urls('extras', 'webhook'))),
# Tags
@ -57,9 +45,6 @@ urlpatterns = [
path('tags/import/', views.TagBulkImportView.as_view(), name='tag_import'),
path('tags/edit/', views.TagBulkEditView.as_view(), name='tag_bulk_edit'),
path('tags/delete/', views.TagBulkDeleteView.as_view(), name='tag_bulk_delete'),
path('tags/<int:pk>/', views.TagView.as_view(), name='tag'),
path('tags/<int:pk>/edit/', views.TagEditView.as_view(), name='tag_edit'),
path('tags/<int:pk>/delete/', views.TagDeleteView.as_view(), name='tag_delete'),
path('tags/<int:pk>/', include(get_model_urls('extras', 'tag'))),
# Config contexts
@ -67,29 +52,22 @@ urlpatterns = [
path('config-contexts/add/', views.ConfigContextEditView.as_view(), name='configcontext_add'),
path('config-contexts/edit/', views.ConfigContextBulkEditView.as_view(), name='configcontext_bulk_edit'),
path('config-contexts/delete/', views.ConfigContextBulkDeleteView.as_view(), name='configcontext_bulk_delete'),
path('config-contexts/<int:pk>/', views.ConfigContextView.as_view(), name='configcontext'),
path('config-contexts/<int:pk>/edit/', views.ConfigContextEditView.as_view(), name='configcontext_edit'),
path('config-contexts/<int:pk>/delete/', views.ConfigContextDeleteView.as_view(), name='configcontext_delete'),
path('config-contexts/<int:pk>/', include(get_model_urls('extras', 'configcontext'))),
# Image attachments
path('image-attachments/add/', views.ImageAttachmentEditView.as_view(), name='imageattachment_add'),
path('image-attachments/<int:pk>/edit/', views.ImageAttachmentEditView.as_view(), name='imageattachment_edit'),
path('image-attachments/<int:pk>/delete/', views.ImageAttachmentDeleteView.as_view(), name='imageattachment_delete'),
path('image-attachments/<int:pk>/', include(get_model_urls('extras', 'imageattachment'))),
# Journal entries
path('journal-entries/', views.JournalEntryListView.as_view(), name='journalentry_list'),
path('journal-entries/add/', views.JournalEntryEditView.as_view(), name='journalentry_add'),
path('journal-entries/edit/', views.JournalEntryBulkEditView.as_view(), name='journalentry_bulk_edit'),
path('journal-entries/delete/', views.JournalEntryBulkDeleteView.as_view(), name='journalentry_bulk_delete'),
path('journal-entries/<int:pk>/', views.JournalEntryView.as_view(), name='journalentry'),
path('journal-entries/<int:pk>/edit/', views.JournalEntryEditView.as_view(), name='journalentry_edit'),
path('journal-entries/<int:pk>/delete/', views.JournalEntryDeleteView.as_view(), name='journalentry_delete'),
path('journal-entries/<int:pk>/', include(get_model_urls('extras', 'journalentry'))),
# Change logging
path('changelog/', views.ObjectChangeListView.as_view(), name='objectchange_list'),
path('changelog/<int:pk>/', views.ObjectChangeView.as_view(), name='objectchange'),
path('changelog/<int:pk>/', include(get_model_urls('extras', 'objectchange'))),
# Reports
path('reports/', views.ReportListView.as_view(), name='report_list'),

View File

@ -12,7 +12,7 @@ from netbox.views import generic
from utilities.forms import ConfirmationForm
from utilities.htmx import is_htmx
from utilities.utils import copy_safe_request, count_related, get_viewname, normalize_querydict, shallow_compare_dict
from utilities.views import ContentTypePermissionRequiredMixin
from utilities.views import ContentTypePermissionRequiredMixin, register_model_view
from . import filtersets, forms, tables
from .choices import JobResultStatusChoices
from .models import *
@ -31,15 +31,18 @@ class CustomFieldListView(generic.ObjectListView):
table = tables.CustomFieldTable
@register_model_view(CustomField)
class CustomFieldView(generic.ObjectView):
queryset = CustomField.objects.all()
@register_model_view(CustomField, 'edit')
class CustomFieldEditView(generic.ObjectEditView):
queryset = CustomField.objects.all()
form = forms.CustomFieldForm
@register_model_view(CustomField, 'delete')
class CustomFieldDeleteView(generic.ObjectDeleteView):
queryset = CustomField.objects.all()
@ -74,15 +77,18 @@ class CustomLinkListView(generic.ObjectListView):
table = tables.CustomLinkTable
@register_model_view(CustomLink)
class CustomLinkView(generic.ObjectView):
queryset = CustomLink.objects.all()
@register_model_view(CustomLink, 'edit')
class CustomLinkEditView(generic.ObjectEditView):
queryset = CustomLink.objects.all()
form = forms.CustomLinkForm
@register_model_view(CustomLink, 'delete')
class CustomLinkDeleteView(generic.ObjectDeleteView):
queryset = CustomLink.objects.all()
@ -117,15 +123,18 @@ class ExportTemplateListView(generic.ObjectListView):
table = tables.ExportTemplateTable
@register_model_view(ExportTemplate)
class ExportTemplateView(generic.ObjectView):
queryset = ExportTemplate.objects.all()
@register_model_view(ExportTemplate, 'edit')
class ExportTemplateEditView(generic.ObjectEditView):
queryset = ExportTemplate.objects.all()
form = forms.ExportTemplateForm
@register_model_view(ExportTemplate, 'delete')
class ExportTemplateDeleteView(generic.ObjectDeleteView):
queryset = ExportTemplate.objects.all()
@ -160,15 +169,18 @@ class WebhookListView(generic.ObjectListView):
table = tables.WebhookTable
@register_model_view(Webhook)
class WebhookView(generic.ObjectView):
queryset = Webhook.objects.all()
@register_model_view(Webhook, 'edit')
class WebhookEditView(generic.ObjectEditView):
queryset = Webhook.objects.all()
form = forms.WebhookForm
@register_model_view(Webhook, 'delete')
class WebhookDeleteView(generic.ObjectDeleteView):
queryset = Webhook.objects.all()
@ -205,6 +217,7 @@ class TagListView(generic.ObjectListView):
table = tables.TagTable
@register_model_view(Tag)
class TagView(generic.ObjectView):
queryset = Tag.objects.all()
@ -230,11 +243,13 @@ class TagView(generic.ObjectView):
}
@register_model_view(Tag, 'edit')
class TagEditView(generic.ObjectEditView):
queryset = Tag.objects.all()
form = forms.TagForm
@register_model_view(Tag, 'delete')
class TagDeleteView(generic.ObjectDeleteView):
queryset = Tag.objects.all()
@ -272,6 +287,7 @@ class ConfigContextListView(generic.ObjectListView):
actions = ('add', 'bulk_edit', 'bulk_delete')
@register_model_view(ConfigContext)
class ConfigContextView(generic.ObjectView):
queryset = ConfigContext.objects.all()
@ -309,6 +325,7 @@ class ConfigContextView(generic.ObjectView):
}
@register_model_view(ConfigContext, 'edit')
class ConfigContextEditView(generic.ObjectEditView):
queryset = ConfigContext.objects.all()
form = forms.ConfigContextForm
@ -321,6 +338,7 @@ class ConfigContextBulkEditView(generic.BulkEditView):
form = forms.ConfigContextBulkEditForm
@register_model_view(ConfigContext, 'delete')
class ConfigContextDeleteView(generic.ObjectDeleteView):
queryset = ConfigContext.objects.all()
@ -368,6 +386,7 @@ class ObjectChangeListView(generic.ObjectListView):
actions = ('export',)
@register_model_view(ObjectChange)
class ObjectChangeView(generic.ObjectView):
queryset = ObjectChange.objects.all()
@ -425,6 +444,7 @@ class ObjectChangeView(generic.ObjectView):
# Image attachments
#
@register_model_view(ImageAttachment, 'edit')
class ImageAttachmentEditView(generic.ObjectEditView):
queryset = ImageAttachment.objects.all()
form = forms.ImageAttachmentForm
@ -447,6 +467,7 @@ class ImageAttachmentEditView(generic.ObjectEditView):
}
@register_model_view(ImageAttachment, 'delete')
class ImageAttachmentDeleteView(generic.ObjectDeleteView):
queryset = ImageAttachment.objects.all()
@ -466,10 +487,12 @@ class JournalEntryListView(generic.ObjectListView):
actions = ('export', 'bulk_edit', 'bulk_delete')
@register_model_view(JournalEntry)
class JournalEntryView(generic.ObjectView):
queryset = JournalEntry.objects.all()
@register_model_view(JournalEntry, 'edit')
class JournalEntryEditView(generic.ObjectEditView):
queryset = JournalEntry.objects.all()
form = forms.JournalEntryForm
@ -487,6 +510,7 @@ class JournalEntryEditView(generic.ObjectEditView):
return reverse(viewname, kwargs={'pk': obj.pk})
@register_model_view(JournalEntry, 'delete')
class JournalEntryDeleteView(generic.ObjectDeleteView):
queryset = JournalEntry.objects.all()

View File

@ -12,9 +12,6 @@ urlpatterns = [
path('asns/import/', views.ASNBulkImportView.as_view(), name='asn_import'),
path('asns/edit/', views.ASNBulkEditView.as_view(), name='asn_bulk_edit'),
path('asns/delete/', views.ASNBulkDeleteView.as_view(), name='asn_bulk_delete'),
path('asns/<int:pk>/', views.ASNView.as_view(), name='asn'),
path('asns/<int:pk>/edit/', views.ASNEditView.as_view(), name='asn_edit'),
path('asns/<int:pk>/delete/', views.ASNDeleteView.as_view(), name='asn_delete'),
path('asns/<int:pk>/', include(get_model_urls('ipam', 'asn'))),
# VRFs
@ -23,9 +20,6 @@ urlpatterns = [
path('vrfs/import/', views.VRFBulkImportView.as_view(), name='vrf_import'),
path('vrfs/edit/', views.VRFBulkEditView.as_view(), name='vrf_bulk_edit'),
path('vrfs/delete/', views.VRFBulkDeleteView.as_view(), name='vrf_bulk_delete'),
path('vrfs/<int:pk>/', views.VRFView.as_view(), name='vrf'),
path('vrfs/<int:pk>/edit/', views.VRFEditView.as_view(), name='vrf_edit'),
path('vrfs/<int:pk>/delete/', views.VRFDeleteView.as_view(), name='vrf_delete'),
path('vrfs/<int:pk>/', include(get_model_urls('ipam', 'vrf'))),
# Route targets
@ -34,9 +28,6 @@ urlpatterns = [
path('route-targets/import/', views.RouteTargetBulkImportView.as_view(), name='routetarget_import'),
path('route-targets/edit/', views.RouteTargetBulkEditView.as_view(), name='routetarget_bulk_edit'),
path('route-targets/delete/', views.RouteTargetBulkDeleteView.as_view(), name='routetarget_bulk_delete'),
path('route-targets/<int:pk>/', views.RouteTargetView.as_view(), name='routetarget'),
path('route-targets/<int:pk>/edit/', views.RouteTargetEditView.as_view(), name='routetarget_edit'),
path('route-targets/<int:pk>/delete/', views.RouteTargetDeleteView.as_view(), name='routetarget_delete'),
path('route-targets/<int:pk>/', include(get_model_urls('ipam', 'routetarget'))),
# RIRs
@ -45,9 +36,6 @@ urlpatterns = [
path('rirs/import/', views.RIRBulkImportView.as_view(), name='rir_import'),
path('rirs/edit/', views.RIRBulkEditView.as_view(), name='rir_bulk_edit'),
path('rirs/delete/', views.RIRBulkDeleteView.as_view(), name='rir_bulk_delete'),
path('rirs/<int:pk>/', views.RIRView.as_view(), name='rir'),
path('rirs/<int:pk>/edit/', views.RIREditView.as_view(), name='rir_edit'),
path('rirs/<int:pk>/delete/', views.RIRDeleteView.as_view(), name='rir_delete'),
path('rirs/<int:pk>/', include(get_model_urls('ipam', 'rir'))),
# Aggregates
@ -56,9 +44,6 @@ urlpatterns = [
path('aggregates/import/', views.AggregateBulkImportView.as_view(), name='aggregate_import'),
path('aggregates/edit/', views.AggregateBulkEditView.as_view(), name='aggregate_bulk_edit'),
path('aggregates/delete/', views.AggregateBulkDeleteView.as_view(), name='aggregate_bulk_delete'),
path('aggregates/<int:pk>/', views.AggregateView.as_view(), name='aggregate'),
path('aggregates/<int:pk>/edit/', views.AggregateEditView.as_view(), name='aggregate_edit'),
path('aggregates/<int:pk>/delete/', views.AggregateDeleteView.as_view(), name='aggregate_delete'),
path('aggregates/<int:pk>/', include(get_model_urls('ipam', 'aggregate'))),
# Roles
@ -67,9 +52,6 @@ urlpatterns = [
path('roles/import/', views.RoleBulkImportView.as_view(), name='role_import'),
path('roles/edit/', views.RoleBulkEditView.as_view(), name='role_bulk_edit'),
path('roles/delete/', views.RoleBulkDeleteView.as_view(), name='role_bulk_delete'),
path('roles/<int:pk>/', views.RoleView.as_view(), name='role'),
path('roles/<int:pk>/edit/', views.RoleEditView.as_view(), name='role_edit'),
path('roles/<int:pk>/delete/', views.RoleDeleteView.as_view(), name='role_delete'),
path('roles/<int:pk>/', include(get_model_urls('ipam', 'role'))),
# Prefixes
@ -78,9 +60,6 @@ urlpatterns = [
path('prefixes/import/', views.PrefixBulkImportView.as_view(), name='prefix_import'),
path('prefixes/edit/', views.PrefixBulkEditView.as_view(), name='prefix_bulk_edit'),
path('prefixes/delete/', views.PrefixBulkDeleteView.as_view(), name='prefix_bulk_delete'),
path('prefixes/<int:pk>/', views.PrefixView.as_view(), name='prefix'),
path('prefixes/<int:pk>/edit/', views.PrefixEditView.as_view(), name='prefix_edit'),
path('prefixes/<int:pk>/delete/', views.PrefixDeleteView.as_view(), name='prefix_delete'),
path('prefixes/<int:pk>/', include(get_model_urls('ipam', 'prefix'))),
# IP ranges
@ -89,9 +68,6 @@ urlpatterns = [
path('ip-ranges/import/', views.IPRangeBulkImportView.as_view(), name='iprange_import'),
path('ip-ranges/edit/', views.IPRangeBulkEditView.as_view(), name='iprange_bulk_edit'),
path('ip-ranges/delete/', views.IPRangeBulkDeleteView.as_view(), name='iprange_bulk_delete'),
path('ip-ranges/<int:pk>/', views.IPRangeView.as_view(), name='iprange'),
path('ip-ranges/<int:pk>/edit/', views.IPRangeEditView.as_view(), name='iprange_edit'),
path('ip-ranges/<int:pk>/delete/', views.IPRangeDeleteView.as_view(), name='iprange_delete'),
path('ip-ranges/<int:pk>/', include(get_model_urls('ipam', 'iprange'))),
# IP addresses
@ -102,9 +78,6 @@ urlpatterns = [
path('ip-addresses/edit/', views.IPAddressBulkEditView.as_view(), name='ipaddress_bulk_edit'),
path('ip-addresses/delete/', views.IPAddressBulkDeleteView.as_view(), name='ipaddress_bulk_delete'),
path('ip-addresses/assign/', views.IPAddressAssignView.as_view(), name='ipaddress_assign'),
path('ip-addresses/<int:pk>/', views.IPAddressView.as_view(), name='ipaddress'),
path('ip-addresses/<int:pk>/edit/', views.IPAddressEditView.as_view(), name='ipaddress_edit'),
path('ip-addresses/<int:pk>/delete/', views.IPAddressDeleteView.as_view(), name='ipaddress_delete'),
path('ip-addresses/<int:pk>/', include(get_model_urls('ipam', 'ipaddress'))),
# FHRP groups
@ -113,15 +86,11 @@ urlpatterns = [
path('fhrp-groups/import/', views.FHRPGroupBulkImportView.as_view(), name='fhrpgroup_import'),
path('fhrp-groups/edit/', views.FHRPGroupBulkEditView.as_view(), name='fhrpgroup_bulk_edit'),
path('fhrp-groups/delete/', views.FHRPGroupBulkDeleteView.as_view(), name='fhrpgroup_bulk_delete'),
path('fhrp-groups/<int:pk>/', views.FHRPGroupView.as_view(), name='fhrpgroup'),
path('fhrp-groups/<int:pk>/edit/', views.FHRPGroupEditView.as_view(), name='fhrpgroup_edit'),
path('fhrp-groups/<int:pk>/delete/', views.FHRPGroupDeleteView.as_view(), name='fhrpgroup_delete'),
path('fhrp-groups/<int:pk>/', include(get_model_urls('ipam', 'fhrpgroup'))),
# FHRP group assignments
path('fhrp-group-assignments/add/', views.FHRPGroupAssignmentEditView.as_view(), name='fhrpgroupassignment_add'),
path('fhrp-group-assignments/<int:pk>/edit/', views.FHRPGroupAssignmentEditView.as_view(), name='fhrpgroupassignment_edit'),
path('fhrp-group-assignments/<int:pk>/delete/', views.FHRPGroupAssignmentDeleteView.as_view(), name='fhrpgroupassignment_delete'),
path('fhrp-group-assignments/<int:pk>/', include(get_model_urls('ipam', 'fhrpgroupassignment'))),
# VLAN groups
path('vlan-groups/', views.VLANGroupListView.as_view(), name='vlangroup_list'),
@ -129,9 +98,6 @@ urlpatterns = [
path('vlan-groups/import/', views.VLANGroupBulkImportView.as_view(), name='vlangroup_import'),
path('vlan-groups/edit/', views.VLANGroupBulkEditView.as_view(), name='vlangroup_bulk_edit'),
path('vlan-groups/delete/', views.VLANGroupBulkDeleteView.as_view(), name='vlangroup_bulk_delete'),
path('vlan-groups/<int:pk>/', views.VLANGroupView.as_view(), name='vlangroup'),
path('vlan-groups/<int:pk>/edit/', views.VLANGroupEditView.as_view(), name='vlangroup_edit'),
path('vlan-groups/<int:pk>/delete/', views.VLANGroupDeleteView.as_view(), name='vlangroup_delete'),
path('vlan-groups/<int:pk>/', include(get_model_urls('ipam', 'vlangroup'))),
# VLANs
@ -140,9 +106,6 @@ urlpatterns = [
path('vlans/import/', views.VLANBulkImportView.as_view(), name='vlan_import'),
path('vlans/edit/', views.VLANBulkEditView.as_view(), name='vlan_bulk_edit'),
path('vlans/delete/', views.VLANBulkDeleteView.as_view(), name='vlan_bulk_delete'),
path('vlans/<int:pk>/', views.VLANView.as_view(), name='vlan'),
path('vlans/<int:pk>/edit/', views.VLANEditView.as_view(), name='vlan_edit'),
path('vlans/<int:pk>/delete/', views.VLANDeleteView.as_view(), name='vlan_delete'),
path('vlans/<int:pk>/', include(get_model_urls('ipam', 'vlan'))),
# Service templates
@ -151,9 +114,6 @@ urlpatterns = [
path('service-templates/import/', views.ServiceTemplateBulkImportView.as_view(), name='servicetemplate_import'),
path('service-templates/edit/', views.ServiceTemplateBulkEditView.as_view(), name='servicetemplate_bulk_edit'),
path('service-templates/delete/', views.ServiceTemplateBulkDeleteView.as_view(), name='servicetemplate_bulk_delete'),
path('service-templates/<int:pk>/', views.ServiceTemplateView.as_view(), name='servicetemplate'),
path('service-templates/<int:pk>/edit/', views.ServiceTemplateEditView.as_view(), name='servicetemplate_edit'),
path('service-templates/<int:pk>/delete/', views.ServiceTemplateDeleteView.as_view(), name='servicetemplate_delete'),
path('service-templates/<int:pk>/', include(get_model_urls('ipam', 'servicetemplate'))),
# Services
@ -162,9 +122,6 @@ urlpatterns = [
path('services/import/', views.ServiceBulkImportView.as_view(), name='service_import'),
path('services/edit/', views.ServiceBulkEditView.as_view(), name='service_bulk_edit'),
path('services/delete/', views.ServiceBulkDeleteView.as_view(), name='service_bulk_delete'),
path('services/<int:pk>/', views.ServiceView.as_view(), name='service'),
path('services/<int:pk>/edit/', views.ServiceEditView.as_view(), name='service_edit'),
path('services/<int:pk>/delete/', views.ServiceDeleteView.as_view(), name='service_delete'),
path('services/<int:pk>/', include(get_model_urls('ipam', 'service'))),
# L2VPN
@ -173,9 +130,6 @@ urlpatterns = [
path('l2vpns/import/', views.L2VPNBulkImportView.as_view(), name='l2vpn_import'),
path('l2vpns/edit/', views.L2VPNBulkEditView.as_view(), name='l2vpn_bulk_edit'),
path('l2vpns/delete/', views.L2VPNBulkDeleteView.as_view(), name='l2vpn_bulk_delete'),
path('l2vpns/<int:pk>/', views.L2VPNView.as_view(), name='l2vpn'),
path('l2vpns/<int:pk>/edit/', views.L2VPNEditView.as_view(), name='l2vpn_edit'),
path('l2vpns/<int:pk>/delete/', views.L2VPNDeleteView.as_view(), name='l2vpn_delete'),
path('l2vpns/<int:pk>/', include(get_model_urls('ipam', 'l2vpn'))),
# L2VPN terminations
@ -184,8 +138,5 @@ urlpatterns = [
path('l2vpn-terminations/import/', views.L2VPNTerminationBulkImportView.as_view(), name='l2vpntermination_import'),
path('l2vpn-terminations/edit/', views.L2VPNTerminationBulkEditView.as_view(), name='l2vpntermination_bulk_edit'),
path('l2vpn-terminations/delete/', views.L2VPNTerminationBulkDeleteView.as_view(), name='l2vpntermination_bulk_delete'),
path('l2vpn-terminations/<int:pk>/', views.L2VPNTerminationView.as_view(), name='l2vpntermination'),
path('l2vpn-terminations/<int:pk>/edit/', views.L2VPNTerminationEditView.as_view(), name='l2vpntermination_edit'),
path('l2vpn-terminations/<int:pk>/delete/', views.L2VPNTerminationDeleteView.as_view(), name='l2vpntermination_delete'),
path('l2vpn-terminations/<int:pk>/', include(get_model_urls('ipam', 'l2vpntermination'))),
]

View File

@ -34,6 +34,7 @@ class VRFListView(generic.ObjectListView):
table = tables.VRFTable
@register_model_view(VRF)
class VRFView(generic.ObjectView):
queryset = VRF.objects.all()
@ -58,11 +59,13 @@ class VRFView(generic.ObjectView):
}
@register_model_view(VRF, 'edit')
class VRFEditView(generic.ObjectEditView):
queryset = VRF.objects.all()
form = forms.VRFForm
@register_model_view(VRF, 'delete')
class VRFDeleteView(generic.ObjectDeleteView):
queryset = VRF.objects.all()
@ -97,6 +100,7 @@ class RouteTargetListView(generic.ObjectListView):
table = tables.RouteTargetTable
@register_model_view(RouteTarget)
class RouteTargetView(generic.ObjectView):
queryset = RouteTarget.objects.all()
@ -116,11 +120,13 @@ class RouteTargetView(generic.ObjectView):
}
@register_model_view(RouteTarget, 'edit')
class RouteTargetEditView(generic.ObjectEditView):
queryset = RouteTarget.objects.all()
form = forms.RouteTargetForm
@register_model_view(RouteTarget, 'delete')
class RouteTargetDeleteView(generic.ObjectDeleteView):
queryset = RouteTarget.objects.all()
@ -157,6 +163,7 @@ class RIRListView(generic.ObjectListView):
table = tables.RIRTable
@register_model_view(RIR)
class RIRView(generic.ObjectView):
queryset = RIR.objects.all()
@ -172,11 +179,13 @@ class RIRView(generic.ObjectView):
}
@register_model_view(RIR, 'edit')
class RIREditView(generic.ObjectEditView):
queryset = RIR.objects.all()
form = forms.RIRForm
@register_model_view(RIR, 'delete')
class RIRDeleteView(generic.ObjectDeleteView):
queryset = RIR.objects.all()
@ -218,6 +227,7 @@ class ASNListView(generic.ObjectListView):
table = tables.ASNTable
@register_model_view(ASN)
class ASNView(generic.ObjectView):
queryset = ASN.objects.all()
@ -242,11 +252,13 @@ class ASNView(generic.ObjectView):
}
@register_model_view(ASN, 'edit')
class ASNEditView(generic.ObjectEditView):
queryset = ASN.objects.all()
form = forms.ASNForm
@register_model_view(ASN, 'delete')
class ASNDeleteView(generic.ObjectDeleteView):
queryset = ASN.objects.all()
@ -287,6 +299,7 @@ class AggregateListView(generic.ObjectListView):
table = tables.AggregateTable
@register_model_view(Aggregate)
class AggregateView(generic.ObjectView):
queryset = Aggregate.objects.all()
@ -325,11 +338,13 @@ class AggregatePrefixesView(generic.ObjectChildrenView):
}
@register_model_view(Aggregate, 'edit')
class AggregateEditView(generic.ObjectEditView):
queryset = Aggregate.objects.all()
form = forms.AggregateForm
@register_model_view(Aggregate, 'delete')
class AggregateDeleteView(generic.ObjectDeleteView):
queryset = Aggregate.objects.all()
@ -372,6 +387,7 @@ class RoleListView(generic.ObjectListView):
table = tables.RoleTable
@register_model_view(Role)
class RoleView(generic.ObjectView):
queryset = Role.objects.all()
@ -388,11 +404,13 @@ class RoleView(generic.ObjectView):
}
@register_model_view(Role, 'edit')
class RoleEditView(generic.ObjectEditView):
queryset = Role.objects.all()
form = forms.RoleForm
@register_model_view(Role, 'delete')
class RoleDeleteView(generic.ObjectDeleteView):
queryset = Role.objects.all()
@ -427,6 +445,7 @@ class PrefixListView(generic.ObjectListView):
template_name = 'ipam/prefix_list.html'
@register_model_view(Prefix)
class PrefixView(generic.ObjectView):
queryset = Prefix.objects.all()
@ -560,11 +579,13 @@ class PrefixIPAddressesView(generic.ObjectChildrenView):
}
@register_model_view(Prefix, 'edit')
class PrefixEditView(generic.ObjectEditView):
queryset = Prefix.objects.all()
form = forms.PrefixForm
@register_model_view(Prefix, 'delete')
class PrefixDeleteView(generic.ObjectDeleteView):
queryset = Prefix.objects.all()
@ -599,6 +620,7 @@ class IPRangeListView(generic.ObjectListView):
table = tables.IPRangeTable
@register_model_view(IPRange)
class IPRangeView(generic.ObjectView):
queryset = IPRange.objects.all()
@ -620,11 +642,13 @@ class IPRangeIPAddressesView(generic.ObjectChildrenView):
return parent.get_child_ips().restrict(request.user, 'view')
@register_model_view(IPRange, 'edit')
class IPRangeEditView(generic.ObjectEditView):
queryset = IPRange.objects.all()
form = forms.IPRangeForm
@register_model_view(IPRange, 'delete')
class IPRangeDeleteView(generic.ObjectDeleteView):
queryset = IPRange.objects.all()
@ -659,6 +683,7 @@ class IPAddressListView(generic.ObjectListView):
table = tables.IPAddressTable
@register_model_view(IPAddress)
class IPAddressView(generic.ObjectView):
queryset = IPAddress.objects.prefetch_related('vrf__tenant', 'tenant')
@ -726,6 +751,7 @@ class IPAddressView(generic.ObjectView):
}
@register_model_view(IPAddress, 'edit')
class IPAddressEditView(generic.ObjectEditView):
queryset = IPAddress.objects.all()
form = forms.IPAddressForm
@ -795,6 +821,7 @@ class IPAddressAssignView(generic.ObjectView):
})
@register_model_view(IPAddress, 'delete')
class IPAddressDeleteView(generic.ObjectDeleteView):
queryset = IPAddress.objects.all()
@ -839,6 +866,7 @@ class VLANGroupListView(generic.ObjectListView):
table = tables.VLANGroupTable
@register_model_view(VLANGroup)
class VLANGroupView(generic.ObjectView):
queryset = VLANGroup.objects.all()
@ -869,11 +897,13 @@ class VLANGroupView(generic.ObjectView):
}
@register_model_view(VLANGroup, 'edit')
class VLANGroupEditView(generic.ObjectEditView):
queryset = VLANGroup.objects.all()
form = forms.VLANGroupForm
@register_model_view(VLANGroup, 'delete')
class VLANGroupDeleteView(generic.ObjectDeleteView):
queryset = VLANGroup.objects.all()
@ -914,6 +944,7 @@ class FHRPGroupListView(generic.ObjectListView):
table = tables.FHRPGroupTable
@register_model_view(FHRPGroup)
class FHRPGroupView(generic.ObjectView):
queryset = FHRPGroup.objects.all()
@ -938,6 +969,7 @@ class FHRPGroupView(generic.ObjectView):
}
@register_model_view(FHRPGroup, 'edit')
class FHRPGroupEditView(generic.ObjectEditView):
queryset = FHRPGroup.objects.all()
form = forms.FHRPGroupForm
@ -954,6 +986,7 @@ class FHRPGroupEditView(generic.ObjectEditView):
return return_url
@register_model_view(FHRPGroup, 'delete')
class FHRPGroupDeleteView(generic.ObjectDeleteView):
queryset = FHRPGroup.objects.all()
@ -981,6 +1014,7 @@ class FHRPGroupBulkDeleteView(generic.BulkDeleteView):
# FHRP group assignments
#
@register_model_view(FHRPGroupAssignment, 'edit')
class FHRPGroupAssignmentEditView(generic.ObjectEditView):
queryset = FHRPGroupAssignment.objects.all()
form = forms.FHRPGroupAssignmentForm
@ -994,6 +1028,7 @@ class FHRPGroupAssignmentEditView(generic.ObjectEditView):
return instance
@register_model_view(FHRPGroupAssignment, 'delete')
class FHRPGroupAssignmentDeleteView(generic.ObjectDeleteView):
queryset = FHRPGroupAssignment.objects.all()
@ -1009,6 +1044,7 @@ class VLANListView(generic.ObjectListView):
table = tables.VLANTable
@register_model_view(VLAN)
class VLANView(generic.ObjectView):
queryset = VLAN.objects.all()
@ -1057,12 +1093,14 @@ class VLANVMInterfacesView(generic.ObjectChildrenView):
return parent.get_vminterfaces().restrict(request.user, 'view')
@register_model_view(VLAN, 'edit')
class VLANEditView(generic.ObjectEditView):
queryset = VLAN.objects.all()
form = forms.VLANForm
template_name = 'ipam/vlan_edit.html'
@register_model_view(VLAN, 'delete')
class VLANDeleteView(generic.ObjectDeleteView):
queryset = VLAN.objects.all()
@ -1097,15 +1135,18 @@ class ServiceTemplateListView(generic.ObjectListView):
table = tables.ServiceTemplateTable
@register_model_view(ServiceTemplate)
class ServiceTemplateView(generic.ObjectView):
queryset = ServiceTemplate.objects.all()
@register_model_view(ServiceTemplate, 'edit')
class ServiceTemplateEditView(generic.ObjectEditView):
queryset = ServiceTemplate.objects.all()
form = forms.ServiceTemplateForm
@register_model_view(ServiceTemplate, 'delete')
class ServiceTemplateDeleteView(generic.ObjectDeleteView):
queryset = ServiceTemplate.objects.all()
@ -1140,6 +1181,7 @@ class ServiceListView(generic.ObjectListView):
table = tables.ServiceTable
@register_model_view(Service)
class ServiceView(generic.ObjectView):
queryset = Service.objects.all()
@ -1150,12 +1192,14 @@ class ServiceCreateView(generic.ObjectEditView):
template_name = 'ipam/service_create.html'
@register_model_view(Service, 'edit')
class ServiceEditView(generic.ObjectEditView):
queryset = Service.objects.all()
form = forms.ServiceForm
template_name = 'ipam/service_edit.html'
@register_model_view(Service, 'delete')
class ServiceDeleteView(generic.ObjectDeleteView):
queryset = Service.objects.all()
@ -1181,7 +1225,6 @@ class ServiceBulkDeleteView(generic.BulkDeleteView):
# L2VPN
class L2VPNListView(generic.ObjectListView):
queryset = L2VPN.objects.all()
table = L2VPNTable
@ -1189,6 +1232,7 @@ class L2VPNListView(generic.ObjectListView):
filterset_form = forms.L2VPNFilterForm
@register_model_view(L2VPN)
class L2VPNView(generic.ObjectView):
queryset = L2VPN.objects.all()
@ -1213,11 +1257,13 @@ class L2VPNView(generic.ObjectView):
}
@register_model_view(L2VPN, 'edit')
class L2VPNEditView(generic.ObjectEditView):
queryset = L2VPN.objects.all()
form = forms.L2VPNForm
@register_model_view(L2VPN, 'delete')
class L2VPNDeleteView(generic.ObjectDeleteView):
queryset = L2VPN.objects.all()
@ -1241,6 +1287,10 @@ class L2VPNBulkDeleteView(generic.BulkDeleteView):
table = tables.L2VPNTable
#
# L2VPN terminations
#
class L2VPNTerminationListView(generic.ObjectListView):
queryset = L2VPNTermination.objects.all()
table = L2VPNTerminationTable
@ -1248,16 +1298,19 @@ class L2VPNTerminationListView(generic.ObjectListView):
filterset_form = forms.L2VPNTerminationFilterForm
@register_model_view(L2VPNTermination)
class L2VPNTerminationView(generic.ObjectView):
queryset = L2VPNTermination.objects.all()
@register_model_view(L2VPNTermination, 'edit')
class L2VPNTerminationEditView(generic.ObjectEditView):
queryset = L2VPNTermination.objects.all()
form = forms.L2VPNTerminationForm
template_name = 'ipam/l2vpntermination_edit.html'
@register_model_view(L2VPNTermination, 'delete')
class L2VPNTerminationDeleteView(generic.ObjectDeleteView):
queryset = L2VPNTermination.objects.all()

View File

@ -12,9 +12,6 @@ urlpatterns = [
path('tenant-groups/import/', views.TenantGroupBulkImportView.as_view(), name='tenantgroup_import'),
path('tenant-groups/edit/', views.TenantGroupBulkEditView.as_view(), name='tenantgroup_bulk_edit'),
path('tenant-groups/delete/', views.TenantGroupBulkDeleteView.as_view(), name='tenantgroup_bulk_delete'),
path('tenant-groups/<int:pk>/', views.TenantGroupView.as_view(), name='tenantgroup'),
path('tenant-groups/<int:pk>/edit/', views.TenantGroupEditView.as_view(), name='tenantgroup_edit'),
path('tenant-groups/<int:pk>/delete/', views.TenantGroupDeleteView.as_view(), name='tenantgroup_delete'),
path('tenant-groups/<int:pk>/', include(get_model_urls('tenancy', 'tenantgroup'))),
# Tenants
@ -23,9 +20,6 @@ urlpatterns = [
path('tenants/import/', views.TenantBulkImportView.as_view(), name='tenant_import'),
path('tenants/edit/', views.TenantBulkEditView.as_view(), name='tenant_bulk_edit'),
path('tenants/delete/', views.TenantBulkDeleteView.as_view(), name='tenant_bulk_delete'),
path('tenants/<int:pk>/', views.TenantView.as_view(), name='tenant'),
path('tenants/<int:pk>/edit/', views.TenantEditView.as_view(), name='tenant_edit'),
path('tenants/<int:pk>/delete/', views.TenantDeleteView.as_view(), name='tenant_delete'),
path('tenants/<int:pk>/', include(get_model_urls('tenancy', 'tenant'))),
# Contact groups
@ -34,9 +28,6 @@ urlpatterns = [
path('contact-groups/import/', views.ContactGroupBulkImportView.as_view(), name='contactgroup_import'),
path('contact-groups/edit/', views.ContactGroupBulkEditView.as_view(), name='contactgroup_bulk_edit'),
path('contact-groups/delete/', views.ContactGroupBulkDeleteView.as_view(), name='contactgroup_bulk_delete'),
path('contact-groups/<int:pk>/', views.ContactGroupView.as_view(), name='contactgroup'),
path('contact-groups/<int:pk>/edit/', views.ContactGroupEditView.as_view(), name='contactgroup_edit'),
path('contact-groups/<int:pk>/delete/', views.ContactGroupDeleteView.as_view(), name='contactgroup_delete'),
path('contact-groups/<int:pk>/', include(get_model_urls('tenancy', 'contactgroup'))),
# Contact roles
@ -45,9 +36,6 @@ urlpatterns = [
path('contact-roles/import/', views.ContactRoleBulkImportView.as_view(), name='contactrole_import'),
path('contact-roles/edit/', views.ContactRoleBulkEditView.as_view(), name='contactrole_bulk_edit'),
path('contact-roles/delete/', views.ContactRoleBulkDeleteView.as_view(), name='contactrole_bulk_delete'),
path('contact-roles/<int:pk>/', views.ContactRoleView.as_view(), name='contactrole'),
path('contact-roles/<int:pk>/edit/', views.ContactRoleEditView.as_view(), name='contactrole_edit'),
path('contact-roles/<int:pk>/delete/', views.ContactRoleDeleteView.as_view(), name='contactrole_delete'),
path('contact-roles/<int:pk>/', include(get_model_urls('tenancy', 'contactrole'))),
# Contacts
@ -56,14 +44,10 @@ urlpatterns = [
path('contacts/import/', views.ContactBulkImportView.as_view(), name='contact_import'),
path('contacts/edit/', views.ContactBulkEditView.as_view(), name='contact_bulk_edit'),
path('contacts/delete/', views.ContactBulkDeleteView.as_view(), name='contact_bulk_delete'),
path('contacts/<int:pk>/', views.ContactView.as_view(), name='contact'),
path('contacts/<int:pk>/edit/', views.ContactEditView.as_view(), name='contact_edit'),
path('contacts/<int:pk>/delete/', views.ContactDeleteView.as_view(), name='contact_delete'),
path('contacts/<int:pk>/', include(get_model_urls('tenancy', 'contact'))),
# Contact assignments
path('contact-assignments/add/', views.ContactAssignmentEditView.as_view(), name='contactassignment_add'),
path('contact-assignments/<int:pk>/edit/', views.ContactAssignmentEditView.as_view(), name='contactassignment_edit'),
path('contact-assignments/<int:pk>/delete/', views.ContactAssignmentDeleteView.as_view(), name='contactassignment_delete'),
path('contact-assignments/<int:pk>/', include(get_model_urls('tenancy', 'contactassignment'))),
]

View File

@ -1,5 +1,4 @@
from django.contrib.contenttypes.models import ContentType
from django.http import QueryDict
from django.shortcuts import get_object_or_404
from circuits.models import Circuit
@ -7,6 +6,7 @@ from dcim.models import Cable, Device, Location, Rack, RackReservation, Site
from ipam.models import Aggregate, IPAddress, IPRange, Prefix, VLAN, VRF, ASN
from netbox.views import generic
from utilities.utils import count_related
from utilities.views import register_model_view
from virtualization.models import VirtualMachine, Cluster
from wireless.models import WirelessLAN, WirelessLink
from . import filtersets, forms, tables
@ -30,6 +30,7 @@ class TenantGroupListView(generic.ObjectListView):
table = tables.TenantGroupTable
@register_model_view(TenantGroup)
class TenantGroupView(generic.ObjectView):
queryset = TenantGroup.objects.all()
@ -45,11 +46,13 @@ class TenantGroupView(generic.ObjectView):
}
@register_model_view(TenantGroup, 'edit')
class TenantGroupEditView(generic.ObjectEditView):
queryset = TenantGroup.objects.all()
form = forms.TenantGroupForm
@register_model_view(TenantGroup, 'delete')
class TenantGroupDeleteView(generic.ObjectDeleteView):
queryset = TenantGroup.objects.all()
@ -95,6 +98,7 @@ class TenantListView(generic.ObjectListView):
table = tables.TenantTable
@register_model_view(Tenant)
class TenantView(generic.ObjectView):
queryset = Tenant.objects.all()
@ -125,11 +129,13 @@ class TenantView(generic.ObjectView):
}
@register_model_view(Tenant, 'edit')
class TenantEditView(generic.ObjectEditView):
queryset = Tenant.objects.all()
form = forms.TenantForm
@register_model_view(Tenant, 'delete')
class TenantDeleteView(generic.ObjectDeleteView):
queryset = Tenant.objects.all()
@ -170,6 +176,7 @@ class ContactGroupListView(generic.ObjectListView):
table = tables.ContactGroupTable
@register_model_view(ContactGroup)
class ContactGroupView(generic.ObjectView):
queryset = ContactGroup.objects.all()
@ -198,11 +205,13 @@ class ContactGroupView(generic.ObjectView):
}
@register_model_view(ContactGroup, 'edit')
class ContactGroupEditView(generic.ObjectEditView):
queryset = ContactGroup.objects.all()
form = forms.ContactGroupForm
@register_model_view(ContactGroup, 'delete')
class ContactGroupDeleteView(generic.ObjectDeleteView):
queryset = ContactGroup.objects.all()
@ -248,6 +257,7 @@ class ContactRoleListView(generic.ObjectListView):
table = tables.ContactRoleTable
@register_model_view(ContactRole)
class ContactRoleView(generic.ObjectView):
queryset = ContactRole.objects.all()
@ -265,11 +275,13 @@ class ContactRoleView(generic.ObjectView):
}
@register_model_view(ContactRole, 'edit')
class ContactRoleEditView(generic.ObjectEditView):
queryset = ContactRole.objects.all()
form = forms.ContactRoleForm
@register_model_view(ContactRole, 'delete')
class ContactRoleDeleteView(generic.ObjectDeleteView):
queryset = ContactRole.objects.all()
@ -305,6 +317,7 @@ class ContactListView(generic.ObjectListView):
table = tables.ContactTable
@register_model_view(Contact)
class ContactView(generic.ObjectView):
queryset = Contact.objects.all()
@ -322,11 +335,13 @@ class ContactView(generic.ObjectView):
}
@register_model_view(Contact, 'edit')
class ContactEditView(generic.ObjectEditView):
queryset = Contact.objects.all()
form = forms.ContactForm
@register_model_view(Contact, 'delete')
class ContactDeleteView(generic.ObjectDeleteView):
queryset = Contact.objects.all()
@ -354,6 +369,7 @@ class ContactBulkDeleteView(generic.BulkDeleteView):
# Contact assignments
#
@register_model_view(ContactAssignment, 'edit')
class ContactAssignmentEditView(generic.ObjectEditView):
queryset = ContactAssignment.objects.all()
form = forms.ContactAssignmentForm
@ -373,5 +389,6 @@ class ContactAssignmentEditView(generic.ObjectEditView):
}
@register_model_view(ContactAssignment, 'delete')
class ContactAssignmentDeleteView(generic.ObjectDeleteView):
queryset = ContactAssignment.objects.all()

View File

@ -32,8 +32,10 @@ def get_model_urls(app_label, model_name):
view_ = view_.as_view()
# Create a path to the view
name = f"{model_name}_{config['name']}" if config['name'] else model_name
url_path = f"{config['path']}/" if config['path'] else ''
paths.append(
path(f"{config['path']}/", view_, name=f"{model_name}_{config['name']}", kwargs=config['kwargs'])
path(url_path, view_, name=name, kwargs=config['kwargs'])
)
return paths

View File

@ -167,7 +167,7 @@ class ViewTab:
return self.badge
def register_model_view(model, name, path=None, kwargs=None):
def register_model_view(model, name='', path=None, kwargs=None):
"""
This decorator can be used to "attach" a view to any model in NetBox. This is typically used to inject
additional tabs within a model's detail view. For example, to add a custom tab to NetBox's dcim.Site model:
@ -182,7 +182,7 @@ def register_model_view(model, name, path=None, kwargs=None):
Args:
model: The Django model class with which this view will be associated.
name: The string used to form the view's name for URL resolution (e.g. via `reverse()`). This will be appended
to the name of the base view for the model using an underscore.
to the name of the base view for the model using an underscore. If blank, the model name will be used.
path: The URL path by which the view can be reached (optional). If not provided, `name` will be used.
kwargs: A dictionary of keyword arguments for the view to include when registering its URL path (optional).
"""

View File

@ -12,9 +12,6 @@ urlpatterns = [
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/<int:pk>/', views.ClusterTypeView.as_view(), name='clustertype'),
path('cluster-types/<int:pk>/edit/', views.ClusterTypeEditView.as_view(), name='clustertype_edit'),
path('cluster-types/<int:pk>/delete/', views.ClusterTypeDeleteView.as_view(), name='clustertype_delete'),
path('cluster-types/<int:pk>/', include(get_model_urls('virtualization', 'clustertype'))),
# Cluster groups
@ -23,9 +20,6 @@ urlpatterns = [
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/<int:pk>/', views.ClusterGroupView.as_view(), name='clustergroup'),
path('cluster-groups/<int:pk>/edit/', views.ClusterGroupEditView.as_view(), name='clustergroup_edit'),
path('cluster-groups/<int:pk>/delete/', views.ClusterGroupDeleteView.as_view(), name='clustergroup_delete'),
path('cluster-groups/<int:pk>/', include(get_model_urls('virtualization', 'clustergroup'))),
# Clusters
@ -34,11 +28,6 @@ urlpatterns = [
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/<int:pk>/', views.ClusterView.as_view(), name='cluster'),
path('clusters/<int:pk>/edit/', views.ClusterEditView.as_view(), name='cluster_edit'),
path('clusters/<int:pk>/delete/', views.ClusterDeleteView.as_view(), name='cluster_delete'),
path('clusters/<int:pk>/devices/add/', views.ClusterAddDevicesView.as_view(), name='cluster_add_devices'),
path('clusters/<int:pk>/devices/remove/', views.ClusterRemoveDevicesView.as_view(), name='cluster_remove_devices'),
path('clusters/<int:pk>/', include(get_model_urls('virtualization', 'cluster'))),
# Virtual machines
@ -47,9 +36,6 @@ urlpatterns = [
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/<int:pk>/', views.VirtualMachineView.as_view(), name='virtualmachine'),
path('virtual-machines/<int:pk>/edit/', views.VirtualMachineEditView.as_view(), name='virtualmachine_edit'),
path('virtual-machines/<int:pk>/delete/', views.VirtualMachineDeleteView.as_view(), name='virtualmachine_delete'),
path('virtual-machines/<int:pk>/', include(get_model_urls('virtualization', 'virtualmachine'))),
# VM interfaces
@ -59,9 +45,6 @@ urlpatterns = [
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/<int:pk>/', views.VMInterfaceView.as_view(), name='vminterface'),
path('interfaces/<int:pk>/edit/', views.VMInterfaceEditView.as_view(), name='vminterface_edit'),
path('interfaces/<int:pk>/delete/', views.VMInterfaceDeleteView.as_view(), name='vminterface_delete'),
path('interfaces/<int:pk>/', include(get_model_urls('virtualization', 'vminterface'))),
path('virtual-machines/interfaces/add/', views.VirtualMachineBulkAddInterfaceView.as_view(), name='virtualmachine_bulk_add_vminterface'),

View File

@ -31,6 +31,7 @@ class ClusterTypeListView(generic.ObjectListView):
table = tables.ClusterTypeTable
@register_model_view(ClusterType)
class ClusterTypeView(generic.ObjectView):
queryset = ClusterType.objects.all()
@ -49,11 +50,13 @@ class ClusterTypeView(generic.ObjectView):
}
@register_model_view(ClusterType, 'edit')
class ClusterTypeEditView(generic.ObjectEditView):
queryset = ClusterType.objects.all()
form = forms.ClusterTypeForm
@register_model_view(ClusterType, 'delete')
class ClusterTypeDeleteView(generic.ObjectDeleteView):
queryset = ClusterType.objects.all()
@ -93,6 +96,7 @@ class ClusterGroupListView(generic.ObjectListView):
table = tables.ClusterGroupTable
@register_model_view(ClusterGroup)
class ClusterGroupView(generic.ObjectView):
queryset = ClusterGroup.objects.all()
@ -111,11 +115,13 @@ class ClusterGroupView(generic.ObjectView):
}
@register_model_view(ClusterGroup, 'edit')
class ClusterGroupEditView(generic.ObjectEditView):
queryset = ClusterGroup.objects.all()
form = forms.ClusterGroupForm
@register_model_view(ClusterGroup, 'delete')
class ClusterGroupDeleteView(generic.ObjectDeleteView):
queryset = ClusterGroup.objects.all()
@ -159,6 +165,7 @@ class ClusterListView(generic.ObjectListView):
filterset_form = forms.ClusterFilterForm
@register_model_view(Cluster)
class ClusterView(generic.ObjectView):
queryset = Cluster.objects.all()
@ -197,11 +204,13 @@ class ClusterDevicesView(generic.ObjectChildrenView):
return Device.objects.restrict(request.user, 'view').filter(cluster=parent)
@register_model_view(Cluster, 'edit')
class ClusterEditView(generic.ObjectEditView):
queryset = Cluster.objects.all()
form = forms.ClusterForm
@register_model_view(Cluster, 'delete')
class ClusterDeleteView(generic.ObjectDeleteView):
queryset = Cluster.objects.all()
@ -225,6 +234,7 @@ class ClusterBulkDeleteView(generic.BulkDeleteView):
table = tables.ClusterTable
@register_model_view(Cluster, 'add_devices', path='devices/add')
class ClusterAddDevicesView(generic.ObjectEditView):
queryset = Cluster.objects.all()
form = forms.ClusterAddDevicesForm
@ -266,6 +276,7 @@ class ClusterAddDevicesView(generic.ObjectEditView):
})
@register_model_view(Cluster, 'remove_devices', path='devices/remove')
class ClusterRemoveDevicesView(generic.ObjectEditView):
queryset = Cluster.objects.all()
form = forms.ClusterRemoveDevicesForm
@ -319,6 +330,7 @@ class VirtualMachineListView(generic.ObjectListView):
template_name = 'virtualization/virtualmachine_list.html'
@register_model_view(VirtualMachine)
class VirtualMachineView(generic.ObjectView):
queryset = VirtualMachine.objects.prefetch_related('tenant__group')
@ -378,11 +390,13 @@ class VirtualMachineConfigContextView(ObjectConfigContextView):
)
@register_model_view(VirtualMachine, 'edit')
class VirtualMachineEditView(generic.ObjectEditView):
queryset = VirtualMachine.objects.all()
form = forms.VirtualMachineForm
@register_model_view(VirtualMachine, 'delete')
class VirtualMachineDeleteView(generic.ObjectDeleteView):
queryset = VirtualMachine.objects.all()
@ -418,6 +432,7 @@ class VMInterfaceListView(generic.ObjectListView):
actions = ('import', 'export', 'bulk_edit', 'bulk_delete')
@register_model_view(VMInterface)
class VMInterfaceView(generic.ObjectView):
queryset = VMInterface.objects.all()
@ -463,11 +478,13 @@ class VMInterfaceCreateView(generic.ComponentCreateView):
model_form = forms.VMInterfaceForm
@register_model_view(VMInterface, 'edit')
class VMInterfaceEditView(generic.ObjectEditView):
queryset = VMInterface.objects.all()
form = forms.VMInterfaceForm
@register_model_view(VMInterface, 'delete')
class VMInterfaceDeleteView(generic.ObjectDeleteView):
queryset = VMInterface.objects.all()

View File

@ -12,9 +12,6 @@ urlpatterns = (
path('wireless-lan-groups/import/', views.WirelessLANGroupBulkImportView.as_view(), name='wirelesslangroup_import'),
path('wireless-lan-groups/edit/', views.WirelessLANGroupBulkEditView.as_view(), name='wirelesslangroup_bulk_edit'),
path('wireless-lan-groups/delete/', views.WirelessLANGroupBulkDeleteView.as_view(), name='wirelesslangroup_bulk_delete'),
path('wireless-lan-groups/<int:pk>/', views.WirelessLANGroupView.as_view(), name='wirelesslangroup'),
path('wireless-lan-groups/<int:pk>/edit/', views.WirelessLANGroupEditView.as_view(), name='wirelesslangroup_edit'),
path('wireless-lan-groups/<int:pk>/delete/', views.WirelessLANGroupDeleteView.as_view(), name='wirelesslangroup_delete'),
path('wireless-lan-groups/<int:pk>/', include(get_model_urls('wireless', 'wirelesslangroup'))),
# Wireless LANs
@ -23,9 +20,6 @@ urlpatterns = (
path('wireless-lans/import/', views.WirelessLANBulkImportView.as_view(), name='wirelesslan_import'),
path('wireless-lans/edit/', views.WirelessLANBulkEditView.as_view(), name='wirelesslan_bulk_edit'),
path('wireless-lans/delete/', views.WirelessLANBulkDeleteView.as_view(), name='wirelesslan_bulk_delete'),
path('wireless-lans/<int:pk>/', views.WirelessLANView.as_view(), name='wirelesslan'),
path('wireless-lans/<int:pk>/edit/', views.WirelessLANEditView.as_view(), name='wirelesslan_edit'),
path('wireless-lans/<int:pk>/delete/', views.WirelessLANDeleteView.as_view(), name='wirelesslan_delete'),
path('wireless-lans/<int:pk>/', include(get_model_urls('wireless', 'wirelesslan'))),
# Wireless links
@ -34,9 +28,6 @@ urlpatterns = (
path('wireless-links/import/', views.WirelessLinkBulkImportView.as_view(), name='wirelesslink_import'),
path('wireless-links/edit/', views.WirelessLinkBulkEditView.as_view(), name='wirelesslink_bulk_edit'),
path('wireless-links/delete/', views.WirelessLinkBulkDeleteView.as_view(), name='wirelesslink_bulk_delete'),
path('wireless-links/<int:pk>/', views.WirelessLinkView.as_view(), name='wirelesslink'),
path('wireless-links/<int:pk>/edit/', views.WirelessLinkEditView.as_view(), name='wirelesslink_edit'),
path('wireless-links/<int:pk>/delete/', views.WirelessLinkDeleteView.as_view(), name='wirelesslink_delete'),
path('wireless-links/<int:pk>/', include(get_model_urls('wireless', 'wirelesslink'))),
)

View File

@ -1,6 +1,7 @@
from dcim.models import Interface
from netbox.views import generic
from utilities.utils import count_related
from utilities.views import register_model_view
from . import filtersets, forms, tables
from .models import *
@ -22,6 +23,7 @@ class WirelessLANGroupListView(generic.ObjectListView):
table = tables.WirelessLANGroupTable
@register_model_view(WirelessLANGroup)
class WirelessLANGroupView(generic.ObjectView):
queryset = WirelessLANGroup.objects.all()
@ -37,11 +39,13 @@ class WirelessLANGroupView(generic.ObjectView):
}
@register_model_view(WirelessLANGroup, 'edit')
class WirelessLANGroupEditView(generic.ObjectEditView):
queryset = WirelessLANGroup.objects.all()
form = forms.WirelessLANGroupForm
@register_model_view(WirelessLANGroup, 'delete')
class WirelessLANGroupDeleteView(generic.ObjectDeleteView):
queryset = WirelessLANGroup.objects.all()
@ -90,6 +94,7 @@ class WirelessLANListView(generic.ObjectListView):
table = tables.WirelessLANTable
@register_model_view(WirelessLAN)
class WirelessLANView(generic.ObjectView):
queryset = WirelessLAN.objects.all()
@ -105,11 +110,13 @@ class WirelessLANView(generic.ObjectView):
}
@register_model_view(WirelessLAN, 'edit')
class WirelessLANEditView(generic.ObjectEditView):
queryset = WirelessLAN.objects.all()
form = forms.WirelessLANForm
@register_model_view(WirelessLAN, 'delete')
class WirelessLANDeleteView(generic.ObjectDeleteView):
queryset = WirelessLAN.objects.all()
@ -144,15 +151,18 @@ class WirelessLinkListView(generic.ObjectListView):
table = tables.WirelessLinkTable
@register_model_view(WirelessLink)
class WirelessLinkView(generic.ObjectView):
queryset = WirelessLink.objects.all()
@register_model_view(WirelessLink, 'edit')
class WirelessLinkEditView(generic.ObjectEditView):
queryset = WirelessLink.objects.all()
form = forms.WirelessLinkForm
@register_model_view(WirelessLink, 'delete')
class WirelessLinkDeleteView(generic.ObjectDeleteView):
queryset = WirelessLink.objects.all()