# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later.
# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
#
+from functools import wraps
+
from django.shortcuts import get_object_or_404
-from django.contrib.auth.decorators import login_required, user_passes_test
+from django.contrib.auth.decorators import login_required, permission_required
from piston.handler import BaseHandler
from piston.utils import rc, validate
from catalogue.models import Book
from catalogue.forms import BookImportForm
-staff_required = user_passes_test(lambda user: user.is_staff)
+def method_decorator(function_decorator):
+ """
+ Turns a function(*args, **kwargs) decorator into an
+ equivalent decorator for method(self, *args, **kwargs).
+ """
+ @wraps(function_decorator)
+ def decorator(method):
+ @wraps(method)
+ def decorated_method(self, *args, **kwargs):
+ def method_as_function(*fargs, **fkwargs):
+ return method(self, *fargs, **fkwargs)
+ return function_decorator(method_as_function)(*args, **kwargs)
+ return decorated_method
+ return decorator
class BookHandler(BaseHandler):
model = Book
fields = ('slug', 'title')
- @staff_required
def read(self, request, slug=None):
if slug:
return get_object_or_404(Book, slug=slug)
else:
return Book.objects.all()
- @staff_required
+ @method_decorator(permission_required('catalogue.add_book'))
def create(self, request):
form = BookImportForm(request.POST, request.FILES)
if form.is_valid():