Fixed #13304 -- Updated auth decorators so they can be used with callable classes. Thanks to Horst Gutmann for the report and patch.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@12938 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Russell Keith-Magee 2010-04-09 11:07:17 +00:00
parent 736b751ed9
commit 056c940f0d
3 changed files with 32 additions and 5 deletions

View File

@ -5,6 +5,7 @@ except ImportError:
from django.contrib.auth import REDIRECT_FIELD_NAME from django.contrib.auth import REDIRECT_FIELD_NAME
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect
from django.utils.decorators import available_attrs
from django.utils.http import urlquote from django.utils.http import urlquote
@ -25,7 +26,7 @@ def user_passes_test(test_func, login_url=None, redirect_field_name=REDIRECT_FIE
path = urlquote(request.get_full_path()) path = urlquote(request.get_full_path())
tup = login_url, redirect_field_name, path tup = login_url, redirect_field_name, path
return HttpResponseRedirect('%s?%s=%s' % tup) return HttpResponseRedirect('%s?%s=%s' % tup)
return wraps(view_func)(_wrapped_view) return wraps(view_func, assigned=available_attrs(view_func))(_wrapped_view)
return decorator return decorator

View File

@ -1,12 +1,13 @@
from django.contrib.auth.tests.auth_backends import BackendTest, RowlevelBackendTest, AnonymousUserBackendTest, NoAnonymousUserBackendTest
from django.contrib.auth.tests.basic import BASIC_TESTS from django.contrib.auth.tests.basic import BASIC_TESTS
from django.contrib.auth.tests.views \ from django.contrib.auth.tests.decorators import LoginRequiredTestCase
import PasswordResetTest, ChangePasswordTest, LoginTest, LogoutTest
from django.contrib.auth.tests.forms import FORM_TESTS from django.contrib.auth.tests.forms import FORM_TESTS
from django.contrib.auth.tests.remote_user \ from django.contrib.auth.tests.remote_user \
import RemoteUserTest, RemoteUserNoCreateTest, RemoteUserCustomTest import RemoteUserTest, RemoteUserNoCreateTest, RemoteUserCustomTest
from django.contrib.auth.tests.auth_backends import BackendTest, RowlevelBackendTest, AnonymousUserBackendTest, NoAnonymousUserBackendTest
from django.contrib.auth.tests.tokens import TOKEN_GENERATOR_TESTS
from django.contrib.auth.tests.models import ProfileTestCase from django.contrib.auth.tests.models import ProfileTestCase
from django.contrib.auth.tests.tokens import TOKEN_GENERATOR_TESTS
from django.contrib.auth.tests.views \
import PasswordResetTest, ChangePasswordTest, LoginTest, LogoutTest
# The password for the fixture data users is 'password' # The password for the fixture data users is 'password'

View File

@ -0,0 +1,25 @@
from unittest import TestCase
from django.contrib.auth.decorators import login_required
class LoginRequiredTestCase(TestCase):
"""
Tests the login_required decorators
"""
def testCallable(self):
"""
Check that login_required is assignable to callable objects.
"""
class CallableView(object):
def __call__(self, *args, **kwargs):
pass
login_required(CallableView())
def testView(self):
"""
Check that login_required is assignable to normal views.
"""
def normal_view(request):
pass
login_required(normal_view)