@@ -229,7 +229,7 @@ class RfcMetadataSerializer(serializers.ModelSerializer): | |||
| 229 | 229 | status = RfcStatusSerializer(source="*") | |
| 230 | 230 | authors = serializers.SerializerMethodField() | |
| 231 | 231 | group = GroupSerializer() | |
| 232 | - area = AreaSerializer(source="group.area", required=False) | ||
| 232 | + area = serializers.SerializerMethodField() | ||
| 233 | 233 | stream = StreamNameSerializer() | |
| 234 | 234 | ad = AreaDirectorSerializer(read_only=True, allow_null=True) | |
| 235 | 235 | group_list_email = serializers.EmailField(source="group.list_email", read_only=True) | |
@@ -287,6 +287,23 @@ def get_authors(self, doc: Document): | |||
| 287 | 287 | many=True, | |
| 288 | 288 | ).data | |
| 289 | 289 | ||
| 290 | + @extend_schema_field(AreaSerializer(required=False)) | ||
| 291 | + def get_area(self, doc: Document): | ||
| 292 | + """Get area for the RFC | ||
| 293 | + | ||
| 294 | + This logic might be better moved to Document or a combination of Document | ||
| 295 | + and Group. The current (2026-02-24) Group.area() method is not strict enough: | ||
| 296 | + it does not limit to WG groups or IETF-stream documents. | ||
| 297 | + """ | ||
| 298 | + if doc.stream_id != "ietf": | ||
| 299 | + return None | ||
| 300 | + if doc.group is None: | ||
| 301 | + return None | ||
| 302 | + parent = doc.group.parent | ||
| 303 | + if parent.type_id == "area": | ||
| 304 | + return AreaSerializer(parent).data | ||
| 305 | + return None | ||
| 306 | + | ||
| 290 | 307 | @extend_schema_field(DocIdentifierSerializer(many=True)) | |
| 291 | 308 | def get_identifiers(self, doc: Document): | |
| 292 | 309 | identifiers = [] | |
@@ -30,8 +30,15 @@ def get_email(self, instance: Email | Role): | |||
| 30 | 30 | ||
| 31 | 31 | ||
| 32 | 32 | class AreaSerializer(serializers.ModelSerializer): | |
| 33 | - ads = AreaDirectorSerializer(many=True, read_only=True) | ||
| 33 | + ads = serializers.SerializerMethodField() | ||
| 34 | 34 | ||
| 35 | 35 | class Meta: | |
| 36 | 36 | model = Group | |
| 37 | 37 | fields = ["acronym", "name", "type", "ads"] | |
| 38 | + | ||
| 39 | + @extend_schema_field(AreaDirectorSerializer(many=True)) | ||
| 40 | + def get_ads(self, area: Group): | ||
| 41 | + return AreaDirectorSerializer( | ||
| 42 | + area.ads() if area.is_active else Role.objects.none(), | ||
| 43 | + many=True, | ||
| 44 | + ).data | ||
0 commit comments