fix
[wolnelektury.git] / src / catalogue / api / serializers.py
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.
3 #
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
8
9
10 class TagSerializer(serializers.ModelSerializer):
11     url = AbsoluteURLField()
12     href = AbsoluteURLField(
13         view_name='catalogue_api_tag',
14         view_args=('category', 'slug')
15     )
16
17     class Meta:
18         model = Tag
19         fields = ['url', 'href', 'name', 'slug']
20
21
22 class TagDetailSerializer(serializers.ModelSerializer):
23     url = AbsoluteURLField()
24
25     class Meta:
26         model = Tag
27         fields = [
28             'name', 'url', 'sort_key',
29             'description',
30             'description_pl',
31             'plural', 'genre_epoch_specific',
32             'adjective_feminine_singular', 'adjective_nonmasculine_plural',
33             'genitive', 'collective_noun',
34         ]
35         write_only_fields = [
36             'description_pl',
37             'plural', 'genre_epoch_specific',
38             'adjective_feminine_singular', 'adjective_nonmasculine_plural',
39             'genitive', 'collective_noun',
40         ]
41
42
43 class AuthorItemSerializer(serializers.ModelSerializer):
44     url = AbsoluteURLField()
45     href = AbsoluteURLField(
46         view_name='catalogue_api_author',
47         view_args=('slug',)
48     )
49
50     class Meta:
51         model = Tag
52         fields = [
53             'url', 'href', 'name'
54         ]
55
56 class AuthorSerializer(AuthorItemSerializer):
57     photo_thumb = ThumbnailField('139x193', source='photo')
58
59     class Meta:
60         model = Tag
61         fields = [
62             'url', 'href', 'name', 'slug', 'sort_key', 'description',
63             'genitive', 'photo', 'photo_thumb', 'photo_attribution',
64         ]
65
66 class EpochItemSerializer(serializers.ModelSerializer):
67     url = AbsoluteURLField()
68     href = AbsoluteURLField(
69         view_name='catalogue_api_epoch',
70         view_args=('slug',)
71     )
72     class Meta:
73         model = Tag
74         fields = ['url', 'href', 'name']
75
76 class EpochSerializer(EpochItemSerializer):
77     class Meta:
78         model = Tag
79         fields = [
80             'url', 'href', 'name', 'slug', 'sort_key', 'description',
81             'adjective_feminine_singular', 'adjective_nonmasculine_plural',
82         ]
83
84 class GenreItemSerializer(serializers.ModelSerializer):
85     url = AbsoluteURLField()
86     href = AbsoluteURLField(
87         view_name='catalogue_api_genre',
88         view_args=('slug',)
89     )
90     class Meta:
91         model = Tag
92         fields = ['url', 'href', 'name']
93
94 class GenreSerializer(GenreItemSerializer):
95     class Meta:
96         model = Tag
97         fields = [
98             'url', 'href', 'name', 'slug', 'sort_key', 'description',
99             'plural', 'genre_epoch_specific',
100         ]
101
102 class KindItemSerializer(serializers.ModelSerializer):
103     url = AbsoluteURLField()
104     href = AbsoluteURLField(
105         view_name='catalogue_api_kind',
106         view_args=('slug',)
107     )
108     class Meta:
109         model = Tag
110         fields = ['url', 'href', 'name']
111
112 class KindSerializer(KindItemSerializer):
113     class Meta:
114         model = Tag
115         fields = [
116             'url', 'href', 'name', 'slug', 'sort_key', 'description',
117             'collective_noun',
118         ]
119
120
121 class TranslatorSerializer(serializers.Serializer):
122     name = serializers.CharField(source='*')
123
124
125 class BookSerializer2(serializers.ModelSerializer):
126     url = AbsoluteURLField()
127     href = AbsoluteURLField(view_name='catalogue_api_book', view_args=['slug'])
128     xml = EmbargoURLField(source='xml_url')
129     html = EmbargoURLField(source='html_url')
130     txt = EmbargoURLField(source='txt_url')
131     fb2 = EmbargoURLField(source='fb2_url')
132     epub = EmbargoURLField(source='epub_url')
133     mobi = EmbargoURLField(source='mobi_url')
134     pdf = EmbargoURLField(source='pdf_url')
135
136     authors = AuthorItemSerializer(many=True)
137     translators = AuthorItemSerializer(many=True)
138     epochs = EpochItemSerializer(many=True)
139     genres = GenreItemSerializer(many=True)
140     kinds = KindItemSerializer(many=True)
141     parent = serializers.HyperlinkedRelatedField(
142         read_only=True,
143         view_name='catalogue_api_book',
144         lookup_field='slug'
145     )
146
147     class Meta:
148         model = Book
149         fields = [
150             'slug', 'title', 'full_sort_key',
151             'href', 'url', 'language',
152             'authors', 'translators',
153             'epochs', 'genres', 'kinds',
154             #'children',
155             'parent', 'preview',
156             'epub', 'mobi', 'pdf', 'html', 'txt', 'fb2', 'xml',
157             'cover_thumb', 'cover',
158             'isbn_pdf', 'isbn_epub', 'isbn_mobi',
159             'abstract',
160             'has_mp3_file',
161         ]
162
163 class BookSerializer11Labs(serializers.ModelSerializer):
164     url = AbsoluteURLField()
165     href = AbsoluteURLField(view_name='catalogue_api_book', view_args=['slug'])
166     html = EmbargoURLField(source='html_nonotes_url')
167
168     authors = AuthorItemSerializer(many=True)
169     translators = AuthorItemSerializer(many=True)
170     epochs = EpochItemSerializer(many=True)
171     genres = GenreItemSerializer(many=True)
172     kinds = KindItemSerializer(many=True)
173     parent = serializers.HyperlinkedRelatedField(
174         read_only=True,
175         view_name='catalogue_api_book',
176         lookup_field='slug'
177     )
178
179     class Meta:
180         model = Book
181         fields = [
182             'slug', 'title', 'full_sort_key',
183             'href', 'url', 'language',
184             'authors', 'translators',
185             'epochs', 'genres', 'kinds',
186             #'children',
187             'parent', 'preview',
188             'html',
189             'cover_thumb', 'cover',
190             'isbn_pdf', 'isbn_epub', 'isbn_mobi',
191         ]
192
193
194 class BookSerializer(LegacyMixin, serializers.ModelSerializer):
195     author = serializers.CharField(source='author_unicode')
196     kind = serializers.CharField(source='kind_unicode')
197     epoch = serializers.CharField(source='epoch_unicode')
198     genre = serializers.CharField(source='genre_unicode')
199     liked = BookLiked()
200
201     simple_thumb = serializers.FileField(source='cover_api_thumb')
202     href = AbsoluteURLField(view_name='catalogue_api_book', view_args=['slug'])
203     url = AbsoluteURLField()
204     cover_thumb = ThumbnailField('139x193', source='cover')
205
206     class Meta:
207         model = Book
208         fields = [
209             'kind', 'full_sort_key', 'title', 'url', 'cover_color', 'author',
210             'cover', 'epoch', 'href', 'has_audio', 'genre',
211             'simple_thumb', 'slug', 'cover_thumb', 'liked']
212         legacy_non_null_fields = [
213             'kind', 'author', 'epoch', 'genre',
214             'cover', 'simple_thumb', 'cover_thumb']
215
216
217 class BookListSerializer(BookSerializer):
218     cover = serializers.CharField()
219     cover_thumb = serializers.CharField()
220
221     Meta = BookSerializer.Meta
222
223
224 class FilterBookListSerializer(BookListSerializer):
225     key = serializers.CharField()
226
227     class Meta:
228         model = Book
229         fields = BookListSerializer.Meta.fields + ['key']
230         legacy_non_null_fields = BookListSerializer.Meta.legacy_non_null_fields
231
232
233 class MediaSerializer(LegacyMixin, serializers.ModelSerializer):
234     url = EmbargoURLField(source='file_url')
235
236     class Meta:
237         model = BookMedia
238         fields = ['url', 'director', 'type', 'name', 'artist']
239         legacy_non_null_fields = ['director', 'artist']
240
241
242 class MediaSerializer2(MediaSerializer):
243     size = serializers.SerializerMethodField()
244
245     class Meta:
246         model = BookMedia
247         fields = ['url', 'director', 'type', 'name', 'part_name', 'artist', 'duration', 'size']
248
249     def get_size(self, obj):
250         return obj.file.size
251
252
253 class BookDetailSerializer(LegacyMixin, serializers.ModelSerializer):
254     url = AbsoluteURLField()
255
256     authors = TagSerializer(many=True)
257     translators = TranslatorSerializer(many=True)
258     epochs = TagSerializer(many=True)
259     genres = TagSerializer(many=True)
260     kinds = TagSerializer(many=True)
261
262     fragment_data = serializers.DictField()
263     parent = BookSerializer()
264     children = BookSerializer(many=True)
265
266     xml = EmbargoURLField(source='xml_url')
267     html = EmbargoURLField(source='html_url')
268     txt = EmbargoURLField(source='txt_url')
269     fb2 = EmbargoURLField(source='fb2_url')
270     epub = EmbargoURLField(source='epub_url')
271     mobi = EmbargoURLField(source='mobi_url')
272     pdf = EmbargoURLField(source='pdf_url')
273     media = MediaSerializer(many=True)
274     cover_thumb = ThumbnailField('139x193', source='cover')
275     simple_thumb = serializers.FileField(source='cover_api_thumb')
276
277     class Meta:
278         model = Book
279         fields = [
280             'title', 'url', 'language',
281             'epochs', 'genres', 'kinds', 'authors', 'translators',
282             'fragment_data', 'children', 'parent', 'preview',
283             'epub', 'mobi', 'pdf', 'html', 'txt', 'fb2', 'xml', 'media', 'audio_length',
284             'cover_color', 'simple_cover', 'cover_thumb', 'cover', 'simple_thumb',
285             'isbn_pdf', 'isbn_epub', 'isbn_mobi',
286         ]
287         legacy_non_null_fields = ['html', 'txt', 'fb2', 'epub', 'mobi', 'pdf',
288                                   'cover', 'simple_cover', 'cover_thumb', 'simple_thumb']
289
290
291 class BookPreviewSerializer(BookDetailSerializer):
292     class Meta:
293         model = Book
294         fields = BookDetailSerializer.Meta.fields + ['slug']
295         legacy_non_null_fields = BookDetailSerializer.Meta.legacy_non_null_fields
296
297
298 class EbookSerializer(BookListSerializer):
299     txt = EmbargoURLField(source='txt_url')
300     fb2 = EmbargoURLField(source='fb2_url')
301     epub = EmbargoURLField(source='epub_url')
302     mobi = EmbargoURLField(source='mobi_url')
303     pdf = EmbargoURLField(source='pdf_url')
304
305     class Meta:
306         model = Book
307         fields = ['author', 'href', 'title', 'cover', 'slug'] + Book.ebook_formats
308         legacy_non_null_fields = ['author', 'cover'] + Book.ebook_formats
309
310
311 class CollectionListSerializer(serializers.ModelSerializer):
312     url = AbsoluteURLField()
313     href = AbsoluteURLField(view_name='collection-detail', view_args=['slug'])
314
315     class Meta:
316         model = Collection
317         fields = ['url', 'href', 'title']
318
319
320 class CollectionSerializer(serializers.ModelSerializer):
321     books = BookSerializer(many=True, source='get_books', read_only=True)
322     authors = TagSerializer(many=True, read_only=True)
323     book_slugs = serializers.CharField(write_only=True, required=False)
324     author_slugs = serializers.CharField(write_only=True, required=False)
325     url = AbsoluteURLField()
326
327     class Meta:
328         model = Collection
329         fields = [
330             'url', 'books', 'description', 'title',
331             'book_slugs', 'authors', 'author_slugs'
332         ]
333
334     def update(self, instance, validated_data):
335         instance = super().update(instance, validated_data)
336         author_slugs = validated_data.get('author_slugs', '').strip().split()
337         if author_slugs:
338             authors = Tag.objects.filter(
339                 category='author',
340                 slug__in=author_slugs
341             )
342         else:
343             authors = []
344         instance.authors.set(authors)
345         return instance
346
347
348 class FragmentSerializer(serializers.ModelSerializer):
349     book = BookSerializer()
350     url = AbsoluteURLField()
351     href = AbsoluteURLField(source='get_api_url')
352
353     class Meta:
354         model = Fragment
355         fields = ['book', 'url', 'anchor', 'href']
356
357
358 class FragmentDetailSerializer(serializers.ModelSerializer):
359     book = BookSerializer()
360     url = AbsoluteURLField()
361     themes = TagSerializer(many=True)
362
363     class Meta:
364         model = Fragment
365         fields = ['book', 'anchor', 'text', 'url', 'themes']
366
367
368 class FragmentSerializer2(serializers.ModelSerializer):
369     url = AbsoluteURLField()
370     html = serializers.CharField(source='text')
371
372     class Meta:
373         model = Fragment
374         fields = ['anchor', 'html', 'url']
375
376
377 class FilterTagSerializer(serializers.ModelSerializer):
378     class Meta:
379         model = Tag
380         fields = ['id', 'category', 'name']