Custom cover support in Librarian.
[wolnelektury.git] / apps / api / handlers.py
index be5993c..b436024 100644 (file)
@@ -17,7 +17,8 @@ from sorl.thumbnail import default
 from api.helpers import timestamp
 from api.models import Deleted
 from catalogue.forms import BookImportForm
 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 picture.models import Picture
 from picture.forms import PictureImportForm
 
@@ -105,10 +106,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. """
@@ -138,7 +135,7 @@ class BookDetails(object):
     @classmethod
     def cover_thumb(cls, book):
         return MEDIA_BASE + default.backend.get_thumbnail(
     @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 +165,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 +216,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 +242,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):
@@ -258,6 +266,52 @@ for format in Book.formats:
     setattr(BookDetails, format, _file_getter(format))
 
 
     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."""
 
 class TagDetails(object):
     """Custom Tag fields."""