X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/0c3e8f92c425a22c1b9da737db89977d31312353..69a96efdb07b874a503845692a4cdb9355458beb:/apps/api/handlers.py?ds=sidebyside diff --git a/apps/api/handlers.py b/apps/api/handlers.py index 437b3be4c..b436024b1 100644 --- a/apps/api/handlers.py +++ b/apps/api/handlers.py @@ -12,11 +12,13 @@ from django.core.cache import get_cache from django.core.urlresolvers import reverse from piston.handler import AnonymousBaseHandler, BaseHandler from piston.utils import rc +from sorl.thumbnail import default from api.helpers import timestamp from api.models import Deleted from catalogue.forms import BookImportForm -from catalogue.models import Book, Tag, BookMedia, Fragment +from catalogue.models import Book, Tag, BookMedia, Fragment, Collection +from catalogue.utils import related_tag_name from picture.models import Picture from picture.forms import PictureImportForm @@ -104,10 +106,6 @@ class BookMediaHandler(BaseHandler): class BookDetails(object): """Custom fields used for representing Books.""" - @classmethod - def author(cls, book): - return ",".join(t[0] for t in book.related_info()['tags'].get('author', [])) - @classmethod def href(cls, book): """ Returns an URI for a Book in the API. """ @@ -134,6 +132,11 @@ class BookDetails(object): def cover(cls, book): return MEDIA_BASE + book.cover.url if book.cover else '' + @classmethod + def cover_thumb(cls, book): + return MEDIA_BASE + default.backend.get_thumbnail( + book.cover, "139x193").url if book.cover else '' + class BookDetailHandler(BaseHandler, BookDetails): @@ -143,7 +146,7 @@ class BookDetailHandler(BaseHandler, BookDetails): """ allowed_methods = ['GET'] fields = ['title', 'parent', 'children'] + Book.formats + [ - 'media', 'url', 'cover'] + [ + 'media', 'url', 'cover', 'cover_thumb'] + [ category_plural[c] for c in book_tag_categories] @piwik_track @@ -162,7 +165,12 @@ class AnonymousBooksHandler(AnonymousBaseHandler, BookDetails): """ allowed_methods = ('GET',) model = Book - fields = ['author', 'href', 'title', 'url', 'cover'] + fields = book_tag_categories + ['href', 'title', 'url', 'cover', 'cover_thumb'] + + @classmethod + def genres(cls, book): + """ Returns all media for a book. """ + return book.tags.filter(category='genre') @piwik_track def read(self, request, tags, top_level=False, @@ -192,9 +200,9 @@ class AnonymousBooksHandler(AnonymousBaseHandler, BookDetails): if top_level: books = books.filter(parent=None) if audiobooks: - books = books.filter(media__type='mp3') + books = books.filter(media__type='mp3').distinct() if daisy: - books = books.filter(media__type='daisy') + books = books.filter(media__type='daisy').distinct() if books.exists(): return books @@ -208,7 +216,7 @@ class AnonymousBooksHandler(AnonymousBaseHandler, BookDetails): class BooksHandler(BookDetailHandler): allowed_methods = ('GET', 'POST') model = Book - fields = ['author', 'href', 'title', 'url'] + fields = book_tag_categories + ['href', 'title', 'url', 'cover', 'cover_thumb'] anonymous = AnonymousBooksHandler def create(self, request, *args, **kwargs): @@ -224,14 +232,24 @@ class BooksHandler(BookDetailHandler): return rc.NOT_FOUND +class EBooksHandler(AnonymousBooksHandler): + fields = ('author', 'href', 'title', 'cover') + tuple(Book.ebook_formats) + + # add categorized tags fields for Book def _tags_getter(category): @classmethod def get_tags(cls, book): return book.tags.filter(category=category) return get_tags +def _tag_getter(category): + @classmethod + def get_tag(cls, book): + return ", ".join(related_tag_name(t) for t in book.related_info()['tags'].get(category, [])) + return get_tag for plural, singular in category_singular.items(): setattr(BookDetails, plural, _tags_getter(singular)) + setattr(BookDetails, singular, _tag_getter(singular)) # add fields for files in Book def _file_getter(format): @@ -248,6 +266,52 @@ for format in Book.formats: setattr(BookDetails, format, _file_getter(format)) +class CollectionDetails(object): + """Custom Collection fields.""" + + @classmethod + def href(cls, collection): + """ Returns URI in the API for the collection. """ + + return API_BASE + reverse("api_collection", args=[collection.slug]) + + @classmethod + def url(cls, collection): + """ Returns URL on the site. """ + + return WL_BASE + collection.get_absolute_url() + + @classmethod + def books(cls, collection): + return Book.objects.filter(collection.get_query()) + + + +class CollectionDetailHandler(BaseHandler, CollectionDetails): + allowed_methods = ('GET',) + fields = ['url', 'title', 'description', 'books'] + + @piwik_track + def read(self, request, slug): + print slug + """ Returns details of a collection, identified by slug. """ + try: + return Collection.objects.get(slug=slug) + except Collection.DoesNotExist: + return rc.NOT_FOUND + + +class CollectionsHandler(BaseHandler, CollectionDetails): + allowed_methods = ('GET',) + model = Collection + fields = ['url', 'href', 'title'] + + @piwik_track + def read(self, request): + """ Returns all collections. """ + return Collection.objects.all() + + class TagDetails(object): """Custom Tag fields."""