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

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 

10 

11from comments_moderation.forms import UserCommentModeratorForm 

12from comments_moderation.models import CommentModerator 

13from ptf_tools.models import CollectionGroup 

14 

15from .forms import InvitationAdminAddForm, InvitationAdminChangeForm 

16from .models import Invitation 

17 

18 

19class GroupInline(admin.StackedInline): 

20 model = CollectionGroup 

21 can_delete = False 

22 verbose_name_plural = "collection groups" 

23 

24 

25class GroupAdmin(BaseGroupAdmin): 

26 inlines = (GroupInline,) 

27 list_display = ("name", "get_collections") 

28 

29 def get_queryset(self, request: HttpRequest) -> QuerySet: 

30 return ( 

31 super() 

32 .get_queryset(request) 

33 .prefetch_related("collectiongroup", "collectiongroup__collections") 

34 ) 

35 

36 @admin.display(description="Collections") 

37 def get_collections(self, obj) -> str: 

38 return obj.collectiongroup.get_collections() 

39 

40 

41# Re-register GroupAdmin 

42ptf_admin.unregister(Group) 

43ptf_admin.register(Group, GroupAdmin) 

44ptf_admin.register(Page, PageAdmin) 

45ptf_admin.register(Site) 

46 

47 

48class ModeratorUserInline(admin.StackedInline): 

49 model = CommentModerator 

50 can_delete = False 

51 fields = ("is_moderator", "collections") 

52 form = UserCommentModeratorForm 

53 add_form = UserCommentModeratorForm 

54 

55 

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 ) 

67 

68 def get_queryset(self, request: HttpRequest) -> QuerySet: 

69 return super().get_queryset(request).prefetch_related("comment_moderator") 

70 

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 

78 

79 

80ptf_admin.unregister(User) 

81ptf_admin.register(User, UserAdmin) 

82 

83 

84class InvitationAdmin(admin.ModelAdmin): 

85 list_display = ("email", "first_name", "last_name", "sent", "accepted", "key") 

86 raw_id_fields = ("inviter",) 

87 

88 readonly_fields = ["accepted", "key", "sent", "inviter", "created"] 

89 

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) 

98 

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 

107 

108 

109ptf_admin.register(Invitation, InvitationAdmin)