Coverage for website/members/api/v2/serializers/member.py: 80.00%

50 statements  

« prev     ^ index     » next       coverage.py v7.6.7, created at 2025-08-14 10:31 +0000

1from rest_framework import serializers 

2from rest_framework.exceptions import ValidationError 

3 

4from members.api.v2.serializers.profile import ProfileSerializer 

5from members.models import Member 

6from members.services import member_achievements, member_societies 

7from thaliawebsite.api.v2.serializers.cleaned_model_serializer import ( 

8 CleanedModelSerializer, 

9) 

10 

11 

12class MemberSerializer(CleanedModelSerializer): 

13 def __init__(self, *args, **kwargs): 

14 # Don't pass the 'fields' arg up to the superclass 

15 detailed = kwargs.pop("detailed", True) 

16 admin = kwargs.pop("admin", False) 

17 

18 # Instantiate the superclass normally 

19 super().__init__(*args, **kwargs) 

20 

21 hidden_fields = set() 

22 if not detailed: 22 ↛ 24line 22 didn't jump to line 24 because the condition on line 22 was always true

23 hidden_fields.update({"achievements", "societies"}) 

24 if not admin: 

25 hidden_fields.update({"first_name", "last_name"}) 

26 

27 existing = set(self.fields.keys()) 

28 for field_name in existing & hidden_fields: 

29 self.fields.pop(field_name) 

30 

31 class Meta: 

32 model = Member 

33 fields = ( 

34 "pk", 

35 "first_name", 

36 "last_name", 

37 "membership_type", 

38 "profile", 

39 "achievements", 

40 "societies", 

41 ) 

42 

43 membership_type = serializers.SerializerMethodField("_membership_type") 

44 profile = ProfileSerializer( 

45 fields=( 

46 "photo", 

47 "display_name", 

48 "short_display_name", 

49 "programme", 

50 "starting_year", 

51 "birthday", 

52 "website", 

53 "profile_description", 

54 ) 

55 ) 

56 achievements = serializers.SerializerMethodField("_achievements") 

57 societies = serializers.SerializerMethodField("_societies") 

58 

59 def _achievements(self, instance): 

60 return member_achievements(instance) 

61 

62 def _societies(self, instance): 

63 return member_societies(instance) 

64 

65 def _membership_type(self, instance): 

66 membership = instance.current_membership 

67 if membership: 67 ↛ 69line 67 didn't jump to line 69 because the condition on line 67 was always true

68 return membership.type 

69 return None 

70 

71 def update(self, instance, validated_data): 

72 if "profile" not in validated_data: 

73 raise ValidationError("profile field is missing") 

74 

75 profile_data = validated_data.pop("profile") 

76 instance.profile = self.fields["profile"].update( 

77 instance=instance.profile, validated_data=profile_data 

78 ) 

79 return instance 

80 

81 

82class MemberListSerializer(MemberSerializer): 

83 class Meta: 

84 model = Member 

85 fields = ( 

86 "pk", 

87 "membership_type", 

88 "profile", 

89 ) 

90 

91 

92class MemberCurrentSerializer(MemberSerializer): 

93 class Meta: 

94 model = Member 

95 fields = ("pk", "membership_type", "profile", "achievements", "societies") 

96 

97 profile = ProfileSerializer( 

98 fields=( 

99 "photo", 

100 "display_name", 

101 "short_display_name", 

102 "programme", 

103 "starting_year", 

104 "birthday", 

105 "show_birthday", 

106 "website", 

107 "profile_description", 

108 "address_street", 

109 "address_street2", 

110 "address_postal_code", 

111 "address_city", 

112 "address_country", 

113 "phone_number", 

114 "website", 

115 "emergency_contact", 

116 "emergency_contact_phone_number", 

117 "profile_description", 

118 "nickname", 

119 "initials", 

120 "display_name_preference", 

121 "receive_optin", 

122 "receive_newsletter", 

123 "email_gsuite_only", 

124 ), 

125 force_show_birthday=True, 

126 )