X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/06aa9a0cfb91249b55aafe26967730c3ea29ad96..99f6dd4f1ff0390de9a9bbd4e3352b953cb9a235:/apps/api/handlers.py diff --git a/apps/api/handlers.py b/apps/api/handlers.py index be5993cd9..c118d95df 100644 --- a/apps/api/handlers.py +++ b/apps/api/handlers.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later. # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. - +# from datetime import datetime, timedelta import json from urlparse import urljoin @@ -10,6 +10,7 @@ from django.conf import settings from django.contrib.sites.models import Site from django.core.cache import get_cache from django.core.urlresolvers import reverse +from django.utils.timezone import utc from piston.handler import AnonymousBaseHandler, BaseHandler from piston.utils import rc from sorl.thumbnail import default @@ -17,9 +18,11 @@ 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 +from wolnelektury.utils import tz from stats.utils import piwik_track @@ -105,10 +108,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. """ @@ -138,7 +137,7 @@ class BookDetails(object): @classmethod def cover_thumb(cls, book): return MEDIA_BASE + default.backend.get_thumbnail( - book.cover, "139x193").url + book.cover, "139x193").url if book.cover else '' @@ -168,7 +167,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, @@ -214,7 +218,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): @@ -240,8 +244,14 @@ def _tags_getter(category): 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): @@ -258,6 +268,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.""" @@ -412,7 +468,7 @@ class CatalogueHandler(BaseHandler): """ # set to five minutes ago, to avoid concurrency issues if t is None: - t = datetime.now() - timedelta(seconds=settings.API_WAIT) + t = datetime.utcnow().replace(tzinfo=utc) - timedelta(seconds=settings.API_WAIT) # set to whole second in case DB supports something smaller return t.replace(microsecond=0) @@ -483,7 +539,7 @@ class CatalogueHandler(BaseHandler): @classmethod def book_changes(cls, request=None, since=0, until=None, fields=None): - since = datetime.fromtimestamp(int(since)) + since = datetime.fromtimestamp(int(since), tz) until = cls.until(until) changes = { @@ -549,7 +605,7 @@ class CatalogueHandler(BaseHandler): @classmethod def tag_changes(cls, request=None, since=0, until=None, fields=None, categories=None): - since = datetime.fromtimestamp(int(since)) + since = datetime.fromtimestamp(int(since), tz) until = cls.until(until) changes = {