Add sellable flag for audiobooks.
[wolnelektury.git] / src / partners / api / views.py
1 from django.utils.decorators import method_decorator
2 from django.views.decorators.cache import never_cache
3 from rest_framework.generics import (ListAPIView, get_object_or_404)
4 from rest_framework import serializers
5 from api.fields import AbsoluteURLField
6 from catalogue.models import Book
7 from catalogue.api.fields import EmbargoURLField
8 from catalogue.api.serializers import BookSerializer2
9 from partners import models
10
11
12
13
14 class PartnerBookSerializer(BookSerializer2):
15     price = serializers.SerializerMethodField()
16
17     class Meta:
18         model = Book
19         fields = [
20             'slug', 'title', 'full_sort_key',
21             'href', 'url', 'language',
22             'authors', 'translators',
23             'epochs', 'genres', 'kinds',
24             'children',
25             'parent', 'preview',
26             'epub', 'mobi', 'pdf', 'html', 'txt', 'fb2', 'xml',
27             'cover_thumb', 'cover',
28             'isbn_pdf', 'isbn_epub', 'isbn_mobi',
29             'abstract',
30             'has_mp3_file', 'has_sync_file',
31             'elevenreader_link', 'content_warnings', 'audiences',
32             'changed_at', 'read_time', 'pages', 'redakcja',
33             'price',
34         ]
35
36     def get_price(self, obj):
37         if obj.pages is None:
38             return None
39         return self.context['partner'].get_price(obj.pages)
40
41
42 class PartnerAudiobookSerializer(BookSerializer2):
43     price = serializers.SerializerMethodField()
44     duration = serializers.SerializerMethodField()
45     files = serializers.SerializerMethodField()
46
47     class Meta:
48         model = Book
49         fields = [
50             'slug', 'title',
51             'href', 'url', 'language',
52             'authors', 'translators',
53             'epochs', 'genres', 'kinds',
54             'files',
55             'cover',
56             'isbn_mp3',
57             'abstract',
58             'content_warnings', 'audiences',
59             'changed_at', 'duration',
60             'price',
61         ]
62
63     def get_duration(self, obj):
64         return obj.get_audiobooks(True)[2]
65
66     def get_files(self, obj):
67         def get_for_single(b):
68             fs = []
69             for m in b.media.filter(type='mp3'):
70                 fs.append({
71                     "name": m.name,
72                     "part_name": m.part_name,
73                     "url": 'https://wolnelektury.pl' + m.file.url,
74                 })
75             for c in b.get_children():
76                 fs.extend(get_for_single(c))
77             return fs
78         return get_for_single(obj)
79
80     def get_price(self, obj):
81         duration = obj.get_audiobooks(True, True)[2]
82         if not duration:
83             return None
84         duration /= 60
85         return self.context['partner'].get_audio_price(obj.pages)
86
87
88 @method_decorator(never_cache, name='dispatch')
89 class PartnerBooksView(ListAPIView):
90     serializer_class = PartnerBookSerializer
91
92     def get_serializer_context(self):
93         ctx = super().get_serializer_context()
94         ctx['partner'] = get_object_or_404(models.Partner, key=self.kwargs['key'])
95         return ctx
96
97     def get_queryset(self):
98         return Book.objects.filter(parent=None).filter(can_sell=True).exclude(pages=None)
99
100
101 @method_decorator(never_cache, name='dispatch')
102 class PartnerAudiobooksView(ListAPIView):
103     serializer_class = PartnerAudiobookSerializer
104
105     def get_serializer_context(self):
106         ctx = super().get_serializer_context()
107         ctx['partner'] = get_object_or_404(models.Partner, key=self.kwargs['key'])
108         return ctx
109
110     def get_queryset(self):
111         return Book.objects.filter(parent=None, can_sell_mp3=True).exclude(isbn_mp3='')