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 from api.fields import AbsoluteURLField, LegacyMixin, ThumbnailField
6 from catalogue.models import Book, Collection, Tag, BookMedia, Fragment
7 from .fields import BookLiked, EmbargoURLField
10 class TagSerializer(serializers.ModelSerializer):
11 url = AbsoluteURLField()
12 href = AbsoluteURLField(
13 view_name='catalogue_api_tag',
14 view_args=('category', 'slug')
19 fields = ['url', 'href', 'name', 'slug']
22 class TagDetailSerializer(serializers.ModelSerializer):
23 url = AbsoluteURLField()
28 'name', 'url', 'sort_key',
31 'plural', 'genre_epoch_specific',
32 'adjective_feminine_singular', 'adjective_nonmasculine_plural',
33 'genitive', 'collective_noun',
37 'plural', 'genre_epoch_specific',
38 'adjective_feminine_singular', 'adjective_nonmasculine_plural',
39 'genitive', 'collective_noun',
43 class AuthorItemSerializer(serializers.ModelSerializer):
44 url = AbsoluteURLField()
45 href = AbsoluteURLField(
46 view_name='catalogue_api_author',
53 'id', 'url', 'href', 'name', 'slug'
56 class AuthorSerializer(AuthorItemSerializer):
57 photo_thumb = ThumbnailField('139x193', source='photo')
62 'id', 'url', 'href', 'name', 'slug', 'sort_key', 'description',
63 'genitive', 'photo', 'photo_thumb', 'photo_attribution',
66 class EpochItemSerializer(serializers.ModelSerializer):
67 url = AbsoluteURLField()
68 href = AbsoluteURLField(
69 view_name='catalogue_api_epoch',
74 fields = ['id', 'url', 'href', 'name', 'slug']
76 class EpochSerializer(EpochItemSerializer):
80 'url', 'href', 'name', 'slug', 'sort_key', 'description',
81 'adjective_feminine_singular', 'adjective_nonmasculine_plural',
84 class GenreItemSerializer(serializers.ModelSerializer):
85 url = AbsoluteURLField()
86 href = AbsoluteURLField(
87 view_name='catalogue_api_genre',
92 fields = ['id', 'url', 'href', 'name', 'slug']
94 class GenreSerializer(GenreItemSerializer):
98 'url', 'href', 'name', 'slug', 'sort_key', 'description',
99 'plural', 'genre_epoch_specific',
102 class KindItemSerializer(serializers.ModelSerializer):
103 url = AbsoluteURLField()
104 href = AbsoluteURLField(
105 view_name='catalogue_api_kind',
110 fields = ['id', 'url', 'href', 'name', 'slug']
112 class KindSerializer(KindItemSerializer):
116 'url', 'href', 'name', 'slug', 'sort_key', 'description',
120 class ThemeSerializer(serializers.ModelSerializer):
121 url = AbsoluteURLField()
122 href = AbsoluteURLField(
123 view_name='catalogue_api_theme',
129 'url', 'href', 'name', 'slug', 'sort_key', 'description',
133 class TranslatorSerializer(serializers.Serializer):
134 name = serializers.CharField(source='*')
137 class BookSerializer2(serializers.ModelSerializer):
138 url = AbsoluteURLField()
139 href = AbsoluteURLField(view_name='catalogue_api_book', view_args=['slug'])
140 xml = EmbargoURLField(source='xml_url')
141 html = EmbargoURLField(source='html_url')
142 txt = EmbargoURLField(source='txt_url')
143 fb2 = EmbargoURLField(source='fb2_url')
144 epub = EmbargoURLField(source='epub_url')
145 mobi = EmbargoURLField(source='mobi_url')
146 pdf = EmbargoURLField(source='pdf_url')
148 authors = AuthorItemSerializer(many=True)
149 translators = AuthorItemSerializer(many=True)
150 epochs = EpochItemSerializer(many=True)
151 genres = GenreItemSerializer(many=True)
152 kinds = KindItemSerializer(many=True)
153 parent = serializers.HyperlinkedRelatedField(
155 view_name='catalogue_api_book',
158 audiences = serializers.ListField(source='audiences_pl')
163 'slug', 'title', 'full_sort_key',
164 'href', 'url', 'language',
165 'authors', 'translators',
166 'epochs', 'genres', 'kinds',
169 'epub', 'mobi', 'pdf', 'html', 'txt', 'fb2', 'xml',
170 'cover_thumb', 'cover',
171 'isbn_pdf', 'isbn_epub', 'isbn_mobi',
173 'has_mp3_file', 'has_sync_file',
174 'elevenreader_link', 'content_warnings', 'audiences',
177 class BookSerializer11Labs(serializers.ModelSerializer):
178 url = AbsoluteURLField()
179 href = AbsoluteURLField(view_name='catalogue_api_book', view_args=['slug'])
180 html = EmbargoURLField(source='html_nonotes_url')
182 authors = AuthorItemSerializer(many=True)
183 translators = AuthorItemSerializer(many=True)
184 epochs = EpochItemSerializer(many=True)
185 genres = GenreItemSerializer(many=True)
186 kinds = KindItemSerializer(many=True)
187 parent = serializers.HyperlinkedRelatedField(
189 view_name='catalogue_api_book',
196 'slug', 'title', 'full_sort_key',
197 'href', 'url', 'language',
198 'authors', 'translators',
199 'epochs', 'genres', 'kinds',
203 'cover_thumb', 'cover',
204 'isbn_pdf', 'isbn_epub', 'isbn_mobi',
208 class BookSerializer(LegacyMixin, serializers.ModelSerializer):
209 author = serializers.CharField(source='author_unicode')
210 kind = serializers.CharField(source='kind_unicode')
211 epoch = serializers.CharField(source='epoch_unicode')
212 genre = serializers.CharField(source='genre_unicode')
215 simple_thumb = serializers.FileField(source='cover_api_thumb')
216 href = AbsoluteURLField(view_name='catalogue_api_book', view_args=['slug'])
217 url = AbsoluteURLField()
218 cover_thumb = ThumbnailField('139x193', source='cover')
223 'kind', 'full_sort_key', 'title', 'url', 'cover_color', 'author',
224 'cover', 'epoch', 'href', 'has_audio', 'genre',
225 'simple_thumb', 'slug', 'cover_thumb', 'liked']
226 legacy_non_null_fields = [
227 'kind', 'author', 'epoch', 'genre',
228 'cover', 'simple_thumb', 'cover_thumb']
231 class BookListSerializer(BookSerializer):
232 cover = serializers.CharField()
233 cover_thumb = serializers.CharField()
235 Meta = BookSerializer.Meta
238 class FilterBookListSerializer(BookListSerializer):
239 key = serializers.CharField()
243 fields = BookListSerializer.Meta.fields + ['key']
244 legacy_non_null_fields = BookListSerializer.Meta.legacy_non_null_fields
247 class MediaSerializer(LegacyMixin, serializers.ModelSerializer):
248 url = EmbargoURLField(source='file_url')
252 fields = ['url', 'director', 'type', 'name', 'artist']
253 legacy_non_null_fields = ['director', 'artist']
256 class MediaSerializer2(MediaSerializer):
257 size = serializers.SerializerMethodField()
261 fields = ['url', 'director', 'type', 'name', 'part_name', 'artist', 'duration', 'size']
263 def get_size(self, obj):
267 class BookDetailSerializer(LegacyMixin, serializers.ModelSerializer):
268 url = AbsoluteURLField()
270 authors = TagSerializer(many=True)
271 translators = TranslatorSerializer(many=True)
272 epochs = TagSerializer(many=True)
273 genres = TagSerializer(many=True)
274 kinds = TagSerializer(many=True)
276 fragment_data = serializers.DictField()
277 parent = BookSerializer()
278 children = BookSerializer(many=True)
280 xml = EmbargoURLField(source='xml_url')
281 html = EmbargoURLField(source='html_url')
282 txt = EmbargoURLField(source='txt_url')
283 fb2 = EmbargoURLField(source='fb2_url')
284 epub = EmbargoURLField(source='epub_url')
285 mobi = EmbargoURLField(source='mobi_url')
286 pdf = EmbargoURLField(source='pdf_url')
287 media = MediaSerializer(many=True)
288 cover_thumb = ThumbnailField('139x193', source='cover')
289 simple_thumb = serializers.FileField(source='cover_api_thumb')
294 'title', 'url', 'language',
295 'epochs', 'genres', 'kinds', 'authors', 'translators',
296 'fragment_data', 'children', 'parent', 'preview',
297 'epub', 'mobi', 'pdf', 'html', 'txt', 'fb2', 'xml', 'media', 'audio_length',
298 'cover_color', 'simple_cover', 'cover_thumb', 'cover', 'simple_thumb',
299 'isbn_pdf', 'isbn_epub', 'isbn_mobi',
301 legacy_non_null_fields = ['html', 'txt', 'fb2', 'epub', 'mobi', 'pdf',
302 'cover', 'simple_cover', 'cover_thumb', 'simple_thumb']
305 class BookPreviewSerializer(BookDetailSerializer):
308 fields = BookDetailSerializer.Meta.fields + ['slug']
309 legacy_non_null_fields = BookDetailSerializer.Meta.legacy_non_null_fields
312 class EbookSerializer(BookListSerializer):
313 txt = EmbargoURLField(source='txt_url')
314 fb2 = EmbargoURLField(source='fb2_url')
315 epub = EmbargoURLField(source='epub_url')
316 mobi = EmbargoURLField(source='mobi_url')
317 pdf = EmbargoURLField(source='pdf_url')
321 fields = ['author', 'href', 'title', 'cover', 'slug'] + Book.ebook_formats
322 legacy_non_null_fields = ['author', 'cover'] + Book.ebook_formats
325 class CollectionListSerializer(serializers.ModelSerializer):
326 url = AbsoluteURLField()
327 href = AbsoluteURLField(view_name='collection-detail', view_args=['slug'])
331 fields = ['url', 'href', 'title']
334 class CollectionSerializer(serializers.ModelSerializer):
335 books = BookSerializer(many=True, source='get_books', read_only=True)
336 authors = TagSerializer(many=True, read_only=True)
337 book_slugs = serializers.CharField(write_only=True, required=False)
338 author_slugs = serializers.CharField(write_only=True, required=False)
339 url = AbsoluteURLField()
344 'url', 'books', 'description', 'title',
345 'book_slugs', 'authors', 'author_slugs'
348 def update(self, instance, validated_data):
349 instance = super().update(instance, validated_data)
350 author_slugs = validated_data.get('author_slugs', '').strip().split()
352 authors = Tag.objects.filter(
354 slug__in=author_slugs
358 instance.authors.set(authors)
362 class FragmentSerializer(serializers.ModelSerializer):
363 book = BookSerializer()
364 url = AbsoluteURLField()
365 href = AbsoluteURLField(source='get_api_url')
369 fields = ['book', 'url', 'anchor', 'href']
372 class FragmentDetailSerializer(serializers.ModelSerializer):
373 book = BookSerializer()
374 url = AbsoluteURLField()
375 themes = TagSerializer(many=True)
379 fields = ['book', 'anchor', 'text', 'url', 'themes']
382 class FragmentSerializer2(serializers.ModelSerializer):
383 url = AbsoluteURLField()
384 html = serializers.CharField(source='text')
388 fields = ['anchor', 'html', 'url']
391 class FilterTagSerializer(serializers.ModelSerializer):
394 fields = ['id', 'category', 'name', 'slug']