Skip to content

Commit 4267ff7

Browse files
Merge pull request ietf-tools#10613 from ietf-tools/feat/email-name-ads-chairs
feat: add email/name for ADs and WG Chairs
2 parents 7c7219f + b1cc7ed commit 4267ff7

3 files changed

Lines changed: 42 additions & 4 deletions

File tree

ietf/api/serializers_rpc.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
update_action_holders,
2828
update_rfcauthors,
2929
)
30-
from ietf.group.models import Group
30+
from ietf.group.models import Group, Role
3131
from ietf.group.serializers import AreaSerializer
3232
from ietf.name.models import StreamName, StdLevelName
3333
from ietf.person.models import Person
@@ -97,6 +97,21 @@ class Meta:
9797
fields = ["draft_name", "authors"]
9898

9999

100+
class WgChairSerializer(serializers.Serializer):
101+
"""Serialize a WG chair's name and email from a Role"""
102+
103+
name = serializers.SerializerMethodField()
104+
email = serializers.SerializerMethodField()
105+
106+
@extend_schema_field(serializers.CharField)
107+
def get_name(self, role: Role) -> str:
108+
return role.person.plain_name()
109+
110+
@extend_schema_field(serializers.EmailField)
111+
def get_email(self, role: Role) -> str:
112+
return role.email.email_address()
113+
114+
100115
class DocumentAuthorSerializer(serializers.ModelSerializer):
101116
"""Serializer for a Person in a response"""
102117

@@ -126,6 +141,7 @@ class FullDraftSerializer(serializers.ModelSerializer):
126141
source="shepherd.person", read_only=True
127142
)
128143
consensus = serializers.SerializerMethodField()
144+
wg_chairs = serializers.SerializerMethodField()
129145

130146
class Meta:
131147
model = Document
@@ -145,11 +161,21 @@ class Meta:
145161
"consensus",
146162
"shepherd",
147163
"ad",
164+
"wg_chairs",
148165
]
149166

150167
def get_consensus(self, doc: Document) -> Optional[bool]:
151168
return default_consensus(doc)
152169

170+
@extend_schema_field(WgChairSerializer(many=True))
171+
def get_wg_chairs(self, doc: Document):
172+
if doc.group is None:
173+
return []
174+
chairs = doc.group.role_set.filter(name_id="chair").select_related(
175+
"person", "email"
176+
)
177+
return WgChairSerializer(chairs, many=True).data
178+
153179
def get_source_format(
154180
self, doc: Document
155181
) -> Literal["unknown", "xml-v2", "xml-v3", "txt"]:

ietf/group/serializers.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,14 @@ class AreaDirectorSerializer(serializers.Serializer):
2020
Works with Email or Role
2121
"""
2222

23+
name = serializers.SerializerMethodField()
2324
email = serializers.SerializerMethodField()
2425

26+
@extend_schema_field(serializers.CharField)
27+
def get_name(self, instance: Email | Role):
28+
person = getattr(instance, 'person', None)
29+
return person.plain_name() if person else None
30+
2531
@extend_schema_field(serializers.EmailField)
2632
def get_email(self, instance: Email | Role):
2733
if isinstance(instance, Role):

ietf/group/tests_serializers.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def test_serializes_role(self):
3131
serialized = AreaDirectorSerializer(role).data
3232
self.assertEqual(
3333
serialized,
34-
{"email": role.email.email_address()},
34+
{"email": role.email.email_address(), "name": role.person.plain_name()},
3535
)
3636

3737
def test_serializes_email(self):
@@ -40,7 +40,10 @@ def test_serializes_email(self):
4040
serialized = AreaDirectorSerializer(email).data
4141
self.assertEqual(
4242
serialized,
43-
{"email": email.email_address()},
43+
{
44+
"email": email.email_address(),
45+
"name": email.person.plain_name() if email.person else None,
46+
},
4447
)
4548

4649

@@ -63,7 +66,10 @@ def test_serializes_active_area(self):
6366
self.assertEqual(serialized["name"], area.name)
6467
self.assertCountEqual(
6568
serialized["ads"],
66-
[{"email": ad.email.email_address()} for ad in ad_roles],
69+
[
70+
{"email": ad.email.email_address(), "name": ad.person.plain_name()}
71+
for ad in ad_roles
72+
],
6773
)
6874

6975
def test_serializes_inactive_area(self):

0 commit comments

Comments
 (0)