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 catalogue.models
6 from social import models
9 class SettingsSerializer(serializers.ModelSerializer):
11 model = models.UserProfile
12 fields = ['notifications']
15 class UserListBooksField(serializers.Field):
16 def to_representation(self, value):
17 return list(value.userlistitem_set.exclude(deleted=True).exclude(book=None).values_list('book__slug', flat=True))
19 def to_internal_value(self, value):
20 return {'books': catalogue.models.Book.objects.filter(slug__in=value)}
23 class UserListSerializerV2(serializers.ModelSerializer):
24 client_id = serializers.CharField(write_only=True, required=False)
25 books = UserListBooksField(source='*', required=False)
26 timestamp = serializers.IntegerField(required=False)
29 model = models.UserList
49 def create(self, validated_data):
50 instance = models.UserList.get_by_name(
51 validated_data['user'],
52 validated_data['name'],
55 if 'books' in validated_data:
56 instance.userlistitem_set.all().delete()
57 for book in validated_data['books']:
61 def update(self, instance, validated_data):
62 super().update(instance, validated_data)
63 if 'books' in validated_data:
64 instance.userlistitem_set.all().delete()
65 for book in validated_data['books']:
66 instance.append(instance)
70 class UserListBooksSerializer(UserListSerializerV2):
72 model = models.UserList
76 class UserListItemSerializer(serializers.ModelSerializer):
77 client_id = serializers.CharField(write_only=True, required=False)
78 favorites = serializers.BooleanField(required=False)
79 list_slug = serializers.SlugRelatedField(
80 queryset=models.UserList.objects.all(),
85 timestamp = serializers.IntegerField(required=False)
86 book_slug = serializers.SlugRelatedField(
87 queryset=catalogue.models.Book.objects.all(),
94 model = models.UserListItem
117 class UserListSerializerV3(serializers.ModelSerializer):
118 client_id = serializers.CharField(write_only=True, required=False)
119 timestamp = serializers.IntegerField(required=False)
122 model = models.UserList
141 def create(self, validated_data):
142 instance = models.UserList.get_by_name(
143 validated_data['user'],
144 validated_data['name'],
150 class ProgressSerializer(serializers.ModelSerializer):
151 book = serializers.HyperlinkedRelatedField(
153 view_name='catalogue_api_book',
156 book_slug = serializers.SlugRelatedField(
157 queryset=catalogue.models.Book.objects.all(),
160 timestamp = serializers.IntegerField(required=False)
163 model = models.Progress
166 'book', 'book_slug', 'last_mode', 'text_percent',
170 'implicit_text_percent',
171 'implicit_text_anchor',
172 'implicit_audio_percent',
173 'implicit_audio_timestamp',
183 class TextProgressSerializer(serializers.ModelSerializer):
185 model = models.Progress
190 read_only_fields = ['text_percent']
192 class AudioProgressSerializer(serializers.ModelSerializer):
194 model = models.Progress
195 fields = ['audio_percent', 'audio_timestamp']
196 read_only_fields = ['audio_percent']