"""Model serializers for the groups app."""
from typing import Dict, List
from rest_framework.fields import RegexField, SerializerMethodField
from rest_framework.serializers import ModelSerializer
from MangAdventure.validators import (
DiscordNameValidator, DiscordServerValidator,
RedditNameValidator, TwitterNameValidator
)
from .models import Group, Member
[docs]class GroupSerializer(ModelSerializer):
"""Serializer for groups."""
discord = RegexField(
regex=DiscordServerValidator.regex, required=False,
help_text="The group's Discord link.", max_length=200
)
twitter = RegexField(
regex=TwitterNameValidator.regex, required=False,
help_text="The group's Twitter username.", max_length=15
)
reddit = RegexField(
regex=RedditNameValidator.regex, required=False,
help_text="The group's Reddit username or subreddit.", max_length=24
)
members = SerializerMethodField(
help_text='The members of this group.', method_name='_get_members'
)
def _get_members(self, obj: Group) -> List[str]:
return [
f'{r.get_role_display()}: {r.member.name}'
for r in obj.roles.all()
]
[docs] def create(self, validated_data: Dict) -> Group:
"""Create a new ``Group`` instance."""
# manually set the manager to the current user
return super().create({
**validated_data,
'manager_id': self.context['request'].user.id
})
[docs]class MemberSerializer(ModelSerializer):
"""Serializer for members."""
twitter = RegexField(
regex=TwitterNameValidator.regex, required=False,
help_text="The member's Twitter username.", max_length=15
)
discord = RegexField(
regex=DiscordNameValidator.regex, required=False, max_length=37,
help_text="The member's Discord name and discriminator."
)
reddit = RegexField(
regex=RedditNameValidator.regex, required=False,
help_text="The member's Reddit username.", max_length=21
)
groups = SerializerMethodField(
help_text='The groups this person belongs to.',
method_name='_get_groups'
)
def _get_groups(self, obj: Member) -> List[str]:
return [
f'{g.name} ({obj.get_roles(g)})' for g
in obj.groups.only('id', 'name').distinct()
]
__all__ = ['GroupSerializer', 'MemberSerializer']