1 import logging |
1 import logging |
2 |
2 |
|
3 from django.contrib.auth import get_user_model |
3 from django.contrib.auth.models import Group |
4 from django.contrib.auth.models import Group |
4 from rest_framework import serializers |
5 from rest_framework import serializers |
5 |
6 |
6 logger = logging.getLogger(__name__) |
7 logger = logging.getLogger(__name__) |
7 |
8 |
|
9 User = get_user_model() |
|
10 |
8 class GroupSerializer(serializers.ModelSerializer): |
11 class GroupSerializer(serializers.ModelSerializer): |
|
12 owner = serializers.CharField(source='profile.owner.username', read_only=True) |
|
13 description = serializers.CharField(source='profile.description') |
|
14 |
9 class Meta: |
15 class Meta: |
10 model = Group |
16 model = Group |
11 fields = '__all__' |
17 fields = ['name', 'owner', 'description'] |
|
18 |
|
19 |
|
20 class DetailGroupSerializer(GroupSerializer): |
|
21 users = serializers.SlugRelatedField( |
|
22 many=True, |
|
23 read_only=True, |
|
24 slug_field='username', |
|
25 source='user_set' |
|
26 ) |
|
27 |
|
28 class Meta: |
|
29 model = Group |
|
30 fields = ['name', 'owner', 'description', 'users'] |
|
31 |
|
32 class WriteGroupSerializer(serializers.ModelSerializer): |
|
33 ''' |
|
34 Serializers for writing groups. |
|
35 ''' |
|
36 |
|
37 description = serializers.CharField(source='profile.description') |
|
38 users = serializers.SlugRelatedField( |
|
39 many=True, |
|
40 slug_field='username', |
|
41 source='user_set', |
|
42 queryset=User.objects.all(), |
|
43 default=[] |
|
44 ) |
|
45 |
|
46 class Meta: |
|
47 model = Group |
|
48 fields = ['name', 'description', 'users'] |
|
49 |
|
50 |
|
51 def create(self, validated_data): |
|
52 profile_data = validated_data.pop('profile', None) |
|
53 |
|
54 group = super().create(validated_data) |
|
55 |
|
56 if profile_data is not None: |
|
57 group.profile.description = profile_data.get('description') |
|
58 |
|
59 user = None |
|
60 request = self.context.get("request") |
|
61 if request and hasattr(request, "user"): |
|
62 user = request.user |
|
63 group.user_set.add(user) |
|
64 group.save() |
|
65 group.profile.owner = user |
|
66 group.profile.save() |
|
67 |
|
68 return group |
|
69 |
|
70 def update(self, instance, validated_data): |
|
71 profile_data = validated_data.pop('profile', None) |
|
72 group = super().update(instance, validated_data) |
|
73 |
|
74 if profile_data is not None: |
|
75 group.profile.description = profile_data.get('description') |
|
76 group.profile.save() |
|
77 |
|
78 # check that owner is still in user list |
|
79 if group.profile.owner and group.profile.owner not in group.user_set.all(): |
|
80 group.user_set.add(group.profile.owner) |
|
81 |
|
82 return group |