src/notes/api/serializers/auth.py
author ymh <ymh.work@gmail.com>
Wed, 18 Jul 2018 17:32:09 +0200
changeset 142 56850f5c73f6
parent 133 6f3078f7fd47
permissions -rw-r--r--
- upgrade libraries - python 3.7 compatibility - First protocol management implementation
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
99
18fa4a1fa9e9 Add group endpoint.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
     1
import logging
18fa4a1fa9e9 Add group endpoint.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
     2
117
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
     3
from django.contrib.auth import get_user_model
99
18fa4a1fa9e9 Add group endpoint.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
     4
from django.contrib.auth.models import Group
142
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 133
diff changeset
     5
from django.db import transaction
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 133
diff changeset
     6
from notes import constants
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 133
diff changeset
     7
from notes.api.fields.category import ProtocolField
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 133
diff changeset
     8
from protocols.models import Protocol
133
6f3078f7fd47 Work on correct protocol propagation
ymh <ymh.work@gmail.com>
parents: 131
diff changeset
     9
from rest_auth.serializers import \
6f3078f7fd47 Work on correct protocol propagation
ymh <ymh.work@gmail.com>
parents: 131
diff changeset
    10
    UserDetailsSerializer as RestAuthUserDetailsSerializer
99
18fa4a1fa9e9 Add group endpoint.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    11
from rest_framework import serializers
18fa4a1fa9e9 Add group endpoint.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    12
18fa4a1fa9e9 Add group endpoint.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    13
logger = logging.getLogger(__name__)
18fa4a1fa9e9 Add group endpoint.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    14
117
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    15
User = get_user_model()
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    16
99
18fa4a1fa9e9 Add group endpoint.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    17
class GroupSerializer(serializers.ModelSerializer):
117
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    18
    owner = serializers.CharField(source='profile.owner.username', read_only=True)
131
adad5563603c add personal group, default_group to users and add group info to session on backend
ymh <ymh.work@gmail.com>
parents: 118
diff changeset
    19
    is_personal = serializers.BooleanField(source='profile.is_personal', read_only=True)
117
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    20
    description = serializers.CharField(source='profile.description')
133
6f3078f7fd47 Work on correct protocol propagation
ymh <ymh.work@gmail.com>
parents: 131
diff changeset
    21
    protocol = ProtocolField(read_only=True, source='profile.protocol')
117
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    22
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    23
    class Meta:
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    24
        model = Group
133
6f3078f7fd47 Work on correct protocol propagation
ymh <ymh.work@gmail.com>
parents: 131
diff changeset
    25
        fields = ['name', 'owner', 'is_personal', 'description', 'protocol']
117
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    26
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    27
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    28
class DetailGroupSerializer(GroupSerializer):
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    29
    users = serializers.SlugRelatedField(
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    30
        many=True,
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    31
        read_only=True,
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    32
        slug_field='username',
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    33
        source='user_set'
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    34
    )
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    35
99
18fa4a1fa9e9 Add group endpoint.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    36
    class Meta:
18fa4a1fa9e9 Add group endpoint.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    37
        model = Group
133
6f3078f7fd47 Work on correct protocol propagation
ymh <ymh.work@gmail.com>
parents: 131
diff changeset
    38
        fields = ['name', 'owner', 'description', 'users', 'is_personal', 'protocol']
131
adad5563603c add personal group, default_group to users and add group info to session on backend
ymh <ymh.work@gmail.com>
parents: 118
diff changeset
    39
117
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    40
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    41
class WriteGroupSerializer(serializers.ModelSerializer):
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    42
    '''
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    43
    Serializers for writing groups.
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    44
    '''
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    45
118
2cb8d11aa9ca make description field optional for group
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    46
    description = serializers.CharField(source='profile.description', required=False)
117
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    47
    users = serializers.SlugRelatedField(
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    48
        many=True,
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    49
        slug_field='username',
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    50
        source='user_set',
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    51
        queryset=User.objects.all(),
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    52
        default=[]
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    53
    )
133
6f3078f7fd47 Work on correct protocol propagation
ymh <ymh.work@gmail.com>
parents: 131
diff changeset
    54
    protocol = ProtocolField(required=False, source='profile.protocol')
117
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    55
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    56
    class Meta:
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    57
        model = Group
133
6f3078f7fd47 Work on correct protocol propagation
ymh <ymh.work@gmail.com>
parents: 131
diff changeset
    58
        fields = ['name', 'description', 'users', 'protocol']
117
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    59
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    60
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    61
    def create(self, validated_data):
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    62
        profile_data = validated_data.pop('profile', None)
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    63
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    64
        group = super().create(validated_data)
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    65
133
6f3078f7fd47 Work on correct protocol propagation
ymh <ymh.work@gmail.com>
parents: 131
diff changeset
    66
        if profile_data is not None and profile_data.get('description', None) is not None:
117
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    67
            group.profile.description = profile_data.get('description')
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    68
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    69
        user = None
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    70
        request = self.context.get("request")
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    71
        if request and hasattr(request, "user"):
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    72
            user = request.user
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    73
            group.user_set.add(user)
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    74
            group.save()
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    75
        group.profile.owner = user
142
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 133
diff changeset
    76
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 133
diff changeset
    77
        new_protocol = Protocol.objects.create_from_default(
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 133
diff changeset
    78
            "Protocol group %s"%validated_data.get('name', ''),
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 133
diff changeset
    79
            "Protocol group %s"%validated_data.get('name', ''),
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 133
diff changeset
    80
            validated_data.get('name', ''),
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 133
diff changeset
    81
            None
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 133
diff changeset
    82
        )
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 133
diff changeset
    83
        group.profile.protocol = "%s%s.%s" % (constants.PROTOCOL_URN_PREFIX, new_protocol.ext_id, new_protocol.revisions.last().version)
117
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    84
        group.profile.save()
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    85
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    86
        return group
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    87
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    88
    def update(self, instance, validated_data):
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    89
        profile_data = validated_data.pop('profile', None)
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    90
        group = super().update(instance, validated_data)
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    91
133
6f3078f7fd47 Work on correct protocol propagation
ymh <ymh.work@gmail.com>
parents: 131
diff changeset
    92
        logger.debug("WriteGroupSerializer.update %r", profile_data)
6f3078f7fd47 Work on correct protocol propagation
ymh <ymh.work@gmail.com>
parents: 131
diff changeset
    93
        if profile_data is not None and profile_data.get('description', None) is not None:
117
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    94
            group.profile.description = profile_data.get('description')
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    95
            group.profile.save()
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    96
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    97
        # check that owner is still in user list
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    98
        if group.profile.owner and group.profile.owner not in group.user_set.all():
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    99
            group.user_set.add(group.profile.owner)
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
   100
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
   101
        return group
133
6f3078f7fd47 Work on correct protocol propagation
ymh <ymh.work@gmail.com>
parents: 131
diff changeset
   102
142
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 133
diff changeset
   103
    @transaction.atomic()
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 133
diff changeset
   104
    def save(self, **kwargs):
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 133
diff changeset
   105
        return super().save(**kwargs)
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 133
diff changeset
   106
133
6f3078f7fd47 Work on correct protocol propagation
ymh <ymh.work@gmail.com>
parents: 131
diff changeset
   107
6f3078f7fd47 Work on correct protocol propagation
ymh <ymh.work@gmail.com>
parents: 131
diff changeset
   108
class UserDetailsSerializer(RestAuthUserDetailsSerializer):
6f3078f7fd47 Work on correct protocol propagation
ymh <ymh.work@gmail.com>
parents: 131
diff changeset
   109
    default_group = serializers.SlugRelatedField(read_only=True, slug_field='name', source='profile.default_group')
6f3078f7fd47 Work on correct protocol propagation
ymh <ymh.work@gmail.com>
parents: 131
diff changeset
   110
6f3078f7fd47 Work on correct protocol propagation
ymh <ymh.work@gmail.com>
parents: 131
diff changeset
   111
    class Meta(RestAuthUserDetailsSerializer.Meta):
6f3078f7fd47 Work on correct protocol propagation
ymh <ymh.work@gmail.com>
parents: 131
diff changeset
   112
        fields = ('pk', 'username', 'email', 'first_name', 'last_name', 'default_group')
6f3078f7fd47 Work on correct protocol propagation
ymh <ymh.work@gmail.com>
parents: 131
diff changeset
   113
        read_only_fields = ('email', 'default_group')