#24085: @requires_login decorator redirects to a locale specific URL when using
i18n_patterns
-------------------------------------+-------------------------------------
     Reporter:  thedrow              |      Owner:  nobody
         Type:  Bug                  |     Status:  new
    Component:                       |    Version:  master
  Internationalization               |   Keywords:  authentication i18n
     Severity:  Normal               |  login_required
 Triage Stage:  Unreviewed           |  Has patch:  0
Easy pickings:  0                    |      UI/UX:  0
-------------------------------------+-------------------------------------
 When an anonymous user is hitting a view decorated with @login_required
 that is routed using i18n_patterns he will be first redirected to the
 default locale URL e.g. /en-us/ and after that he will be redirected to
 the login view. The next query parameter will be /en-us/ which will
 override whatever language is in LANGUAGE_SESSION_KEY and set the site's
 language to en-us when the user logs in.

 The solution is very simple. We need to strip the locale part of the URI
 when setting the next query parameter.


 {{{
 def strip_language_from_path(path):
     """
     Strips the language-code if there is a valid language-code
     found in the `path`.
     """
     regex_match = language_code_prefix_re.match(path)
     if not regex_match:
         return None
     path = regex_match.group(2)
     return path


 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()
             # urlparse chokes on lazy objects in Python 3, force to str
             resolved_login_url = force_str(
                 resolve_url(login_url or settings.LOGIN_URL))
             # 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()

             path = strip_language_from_path(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
 }}}

 I can issue a PR with this change if desired.
 If not, is there another way to fix this problem?

--
Ticket URL: <https://code.djangoproject.com/ticket/24085>
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/050.dbc7783f1faeb54e3f01661e0b841e24%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to