X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/7255df395ced6145a654fb6cfc1e673000008a25..0bb67240e8bc535ec703e34262487ba902c91079:/src/api/handlers.py diff --git a/src/api/handlers.py b/src/api/handlers.py index f7b30864d..77728208e 100644 --- a/src/api/handlers.py +++ b/src/api/handlers.py @@ -6,6 +6,7 @@ import json from django.contrib.sites.models import Site from django.core.urlresolvers import reverse +from django.http.response import HttpResponse from django.utils.functional import lazy from django.db import models from piston.handler import AnonymousBaseHandler, BaseHandler @@ -15,6 +16,7 @@ from sorl.thumbnail import default from catalogue.forms import BookImportForm from catalogue.models import Book, Tag, BookMedia, Fragment, Collection from catalogue.models.tag import prefetch_relations +from catalogue.utils import is_subscribed from picture.models import Picture from picture.forms import PictureImportForm @@ -150,9 +152,8 @@ class BookDetails(object): return MEDIA_BASE + book.cover_api_thumb.url if book.cover_api_thumb else '' @classmethod - def cover_source_image(cls, book): - url = book.cover_source() - return url.rstrip('/') + '/file/' + def simple_cover(cls, book): + return MEDIA_BASE + book.simple_cover.url if book.simple_cover else '' class BookDetailHandler(BaseHandler, BookDetails): @@ -162,7 +163,7 @@ class BookDetailHandler(BaseHandler, BookDetails): """ allowed_methods = ['GET'] fields = ['title', 'parent', 'children'] + Book.formats + [ - 'media', 'url', 'cover', 'cover_thumb', 'simple_thumb', 'fragment_data'] + [ + 'media', 'url', 'cover', 'cover_thumb', 'simple_thumb', 'simple_cover', 'fragment_data', 'preview'] + [ category_plural[c] for c in book_tag_categories] @piwik_track @@ -279,11 +280,26 @@ class BooksHandler(BookDetailHandler): return rc.NOT_FOUND +class EpubHandler(BookDetailHandler): + def read(self, request, slug): + if not is_subscribed(request.user): + return rc.FORBIDDEN + try: + book = Book.objects.get(slug=slug) + except Book.DoesNotExist: + return rc.NOT_FOUND + response = HttpResponse(book.get_media('epub')) + return response + + class EBooksHandler(AnonymousBooksHandler): fields = ('author', 'href', 'title', 'cover') + tuple(Book.ebook_formats) + ('slug',) class BookProxy(models.Model): + class Meta: + managed = False + def __init__(self, book, key): self.book = book self.key = key @@ -305,22 +321,23 @@ class QuerySetProxy(models.QuerySet): class FilterBooksHandler(AnonymousBooksHandler): fields = book_tag_categories + [ - 'href', 'title', 'url', 'cover', 'cover_thumb', 'simple_thumb', 'slug', 'key', 'cover_source_image'] + 'href', 'title', 'url', 'cover', 'cover_thumb', 'simple_thumb', 'slug', 'key'] + + def parse_bool(self, s): + if s in ('true', 'false'): + return s == 'true' + else: + return None def read(self, request): key_sep = '$' search_string = request.GET.get('search') - is_lektura = request.GET.get('lektura') - is_audiobook = request.GET.get('audiobook') + is_lektura = self.parse_bool(request.GET.get('lektura')) + is_audiobook = self.parse_bool(request.GET.get('audiobook')) + preview = self.parse_bool(request.GET.get('preview')) after = request.GET.get('after') count = int(request.GET.get('count', 50)) - if is_lektura in ('true', 'false'): - is_lektura = is_lektura == 'true' - else: - is_lektura = None - if is_audiobook in ('true', 'false'): - is_audiobook = is_audiobook == 'true' books = Book.objects.distinct().order_by('slug') if is_lektura is not None: books = books.filter(has_audience=is_lektura) @@ -329,6 +346,8 @@ class FilterBooksHandler(AnonymousBooksHandler): books = books.filter(media__type='mp3') else: books = books.exclude(media__type='mp3') + if preview is not None: + books = books.filter(preview=preview) for key in request.GET: if key in category_singular: category = category_singular[key] @@ -392,18 +411,18 @@ def add_tag_getters(): setattr(BookDetails, plural, _tags_getter(singular)) setattr(BookDetails, singular, _tag_getter(singular)) + add_tag_getters() # add fields for files in Book def _file_getter(book_format): - field = "%s_file" % book_format - @classmethod - def get_file(cls, book): - f = getattr(book, field) - if f: - return MEDIA_BASE + f.url + @staticmethod + def get_file(book): + f_url = book.media_url(book_format) + if f_url: + return MEDIA_BASE + f_url else: return '' return get_file