X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/5a15f6f4162ddda647b1ca9eec4e36f85f457056..2d8bcd45b873aa01d43b07d0179d373e0bdc9bb5:/apps/api/handlers.py diff --git a/apps/api/handlers.py b/apps/api/handlers.py index 32a3ce300..9bb89005c 100644 --- a/apps/api/handlers.py +++ b/apps/api/handlers.py @@ -3,17 +3,17 @@ # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. from datetime import datetime, timedelta +import json from django.conf import settings from django.contrib.sites.models import Site from django.core.urlresolvers import reverse -from django.http import Http404 -from django.shortcuts import get_object_or_404 -from piston.handler import BaseHandler +from piston.handler import AnonymousBaseHandler, BaseHandler from piston.utils import rc from api.helpers import timestamp from api.models import Deleted +from catalogue.forms import BookImportForm from catalogue.models import Book, Tag, BookMedia, Fragment @@ -38,7 +38,7 @@ def read_tags(tags, allowed): :param str tags: a path of category and slug pairs, like: authors/an-author/... :returns: list of Tag objects - :raises: django.http.Http404 + :raises: ValueError when tags can't be found """ if not tags: return [] @@ -52,16 +52,19 @@ def read_tags(tags, allowed): try: category = category_singular[category] except KeyError: - raise Http404 + raise ValueError('Unknown category.') if not category in allowed: - raise Http404 + raise ValueError('Category not allowed.') # !^%@#$^#! if category == 'book': slug = 'l-' + slug - real_tags.append(get_object_or_404(Tag, category=category, slug=slug)) + try: + real_tags.append(Tag.objects.get(category=category, slug=slug)) + except Tag.DoesNotExist: + raise ValueError('Tag not found') return real_tags @@ -96,10 +99,13 @@ class BookDetailHandler(BaseHandler): def read(self, request, slug): """ Returns details of a book, identified by a slug. """ - return get_object_or_404(Book, slug=slug) + try: + return Book.objects.get(slug=slug) + except Book.DoesNotExist: + return rc.NOT_FOUND -class BooksHandler(BaseHandler): +class AnonymousBooksHandler(AnonymousBaseHandler): """ Main handler for Book objects. Responsible for lists of Book objects @@ -135,12 +141,44 @@ class BooksHandler(BaseHandler): tags = read_tags(tags, allowed=self.categories) if tags: if top_level: - return Book.tagged_top_level(tags) + books = Book.tagged_top_level(tags) + return books if books else rc.NOT_FOUND else: - return Book.tagged.with_all(tags) + books = Book.tagged.with_all(tags) else: - return Book.objects.all() + books = Book.objects.all() + + if books.exists(): + return books + else: + return rc.NOT_FOUND + def create(self, request, tags, top_level=False): + return 'aaa' + + @classmethod + def media(self, book): + """ Returns all media for a book. """ + + return book.media.all() + + +class BooksHandler(BaseHandler): + model = Book + fields = ('slug', 'title') + anonymous = AnonymousBooksHandler + + def create(self, request, tags, top_level=False): + if not request.user.has_perm('catalogue.add_book'): + return rc.FORBIDDEN + + data = json.loads(request.POST.get('data')) + form = BookImportForm(data) + if form.is_valid(): + form.save() + return rc.CREATED + else: + return rc.NOT_FOUND # add categorized tags fields for Book def _tags_getter(category): @@ -179,7 +217,10 @@ class TagDetailHandler(BaseHandler): except KeyError, e: return rc.NOT_FOUND - return get_object_or_404(Tag, category=category_sng, slug=slug) + try: + return Tag.objects.get(category=category_sng, slug=slug) + except Tag.DoesNotExist: + return rc.NOT_FOUND class TagsHandler(BaseHandler): @@ -201,7 +242,13 @@ class TagsHandler(BaseHandler): except KeyError, e: return rc.NOT_FOUND - return Tag.objects.filter(category=category_sng) + tags = Tag.objects.filter(category=category_sng) + tags = [t for t in tags if t.get_count() > 0] + if tags: + return tags + else: + return rc.NOT_FOUND + @classmethod def href(cls, tag): @@ -216,7 +263,10 @@ class FragmentDetailHandler(BaseHandler): def read(self, request, slug, anchor): """ Returns details of a fragment, identified by book slug and anchor. """ - return get_object_or_404(Fragment, book__slug=slug, anchor=anchor) + try: + return Fragment.objects.get(book__slug=slug, anchor=anchor) + except Fragment.DoesNotExist: + return rc.NOT_FOUND class FragmentsHandler(BaseHandler): @@ -240,7 +290,11 @@ class FragmentsHandler(BaseHandler): """ tags = read_tags(tags, allowed=self.categories) - return Fragment.tagged.with_all(tags).select_related('book') + fragments = Fragment.tagged.with_all(tags).select_related('book') + if fragments.exists(): + return fragments + else: + return rc.NOT_FOUND @classmethod def href(cls, fragment):