Coverage for netbox/urls.py: 79%

20 statements  

« 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 

6 

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 

13 

14_patterns = [ 

15 

16 # Base views 

17 path('', HomeView.as_view(), name='home'), 

18 path('search/', SearchView.as_view(), name='search'), 

19 

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')), 

25 

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')), 

37 

38 # Current user views 

39 path('user/', include('account.urls')), 

40 

41 # HTMX views 

42 path('htmx/object-selector/', htmx.ObjectSelectorView.as_view(), name='htmx_object_selector'), 

43 

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'), 

58 

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'), 

69 

70 # GraphQL 

71 path('graphql/', NetBoxGraphQLView.as_view(schema=schema), name='graphql'), 

72 

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'), 

76 

77 # Plugins 

78 path('plugins/', include((plugin_patterns, 'plugins'))), 

79 path('api/plugins/', include((plugin_api_patterns, 'plugins-api'))), 

80] 

81 

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))) 

86 

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'))) 

90 

91# Prepend BASE_PATH 

92urlpatterns = [ 

93 path(settings.BASE_PATH, include(_patterns)) 

94] 

95 

96handler404 = 'netbox.views.errors.handler_404' 

97handler500 = 'netbox.views.errors.handler_500'