Cleaning: timezone issues, deprecated urls.py imports, missing notes.
[wolnelektury.git] / apps / api / handlers.py
index 7f74c19..c118d95 100644 (file)
@@ -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.
 # -*- 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
 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.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
 from piston.handler import AnonymousBaseHandler, BaseHandler
 from piston.utils import rc
 from sorl.thumbnail import default
@@ -18,8 +19,10 @@ from api.helpers import timestamp
 from api.models import Deleted
 from catalogue.forms import BookImportForm
 from catalogue.models import Book, Tag, BookMedia, Fragment, Collection
 from api.models import Deleted
 from catalogue.forms import BookImportForm
 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 picture.models import Picture
 from picture.forms import PictureImportForm
+from wolnelektury.utils import tz
 
 from stats.utils import piwik_track
 
 
 from stats.utils import piwik_track
 
@@ -105,10 +108,6 @@ class BookMediaHandler(BaseHandler):
 class BookDetails(object):
     """Custom fields used for representing Books."""
 
 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. """
     @classmethod
     def href(cls, book):
         """ Returns an URI for a Book in the API. """
@@ -168,7 +167,12 @@ class AnonymousBooksHandler(AnonymousBaseHandler, BookDetails):
     """
     allowed_methods = ('GET',)
     model = Book
     """
     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,
 
     @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
 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):
     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 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))
 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):
 
 # add fields for files in Book
 def _file_getter(format):
@@ -458,7 +468,7 @@ class CatalogueHandler(BaseHandler):
         """
         # set to five minutes ago, to avoid concurrency issues
         if t is None:
         """
         # 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)
 
         # set to whole second in case DB supports something smaller
         return t.replace(microsecond=0)
 
@@ -529,7 +539,7 @@ class CatalogueHandler(BaseHandler):
 
     @classmethod
     def book_changes(cls, request=None, since=0, until=None, fields=None):
 
     @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 = {
         until = cls.until(until)
 
         changes = {
@@ -595,7 +605,7 @@ class CatalogueHandler(BaseHandler):
 
     @classmethod
     def tag_changes(cls, request=None, since=0, until=None, fields=None, categories=None):
 
     @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 = {
         until = cls.until(until)
 
         changes = {