Completed
Push — master ( 9a7f1b...b2a2c0 )
by Camille
9s
created

UserSerializer

Size/Duplication

Total Lines 24
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 24
ccs 0
cts 0
cp 0

1 Method

Rating   Name   Duplication   Size   Complexity  
A create() 0 14 3
1
from rest_framework import serializers
2
3
from sigma_core.models.user import User
4
from sigma_core.models.cluster import Cluster
5
from sigma_files.models import Image
6
from sigma_files.serializers import ImageSerializer
7
8
9
class UserSerializerMeta():
10
    model = User
11
    exclude = ('is_staff', 'is_superuser', 'invited_to_groups', 'clusters', 'groups', )
12
    read_only_fields = ('last_login', 'is_active', 'photo', )
13
    extra_kwargs = {'password': {'write_only': True, 'required': False}}
14
15
16
class MinimalUserSerializer(serializers.ModelSerializer):
17
    """
18
    Serialize an User with minimal data.
19
    """
20
    class Meta:
21
        model = User
22
        fields = ('id', 'lastname', 'firstname', 'is_active', 'clusters_ids', )
23
        read_only_fields = ('is_active', )
24
25
    clusters_ids = serializers.PrimaryKeyRelatedField(queryset=Cluster.objects.all(), many=True, source='clusters')
26
27
28
class UserSerializer(serializers.ModelSerializer):
29
    """
30
    Serialize an User with related keys.
31
    """
32
    class Meta(UserSerializerMeta):
33
        pass
34
35
    photo = ImageSerializer(read_only=True)
36
    clusters_ids = serializers.PrimaryKeyRelatedField(queryset=Cluster.objects.all(), many=True, source='clusters')
37
38
    def create(self, validated_data):
39
        from sigma_core.models.group_member import GroupMember
40
        from sigma_core.models.cluster import Cluster
41
42
        request = self.context['request']
43
        input_clusters_ids = request.data.get('clusters_ids', [])
44
        if request.user.is_sigma_admin():
45
            valid_clusters_ids = Cluster.objects.filter(pk__in=input_clusters_ids).values_list('id', flat=True)
46
        else:
47
            valid_clusters_ids = GroupMember.objects.filter(user=request.user, group__in=input_clusters_ids, perm_rank__gte=Cluster.ADMINISTRATOR_RANK).values_list('group', flat=True)
48
49
        if set(input_clusters_ids) != set(valid_clusters_ids):
50
            raise serializers.ValidationError("Cluster list: incorrect values")
51
        return super().create(validated_data)
52
53
54
class MyUserSerializer(UserSerializer):
55
    """
56
    Serialize current User with related keys.
57
    """
58
    class Meta(UserSerializerMeta):
59
        pass
60
61
    invited_to_groups_ids = serializers.PrimaryKeyRelatedField(read_only=True, many=True, source='invited_to_groups')
62