More API views migrated.
[wolnelektury.git] / src / catalogue / api / serializers.py
1 from rest_framework import serializers
2 from api.fields import AbsoluteURLField, LegacyMixin
3 from catalogue.models import Book, Collection, Tag, BookMedia, Fragment
4 from .fields import BookLiked, ThumbnailField
5
6
7 class TagSerializer(serializers.ModelSerializer):
8     url = AbsoluteURLField()
9     href = AbsoluteURLField(
10         view_name='catalogue_api_tag',
11         view_args=('category', 'slug')
12     )
13
14     class Meta:
15         model = Tag
16         fields = ['url', 'href', 'name', 'slug']
17
18
19 class TagDetailSerializer(serializers.ModelSerializer):
20     url = AbsoluteURLField()
21
22     class Meta:
23         model = Tag
24         fields = ['name', 'url', 'sort_key', 'description']
25
26
27 class BookSerializer(LegacyMixin, serializers.ModelSerializer):
28     author = serializers.CharField(source='author_unicode')
29     kind = serializers.CharField(source='kind_unicode')
30     epoch = serializers.CharField(source='epoch_unicode')
31     genre = serializers.CharField(source='genre_unicode')
32
33     simple_thumb = serializers.FileField(source='cover_api_thumb')
34     href = AbsoluteURLField(view_name='catalogue_api_book', view_args=['slug'])
35     url = AbsoluteURLField()
36     liked = BookLiked()
37     cover_thumb = ThumbnailField('139x193', source='cover')
38
39     class Meta:
40         model = Book
41         fields = [
42             'kind', 'full_sort_key', 'title', 'url', 'cover_color', 'author',
43             'cover', 'liked', 'epoch', 'href', 'has_audio', 'genre',
44             'simple_thumb', 'slug', 'cover_thumb']
45         legacy_non_null_fields = [
46             'kind', 'author', 'epoch', 'genre',
47             'cover', 'simple_thumb', 'cover_thumb']
48
49
50 class MediaSerializer(LegacyMixin, serializers.ModelSerializer):
51     url = serializers.FileField(source='file')
52
53     class Meta:
54         model = BookMedia
55         fields = ['url', 'director', 'type', 'name', 'artist']
56         legacy_non_null_fields = ['director', 'artist']
57
58
59 class BookDetailSerializer(LegacyMixin, serializers.ModelSerializer):
60     url = AbsoluteURLField()
61
62     authors = TagSerializer(many=True)
63     epochs = TagSerializer(many=True)
64     genres = TagSerializer(many=True)
65     kinds = TagSerializer(many=True)
66
67     fragment_data = serializers.DictField()
68     parent = BookSerializer()
69     children = BookSerializer(many=True)
70
71     xml = AbsoluteURLField(source='xml_url')
72     html = AbsoluteURLField(source='html_url')
73     txt = AbsoluteURLField(source='txt_url')
74     fb2 = AbsoluteURLField(source='fb2_url')
75     epub = AbsoluteURLField(source='epub_url')
76     mobi = AbsoluteURLField(source='mobi_url')
77     pdf = AbsoluteURLField(source='pdf_url')
78     media = MediaSerializer(many=True)
79     cover_thumb = ThumbnailField('139x193', source='cover')
80     simple_thumb = serializers.FileField(source='cover_api_thumb')
81
82     class Meta:
83         model = Book
84         fields = [
85             'title', 'url',
86             'epochs', 'genres', 'kinds', 'authors',
87             'fragment_data', 'children', 'parent', 'preview',
88             'epub', 'mobi', 'pdf', 'html', 'txt', 'fb2', 'xml', 'media', 'audio_length',
89             'cover_color', 'simple_cover', 'cover_thumb', 'cover', 'simple_thumb'
90         ]
91         legacy_non_null_fields = ['html', 'txt', 'fb2', 'epub', 'mobi', 'pdf',
92                                   'cover', 'simple_cover', 'cover_thumb', 'simple_thumb']
93
94
95 class CollectionListSerializer(serializers.ModelSerializer):
96     url = AbsoluteURLField()
97     href = AbsoluteURLField(view_name='collection-detail', view_args=['slug'])
98
99     class Meta:
100         model = Collection
101         fields = ['url', 'href', 'title']
102
103
104 class CollectionSerializer(serializers.ModelSerializer):
105     books = BookSerializer(many=True, source='get_books')
106     url = AbsoluteURLField()
107
108     class Meta:
109         model = Collection
110         fields = ['url', 'books', 'description', 'title']
111
112
113 class FragmentSerializer(serializers.ModelSerializer):
114     book = BookSerializer()
115     url = AbsoluteURLField()
116     href = AbsoluteURLField(source='get_api_url')
117
118     class Meta:
119         model = Fragment
120         fields = ['book', 'url', 'anchor', 'href']
121
122
123 class FragmentDetailSerializer(serializers.ModelSerializer):
124     book = BookSerializer()
125     url = AbsoluteURLField()
126     themes = TagSerializer(many=True)
127
128     class Meta:
129         model = Fragment
130         fields = ['book', 'anchor', 'text', 'url', 'themes']