#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.

Reply via email to