Coverage for netbox/urls.py: 79%
20 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 18:35 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 18:35 +0000
1from django.conf import settings
2from django.conf.urls import include
3from django.urls import path
4from django.views.decorators.cache import cache_page
5from drf_spectacular.views import SpectacularAPIView, SpectacularRedocView, SpectacularSwaggerView
7from account.views import LoginView, LogoutView, SocialAuthBeginView
8from netbox.api.views import APIRootView, AuthenticationCheckView, StatusView
9from netbox.graphql.schema import schema
10from netbox.graphql.views import NetBoxGraphQLView
11from netbox.plugins.urls import plugin_api_patterns, plugin_patterns
12from netbox.views import HomeView, MediaView, SearchView, StaticMediaFailureView, htmx
14_patterns = [
16 # Base views
17 path('', HomeView.as_view(), name='home'),
18 path('search/', SearchView.as_view(), name='search'),
20 # Login/logout
21 path('login/', LoginView.as_view(), name='login'),
22 path('logout/', LogoutView.as_view(), name='logout'),
23 path('oauth/begin/<str:backend>/', SocialAuthBeginView.as_view(), name='social_auth_begin'),
24 path('oauth/', include('social_django.urls', namespace='social')),
26 # Apps
27 path('circuits/', include('circuits.urls')),
28 path('core/', include('core.urls')),
29 path('dcim/', include('dcim.urls')),
30 path('extras/', include('extras.urls')),
31 path('ipam/', include('ipam.urls')),
32 path('tenancy/', include('tenancy.urls')),
33 path('users/', include('users.urls')),
34 path('virtualization/', include('virtualization.urls')),
35 path('vpn/', include('vpn.urls')),
36 path('wireless/', include('wireless.urls')),
38 # Current user views
39 path('user/', include('account.urls')),
41 # HTMX views
42 path('htmx/object-selector/', htmx.ObjectSelectorView.as_view(), name='htmx_object_selector'),
44 # REST API
45 path('api/', APIRootView.as_view(), name='api-root'),
46 path('api/circuits/', include('circuits.api.urls')),
47 path('api/core/', include('core.api.urls')),
48 path('api/dcim/', include('dcim.api.urls')),
49 path('api/extras/', include('extras.api.urls')),
50 path('api/ipam/', include('ipam.api.urls')),
51 path('api/tenancy/', include('tenancy.api.urls')),
52 path('api/users/', include('users.api.urls')),
53 path('api/virtualization/', include('virtualization.api.urls')),
54 path('api/vpn/', include('vpn.api.urls')),
55 path('api/wireless/', include('wireless.api.urls')),
56 path('api/status/', StatusView.as_view(), name='api-status'),
57 path('api/authentication-check/', AuthenticationCheckView.as_view(), name='api-authentication-check'),
59 # REST API schema
60 path(
61 "api/schema/",
62 cache_page(timeout=86400, key_prefix=f"api_schema_{settings.RELEASE.version}")(
63 SpectacularAPIView.as_view()
64 ),
65 name="schema",
66 ),
67 path('api/schema/swagger-ui/', SpectacularSwaggerView.as_view(url_name='schema'), name='api_docs'),
68 path('api/schema/redoc/', SpectacularRedocView.as_view(url_name='schema'), name='api_redocs'),
70 # GraphQL
71 path('graphql/', NetBoxGraphQLView.as_view(schema=schema), name='graphql'),
73 # Serving static media in Django to pipe it through LoginRequiredMiddleware
74 path('media/<path:path>', MediaView.as_view(), name='media'),
75 path('media-failure/', StaticMediaFailureView.as_view(), name='media_failure'),
77 # Plugins
78 path('plugins/', include((plugin_patterns, 'plugins'))),
79 path('api/plugins/', include((plugin_api_patterns, 'plugins-api'))),
80]
82# django-debug-toolbar
83if settings.DEBUG: 83 ↛ 84line 83 didn't jump to line 84 because the condition on line 83 was never true
84 import debug_toolbar
85 _patterns.append(path('__debug__/', include(debug_toolbar.urls)))
87# Prometheus metrics
88if settings.METRICS_ENABLED: 88 ↛ 89line 88 didn't jump to line 89 because the condition on line 88 was never true
89 _patterns.append(path('', include('django_prometheus.urls')))
91# Prepend BASE_PATH
92urlpatterns = [
93 path(settings.BASE_PATH, include(_patterns))
94]
96handler404 = 'netbox.views.errors.handler_404'
97handler500 = 'netbox.views.errors.handler_500'