closes #2843: collections in API
authorRadek Czajka <radoslaw.czajka@nowoczesnapolska.org.pl>
Fri, 14 Jun 2013 09:31:24 +0000 (11:31 +0200)
committerRadek Czajka <radoslaw.czajka@nowoczesnapolska.org.pl>
Fri, 14 Jun 2013 09:31:24 +0000 (11:31 +0200)
apps/api/handlers.py
apps/api/urls.py
apps/catalogue/models/collection.py
apps/catalogue/views.py

index dbe905b..7f74c19 100644 (file)
@@ -17,7 +17,7 @@ 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 picture.models import Picture
 from picture.forms import PictureImportForm
 
@@ -258,6 +258,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."""
 
index 8a14519..a2e3197 100644 (file)
@@ -19,6 +19,9 @@ ebook_list_resource = Resource(handler=handlers.EBooksHandler)
 #book_list_resource = Resource(handler=handlers.BooksHandler)
 book_resource = Resource(handler=handlers.BookDetailHandler)
 
+collection_resource = Resource(handler=handlers.CollectionDetailHandler)
+collection_list_resource = Resource(handler=handlers.CollectionsHandler)
+
 tag_list_resource = Resource(handler=handlers.TagsHandler)
 tag_resource = Resource(handler=handlers.TagDetailHandler)
 
@@ -48,6 +51,10 @@ urlpatterns = patterns(
     url(r'tag/(?P<id>\d*?)/info\.html$', 'catalogue.views.tag_info'),
 
 
+    # books by collections
+    url(r'^collections/$', collection_list_resource, name="api_collections"),
+    url(r'^collections/(?P<slug>[^/]+)/$', collection_resource, name="api_collection"),
+
     # objects details
     url(r'^books/(?P<book>[a-z0-9-]+)/$', book_resource, name="api_book"),
     url(r'^(?P<category>[a-z0-9-]+)/(?P<slug>[a-z0-9-]+)/$',
index daee484..8f67f88 100644 (file)
@@ -27,3 +27,10 @@ class Collection(models.Model):
     @models.permalink
     def get_absolute_url(self):
         return ("collection", [self.slug])
+
+    def get_query(self):
+        slugs = self.book_slugs.split()
+        # allow URIs
+        slugs = [slug.rstrip('/').rsplit('/', 1)[-1] if '/' in slug else slug
+                    for slug in slugs]
+        return models.Q(slug__in=slugs)
index 92ecebf..d69e542 100644 (file)
@@ -103,13 +103,7 @@ def daisy_list(request):
 
 def collection(request, slug):
     coll = get_object_or_404(models.Collection, slug=slug)
-    def get_filter():
-        slugs = coll.book_slugs.split()
-        # allow URIs
-        slugs = [slug.rstrip('/').rsplit('/', 1)[-1] if '/' in slug else slug
-                    for slug in slugs]
-        return Q(slug__in=slugs)
-    return book_list(request, get_filter=get_filter,
+    return book_list(request, get_filter=coll.get_query,
                      template_name='catalogue/collection.html',
                      cache_key='catalogue.collection:%s' % coll.slug,
                      context={'collection': coll})