api for redakcja (needs some testing and chrome)
[wolnelektury.git] / apps / api / handlers.py
1 # -*- coding: utf-8 -*-
2 # This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later.
3 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
4 #
5 from functools import wraps
6
7 from django.shortcuts import get_object_or_404
8 from django.contrib.auth.decorators import login_required, permission_required
9 from piston.handler import BaseHandler
10 from piston.utils import rc, validate
11 from catalogue.models import Book
12 from catalogue.forms import BookImportForm
13
14
15 def method_decorator(function_decorator):
16     """
17         Turns a function(*args, **kwargs) decorator into an
18         equivalent decorator for method(self, *args, **kwargs).
19     """
20     @wraps(function_decorator)
21     def decorator(method):
22         @wraps(method)
23         def decorated_method(self, *args, **kwargs):
24             def method_as_function(*fargs, **fkwargs):
25                 return method(self, *fargs, **fkwargs)
26             return function_decorator(method_as_function)(*args, **kwargs)
27         return decorated_method
28     return decorator
29
30
31 class BookHandler(BaseHandler):
32     model = Book
33     fields = ('slug', 'title')
34
35     def read(self, request, slug=None):
36         if slug:
37             return get_object_or_404(Book, slug=slug)
38         else:
39             return Book.objects.all()
40
41     @method_decorator(permission_required('catalogue.add_book'))
42     def create(self, request):
43         form = BookImportForm(request.POST, request.FILES)
44         if form.is_valid():
45             form.save()
46             return rc.CREATED
47         else:
48             return rc.BAD_REQUEST
49