Coverage for src/ptf_tools/admin.py: 74%
64 statements
« prev ^ index » next coverage.py v7.7.0, created at 2025-04-09 14:54 +0000
« prev ^ index » next coverage.py v7.7.0, created at 2025-04-09 14:54 +0000
1from django.contrib import admin
2from django.contrib.auth.admin import GroupAdmin as BaseGroupAdmin
3from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
4from django.contrib.auth.models import Group, User
5from django.db.models import QuerySet
6from django.http import HttpRequest
7from mersenne_cms.admin import PageAdmin, Site
8from mersenne_cms.models import Page
9from ptf.admin import ptf_admin
11from comments_moderation.forms import UserCommentModeratorForm
12from comments_moderation.models import CommentModerator
13from ptf_tools.models import CollectionGroup
15from .forms import InvitationAdminAddForm, InvitationAdminChangeForm
16from .models import Invitation
19class GroupInline(admin.StackedInline):
20 model = CollectionGroup
21 can_delete = False
22 verbose_name_plural = "collection groups"
25class GroupAdmin(BaseGroupAdmin):
26 inlines = (GroupInline,)
27 list_display = ("name", "get_collections")
29 def get_queryset(self, request: HttpRequest) -> QuerySet:
30 return (
31 super()
32 .get_queryset(request)
33 .prefetch_related("collectiongroup", "collectiongroup__collections")
34 )
36 @admin.display(description="Collections")
37 def get_collections(self, obj) -> str:
38 return obj.collectiongroup.get_collections()
41# Re-register GroupAdmin
42ptf_admin.unregister(Group)
43ptf_admin.register(Group, GroupAdmin)
44ptf_admin.register(Page, PageAdmin)
45ptf_admin.register(Site)
48class ModeratorUserInline(admin.StackedInline):
49 model = CommentModerator
50 can_delete = False
51 fields = ("is_moderator", "collections")
52 form = UserCommentModeratorForm
53 add_form = UserCommentModeratorForm
56class UserAdmin(BaseUserAdmin):
57 inlines = (ModeratorUserInline,)
58 list_display = (
59 "username",
60 "email",
61 "first_name",
62 "last_name",
63 "is_staff",
64 "is_superuser",
65 "is_moderator",
66 )
68 def get_queryset(self, request: HttpRequest) -> QuerySet:
69 return super().get_queryset(request).prefetch_related("comment_moderator")
71 @admin.display(
72 description="Moderator",
73 ordering="comment_moderator__is_moderator",
74 )
75 @admin.display(boolean=True)
76 def is_moderator(self, obj) -> bool:
77 return hasattr(obj, "comment_moderator") and obj.comment_moderator.is_moderator
80ptf_admin.unregister(User)
81ptf_admin.register(User, UserAdmin)
84class InvitationAdmin(admin.ModelAdmin):
85 list_display = ("email", "first_name", "last_name", "sent", "accepted", "key")
86 raw_id_fields = ("inviter",)
88 readonly_fields = ["accepted", "key", "sent", "inviter", "created"]
90 def get_form(self, request, obj=None, **kwargs):
91 if obj:
92 kwargs["form"] = InvitationAdminChangeForm
93 else:
94 kwargs["form"] = InvitationAdminAddForm
95 kwargs["form"].user = request.user
96 kwargs["form"].request = request
97 return super().get_form(request, obj, **kwargs)
99 def get_readonly_fields(self, request: HttpRequest, obj):
100 """
101 Disable editing the email field once the invite has already been sent.
102 """
103 readonly_fields = list(self.readonly_fields)
104 if obj:
105 readonly_fields += ["email"]
106 return readonly_fields
109ptf_admin.register(Invitation, InvitationAdmin)