#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 django-updates+unsubscr...@googlegroups.com.
To post to this group, send email to django-updates@googlegroups.com.
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.

Reply via email to