fix for lists api
[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.models
6 import catalogue.models
7 from social import models
8
9
10 class SettingsSerializer(serializers.ModelSerializer):
11     class Meta:
12         model = models.UserProfile
13         fields = ['notifications']
14
15
16 class UserListBooksField(serializers.Field):
17     def to_representation(self, value):
18         return list(value.userlistitem_set.exclude(deleted=True).exclude(book=None).values_list('book__slug', flat=True))
19
20     def to_internal_value(self, value):
21         return {'books': catalogue.models.Book.objects.filter(slug__in=value)}
22
23
24 class UserListSerializerV2(serializers.ModelSerializer):
25     client_id = serializers.CharField(write_only=True, required=False)
26     books = UserListBooksField(source='*', required=False)
27     timestamp = serializers.IntegerField(required=False)
28
29     class Meta:
30         model = models.UserList
31         fields = [
32             'timestamp',
33             'client_id',
34             'name',
35             'slug',
36             'favorites',
37             'deleted',
38             'books',
39         ]
40         read_only_fields = [
41             'favorites',
42             'slug',
43         ]
44         extra_kwargs = {
45             'slug': {
46                 'required': False
47             }
48         }
49
50     def create(self, validated_data):
51         instance = models.UserList.get_by_name(
52             validated_data['user'],
53             validated_data['name'],
54             create=True
55         )
56         if 'books' in validated_data:
57             instance.userlistitem_set.all().delete()
58             for book in validated_data['books']:
59                 instance.append(book)
60         return instance
61
62     def update(self, instance, validated_data):
63         super().update(instance, validated_data)
64         if 'books' in validated_data:
65             instance.userlistitem_set.all().delete()
66             for book in validated_data['books']:
67                 instance.append(instance)
68         return instance
69
70
71 class UserListBooksSerializer(UserListSerializerV2):
72     class Meta:
73         model = models.UserList
74         fields = ['books']
75
76
77 class UserListItemSerializer(serializers.ModelSerializer):
78     client_id = serializers.CharField(write_only=True, required=False)
79     favorites = serializers.BooleanField(read_only=True)
80     list_slug = serializers.SlugRelatedField(
81         queryset=models.UserList.objects.all(),
82         source='list',
83         slug_field='slug',
84         required=False,
85     )
86     timestamp = serializers.IntegerField(required=False)
87     book_slug = serializers.SlugRelatedField(
88         queryset=catalogue.models.Book.objects.all(),
89         source='book',
90         slug_field='slug',
91         required=False,
92         allow_null=True
93     )
94     bookmark = serializers.SlugRelatedField(
95         queryset=bookmarks.models.Bookmark.objects.all(),
96         slug_field='uuid',
97         required=False,
98         allow_null=True
99     )
100     quote = serializers.SlugRelatedField(
101         queryset=bookmarks.models.Quote.objects.all(),
102         slug_field='uuid',
103         required=False,
104         allow_null=True
105     )
106
107     class Meta:
108         model = models.UserListItem
109         fields = [
110             'client_id',
111             'uuid',
112             'order',
113             'list_slug',
114             'timestamp',
115             'favorites',
116             'deleted',
117
118             'book_slug',
119             'fragment',
120             'quote',
121             'bookmark',
122             'note',
123         ]
124         extra_kwargs = {
125             'order': {
126                 'required': False
127             }
128         }
129
130
131 class UserListSerializerV3(serializers.ModelSerializer):
132     client_id = serializers.CharField(write_only=True, required=False)
133     timestamp = serializers.IntegerField(required=False)
134
135     class Meta:
136         model = models.UserList
137         fields = [
138             'timestamp',
139             'client_id',
140             'name',
141             'slug',
142             'favorites',
143             'deleted',
144         ]
145         read_only_fields = [
146             'favorites',
147             'slug',
148         ]
149         extra_kwargs = {
150             'slug': {
151                 'required': False
152             }
153         }
154
155     def create(self, validated_data):
156         instance = models.UserList.get_by_name(
157             validated_data['user'],
158             validated_data['name'],
159             create=True
160         )
161         return instance
162
163
164 class ProgressSerializer(serializers.ModelSerializer):
165     book = serializers.HyperlinkedRelatedField(
166         read_only=True,
167         view_name='catalogue_api_book',
168         lookup_field='slug'
169     )
170     book_slug = serializers.SlugRelatedField(
171         queryset=catalogue.models.Book.objects.all(),
172         source='book',
173         slug_field='slug')
174     timestamp = serializers.IntegerField(required=False)
175
176     class Meta:
177         model = models.Progress
178         fields = [
179             'timestamp',
180             'book', 'book_slug', 'last_mode', 'text_percent',
181             'text_anchor',
182             'audio_percent',
183             'audio_timestamp',
184             'implicit_text_percent',
185             'implicit_text_anchor',
186             'implicit_audio_percent',
187             'implicit_audio_timestamp',
188         ]
189         extra_kwargs = {
190             'last_mode': {
191                 'required': False,
192                 'default': 'text',
193             }
194         }
195
196
197 class TextProgressSerializer(serializers.ModelSerializer):
198     class Meta:
199         model = models.Progress
200         fields = [
201                 'text_percent',
202                 'text_anchor',
203                 ]
204         read_only_fields = ['text_percent']
205
206 class AudioProgressSerializer(serializers.ModelSerializer):
207     class Meta:
208         model = models.Progress
209         fields = ['audio_percent', 'audio_timestamp']
210         read_only_fields = ['audio_percent']