Docker and testing changes
[wolnelektury.git] / src / social / api / serializers.py
1 # This file is part of Wolne Lektury, licensed under GNU Affero GPLv3 or later.
2 # Copyright © Fundacja Wolne Lektury. See NOTICE for more information.
3 #
4 from rest_framework import serializers
5 import bookmarks.api.views
6 import bookmarks.models
7 import catalogue.api.serializers
8 import catalogue.models
9 from social import models
10
11
12 class SettingsSerializer(serializers.ModelSerializer):
13     class Meta:
14         model = models.UserProfile
15         fields = ['notifications']
16
17
18 class UserListBooksField(serializers.Field):
19     def to_representation(self, value):
20         return list(value.userlistitem_set.exclude(deleted=True).exclude(book=None).values_list('book__slug', flat=True))
21
22     def to_internal_value(self, value):
23         return {'books': catalogue.models.Book.objects.filter(slug__in=value)}
24
25
26 class UserListSerializerV2(serializers.ModelSerializer):
27     client_id = serializers.CharField(write_only=True, required=False)
28     books = UserListBooksField(source='*', required=False)
29     timestamp = serializers.IntegerField(required=False)
30
31     class Meta:
32         model = models.UserList
33         fields = [
34             'timestamp',
35             'client_id',
36             'name',
37             'slug',
38             'favorites',
39             'deleted',
40             'books',
41         ]
42         read_only_fields = [
43             'favorites',
44             'slug',
45         ]
46         extra_kwargs = {
47             'slug': {
48                 'required': False
49             }
50         }
51
52     def create(self, validated_data):
53         instance = models.UserList.get_by_name(
54             validated_data['user'],
55             validated_data['name'],
56             create=True
57         )
58         if 'books' in validated_data:
59             instance.userlistitem_set.all().delete()
60             for book in validated_data['books']:
61                 instance.append(book)
62         return instance
63
64     def update(self, instance, validated_data):
65         super().update(instance, validated_data)
66         if 'books' in validated_data:
67             instance.userlistitem_set.all().delete()
68             for book in validated_data['books']:
69                 instance.append(instance)
70         return instance
71
72
73 class UserListBooksSerializer(UserListSerializerV2):
74     class Meta:
75         model = models.UserList
76         fields = ['books']
77
78
79 class UserListItemSerializer(serializers.ModelSerializer):
80     client_id = serializers.CharField(write_only=True, required=False)
81     favorites = serializers.BooleanField(read_only=True)
82     list_slug = serializers.SlugRelatedField(
83         queryset=models.UserList.objects.all(),
84         source='list',
85         slug_field='slug',
86         required=False,
87     )
88     timestamp = serializers.IntegerField(required=False)
89     book_slug = serializers.SlugRelatedField(
90         queryset=catalogue.models.Book.objects.all(),
91         source='book',
92         slug_field='slug',
93         required=False,
94         allow_null=True
95     )
96     bookmark = serializers.SlugRelatedField(
97         queryset=bookmarks.models.Bookmark.objects.all(),
98         slug_field='uuid',
99         required=False,
100         allow_null=True
101     )
102     quote = serializers.SlugRelatedField(
103         queryset=bookmarks.models.Quote.objects.all(),
104         slug_field='uuid',
105         required=False,
106         allow_null=True
107     )
108
109     class Meta:
110         model = models.UserListItem
111         fields = [
112             'client_id',
113             'uuid',
114             'order',
115             'list_slug',
116             'timestamp',
117             'favorites',
118             'deleted',
119
120             'book_slug',
121             'fragment',
122             'quote',
123             'bookmark',
124             'note',
125         ]
126         extra_kwargs = {
127             'order': {
128                 'required': False
129             }
130         }
131
132
133 class UserListItemReadSerializerV3(UserListItemSerializer):
134     book = catalogue.api.serializers.BookSerializer2()
135     bookmark = bookmarks.api.views.BookmarkSerializerV3()
136     class Meta:
137         model = models.UserListItem
138         fields = [
139             'client_id',
140             'uuid',
141             'order',
142             'list_slug',
143             'timestamp',
144             'favorites',
145             'deleted',
146
147             'book',
148             'fragment',
149             'quote',
150             'bookmark',
151             'note',
152         ]
153
154 class UserListItemReadSerializer(UserListItemSerializer):
155     book = catalogue.api.serializers.BookSerializer2()
156     bookmark = bookmarks.api.views.BookmarkSerializer()
157     quote = bookmarks.api.views.QuoteSerializer()
158
159     class Meta:
160         model = models.UserListItem
161         fields = [
162             'client_id',
163             'uuid',
164             'order',
165             'list_slug',
166             'timestamp',
167             'favorites',
168             'deleted',
169
170             'book',
171             'fragment',
172             'quote',
173             'bookmark',
174             'note',
175         ]
176
177
178 class UserListSerializerV3(serializers.ModelSerializer):
179     client_id = serializers.CharField(write_only=True, required=False)
180     timestamp = serializers.IntegerField(required=False)
181
182     class Meta:
183         model = models.UserList
184         fields = [
185             'timestamp',
186             'client_id',
187             'name',
188             'slug',
189             'favorites',
190             'deleted',
191         ]
192         read_only_fields = [
193             'favorites',
194             'slug',
195         ]
196         extra_kwargs = {
197             'slug': {
198                 'required': False
199             }
200         }
201
202     def create(self, validated_data):
203         instance = models.UserList.get_by_name(
204             validated_data['user'],
205             validated_data['name'],
206             create=True
207         )
208         return instance
209
210
211 class ProgressSerializer(serializers.ModelSerializer):
212     book = serializers.HyperlinkedRelatedField(
213         read_only=True,
214         view_name='catalogue_api_book',
215         lookup_field='slug'
216     )
217     book_slug = serializers.SlugRelatedField(
218         queryset=catalogue.models.Book.objects.all(),
219         source='book',
220         slug_field='slug')
221     timestamp = serializers.IntegerField(required=False)
222
223     class Meta:
224         model = models.Progress
225         fields = [
226             'timestamp',
227             'book', 'book_slug', 'last_mode', 'text_percent',
228             'text_anchor',
229             'audio_percent',
230             'audio_timestamp',
231             'implicit_text_percent',
232             'implicit_text_anchor',
233             'implicit_audio_percent',
234             'implicit_audio_timestamp',
235         ]
236         extra_kwargs = {
237             'last_mode': {
238                 'required': False,
239                 'default': 'text',
240             }
241         }
242
243
244 class TextProgressSerializer(serializers.ModelSerializer):
245     class Meta:
246         model = models.Progress
247         fields = [
248                 'text_percent',
249                 'text_anchor',
250                 ]
251         read_only_fields = ['text_percent']
252
253 class AudioProgressSerializer(serializers.ModelSerializer):
254     class Meta:
255         model = models.Progress
256         fields = ['audio_percent', 'audio_timestamp']
257         read_only_fields = ['audio_percent']