1from django.urls import path
2
3from extras.views import ObjectChangeLogView, ObjectJournalView
4from ipam.views import ServiceEditView
5from utilities.views import SlugRedirectView
6from . import views
7from .models import *
8
9app_name = 'dcim'
10urlpatterns = [
11
12    # Regions
13    path('regions/', views.RegionListView.as_view(), name='region_list'),
14    path('regions/add/', views.RegionEditView.as_view(), name='region_add'),
15    path('regions/import/', views.RegionBulkImportView.as_view(), name='region_import'),
16    path('regions/edit/', views.RegionBulkEditView.as_view(), name='region_bulk_edit'),
17    path('regions/delete/', views.RegionBulkDeleteView.as_view(), name='region_bulk_delete'),
18    path('regions/<int:pk>/', views.RegionView.as_view(), name='region'),
19    path('regions/<int:pk>/edit/', views.RegionEditView.as_view(), name='region_edit'),
20    path('regions/<int:pk>/delete/', views.RegionDeleteView.as_view(), name='region_delete'),
21    path('regions/<int:pk>/changelog/', ObjectChangeLogView.as_view(), name='region_changelog', kwargs={'model': Region}),
22
23    # Site groups
24    path('site-groups/', views.SiteGroupListView.as_view(), name='sitegroup_list'),
25    path('site-groups/add/', views.SiteGroupEditView.as_view(), name='sitegroup_add'),
26    path('site-groups/import/', views.SiteGroupBulkImportView.as_view(), name='sitegroup_import'),
27    path('site-groups/edit/', views.SiteGroupBulkEditView.as_view(), name='sitegroup_bulk_edit'),
28    path('site-groups/delete/', views.SiteGroupBulkDeleteView.as_view(), name='sitegroup_bulk_delete'),
29    path('site-groups/<int:pk>/', views.SiteGroupView.as_view(), name='sitegroup'),
30    path('site-groups/<int:pk>/edit/', views.SiteGroupEditView.as_view(), name='sitegroup_edit'),
31    path('site-groups/<int:pk>/delete/', views.SiteGroupDeleteView.as_view(), name='sitegroup_delete'),
32    path('site-groups/<int:pk>/changelog/', ObjectChangeLogView.as_view(), name='sitegroup_changelog', kwargs={'model': SiteGroup}),
33
34    # Sites
35    path('sites/', views.SiteListView.as_view(), name='site_list'),
36    path('sites/add/', views.SiteEditView.as_view(), name='site_add'),
37    path('sites/import/', views.SiteBulkImportView.as_view(), name='site_import'),
38    path('sites/edit/', views.SiteBulkEditView.as_view(), name='site_bulk_edit'),
39    path('sites/delete/', views.SiteBulkDeleteView.as_view(), name='site_bulk_delete'),
40    path('sites/<int:pk>/', views.SiteView.as_view(), name='site'),
41    path('sites/<slug:slug>/', SlugRedirectView.as_view(), kwargs={'model': Site}),
42    path('sites/<int:pk>/edit/', views.SiteEditView.as_view(), name='site_edit'),
43    path('sites/<int:pk>/delete/', views.SiteDeleteView.as_view(), name='site_delete'),
44    path('sites/<int:pk>/changelog/', ObjectChangeLogView.as_view(), name='site_changelog', kwargs={'model': Site}),
45    path('sites/<int:pk>/journal/', ObjectJournalView.as_view(), name='site_journal', kwargs={'model': Site}),
46
47    # Locations
48    path('locations/', views.LocationListView.as_view(), name='location_list'),
49    path('locations/add/', views.LocationEditView.as_view(), name='location_add'),
50    path('locations/import/', views.LocationBulkImportView.as_view(), name='location_import'),
51    path('locations/edit/', views.LocationBulkEditView.as_view(), name='location_bulk_edit'),
52    path('locations/delete/', views.LocationBulkDeleteView.as_view(), name='location_bulk_delete'),
53    path('locations/<int:pk>/', views.LocationView.as_view(), name='location'),
54    path('locations/<int:pk>/edit/', views.LocationEditView.as_view(), name='location_edit'),
55    path('locations/<int:pk>/delete/', views.LocationDeleteView.as_view(), name='location_delete'),
56    path('locations/<int:pk>/changelog/', ObjectChangeLogView.as_view(), name='location_changelog', kwargs={'model': Location}),
57
58    # Rack roles
59    path('rack-roles/', views.RackRoleListView.as_view(), name='rackrole_list'),
60    path('rack-roles/add/', views.RackRoleEditView.as_view(), name='rackrole_add'),
61    path('rack-roles/import/', views.RackRoleBulkImportView.as_view(), name='rackrole_import'),
62    path('rack-roles/edit/', views.RackRoleBulkEditView.as_view(), name='rackrole_bulk_edit'),
63    path('rack-roles/delete/', views.RackRoleBulkDeleteView.as_view(), name='rackrole_bulk_delete'),
64    path('rack-roles/<int:pk>/', views.RackRoleView.as_view(), name='rackrole'),
65    path('rack-roles/<int:pk>/edit/', views.RackRoleEditView.as_view(), name='rackrole_edit'),
66    path('rack-roles/<int:pk>/delete/', views.RackRoleDeleteView.as_view(), name='rackrole_delete'),
67    path('rack-roles/<int:pk>/changelog/', ObjectChangeLogView.as_view(), name='rackrole_changelog', kwargs={'model': RackRole}),
68
69    # Rack reservations
70    path('rack-reservations/', views.RackReservationListView.as_view(), name='rackreservation_list'),
71    path('rack-reservations/add/', views.RackReservationEditView.as_view(), name='rackreservation_add'),
72    path('rack-reservations/import/', views.RackReservationImportView.as_view(), name='rackreservation_import'),
73    path('rack-reservations/edit/', views.RackReservationBulkEditView.as_view(), name='rackreservation_bulk_edit'),
74    path('rack-reservations/delete/', views.RackReservationBulkDeleteView.as_view(), name='rackreservation_bulk_delete'),
75    path('rack-reservations/<int:pk>/', views.RackReservationView.as_view(), name='rackreservation'),
76    path('rack-reservations/<int:pk>/edit/', views.RackReservationEditView.as_view(), name='rackreservation_edit'),
77    path('rack-reservations/<int:pk>/delete/', views.RackReservationDeleteView.as_view(), name='rackreservation_delete'),
78    path('rack-reservations/<int:pk>/changelog/', ObjectChangeLogView.as_view(), name='rackreservation_changelog', kwargs={'model': RackReservation}),
79    path('rack-reservations/<int:pk>/journal/', ObjectJournalView.as_view(), name='rackreservation_journal', kwargs={'model': RackReservation}),
80
81    # Racks
82    path('racks/', views.RackListView.as_view(), name='rack_list'),
83    path('rack-elevations/', views.RackElevationListView.as_view(), name='rack_elevation_list'),
84    path('racks/add/', views.RackEditView.as_view(), name='rack_add'),
85    path('racks/import/', views.RackBulkImportView.as_view(), name='rack_import'),
86    path('racks/edit/', views.RackBulkEditView.as_view(), name='rack_bulk_edit'),
87    path('racks/delete/', views.RackBulkDeleteView.as_view(), name='rack_bulk_delete'),
88    path('racks/<int:pk>/', views.RackView.as_view(), name='rack'),
89    path('racks/<int:pk>/edit/', views.RackEditView.as_view(), name='rack_edit'),
90    path('racks/<int:pk>/delete/', views.RackDeleteView.as_view(), name='rack_delete'),
91    path('racks/<int:pk>/changelog/', ObjectChangeLogView.as_view(), name='rack_changelog', kwargs={'model': Rack}),
92    path('racks/<int:pk>/journal/', ObjectJournalView.as_view(), name='rack_journal', kwargs={'model': Rack}),
93
94    # Manufacturers
95    path('manufacturers/', views.ManufacturerListView.as_view(), name='manufacturer_list'),
96    path('manufacturers/add/', views.ManufacturerEditView.as_view(), name='manufacturer_add'),
97    path('manufacturers/import/', views.ManufacturerBulkImportView.as_view(), name='manufacturer_import'),
98    path('manufacturers/edit/', views.ManufacturerBulkEditView.as_view(), name='manufacturer_bulk_edit'),
99    path('manufacturers/delete/', views.ManufacturerBulkDeleteView.as_view(), name='manufacturer_bulk_delete'),
100    path('manufacturers/<int:pk>/', views.ManufacturerView.as_view(), name='manufacturer'),
101    path('manufacturers/<int:pk>/edit/', views.ManufacturerEditView.as_view(), name='manufacturer_edit'),
102    path('manufacturers/<int:pk>/delete/', views.ManufacturerDeleteView.as_view(), name='manufacturer_delete'),
103    path('manufacturers/<int:pk>/changelog/', ObjectChangeLogView.as_view(), name='manufacturer_changelog', kwargs={'model': Manufacturer}),
104
105    # Device types
106    path('device-types/', views.DeviceTypeListView.as_view(), name='devicetype_list'),
107    path('device-types/add/', views.DeviceTypeEditView.as_view(), name='devicetype_add'),
108    path('device-types/import/', views.DeviceTypeImportView.as_view(), name='devicetype_import'),
109    path('device-types/edit/', views.DeviceTypeBulkEditView.as_view(), name='devicetype_bulk_edit'),
110    path('device-types/delete/', views.DeviceTypeBulkDeleteView.as_view(), name='devicetype_bulk_delete'),
111    path('device-types/<int:pk>/', views.DeviceTypeView.as_view(), name='devicetype'),
112    path('device-types/<int:pk>/edit/', views.DeviceTypeEditView.as_view(), name='devicetype_edit'),
113    path('device-types/<int:pk>/delete/', views.DeviceTypeDeleteView.as_view(), name='devicetype_delete'),
114    path('device-types/<int:pk>/changelog/', ObjectChangeLogView.as_view(), name='devicetype_changelog', kwargs={'model': DeviceType}),
115    path('device-types/<int:pk>/journal/', ObjectJournalView.as_view(), name='devicetype_journal', kwargs={'model': DeviceType}),
116
117    # Console port templates
118    path('console-port-templates/add/', views.ConsolePortTemplateCreateView.as_view(), name='consoleporttemplate_add'),
119    path('console-port-templates/edit/', views.ConsolePortTemplateBulkEditView.as_view(), name='consoleporttemplate_bulk_edit'),
120    path('console-port-templates/rename/', views.ConsolePortTemplateBulkRenameView.as_view(), name='consoleporttemplate_bulk_rename'),
121    path('console-port-templates/delete/', views.ConsolePortTemplateBulkDeleteView.as_view(), name='consoleporttemplate_bulk_delete'),
122    path('console-port-templates/<int:pk>/edit/', views.ConsolePortTemplateEditView.as_view(), name='consoleporttemplate_edit'),
123    path('console-port-templates/<int:pk>/delete/', views.ConsolePortTemplateDeleteView.as_view(), name='consoleporttemplate_delete'),
124
125    # Console server port templates
126    path('console-server-port-templates/add/', views.ConsoleServerPortTemplateCreateView.as_view(), name='consoleserverporttemplate_add'),
127    path('console-server-port-templates/edit/', views.ConsoleServerPortTemplateBulkEditView.as_view(), name='consoleserverporttemplate_bulk_edit'),
128    path('console-server-port-templates/rename/', views.ConsoleServerPortTemplateBulkRenameView.as_view(), name='consoleserverporttemplate_bulk_rename'),
129    path('console-server-port-templates/delete/', views.ConsoleServerPortTemplateBulkDeleteView.as_view(), name='consoleserverporttemplate_bulk_delete'),
130    path('console-server-port-templates/<int:pk>/edit/', views.ConsoleServerPortTemplateEditView.as_view(), name='consoleserverporttemplate_edit'),
131    path('console-server-port-templates/<int:pk>/delete/', views.ConsoleServerPortTemplateDeleteView.as_view(), name='consoleserverporttemplate_delete'),
132
133    # Power port templates
134    path('power-port-templates/add/', views.PowerPortTemplateCreateView.as_view(), name='powerporttemplate_add'),
135    path('power-port-templates/edit/', views.PowerPortTemplateBulkEditView.as_view(), name='powerporttemplate_bulk_edit'),
136    path('power-port-templates/rename/', views.PowerPortTemplateBulkRenameView.as_view(), name='powerporttemplate_bulk_rename'),
137    path('power-port-templates/delete/', views.PowerPortTemplateBulkDeleteView.as_view(), name='powerporttemplate_bulk_delete'),
138    path('power-port-templates/<int:pk>/edit/', views.PowerPortTemplateEditView.as_view(), name='powerporttemplate_edit'),
139    path('power-port-templates/<int:pk>/delete/', views.PowerPortTemplateDeleteView.as_view(), name='powerporttemplate_delete'),
140
141    # Power outlet templates
142    path('power-outlet-templates/add/', views.PowerOutletTemplateCreateView.as_view(), name='poweroutlettemplate_add'),
143    path('power-outlet-templates/edit/', views.PowerOutletTemplateBulkEditView.as_view(), name='poweroutlettemplate_bulk_edit'),
144    path('power-outlet-templates/rename/', views.PowerOutletTemplateBulkRenameView.as_view(), name='poweroutlettemplate_bulk_rename'),
145    path('power-outlet-templates/delete/', views.PowerOutletTemplateBulkDeleteView.as_view(), name='poweroutlettemplate_bulk_delete'),
146    path('power-outlet-templates/<int:pk>/edit/', views.PowerOutletTemplateEditView.as_view(), name='poweroutlettemplate_edit'),
147    path('power-outlet-templates/<int:pk>/delete/', views.PowerOutletTemplateDeleteView.as_view(), name='poweroutlettemplate_delete'),
148
149    # Interface templates
150    path('interface-templates/add/', views.InterfaceTemplateCreateView.as_view(), name='interfacetemplate_add'),
151    path('interface-templates/edit/', views.InterfaceTemplateBulkEditView.as_view(), name='interfacetemplate_bulk_edit'),
152    path('interface-templates/rename/', views.InterfaceTemplateBulkRenameView.as_view(), name='interfacetemplate_bulk_rename'),
153    path('interface-templates/delete/', views.InterfaceTemplateBulkDeleteView.as_view(), name='interfacetemplate_bulk_delete'),
154    path('interface-templates/<int:pk>/edit/', views.InterfaceTemplateEditView.as_view(), name='interfacetemplate_edit'),
155    path('interface-templates/<int:pk>/delete/', views.InterfaceTemplateDeleteView.as_view(), name='interfacetemplate_delete'),
156
157    # Front port templates
158    path('front-port-templates/add/', views.FrontPortTemplateCreateView.as_view(), name='frontporttemplate_add'),
159    path('front-port-templates/edit/', views.FrontPortTemplateBulkEditView.as_view(), name='frontporttemplate_bulk_edit'),
160    path('front-port-templates/rename/', views.FrontPortTemplateBulkRenameView.as_view(), name='frontporttemplate_bulk_rename'),
161    path('front-port-templates/delete/', views.FrontPortTemplateBulkDeleteView.as_view(), name='frontporttemplate_bulk_delete'),
162    path('front-port-templates/<int:pk>/edit/', views.FrontPortTemplateEditView.as_view(), name='frontporttemplate_edit'),
163    path('front-port-templates/<int:pk>/delete/', views.FrontPortTemplateDeleteView.as_view(), name='frontporttemplate_delete'),
164
165    # Rear port templates
166    path('rear-port-templates/add/', views.RearPortTemplateCreateView.as_view(), name='rearporttemplate_add'),
167    path('rear-port-templates/edit/', views.RearPortTemplateBulkEditView.as_view(), name='rearporttemplate_bulk_edit'),
168    path('rear-port-templates/rename/', views.RearPortTemplateBulkRenameView.as_view(), name='rearporttemplate_bulk_rename'),
169    path('rear-port-templates/delete/', views.RearPortTemplateBulkDeleteView.as_view(), name='rearporttemplate_bulk_delete'),
170    path('rear-port-templates/<int:pk>/edit/', views.RearPortTemplateEditView.as_view(), name='rearporttemplate_edit'),
171    path('rear-port-templates/<int:pk>/delete/', views.RearPortTemplateDeleteView.as_view(), name='rearporttemplate_delete'),
172
173    # Device bay templates
174    path('device-bay-templates/add/', views.DeviceBayTemplateCreateView.as_view(), name='devicebaytemplate_add'),
175    path('device-bay-templates/edit/', views.DeviceBayTemplateBulkEditView.as_view(), name='devicebaytemplate_bulk_edit'),
176    path('device-bay-templates/rename/', views.DeviceBayTemplateBulkRenameView.as_view(), name='devicebaytemplate_bulk_rename'),
177    path('device-bay-templates/delete/', views.DeviceBayTemplateBulkDeleteView.as_view(), name='devicebaytemplate_bulk_delete'),
178    path('device-bay-templates/<int:pk>/edit/', views.DeviceBayTemplateEditView.as_view(), name='devicebaytemplate_edit'),
179    path('device-bay-templates/<int:pk>/delete/', views.DeviceBayTemplateDeleteView.as_view(), name='devicebaytemplate_delete'),
180
181    # Device roles
182    path('device-roles/', views.DeviceRoleListView.as_view(), name='devicerole_list'),
183    path('device-roles/add/', views.DeviceRoleEditView.as_view(), name='devicerole_add'),
184    path('device-roles/import/', views.DeviceRoleBulkImportView.as_view(), name='devicerole_import'),
185    path('device-roles/edit/', views.DeviceRoleBulkEditView.as_view(), name='devicerole_bulk_edit'),
186    path('device-roles/delete/', views.DeviceRoleBulkDeleteView.as_view(), name='devicerole_bulk_delete'),
187    path('device-roles/<int:pk>/', views.DeviceRoleView.as_view(), name='devicerole'),
188    path('device-roles/<int:pk>/edit/', views.DeviceRoleEditView.as_view(), name='devicerole_edit'),
189    path('device-roles/<int:pk>/delete/', views.DeviceRoleDeleteView.as_view(), name='devicerole_delete'),
190    path('device-roles/<int:pk>/changelog/', ObjectChangeLogView.as_view(), name='devicerole_changelog', kwargs={'model': DeviceRole}),
191
192    # Platforms
193    path('platforms/', views.PlatformListView.as_view(), name='platform_list'),
194    path('platforms/add/', views.PlatformEditView.as_view(), name='platform_add'),
195    path('platforms/import/', views.PlatformBulkImportView.as_view(), name='platform_import'),
196    path('platforms/edit/', views.PlatformBulkEditView.as_view(), name='platform_bulk_edit'),
197    path('platforms/delete/', views.PlatformBulkDeleteView.as_view(), name='platform_bulk_delete'),
198    path('platforms/<int:pk>/', views.PlatformView.as_view(), name='platform'),
199    path('platforms/<int:pk>/edit/', views.PlatformEditView.as_view(), name='platform_edit'),
200    path('platforms/<int:pk>/delete/', views.PlatformDeleteView.as_view(), name='platform_delete'),
201    path('platforms/<int:pk>/changelog/', ObjectChangeLogView.as_view(), name='platform_changelog', kwargs={'model': Platform}),
202
203    # Devices
204    path('devices/', views.DeviceListView.as_view(), name='device_list'),
205    path('devices/add/', views.DeviceEditView.as_view(), name='device_add'),
206    path('devices/import/', views.DeviceBulkImportView.as_view(), name='device_import'),
207    path('devices/import/child-devices/', views.ChildDeviceBulkImportView.as_view(), name='device_import_child'),
208    path('devices/edit/', views.DeviceBulkEditView.as_view(), name='device_bulk_edit'),
209    path('devices/delete/', views.DeviceBulkDeleteView.as_view(), name='device_bulk_delete'),
210    path('devices/<int:pk>/', views.DeviceView.as_view(), name='device'),
211    path('devices/<int:pk>/edit/', views.DeviceEditView.as_view(), name='device_edit'),
212    path('devices/<int:pk>/delete/', views.DeviceDeleteView.as_view(), name='device_delete'),
213    path('devices/<int:pk>/console-ports/', views.DeviceConsolePortsView.as_view(), name='device_consoleports'),
214    path('devices/<int:pk>/console-server-ports/', views.DeviceConsoleServerPortsView.as_view(), name='device_consoleserverports'),
215    path('devices/<int:pk>/power-ports/', views.DevicePowerPortsView.as_view(), name='device_powerports'),
216    path('devices/<int:pk>/power-outlets/', views.DevicePowerOutletsView.as_view(), name='device_poweroutlets'),
217    path('devices/<int:pk>/interfaces/', views.DeviceInterfacesView.as_view(), name='device_interfaces'),
218    path('devices/<int:pk>/front-ports/', views.DeviceFrontPortsView.as_view(), name='device_frontports'),
219    path('devices/<int:pk>/rear-ports/', views.DeviceRearPortsView.as_view(), name='device_rearports'),
220    path('devices/<int:pk>/device-bays/', views.DeviceDeviceBaysView.as_view(), name='device_devicebays'),
221    path('devices/<int:pk>/inventory/', views.DeviceInventoryView.as_view(), name='device_inventory'),
222    path('devices/<int:pk>/config-context/', views.DeviceConfigContextView.as_view(), name='device_configcontext'),
223    path('devices/<int:pk>/changelog/', views.DeviceChangeLogView.as_view(), name='device_changelog', kwargs={'model': Device}),
224    path('devices/<int:pk>/journal/', views.DeviceJournalView.as_view(), name='device_journal', kwargs={'model': Device}),
225    path('devices/<int:pk>/status/', views.DeviceStatusView.as_view(), name='device_status'),
226    path('devices/<int:pk>/lldp-neighbors/', views.DeviceLLDPNeighborsView.as_view(), name='device_lldp_neighbors'),
227    path('devices/<int:pk>/config/', views.DeviceConfigView.as_view(), name='device_config'),
228    path('devices/<int:device>/services/assign/', ServiceEditView.as_view(), name='device_service_assign'),
229
230    # Console ports
231    path('console-ports/', views.ConsolePortListView.as_view(), name='consoleport_list'),
232    path('console-ports/add/', views.ConsolePortCreateView.as_view(), name='consoleport_add'),
233    path('console-ports/import/', views.ConsolePortBulkImportView.as_view(), name='consoleport_import'),
234    path('console-ports/edit/', views.ConsolePortBulkEditView.as_view(), name='consoleport_bulk_edit'),
235    path('console-ports/rename/', views.ConsolePortBulkRenameView.as_view(), name='consoleport_bulk_rename'),
236    path('console-ports/disconnect/', views.ConsolePortBulkDisconnectView.as_view(), name='consoleport_bulk_disconnect'),
237    path('console-ports/delete/', views.ConsolePortBulkDeleteView.as_view(), name='consoleport_bulk_delete'),
238    path('console-ports/<int:pk>/', views.ConsolePortView.as_view(), name='consoleport'),
239    path('console-ports/<int:pk>/edit/', views.ConsolePortEditView.as_view(), name='consoleport_edit'),
240    path('console-ports/<int:pk>/delete/', views.ConsolePortDeleteView.as_view(), name='consoleport_delete'),
241    path('console-ports/<int:pk>/changelog/', ObjectChangeLogView.as_view(), name='consoleport_changelog', kwargs={'model': ConsolePort}),
242    path('console-ports/<int:pk>/trace/', views.PathTraceView.as_view(), name='consoleport_trace', kwargs={'model': ConsolePort}),
243    path('console-ports/<int:termination_a_id>/connect/<str:termination_b_type>/', views.CableCreateView.as_view(), name='consoleport_connect', kwargs={'termination_a_type': ConsolePort}),
244    path('devices/console-ports/add/', views.DeviceBulkAddConsolePortView.as_view(), name='device_bulk_add_consoleport'),
245
246    # Console server ports
247    path('console-server-ports/', views.ConsoleServerPortListView.as_view(), name='consoleserverport_list'),
248    path('console-server-ports/add/', views.ConsoleServerPortCreateView.as_view(), name='consoleserverport_add'),
249    path('console-server-ports/import/', views.ConsoleServerPortBulkImportView.as_view(), name='consoleserverport_import'),
250    path('console-server-ports/edit/', views.ConsoleServerPortBulkEditView.as_view(), name='consoleserverport_bulk_edit'),
251    path('console-server-ports/rename/', views.ConsoleServerPortBulkRenameView.as_view(), name='consoleserverport_bulk_rename'),
252    path('console-server-ports/disconnect/', views.ConsoleServerPortBulkDisconnectView.as_view(), name='consoleserverport_bulk_disconnect'),
253    path('console-server-ports/delete/', views.ConsoleServerPortBulkDeleteView.as_view(), name='consoleserverport_bulk_delete'),
254    path('console-server-ports/<int:pk>/', views.ConsoleServerPortView.as_view(), name='consoleserverport'),
255    path('console-server-ports/<int:pk>/edit/', views.ConsoleServerPortEditView.as_view(), name='consoleserverport_edit'),
256    path('console-server-ports/<int:pk>/delete/', views.ConsoleServerPortDeleteView.as_view(), name='consoleserverport_delete'),
257    path('console-server-ports/<int:pk>/changelog/', ObjectChangeLogView.as_view(), name='consoleserverport_changelog', kwargs={'model': ConsoleServerPort}),
258    path('console-server-ports/<int:pk>/trace/', views.PathTraceView.as_view(), name='consoleserverport_trace', kwargs={'model': ConsoleServerPort}),
259    path('console-server-ports/<int:termination_a_id>/connect/<str:termination_b_type>/', views.CableCreateView.as_view(), name='consoleserverport_connect', kwargs={'termination_a_type': ConsoleServerPort}),
260    path('devices/console-server-ports/add/', views.DeviceBulkAddConsoleServerPortView.as_view(), name='device_bulk_add_consoleserverport'),
261
262    # Power ports
263    path('power-ports/', views.PowerPortListView.as_view(), name='powerport_list'),
264    path('power-ports/add/', views.PowerPortCreateView.as_view(), name='powerport_add'),
265    path('power-ports/import/', views.PowerPortBulkImportView.as_view(), name='powerport_import'),
266    path('power-ports/edit/', views.PowerPortBulkEditView.as_view(), name='powerport_bulk_edit'),
267    path('power-ports/rename/', views.PowerPortBulkRenameView.as_view(), name='powerport_bulk_rename'),
268    path('power-ports/disconnect/', views.PowerPortBulkDisconnectView.as_view(), name='powerport_bulk_disconnect'),
269    path('power-ports/delete/', views.PowerPortBulkDeleteView.as_view(), name='powerport_bulk_delete'),
270    path('power-ports/<int:pk>/', views.PowerPortView.as_view(), name='powerport'),
271    path('power-ports/<int:pk>/edit/', views.PowerPortEditView.as_view(), name='powerport_edit'),
272    path('power-ports/<int:pk>/delete/', views.PowerPortDeleteView.as_view(), name='powerport_delete'),
273    path('power-ports/<int:pk>/changelog/', ObjectChangeLogView.as_view(), name='powerport_changelog', kwargs={'model': PowerPort}),
274    path('power-ports/<int:pk>/trace/', views.PathTraceView.as_view(), name='powerport_trace', kwargs={'model': PowerPort}),
275    path('power-ports/<int:termination_a_id>/connect/<str:termination_b_type>/', views.CableCreateView.as_view(), name='powerport_connect', kwargs={'termination_a_type': PowerPort}),
276    path('devices/power-ports/add/', views.DeviceBulkAddPowerPortView.as_view(), name='device_bulk_add_powerport'),
277
278    # Power outlets
279    path('power-outlets/', views.PowerOutletListView.as_view(), name='poweroutlet_list'),
280    path('power-outlets/add/', views.PowerOutletCreateView.as_view(), name='poweroutlet_add'),
281    path('power-outlets/import/', views.PowerOutletBulkImportView.as_view(), name='poweroutlet_import'),
282    path('power-outlets/edit/', views.PowerOutletBulkEditView.as_view(), name='poweroutlet_bulk_edit'),
283    path('power-outlets/rename/', views.PowerOutletBulkRenameView.as_view(), name='poweroutlet_bulk_rename'),
284    path('power-outlets/disconnect/', views.PowerOutletBulkDisconnectView.as_view(), name='poweroutlet_bulk_disconnect'),
285    path('power-outlets/delete/', views.PowerOutletBulkDeleteView.as_view(), name='poweroutlet_bulk_delete'),
286    path('power-outlets/<int:pk>/', views.PowerOutletView.as_view(), name='poweroutlet'),
287    path('power-outlets/<int:pk>/edit/', views.PowerOutletEditView.as_view(), name='poweroutlet_edit'),
288    path('power-outlets/<int:pk>/delete/', views.PowerOutletDeleteView.as_view(), name='poweroutlet_delete'),
289    path('power-outlets/<int:pk>/changelog/', ObjectChangeLogView.as_view(), name='poweroutlet_changelog', kwargs={'model': PowerOutlet}),
290    path('power-outlets/<int:pk>/trace/', views.PathTraceView.as_view(), name='poweroutlet_trace', kwargs={'model': PowerOutlet}),
291    path('power-outlets/<int:termination_a_id>/connect/<str:termination_b_type>/', views.CableCreateView.as_view(), name='poweroutlet_connect', kwargs={'termination_a_type': PowerOutlet}),
292    path('devices/power-outlets/add/', views.DeviceBulkAddPowerOutletView.as_view(), name='device_bulk_add_poweroutlet'),
293
294    # Interfaces
295    path('interfaces/', views.InterfaceListView.as_view(), name='interface_list'),
296    path('interfaces/add/', views.InterfaceCreateView.as_view(), name='interface_add'),
297    path('interfaces/import/', views.InterfaceBulkImportView.as_view(), name='interface_import'),
298    path('interfaces/edit/', views.InterfaceBulkEditView.as_view(), name='interface_bulk_edit'),
299    path('interfaces/rename/', views.InterfaceBulkRenameView.as_view(), name='interface_bulk_rename'),
300    path('interfaces/disconnect/', views.InterfaceBulkDisconnectView.as_view(), name='interface_bulk_disconnect'),
301    path('interfaces/delete/', views.InterfaceBulkDeleteView.as_view(), name='interface_bulk_delete'),
302    path('interfaces/<int:pk>/', views.InterfaceView.as_view(), name='interface'),
303    path('interfaces/<int:pk>/edit/', views.InterfaceEditView.as_view(), name='interface_edit'),
304    path('interfaces/<int:pk>/delete/', views.InterfaceDeleteView.as_view(), name='interface_delete'),
305    path('interfaces/<int:pk>/changelog/', ObjectChangeLogView.as_view(), name='interface_changelog', kwargs={'model': Interface}),
306    path('interfaces/<int:pk>/trace/', views.PathTraceView.as_view(), name='interface_trace', kwargs={'model': Interface}),
307    path('interfaces/<int:termination_a_id>/connect/<str:termination_b_type>/', views.CableCreateView.as_view(), name='interface_connect', kwargs={'termination_a_type': Interface}),
308    path('devices/interfaces/add/', views.DeviceBulkAddInterfaceView.as_view(), name='device_bulk_add_interface'),
309
310    # Front ports
311    path('front-ports/', views.FrontPortListView.as_view(), name='frontport_list'),
312    path('front-ports/add/', views.FrontPortCreateView.as_view(), name='frontport_add'),
313    path('front-ports/import/', views.FrontPortBulkImportView.as_view(), name='frontport_import'),
314    path('front-ports/edit/', views.FrontPortBulkEditView.as_view(), name='frontport_bulk_edit'),
315    path('front-ports/rename/', views.FrontPortBulkRenameView.as_view(), name='frontport_bulk_rename'),
316    path('front-ports/disconnect/', views.FrontPortBulkDisconnectView.as_view(), name='frontport_bulk_disconnect'),
317    path('front-ports/delete/', views.FrontPortBulkDeleteView.as_view(), name='frontport_bulk_delete'),
318    path('front-ports/<int:pk>/', views.FrontPortView.as_view(), name='frontport'),
319    path('front-ports/<int:pk>/edit/', views.FrontPortEditView.as_view(), name='frontport_edit'),
320    path('front-ports/<int:pk>/delete/', views.FrontPortDeleteView.as_view(), name='frontport_delete'),
321    path('front-ports/<int:pk>/changelog/', ObjectChangeLogView.as_view(), name='frontport_changelog', kwargs={'model': FrontPort}),
322    path('front-ports/<int:pk>/trace/', views.PathTraceView.as_view(), name='frontport_trace', kwargs={'model': FrontPort}),
323    path('front-ports/<int:termination_a_id>/connect/<str:termination_b_type>/', views.CableCreateView.as_view(), name='frontport_connect', kwargs={'termination_a_type': FrontPort}),
324    # path('devices/front-ports/add/', views.DeviceBulkAddFrontPortView.as_view(), name='device_bulk_add_frontport'),
325
326    # Rear ports
327    path('rear-ports/', views.RearPortListView.as_view(), name='rearport_list'),
328    path('rear-ports/add/', views.RearPortCreateView.as_view(), name='rearport_add'),
329    path('rear-ports/import/', views.RearPortBulkImportView.as_view(), name='rearport_import'),
330    path('rear-ports/edit/', views.RearPortBulkEditView.as_view(), name='rearport_bulk_edit'),
331    path('rear-ports/rename/', views.RearPortBulkRenameView.as_view(), name='rearport_bulk_rename'),
332    path('rear-ports/disconnect/', views.RearPortBulkDisconnectView.as_view(), name='rearport_bulk_disconnect'),
333    path('rear-ports/delete/', views.RearPortBulkDeleteView.as_view(), name='rearport_bulk_delete'),
334    path('rear-ports/<int:pk>/', views.RearPortView.as_view(), name='rearport'),
335    path('rear-ports/<int:pk>/edit/', views.RearPortEditView.as_view(), name='rearport_edit'),
336    path('rear-ports/<int:pk>/delete/', views.RearPortDeleteView.as_view(), name='rearport_delete'),
337    path('rear-ports/<int:pk>/changelog/', ObjectChangeLogView.as_view(), name='rearport_changelog', kwargs={'model': RearPort}),
338    path('rear-ports/<int:pk>/trace/', views.PathTraceView.as_view(), name='rearport_trace', kwargs={'model': RearPort}),
339    path('rear-ports/<int:termination_a_id>/connect/<str:termination_b_type>/', views.CableCreateView.as_view(), name='rearport_connect', kwargs={'termination_a_type': RearPort}),
340    path('devices/rear-ports/add/', views.DeviceBulkAddRearPortView.as_view(), name='device_bulk_add_rearport'),
341
342    # Device bays
343    path('device-bays/', views.DeviceBayListView.as_view(), name='devicebay_list'),
344    path('device-bays/add/', views.DeviceBayCreateView.as_view(), name='devicebay_add'),
345    path('device-bays/import/', views.DeviceBayBulkImportView.as_view(), name='devicebay_import'),
346    path('device-bays/edit/', views.DeviceBayBulkEditView.as_view(), name='devicebay_bulk_edit'),
347    path('device-bays/rename/', views.DeviceBayBulkRenameView.as_view(), name='devicebay_bulk_rename'),
348    path('device-bays/delete/', views.DeviceBayBulkDeleteView.as_view(), name='devicebay_bulk_delete'),
349    path('device-bays/<int:pk>/', views.DeviceBayView.as_view(), name='devicebay'),
350    path('device-bays/<int:pk>/edit/', views.DeviceBayEditView.as_view(), name='devicebay_edit'),
351    path('device-bays/<int:pk>/delete/', views.DeviceBayDeleteView.as_view(), name='devicebay_delete'),
352    path('device-bays/<int:pk>/changelog/', ObjectChangeLogView.as_view(), name='devicebay_changelog', kwargs={'model': DeviceBay}),
353    path('device-bays/<int:pk>/populate/', views.DeviceBayPopulateView.as_view(), name='devicebay_populate'),
354    path('device-bays/<int:pk>/depopulate/', views.DeviceBayDepopulateView.as_view(), name='devicebay_depopulate'),
355    path('devices/device-bays/add/', views.DeviceBulkAddDeviceBayView.as_view(), name='device_bulk_add_devicebay'),
356
357    # Inventory items
358    path('inventory-items/', views.InventoryItemListView.as_view(), name='inventoryitem_list'),
359    path('inventory-items/add/', views.InventoryItemCreateView.as_view(), name='inventoryitem_add'),
360    path('inventory-items/import/', views.InventoryItemBulkImportView.as_view(), name='inventoryitem_import'),
361    path('inventory-items/edit/', views.InventoryItemBulkEditView.as_view(), name='inventoryitem_bulk_edit'),
362    path('inventory-items/rename/', views.InventoryItemBulkRenameView.as_view(), name='inventoryitem_bulk_rename'),
363    path('inventory-items/delete/', views.InventoryItemBulkDeleteView.as_view(), name='inventoryitem_bulk_delete'),
364    path('inventory-items/<int:pk>/', views.InventoryItemView.as_view(), name='inventoryitem'),
365    path('inventory-items/<int:pk>/edit/', views.InventoryItemEditView.as_view(), name='inventoryitem_edit'),
366    path('inventory-items/<int:pk>/delete/', views.InventoryItemDeleteView.as_view(), name='inventoryitem_delete'),
367    path('inventory-items/<int:pk>/changelog/', ObjectChangeLogView.as_view(), name='inventoryitem_changelog', kwargs={'model': InventoryItem}),
368    path('devices/inventory-items/add/', views.DeviceBulkAddInventoryItemView.as_view(), name='device_bulk_add_inventoryitem'),
369
370    # Cables
371    path('cables/', views.CableListView.as_view(), name='cable_list'),
372    path('cables/import/', views.CableBulkImportView.as_view(), name='cable_import'),
373    path('cables/edit/', views.CableBulkEditView.as_view(), name='cable_bulk_edit'),
374    path('cables/delete/', views.CableBulkDeleteView.as_view(), name='cable_bulk_delete'),
375    path('cables/<int:pk>/', views.CableView.as_view(), name='cable'),
376    path('cables/<int:pk>/edit/', views.CableEditView.as_view(), name='cable_edit'),
377    path('cables/<int:pk>/delete/', views.CableDeleteView.as_view(), name='cable_delete'),
378    path('cables/<int:pk>/changelog/', ObjectChangeLogView.as_view(), name='cable_changelog', kwargs={'model': Cable}),
379    path('cables/<int:pk>/journal/', ObjectJournalView.as_view(), name='cable_journal', kwargs={'model': Cable}),
380
381    # Console/power/interface connections (read-only)
382    path('console-connections/', views.ConsoleConnectionsListView.as_view(), name='console_connections_list'),
383    path('power-connections/', views.PowerConnectionsListView.as_view(), name='power_connections_list'),
384    path('interface-connections/', views.InterfaceConnectionsListView.as_view(), name='interface_connections_list'),
385
386    # Virtual chassis
387    path('virtual-chassis/', views.VirtualChassisListView.as_view(), name='virtualchassis_list'),
388    path('virtual-chassis/add/', views.VirtualChassisCreateView.as_view(), name='virtualchassis_add'),
389    path('virtual-chassis/import/', views.VirtualChassisBulkImportView.as_view(), name='virtualchassis_import'),
390    path('virtual-chassis/edit/', views.VirtualChassisBulkEditView.as_view(), name='virtualchassis_bulk_edit'),
391    path('virtual-chassis/delete/', views.VirtualChassisBulkDeleteView.as_view(), name='virtualchassis_bulk_delete'),
392    path('virtual-chassis/<int:pk>/', views.VirtualChassisView.as_view(), name='virtualchassis'),
393    path('virtual-chassis/<int:pk>/edit/', views.VirtualChassisEditView.as_view(), name='virtualchassis_edit'),
394    path('virtual-chassis/<int:pk>/delete/', views.VirtualChassisDeleteView.as_view(), name='virtualchassis_delete'),
395    path('virtual-chassis/<int:pk>/changelog/', ObjectChangeLogView.as_view(), name='virtualchassis_changelog', kwargs={'model': VirtualChassis}),
396    path('virtual-chassis/<int:pk>/journal/', ObjectJournalView.as_view(), name='virtualchassis_journal', kwargs={'model': VirtualChassis}),
397    path('virtual-chassis/<int:pk>/add-member/', views.VirtualChassisAddMemberView.as_view(), name='virtualchassis_add_member'),
398    path('virtual-chassis-members/<int:pk>/delete/', views.VirtualChassisRemoveMemberView.as_view(), name='virtualchassis_remove_member'),
399
400    # Power panels
401    path('power-panels/', views.PowerPanelListView.as_view(), name='powerpanel_list'),
402    path('power-panels/add/', views.PowerPanelEditView.as_view(), name='powerpanel_add'),
403    path('power-panels/import/', views.PowerPanelBulkImportView.as_view(), name='powerpanel_import'),
404    path('power-panels/edit/', views.PowerPanelBulkEditView.as_view(), name='powerpanel_bulk_edit'),
405    path('power-panels/delete/', views.PowerPanelBulkDeleteView.as_view(), name='powerpanel_bulk_delete'),
406    path('power-panels/<int:pk>/', views.PowerPanelView.as_view(), name='powerpanel'),
407    path('power-panels/<int:pk>/edit/', views.PowerPanelEditView.as_view(), name='powerpanel_edit'),
408    path('power-panels/<int:pk>/delete/', views.PowerPanelDeleteView.as_view(), name='powerpanel_delete'),
409    path('power-panels/<int:pk>/changelog/', ObjectChangeLogView.as_view(), name='powerpanel_changelog', kwargs={'model': PowerPanel}),
410    path('power-panels/<int:pk>/journal/', ObjectJournalView.as_view(), name='powerpanel_journal', kwargs={'model': PowerPanel}),
411
412    # Power feeds
413    path('power-feeds/', views.PowerFeedListView.as_view(), name='powerfeed_list'),
414    path('power-feeds/add/', views.PowerFeedEditView.as_view(), name='powerfeed_add'),
415    path('power-feeds/import/', views.PowerFeedBulkImportView.as_view(), name='powerfeed_import'),
416    path('power-feeds/edit/', views.PowerFeedBulkEditView.as_view(), name='powerfeed_bulk_edit'),
417    path('power-feeds/disconnect/', views.PowerFeedBulkDisconnectView.as_view(), name='powerfeed_bulk_disconnect'),
418    path('power-feeds/delete/', views.PowerFeedBulkDeleteView.as_view(), name='powerfeed_bulk_delete'),
419    path('power-feeds/<int:pk>/', views.PowerFeedView.as_view(), name='powerfeed'),
420    path('power-feeds/<int:pk>/edit/', views.PowerFeedEditView.as_view(), name='powerfeed_edit'),
421    path('power-feeds/<int:pk>/delete/', views.PowerFeedDeleteView.as_view(), name='powerfeed_delete'),
422    path('power-feeds/<int:pk>/trace/', views.PathTraceView.as_view(), name='powerfeed_trace', kwargs={'model': PowerFeed}),
423    path('power-feeds/<int:pk>/changelog/', ObjectChangeLogView.as_view(), name='powerfeed_changelog', kwargs={'model': PowerFeed}),
424    path('power-feeds/<int:pk>/journal/', ObjectJournalView.as_view(), name='powerfeed_journal', kwargs={'model': PowerFeed}),
425    path('power-feeds/<int:termination_a_id>/connect/<str:termination_b_type>/', views.CableCreateView.as_view(), name='powerfeed_connect', kwargs={'termination_a_type': PowerFeed}),
426
427]
428