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.
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
12 class SettingsSerializer(serializers.ModelSerializer):
14 model = models.UserProfile
15 fields = ['notifications']
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))
22 def to_internal_value(self, value):
23 return {'books': catalogue.models.Book.objects.filter(slug__in=value)}
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)
32 model = models.UserList
52 def create(self, validated_data):
53 instance = models.UserList.get_by_name(
54 validated_data['user'],
55 validated_data['name'],
58 if 'books' in validated_data:
59 instance.userlistitem_set.all().delete()
60 for book in validated_data['books']:
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)
73 class UserListBooksSerializer(UserListSerializerV2):
75 model = models.UserList
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(),
88 timestamp = serializers.IntegerField(required=False)
89 book_slug = serializers.SlugRelatedField(
90 queryset=catalogue.models.Book.objects.all(),
96 bookmark = serializers.SlugRelatedField(
97 queryset=bookmarks.models.Bookmark.objects.all(),
102 quote = serializers.SlugRelatedField(
103 queryset=bookmarks.models.Quote.objects.all(),
110 model = models.UserListItem
133 class UserListItemReadSerializerV3(UserListItemSerializer):
134 book = catalogue.api.serializers.BookSerializer2()
135 bookmark = bookmarks.api.views.BookmarkSerializerV3()
137 model = models.UserListItem
154 class UserListItemReadSerializer(UserListItemSerializer):
155 book = catalogue.api.serializers.BookSerializer2()
156 bookmark = bookmarks.api.views.BookmarkSerializer()
158 model = models.UserListItem
176 class UserListSerializerV3(serializers.ModelSerializer):
177 client_id = serializers.CharField(write_only=True, required=False)
178 timestamp = serializers.IntegerField(required=False)
181 model = models.UserList
200 def create(self, validated_data):
201 instance = models.UserList.get_by_name(
202 validated_data['user'],
203 validated_data['name'],
209 class ProgressSerializer(serializers.ModelSerializer):
210 book = serializers.HyperlinkedRelatedField(
212 view_name='catalogue_api_book',
215 book_slug = serializers.SlugRelatedField(
216 queryset=catalogue.models.Book.objects.all(),
219 timestamp = serializers.IntegerField(required=False)
222 model = models.Progress
225 'book', 'book_slug', 'last_mode', 'text_percent',
229 'implicit_text_percent',
230 'implicit_text_anchor',
231 'implicit_audio_percent',
232 'implicit_audio_timestamp',
242 class TextProgressSerializer(serializers.ModelSerializer):
244 model = models.Progress
249 read_only_fields = ['text_percent']
251 class AudioProgressSerializer(serializers.ModelSerializer):
253 model = models.Progress
254 fields = ['audio_percent', 'audio_timestamp']
255 read_only_fields = ['audio_percent']