# 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():
# -*- coding: utf-8 -*-
from django.conf.urls.defaults import *
from piston.resource import Resource
-from piston.authentication import HttpBasicAuthentication
+from piston.authentication import OAuthAuthentication
from api.handlers import BookHandler
-auth = HttpBasicAuthentication(realm='My sample API')
+auth = OAuthAuthentication(realm="Wolne Lektury")
book_resource = Resource(handler=BookHandler, authentication=auth)
-urlpatterns = patterns('',
+urlpatterns = patterns('',
url(r'^books/(?P<slug>[^/]+)\.(?P<emitter_format>xml|json|yaml)$', book_resource),
url(r'^books\.(?P<emitter_format>xml|json|yaml)$', book_resource),
-)
+) + patterns(
+ 'piston.authentication',
+ url(r'^oauth/request_token/$','oauth_request_token'),
+ url(r'^oauth/authorize/$','oauth_user_auth'),
+ url(r'^oauth/access_token/$','oauth_access_token'),
+)
# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
#
from django import forms
+from django.core.files.base import ContentFile
from django.utils.translation import ugettext_lazy as _
from slughifi import slughifi
class BookImportForm(forms.Form):
- book_xml_file = forms.FileField()
+ book_xml_file = forms.FileField(required=False)
+ book_xml = forms.CharField(required=False)
+
+ def clean(self):
+ if not self.cleaned_data['book_xml_file']:
+ if self.cleaned_data['book_xml']:
+ self.cleaned_data['book_xml_file'] = \
+ ContentFile(self.cleaned_data['book_xml'].encode('utf-8'))
+ else:
+ raise forms.ValidationError(_("Please supply an XML."))
+ return super(BookImportForm, self).clean()
def save(self, commit=True, **kwargs):
return Book.from_xml_file(self.cleaned_data['book_xml_file'], overwrite=True, **kwargs)
path.join(PROJECT_DIR, 'templates'),
]
-LOGIN_URL = '/uzytkownicy/zaloguj/'
+LOGIN_URL = '/uzytkownicy/login/'
LOGIN_REDIRECT_URL = '/'
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+ <head>
+ <title>Authorize Token</title>
+ </head>
+ <body>
+ <h1>Authorize Token</h1>
+
+ <form action="{% url piston.authentication.oauth_user_auth %}" method="POST">
+ {{ form.as_table }}
+ <button type="submit">Confirm</button>
+ </form>
+
+ </body>
+</html>
--- /dev/null
+<form method="POST" action="">
+ {% csrf_token %}
+ {{ form }}
+<input type="submit" />
+</form>
url(r'^uzytkownicy/zaloguj/$', 'catalogue.views.login', name='login'),
url(r'^uzytkownicy/wyloguj/$', 'catalogue.views.logout_then_redirect', name='logout'),
url(r'^uzytkownicy/utworz/$', 'catalogue.views.register', name='register'),
+ url(r'^uzytkownicy/login/$', 'django.contrib.auth.views.login', name='simple_login'),
# API
(r'^api/', include('api.urls')),