Coverage for sm/admin.py: 95%
116 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.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
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
21class HistoryAdmin(SimpleHistoryAdmin):
22 """Base admin for tenant models that keep simple-history tracks."""
24 list_filter = ("group",)
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")
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",)
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")
59@admin.register(PatchtimeModel)
60class PatchtimeAdmin(HistoryAdmin):
61 list_display = ("name", "group")
62 search_fields = ("name",)
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")
80@admin.register(ServermodelModel)
81class ServermodelAdmin(HistoryAdmin):
82 list_display = ("name", "vendor", "group")
83 list_filter = ("vendor", "group")
84 search_fields = ("name",)
87@admin.register(StatusModel)
88class StatusAdmin(HistoryAdmin):
89 list_display = ("name", "group")
90 search_fields = ("name",)
93@admin.register(DomainModel)
94class DomainAdmin(HistoryAdmin):
95 list_display = ("name", "group")
96 search_fields = ("name",)
99@admin.register(LocationModel)
100class LocationAdmin(HistoryAdmin):
101 list_display = ("name", "country", "group")
102 search_fields = ("name", "country")
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",)
112@admin.register(OperatingsystemModel)
113class OperatingsystemAdmin(HistoryAdmin):
114 list_display = ("version", "vendor", "group")
115 list_filter = ("vendor", "group")
116 search_fields = ("version",)
119@admin.register(ClusterModel)
120class ClusterAdmin(HistoryAdmin):
121 list_display = ("name", "clustersoftware", "group")
122 list_filter = ("clustersoftware", "group")
123 search_fields = ("name",)
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")
133@admin.register(ClusterSoftwareModel)
134class ClusterSoftwareAdmin(HistoryAdmin):
135 list_display = ("name", "version", "vendor", "group")
136 list_filter = ("vendor", "group")
137 search_fields = ("name", "version")
140@admin.register(ClusterPackageTypeModel)
141class ClusterPackageTypeAdmin(HistoryAdmin):
142 list_display = ("name", "group")
143 search_fields = ("name",)
146class GroupProfileInline(admin.StackedInline):
147 model = GroupProfile
148 can_delete = False
151class GroupAdminWithProfile(GroupAdmin):
152 inlines = [GroupProfileInline]
154 def profile_owner(self, obj):
155 profile = getattr(obj, "profile", None)
156 return profile.owner if profile and profile.owner else "-"
158 profile_owner.short_description = "Owner"
160 def profile_max_items(self, obj):
161 profile = getattr(obj, "profile", None)
162 return profile.max_items if profile else "-"
164 profile_max_items.short_description = "Max items"
166 def profile_max_users(self, obj):
167 profile = getattr(obj, "profile", None)
168 return profile.max_users if profile else "-"
170 profile_max_users.short_description = "Max users"
172 list_display = ("name", "profile_owner", "profile_max_items", "profile_max_users")
175class UserAdminWithGroups(UserAdmin):
176 list_display = (
177 "username",
178 "email",
179 "first_name",
180 "last_name",
181 "is_staff",
182 "is_active",
183 )
186admin.site.unregister(Group)
187admin.site.register(Group, GroupAdminWithProfile)
189admin.site.unregister(User)
190admin.site.register(User, UserAdminWithGroups)