|
1
|
|
|
from rest_framework import serializers |
|
2
|
|
|
from dry_rest_permissions.generics import DRYPermissionsField |
|
3
|
|
|
|
|
4
|
|
|
from sigma_core.models.user import User |
|
5
|
|
|
from sigma_core.serializers.group_member import GroupMemberSerializer_Group |
|
6
|
|
|
from sigma_files.models import Image |
|
7
|
|
|
from sigma_files.serializers import ImageSerializer |
|
8
|
|
|
|
|
9
|
|
|
|
|
10
|
|
|
class BasicUserSerializerMeta(): |
|
11
|
|
|
model = User |
|
|
|
|
|
|
12
|
|
|
exclude = ('is_staff', 'is_superuser', 'invited_to_groups', ) |
|
13
|
|
|
read_only_fields = ('last_login', 'is_active', 'photo', 'clusters', ) # TODO: serialize invited_to_groups correctly |
|
14
|
|
|
extra_kwargs = {'password': {'write_only': True, 'required': False}} |
|
15
|
|
|
|
|
16
|
|
|
|
|
17
|
|
|
class BasicUserSerializer(serializers.ModelSerializer): |
|
|
|
|
|
|
18
|
|
|
""" |
|
19
|
|
|
Serialize an User without relations. |
|
20
|
|
|
""" |
|
21
|
|
|
class Meta(BasicUserSerializerMeta): |
|
|
|
|
|
|
22
|
|
|
pass |
|
23
|
|
|
|
|
24
|
|
|
photo = ImageSerializer(read_only=True) |
|
25
|
|
|
|
|
26
|
|
|
|
|
27
|
|
|
class BasicUserWithPermsSerializer(BasicUserSerializer): |
|
|
|
|
|
|
28
|
|
|
""" |
|
29
|
|
|
Serialize an User without relations and add current user's permissions on the serialized User. |
|
30
|
|
|
""" |
|
31
|
|
|
class Meta(BasicUserSerializerMeta): |
|
32
|
|
|
pass |
|
33
|
|
|
|
|
34
|
|
|
permissions = DRYPermissionsField(read_only=True) |
|
35
|
|
|
|
|
36
|
|
|
def create(self, fields): |
|
37
|
|
|
from sigma_core.models.group_member import GroupMember |
|
38
|
|
|
from sigma_core.models.cluster import Cluster |
|
39
|
|
|
try: |
|
40
|
|
|
request = self.context['request'] |
|
|
|
|
|
|
41
|
|
|
input_clusters = request.data.get('clusters') |
|
42
|
|
|
if request.user.is_sigma_admin(): |
|
43
|
|
|
fields['clusters'] = Cluster.objects.filter(pk__in=input_clusters).values_list('id', flat=True) |
|
44
|
|
|
else: |
|
45
|
|
|
fields['clusters'] = GroupMember.objects.filter(user=request.user, group__in=input_clusters).values_list('group', flat=True) |
|
46
|
|
|
except ValueError: |
|
|
|
|
|
|
47
|
|
|
raise serializers.ValidationError("Cluster list: bad format") |
|
48
|
|
|
if input_clusters != list(fields['clusters']): |
|
|
|
|
|
|
49
|
|
|
raise serializers.ValidationError("Cluster list: incorrect values") |
|
50
|
|
|
return super().create(fields) |
|
|
|
|
|
|
51
|
|
|
|
|
52
|
|
|
|
|
53
|
|
|
class DetailedUserSerializer(BasicUserSerializer): |
|
|
|
|
|
|
54
|
|
|
""" |
|
55
|
|
|
Serialize full data about an User. |
|
56
|
|
|
""" |
|
57
|
|
|
class Meta(BasicUserSerializerMeta): |
|
|
|
|
|
|
58
|
|
|
pass |
|
59
|
|
|
|
|
60
|
|
|
memberships = GroupMemberSerializer_Group(read_only=True, many=True) |
|
61
|
|
|
|
|
62
|
|
|
|
|
63
|
|
|
class DetailedUserWithPermsSerializer(DetailedUserSerializer): |
|
|
|
|
|
|
64
|
|
|
""" |
|
65
|
|
|
Serialize full data about an User and add current user's permissions on the serialized User. |
|
66
|
|
|
""" |
|
67
|
|
|
class Meta(BasicUserSerializerMeta): |
|
68
|
|
|
pass |
|
69
|
|
|
|
|
70
|
|
|
permissions = DRYPermissionsField(read_only=True) |
|
71
|
|
|
|
|
72
|
|
|
|
|
73
|
|
|
class MyUserDetailsWithPermsSerializer(DetailedUserWithPermsSerializer): |
|
|
|
|
|
|
74
|
|
|
""" |
|
75
|
|
|
Serialize full data about current User (with permissions). |
|
76
|
|
|
""" |
|
77
|
|
|
class Meta(BasicUserSerializerMeta): |
|
78
|
|
|
exclude = ('is_staff', 'is_superuser', ) |
|
79
|
|
|
read_only_fields = BasicUserSerializerMeta.read_only_fields + ('invited_to_groups', ) |
|
80
|
|
|
|