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.models
6 import catalogue.models
7 from social import models
10 class SettingsSerializer(serializers.ModelSerializer):
12 model = models.UserProfile
13 fields = ['notifications']
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))
20 def to_internal_value(self, value):
21 return {'books': catalogue.models.Book.objects.filter(slug__in=value)}
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)
30 model = models.UserList
50 def create(self, validated_data):
51 instance = models.UserList.get_by_name(
52 validated_data['user'],
53 validated_data['name'],
56 if 'books' in validated_data:
57 instance.userlistitem_set.all().delete()
58 for book in validated_data['books']:
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)
71 class UserListBooksSerializer(UserListSerializerV2):
73 model = models.UserList
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(),
86 timestamp = serializers.IntegerField(required=False)
87 book_slug = serializers.SlugRelatedField(
88 queryset=catalogue.models.Book.objects.all(),
94 bookmark = serializers.SlugRelatedField(
95 queryset=bookmarks.models.Bookmark.objects.all(),
100 quote = serializers.SlugRelatedField(
101 queryset=bookmarks.models.Quote.objects.all(),
108 model = models.UserListItem
131 class UserListSerializerV3(serializers.ModelSerializer):
132 client_id = serializers.CharField(write_only=True, required=False)
133 timestamp = serializers.IntegerField(required=False)
136 model = models.UserList
155 def create(self, validated_data):
156 instance = models.UserList.get_by_name(
157 validated_data['user'],
158 validated_data['name'],
164 class ProgressSerializer(serializers.ModelSerializer):
165 book = serializers.HyperlinkedRelatedField(
167 view_name='catalogue_api_book',
170 book_slug = serializers.SlugRelatedField(
171 queryset=catalogue.models.Book.objects.all(),
174 timestamp = serializers.IntegerField(required=False)
177 model = models.Progress
180 'book', 'book_slug', 'last_mode', 'text_percent',
184 'implicit_text_percent',
185 'implicit_text_anchor',
186 'implicit_audio_percent',
187 'implicit_audio_timestamp',
197 class TextProgressSerializer(serializers.ModelSerializer):
199 model = models.Progress
204 read_only_fields = ['text_percent']
206 class AudioProgressSerializer(serializers.ModelSerializer):
208 model = models.Progress
209 fields = ['audio_percent', 'audio_timestamp']
210 read_only_fields = ['audio_percent']