From 53196495bbc0038b5c3c0a6e7171efe887e32964 Mon Sep 17 00:00:00 2001 From: Radek Czajka Date: Fri, 14 Jun 2013 11:31:24 +0200 Subject: [PATCH] closes #2843: collections in API --- apps/api/handlers.py | 48 ++++++++++++++++++++++++++++- apps/api/urls.py | 7 +++++ apps/catalogue/models/collection.py | 7 +++++ apps/catalogue/views.py | 8 +---- 4 files changed, 62 insertions(+), 8 deletions(-) diff --git a/apps/api/handlers.py b/apps/api/handlers.py index dbe905b00..7f74c19e7 100644 --- a/apps/api/handlers.py +++ b/apps/api/handlers.py @@ -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.""" diff --git a/apps/api/urls.py b/apps/api/urls.py index 8a1451909..a2e3197ef 100644 --- a/apps/api/urls.py +++ b/apps/api/urls.py @@ -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\d*?)/info\.html$', 'catalogue.views.tag_info'), + # books by collections + url(r'^collections/$', collection_list_resource, name="api_collections"), + url(r'^collections/(?P[^/]+)/$', collection_resource, name="api_collection"), + # objects details url(r'^books/(?P[a-z0-9-]+)/$', book_resource, name="api_book"), url(r'^(?P[a-z0-9-]+)/(?P[a-z0-9-]+)/$', diff --git a/apps/catalogue/models/collection.py b/apps/catalogue/models/collection.py index daee48461..8f67f88e0 100644 --- a/apps/catalogue/models/collection.py +++ b/apps/catalogue/models/collection.py @@ -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) diff --git a/apps/catalogue/views.py b/apps/catalogue/views.py index 92ecebf00..d69e5428c 100644 --- a/apps/catalogue/views.py +++ b/apps/catalogue/views.py @@ -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}) -- 2.20.1