Coverage for sm/urls.py: 94%
33 statements
« prev ^ index » next coverage.py v7.17.0, created at 2026-10-24 19:06 +0000
« prev ^ index » next coverage.py v7.17.0, created at 2026-10-24 19:06 +0000
1from django.urls import path, include
2from django.conf import settings
3from django.conf.urls.static import static
4from django.contrib import admin
6from drf_spectacular.views import (
7 SpectacularAPIView,
8 SpectacularRedocView,
9 SpectacularSwaggerView,
10)
12from .views import (
13 DashboardView,
14 SearchView,
15 ImportStarterPackView,
16 HistoryDiffView,
17 PatchScheduleView,
18 TermsView,
19 PrivacyView,
20 ImpressumView,
21 HealthView,
22)
23from .views_admin import UserListView, GroupProfileUpdateView
24from .views_group import (
25 GroupMemberListView,
26 AddGroupMemberView,
27 RemoveGroupMemberView,
28 GroupPermissionUpdateView,
29 UserPermissionUpdateView,
30 InviteGroupMemberView,
31 AcceptInvitationView,
32 GroupFilterView,
33 GroupCreateView,
34)
35from .views_onboarding import GroupOnboardingView
36from .views_avatars import avatar_proxy
37from .views_audit import AuditLogView
38from .views_api_keys import (
39 ApiKeyListView,
40 RevokeApiKeyView,
41 RotateApiKeyView,
42)
43from .views_profile import ProfileView
44from .api.views import (
45 ServerViewSet,
46 VendorViewSet,
47 StatusViewSet,
48 LocationViewSet,
49 DomainViewSet,
50 PatchtimeViewSet,
51 OSViewSet,
52 ServerModelViewSet,
53 ClusterViewSet,
54 ClusterPackageViewSet,
55 ClusterSoftwareViewSet,
56 ClusterPackageTypeViewSet,
57)
58from rest_framework import routers
60router = routers.DefaultRouter()
61router.register(r"servers", ServerViewSet, basename="api-server")
62router.register(r"vendors", VendorViewSet, basename="api-vendor")
63router.register(r"statuses", StatusViewSet, basename="api-status")
64router.register(r"locations", LocationViewSet, basename="api-location")
65router.register(r"domains", DomainViewSet, basename="api-domain")
66router.register(r"patchtimes", PatchtimeViewSet, basename="api-patchtime")
67router.register(r"operatingsystems", OSViewSet, basename="api-operatingsystem")
68router.register(r"servermodels", ServerModelViewSet, basename="api-servermodel")
69router.register(r"clusters", ClusterViewSet, basename="api-cluster")
70router.register(
71 r"clusterpackages", ClusterPackageViewSet, basename="api-clusterpackage"
72)
73router.register(
74 r"clustersoftware", ClusterSoftwareViewSet, basename="api-clustersoftware"
75)
76router.register(
77 r"clusterpackagetypes",
78 ClusterPackageTypeViewSet,
79 basename="api-clusterpackagetype",
80)
82urlpatterns = [
83 path("admin/doc/", include("django.contrib.admindocs.urls")),
84 # User Management (Staff) - must come before admin/ catch-all
85 path("admin/users/", UserListView.as_view(), name="user_management_list"),
86 path(
87 "admin/groups/<int:pk>/",
88 GroupProfileUpdateView.as_view(),
89 name="group_profile_edit",
90 ),
91 path("admin/", admin.site.urls),
92 # API
93 path("api/", include(router.urls)),
94 # API Schema & Docs
95 path("api/schema/", SpectacularAPIView.as_view(), name="schema"),
96 path(
97 "api/schema/swagger-ui/",
98 SpectacularSwaggerView.as_view(url_name="schema"),
99 name="swagger-ui",
100 ),
101 path(
102 "api/schema/redoc/",
103 SpectacularRedocView.as_view(url_name="schema"),
104 name="redoc",
105 ),
106 # API Key Management
107 path("account/api-keys/", ApiKeyListView.as_view(), name="api_keys"),
108 path(
109 "account/api-keys/revoke/<int:pk>/",
110 RevokeApiKeyView.as_view(),
111 name="api_key_revoke",
112 ),
113 path(
114 "account/api-keys/rotate/<int:pk>/",
115 RotateApiKeyView.as_view(),
116 name="api_key_rotate",
117 ),
118 # Profile
119 path("account/profile/", ProfileView.as_view(), name="profile"),
120 # Allauth URLs
121 path("accounts/", include("allauth.urls")),
122 # Dashboard & Search
123 path("", DashboardView.as_view(), name="dashboard"),
124 path("search/", SearchView.as_view(), name="search"),
125 path("patch-schedule/", PatchScheduleView.as_view(), name="patch_schedule"),
126 path(
127 "starter-pack/import/",
128 ImportStarterPackView.as_view(),
129 name="starter_pack_import",
130 ),
131 path("avatar/<str:email_hash>/", avatar_proxy, name="avatar_proxy"),
132 path(
133 "history/<str:app_label>/<str:model_name>/<int:history_id>/",
134 HistoryDiffView.as_view(),
135 name="history_diff",
136 ),
137 # Legal Pages
138 path("terms/", TermsView.as_view(), name="terms"),
139 path("privacy/", PrivacyView.as_view(), name="privacy"),
140 path("impressum/", ImpressumView.as_view(), name="impressum"),
141 path("health/", HealthView.as_view(), name="health"),
142 # Audit Log
143 path("audit/", AuditLogView.as_view(), name="audit_log"),
144 # Group Management (Owner)
145 path("group/members/", GroupMemberListView.as_view(), name="group_member_list"),
146 path("group/onboarding/", GroupOnboardingView.as_view(), name="group_onboarding"),
147 path("group/create/", GroupCreateView.as_view(), name="group_create"),
148 path(
149 "group/members/add/<int:group_id>/",
150 AddGroupMemberView.as_view(),
151 name="group_member_add",
152 ),
153 path(
154 "group/members/remove/<int:group_id>/<int:user_id>/",
155 RemoveGroupMemberView.as_view(),
156 name="group_member_remove",
157 ),
158 path(
159 "group/permissions/<int:group_id>/",
160 GroupPermissionUpdateView.as_view(),
161 name="group_permission_edit",
162 ),
163 path(
164 "group/permissions/<int:group_id>/user/<int:user_id>/",
165 UserPermissionUpdateView.as_view(),
166 name="group_user_permission_edit",
167 ),
168 path(
169 "group/invite/<int:group_id>/",
170 InviteGroupMemberView.as_view(),
171 name="group_member_invite",
172 ),
173 path(
174 "invitation/<uuid:token>/",
175 AcceptInvitationView.as_view(),
176 name="accept_invitation",
177 ),
178 path(
179 "group/filter/",
180 GroupFilterView.as_view(),
181 name="group_filter",
182 ),
183 # Project Apps
184 path("cluster/", include("cluster.urls")),
185 path("operatingsystem/", include("operatingsystem.urls")),
186 path("clusterpackage/", include("clusterpackage.urls")),
187 path("patchtime/", include("patchtime.urls")),
188 path("location/", include("location.urls")),
189 path("servermodel/", include("servermodel.urls")),
190 path("server/", include("server.urls")),
191 path("status/", include("status.urls")),
192 path("domain/", include("domain.urls")),
193 path("clustersoftware/", include("clustersoftware.urls")),
194 path("clusterpackagetype/", include("clusterpackagetype.urls")),
195 path("vendor/", include("vendor.urls")),
196]
198if "debug_toolbar" in settings.INSTALLED_APPS:
199 import debug_toolbar
201 urlpatterns = [path("__debug__/", include(debug_toolbar.urls))] + urlpatterns
203urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)