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 UserListItemReadSerializer(UserListItemSerializer):
134 book = catalogue.api.serializers.BookSerializer2()
135 bookmark = bookmarks.api.views.BookmarkSerializer()
137 model = models.UserListItem
155 class UserListSerializerV3(serializers.ModelSerializer):
156 client_id = serializers.CharField(write_only=True, required=False)
157 timestamp = serializers.IntegerField(required=False)
160 model = models.UserList
179 def create(self, validated_data):
180 instance = models.UserList.get_by_name(
181 validated_data['user'],
182 validated_data['name'],
188 class ProgressSerializer(serializers.ModelSerializer):
189 book = serializers.HyperlinkedRelatedField(
191 view_name='catalogue_api_book',
194 book_slug = serializers.SlugRelatedField(
195 queryset=catalogue.models.Book.objects.all(),
198 timestamp = serializers.IntegerField(required=False)
201 model = models.Progress
204 'book', 'book_slug', 'last_mode', 'text_percent',
208 'implicit_text_percent',
209 'implicit_text_anchor',
210 'implicit_audio_percent',
211 'implicit_audio_timestamp',
221 class TextProgressSerializer(serializers.ModelSerializer):
223 model = models.Progress
228 read_only_fields = ['text_percent']
230 class AudioProgressSerializer(serializers.ModelSerializer):
232 model = models.Progress
233 fields = ['audio_percent', 'audio_timestamp']
234 read_only_fields = ['audio_percent']