src/notes/api/serializers/auth.py
author ymh <ymh.work@gmail.com>
Fri, 30 Nov 2018 10:53:15 +0100
changeset 183 f8f3af9e5c83
parent 142 56850f5c73f6
permissions -rw-r--r--
Change the settings to avoid using Session authentication for rest framework as it raise exceptions in case client and backend are on the same domain On the filter, adapt to take into account new version of django_filters
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')