diff -r 672e3c4bbd0c -r 9864fe2067cd src/notes/api/serializers/auth.py --- a/src/notes/api/serializers/auth.py Mon Jul 17 14:13:32 2017 +0200 +++ b/src/notes/api/serializers/auth.py Tue Jul 18 17:08:27 2017 +0200 @@ -1,11 +1,82 @@ import logging +from django.contrib.auth import get_user_model from django.contrib.auth.models import Group from rest_framework import serializers logger = logging.getLogger(__name__) +User = get_user_model() + class GroupSerializer(serializers.ModelSerializer): + owner = serializers.CharField(source='profile.owner.username', read_only=True) + description = serializers.CharField(source='profile.description') + + class Meta: + model = Group + fields = ['name', 'owner', 'description'] + + +class DetailGroupSerializer(GroupSerializer): + users = serializers.SlugRelatedField( + many=True, + read_only=True, + slug_field='username', + source='user_set' + ) + class Meta: model = Group - fields = '__all__' + fields = ['name', 'owner', 'description', 'users'] + +class WriteGroupSerializer(serializers.ModelSerializer): + ''' + Serializers for writing groups. + ''' + + description = serializers.CharField(source='profile.description') + users = serializers.SlugRelatedField( + many=True, + slug_field='username', + source='user_set', + queryset=User.objects.all(), + default=[] + ) + + class Meta: + model = Group + fields = ['name', 'description', 'users'] + + + def create(self, validated_data): + profile_data = validated_data.pop('profile', None) + + group = super().create(validated_data) + + if profile_data is not None: + group.profile.description = profile_data.get('description') + + user = None + request = self.context.get("request") + if request and hasattr(request, "user"): + user = request.user + group.user_set.add(user) + group.save() + group.profile.owner = user + group.profile.save() + + return group + + def update(self, instance, validated_data): + profile_data = validated_data.pop('profile', None) + group = super().update(instance, validated_data) + + if profile_data is not None: + group.profile.description = profile_data.get('description') + group.profile.save() + + # check that owner is still in user list + if group.profile.owner and group.profile.owner not in group.user_set.all(): + group.user_set.add(group.profile.owner) + + return group