svthalia/concrexit

View on GitHub
website/activemembers/api/v2/serializers/member_group.py

Summary

Maintainability
A
1 hr
Test Coverage
from rest_framework import serializers

from activemembers.api.v2.serializers.member_group_membership import (
    MemberGroupMembershipSerializer,
)
from activemembers.models import MemberGroup
from thaliawebsite.api.v2.serializers import ThumbnailSerializer
from thaliawebsite.api.v2.serializers.cleaned_model_serializer import (
    CleanedModelSerializer,
)


class MemberGroupSerializer(CleanedModelSerializer):
    """API serializer for member groups."""

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        if "get_memberships" not in self.context and "members" in self.fields:
            self.fields.pop("members")

    class Meta:
        """Meta class for the serializer."""

        model = MemberGroup
        fields = (
            "pk",
            "name",
            "type",
            "description",
            "since",
            "until",
            "contact_address",
            "photo",
            "members",
        )

    members = serializers.SerializerMethodField("_members")
    type = serializers.SerializerMethodField("_type")
    photo = ThumbnailSerializer(placeholder="activemembers/images/placeholder.png")

    def _members(self, instance):
        memberships = self.context["get_memberships"](instance).prefetch_related(
            "member__membergroupmembership_set"
        )
        return MemberGroupMembershipSerializer(
            many=True, context=self.context
        ).to_representation(memberships)

    def _type(self, instance):
        if hasattr(instance, "board"):
            return "board"
        if hasattr(instance, "committee"):
            return "committee"
        if hasattr(instance, "society"):
            return "society"
        return None


class MemberGroupListSerializer(MemberGroupSerializer):
    class Meta:
        """Meta class for the serializer."""

        model = MemberGroup
        fields = (
            "pk",
            "name",
            "type",
            "description",
            "since",
            "until",
            "contact_address",
            "photo",
        )


class MemberGroupShortSerializer(MemberGroupListSerializer):
    class Meta:
        model = MemberGroup
        fields = (
            "pk",
            "name",
            "type",
            "since",
            "until",
            "contact_address",
        )