Coverage for sm/urls.py: 94%

33 statements  

« 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 

5 

6from drf_spectacular.views import ( 

7 SpectacularAPIView, 

8 SpectacularRedocView, 

9 SpectacularSwaggerView, 

10) 

11 

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 

59 

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) 

81 

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] 

197 

198if "debug_toolbar" in settings.INSTALLED_APPS: 

199 import debug_toolbar 

200 

201 urlpatterns = [path("__debug__/", include(debug_toolbar.urls))] + urlpatterns 

202 

203urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)