#24276: django.contrib.auth.decorators.user_passes_test doesn't pass *args and
*kwargs to resolve_url
-------------------------+-------------------------------------------------
Reporter: | Owner: nobody
rubengrill |
Type: Bug | Status: new
Component: | Version: 1.7
contrib.auth | Keywords: login_url resolve_url
Severity: Normal | login_required user_passes_test
Triage Stage: | Has patch: 0
Unreviewed |
Easy pickings: 1 | UI/UX: 0
-------------------------+-------------------------------------------------
When using the decorator
'''django.contrib.auth.decorators.user_passes_test''' or dependent
decorators '''login_required''' and '''permission_required''', the given
'''login_url''' can't be reversed when the url contains at least one
parameter, because when '''reverse_url''' is called, the *args and *kwargs
parameters are not passed.
{{{
urlpatterns = patterns('',
url(r'^(?P<conference>[^/]+)/', include(patterns('',
url(r'^$', conference_root, name='conference_root'),
url(r'^admin/$', conference_admin, name='conference_admin'),
)))
)
...
@login_required(login_url='conference:conference_root')
def conference_admin(request, conference):
return render(request, 'conference/admin.html', {'conference':
conference})
}}}
{{{
Reverse for 'conference_root' with arguments '()' and keyword arguments
'{}' not found. 1 pattern(s) tried: ['(?P<conference>[^/]+)/$']
}}}
The *args and *kwargs parameters should be passed to resolve_url:
{{{
def user_passes_test(test_func, login_url=None,
redirect_field_name=REDIRECT_FIELD_NAME):
"""
Decorator for views that checks that the user passes the given test,
redirecting to the log-in page if necessary. The test should be a
callable
that takes the user object and returns True if the user passes.
"""
def decorator(view_func):
@wraps(view_func, assigned=available_attrs(view_func))
def _wrapped_view(request, *args, **kwargs):
if test_func(request.user):
return view_func(request, *args, **kwargs)
path = request.build_absolute_uri()
#
# resolved_login_url = resolve_url(login_url or
settings.LOGIN_URL)
#
resolved_login_url = resolve_url(login_url or
settings.LOGIN_URL, *args, **kwargs)
# If the login url is the same scheme and net location then
just
# use the path as the "next" url.
login_scheme, login_netloc = urlparse(resolved_login_url)[:2]
current_scheme, current_netloc = urlparse(path)[:2]
if ((not login_scheme or login_scheme == current_scheme) and
(not login_netloc or login_netloc == current_netloc)):
path = request.get_full_path()
from django.contrib.auth.views import redirect_to_login
return redirect_to_login(
path, resolved_login_url, redirect_field_name)
return _wrapped_view
return decorator
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/24276>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/053.67f1f3ca2b31957d91e66a63e5ffe182%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.