X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/38b4defd76b7ed4fedcd81631ec6a4351b469cdc..7c22547b97790b80fff2b0ddfe760925f98bc199:/apps/api/handlers.py diff --git a/apps/api/handlers.py b/apps/api/handlers.py index bd44e57a8..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 @@ -147,6 +153,32 @@ class BooksHandler(BaseHandler): 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): @@ -185,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): @@ -228,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):