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
« 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
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)
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)
18 # Instantiate the superclass normally
19 super().__init__(*args, **kwargs)
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"})
27 existing = set(self.fields.keys())
28 for field_name in existing & hidden_fields:
29 self.fields.pop(field_name)
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 )
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")
59 def _achievements(self, instance):
60 return member_achievements(instance)
62 def _societies(self, instance):
63 return member_societies(instance)
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
71 def update(self, instance, validated_data):
72 if "profile" not in validated_data:
73 raise ValidationError("profile field is missing")
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
82class MemberListSerializer(MemberSerializer):
83 class Meta:
84 model = Member
85 fields = (
86 "pk",
87 "membership_type",
88 "profile",
89 )
92class MemberCurrentSerializer(MemberSerializer):
93 class Meta:
94 model = Member
95 fields = ("pk", "membership_type", "profile", "achievements", "societies")
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 )