"""
Model serializers for the groups app.
.. admonition:: TODO
:class: warning
Add a serializer for members.
"""
from typing import Dict, List
from rest_framework.fields import RegexField, SerializerMethodField
from rest_framework.serializers import ModelSerializer
from MangAdventure.validators import (
DiscordServerValidator, RedditNameValidator, TwitterNameValidator
)
from .models import Group
[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'{m} ({m.get_roles(obj)})' for m in obj.members.distinct()]
[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
})
__all__ = ['GroupSerializer']