src/notes/api/serializers/auth.py
changeset 133 6f3078f7fd47
parent 131 adad5563603c
child 142 56850f5c73f6
equal deleted inserted replaced
132:906a6c7c7943 133:6f3078f7fd47
     1 import logging
     1 import logging
     2 
     2 
     3 from django.contrib.auth import get_user_model
     3 from django.contrib.auth import get_user_model
     4 from django.contrib.auth.models import Group
     4 from django.contrib.auth.models import Group
       
     5 from rest_auth.serializers import \
       
     6     UserDetailsSerializer as RestAuthUserDetailsSerializer
     5 from rest_framework import serializers
     7 from rest_framework import serializers
       
     8 
       
     9 from notes.api.fields.category import ProtocolField
     6 
    10 
     7 logger = logging.getLogger(__name__)
    11 logger = logging.getLogger(__name__)
     8 
    12 
     9 User = get_user_model()
    13 User = get_user_model()
    10 
    14 
    11 class GroupSerializer(serializers.ModelSerializer):
    15 class GroupSerializer(serializers.ModelSerializer):
    12     owner = serializers.CharField(source='profile.owner.username', read_only=True)
    16     owner = serializers.CharField(source='profile.owner.username', read_only=True)
    13     is_personal = serializers.BooleanField(source='profile.is_personal', read_only=True)
    17     is_personal = serializers.BooleanField(source='profile.is_personal', read_only=True)
    14     description = serializers.CharField(source='profile.description')
    18     description = serializers.CharField(source='profile.description')
       
    19     protocol = ProtocolField(read_only=True, source='profile.protocol')
    15 
    20 
    16     class Meta:
    21     class Meta:
    17         model = Group
    22         model = Group
    18         fields = ['name', 'owner', 'is_personal', 'description']
    23         fields = ['name', 'owner', 'is_personal', 'description', 'protocol']
    19 
    24 
    20 
    25 
    21 class DetailGroupSerializer(GroupSerializer):
    26 class DetailGroupSerializer(GroupSerializer):
    22     users = serializers.SlugRelatedField(
    27     users = serializers.SlugRelatedField(
    23         many=True,
    28         many=True,
    26         source='user_set'
    31         source='user_set'
    27     )
    32     )
    28 
    33 
    29     class Meta:
    34     class Meta:
    30         model = Group
    35         model = Group
    31         fields = ['name', 'owner', 'description', 'users', 'is_personal']
    36         fields = ['name', 'owner', 'description', 'users', 'is_personal', 'protocol']
    32 
    37 
    33 
    38 
    34 class WriteGroupSerializer(serializers.ModelSerializer):
    39 class WriteGroupSerializer(serializers.ModelSerializer):
    35     '''
    40     '''
    36     Serializers for writing groups.
    41     Serializers for writing groups.
    42         slug_field='username',
    47         slug_field='username',
    43         source='user_set',
    48         source='user_set',
    44         queryset=User.objects.all(),
    49         queryset=User.objects.all(),
    45         default=[]
    50         default=[]
    46     )
    51     )
       
    52     protocol = ProtocolField(required=False, source='profile.protocol')
    47 
    53 
    48     class Meta:
    54     class Meta:
    49         model = Group
    55         model = Group
    50         fields = ['name', 'description', 'users']
    56         fields = ['name', 'description', 'users', 'protocol']
    51 
    57 
    52 
    58 
    53     def create(self, validated_data):
    59     def create(self, validated_data):
    54         profile_data = validated_data.pop('profile', None)
    60         profile_data = validated_data.pop('profile', None)
    55 
    61 
    56         group = super().create(validated_data)
    62         group = super().create(validated_data)
    57 
    63 
    58         if profile_data is not None:
    64         if profile_data is not None and profile_data.get('description', None) is not None:
    59             group.profile.description = profile_data.get('description')
    65             group.profile.description = profile_data.get('description')
    60 
    66 
    61         user = None
    67         user = None
    62         request = self.context.get("request")
    68         request = self.context.get("request")
    63         if request and hasattr(request, "user"):
    69         if request and hasattr(request, "user"):
    71 
    77 
    72     def update(self, instance, validated_data):
    78     def update(self, instance, validated_data):
    73         profile_data = validated_data.pop('profile', None)
    79         profile_data = validated_data.pop('profile', None)
    74         group = super().update(instance, validated_data)
    80         group = super().update(instance, validated_data)
    75 
    81 
    76         if profile_data is not None:
    82         logger.debug("WriteGroupSerializer.update %r", profile_data)
       
    83         if profile_data is not None and profile_data.get('description', None) is not None:
    77             group.profile.description = profile_data.get('description')
    84             group.profile.description = profile_data.get('description')
    78             group.profile.save()
    85             group.profile.save()
    79 
    86 
    80         # check that owner is still in user list
    87         # check that owner is still in user list
    81         if group.profile.owner and group.profile.owner not in group.user_set.all():
    88         if group.profile.owner and group.profile.owner not in group.user_set.all():
    82             group.user_set.add(group.profile.owner)
    89             group.user_set.add(group.profile.owner)
    83 
    90 
    84         return group
    91         return group
       
    92 
       
    93 
       
    94 class UserDetailsSerializer(RestAuthUserDetailsSerializer):
       
    95     default_group = serializers.SlugRelatedField(read_only=True, slug_field='name', source='profile.default_group')
       
    96 
       
    97     class Meta(RestAuthUserDetailsSerializer.Meta):
       
    98         fields = ('pk', 'username', 'email', 'first_name', 'last_name', 'default_group')
       
    99         read_only_fields = ('email', 'default_group')