Coverage for sm/admin.py: 95%

116 statements  

« prev     ^ index     » next       coverage.py v7.17.0, created at 2026-10-24 19:06 +0000

1from django.contrib import admin 

2from django.contrib.auth.admin import GroupAdmin, UserAdmin 

3from django.contrib.auth.models import Group, User 

4from simple_history.admin import SimpleHistoryAdmin 

5 

6from patchtime.models import Model as PatchtimeModel 

7from server.models import Model as ServerModel 

8from servermodel.models import Model as ServermodelModel 

9from status.models import Model as StatusModel 

10from domain.models import Model as DomainModel 

11from location.models import Model as LocationModel 

12from vendor.models import Model as VendorModel 

13from operatingsystem.models import Model as OperatingsystemModel 

14from cluster.models import Model as ClusterModel 

15from clusterpackage.models import Model as ClusterPackageModel 

16from clustersoftware.models import Model as ClusterSoftwareModel 

17from clusterpackagetype.models import Model as ClusterPackageTypeModel 

18from .models import GroupProfile, Invitation, ApiKey 

19 

20 

21class HistoryAdmin(SimpleHistoryAdmin): 

22 """Base admin for tenant models that keep simple-history tracks.""" 

23 

24 list_filter = ("group",) 

25 

26 

27@admin.register(GroupProfile) 

28class GroupProfileAdmin(admin.ModelAdmin): 

29 list_display = ("group", "owner", "max_items", "max_users") 

30 search_fields = ("group__name", "owner__username") 

31 raw_id_fields = ("group", "owner") 

32 

33 

34@admin.register(Invitation) 

35class InvitationAdmin(admin.ModelAdmin): 

36 list_display = ("email", "group", "created_at", "accepted_at", "is_expired") 

37 search_fields = ("email",) 

38 readonly_fields = ("token", "created_at", "created_by") 

39 raw_id_fields = ("group",) 

40 

41 

42@admin.register(ApiKey) 

43class ApiKeyAdmin(admin.ModelAdmin): 

44 list_display = ( 

45 "name", 

46 "client_id", 

47 "user", 

48 "is_active", 

49 "created_at", 

50 "last_used_at", 

51 ) 

52 list_filter = ("is_active", "created_at") 

53 search_fields = ("name", "client_id", "user__username") 

54 raw_id_fields = ("user",) 

55 # The secret is one-way hashed; never let it be edited or displayed raw. 

56 readonly_fields = ("client_id", "secret_hash", "created_at") 

57 

58 

59@admin.register(PatchtimeModel) 

60class PatchtimeAdmin(HistoryAdmin): 

61 list_display = ("name", "group") 

62 search_fields = ("name",) 

63 

64 

65@admin.register(ServerModel) 

66class ServerAdmin(HistoryAdmin): 

67 list_display = ( 

68 "hostname", 

69 "status", 

70 "domain", 

71 "location", 

72 "operatingsystem", 

73 "primary_ip", 

74 "group", 

75 ) 

76 list_filter = ("status", "operatingsystem", "cluster", "location", "group") 

77 search_fields = ("hostname", "primary_ip", "management_hostname") 

78 

79 

80@admin.register(ServermodelModel) 

81class ServermodelAdmin(HistoryAdmin): 

82 list_display = ("name", "vendor", "group") 

83 list_filter = ("vendor", "group") 

84 search_fields = ("name",) 

85 

86 

87@admin.register(StatusModel) 

88class StatusAdmin(HistoryAdmin): 

89 list_display = ("name", "group") 

90 search_fields = ("name",) 

91 

92 

93@admin.register(DomainModel) 

94class DomainAdmin(HistoryAdmin): 

95 list_display = ("name", "group") 

96 search_fields = ("name",) 

97 

98 

99@admin.register(LocationModel) 

100class LocationAdmin(HistoryAdmin): 

101 list_display = ("name", "country", "group") 

102 search_fields = ("name", "country") 

103 

104 

105@admin.register(VendorModel) 

106class VendorAdmin(HistoryAdmin): 

107 list_display = ("name", "is_hardware", "is_software", "group") 

108 list_filter = ("is_hardware", "is_software", "group") 

109 search_fields = ("name",) 

110 

111 

112@admin.register(OperatingsystemModel) 

113class OperatingsystemAdmin(HistoryAdmin): 

114 list_display = ("version", "vendor", "group") 

115 list_filter = ("vendor", "group") 

116 search_fields = ("version",) 

117 

118 

119@admin.register(ClusterModel) 

120class ClusterAdmin(HistoryAdmin): 

121 list_display = ("name", "clustersoftware", "group") 

122 list_filter = ("clustersoftware", "group") 

123 search_fields = ("name",) 

124 

125 

126@admin.register(ClusterPackageModel) 

127class ClusterPackageAdmin(HistoryAdmin): 

128 list_display = ("name", "cluster", "package_type", "status", "host", "group") 

129 list_filter = ("package_type", "status", "cluster", "group") 

130 search_fields = ("name", "host", "description") 

131 

132 

133@admin.register(ClusterSoftwareModel) 

134class ClusterSoftwareAdmin(HistoryAdmin): 

135 list_display = ("name", "version", "vendor", "group") 

136 list_filter = ("vendor", "group") 

137 search_fields = ("name", "version") 

138 

139 

140@admin.register(ClusterPackageTypeModel) 

141class ClusterPackageTypeAdmin(HistoryAdmin): 

142 list_display = ("name", "group") 

143 search_fields = ("name",) 

144 

145 

146class GroupProfileInline(admin.StackedInline): 

147 model = GroupProfile 

148 can_delete = False 

149 

150 

151class GroupAdminWithProfile(GroupAdmin): 

152 inlines = [GroupProfileInline] 

153 

154 def profile_owner(self, obj): 

155 profile = getattr(obj, "profile", None) 

156 return profile.owner if profile and profile.owner else "-" 

157 

158 profile_owner.short_description = "Owner" 

159 

160 def profile_max_items(self, obj): 

161 profile = getattr(obj, "profile", None) 

162 return profile.max_items if profile else "-" 

163 

164 profile_max_items.short_description = "Max items" 

165 

166 def profile_max_users(self, obj): 

167 profile = getattr(obj, "profile", None) 

168 return profile.max_users if profile else "-" 

169 

170 profile_max_users.short_description = "Max users" 

171 

172 list_display = ("name", "profile_owner", "profile_max_items", "profile_max_users") 

173 

174 

175class UserAdminWithGroups(UserAdmin): 

176 list_display = ( 

177 "username", 

178 "email", 

179 "first_name", 

180 "last_name", 

181 "is_staff", 

182 "is_active", 

183 ) 

184 

185 

186admin.site.unregister(Group) 

187admin.site.register(Group, GroupAdminWithProfile) 

188 

189admin.site.unregister(User) 

190admin.site.register(User, UserAdminWithGroups)