diff --git a/common/djangoapps/student/helpers.py b/common/djangoapps/student/helpers.py index a6abb093b9025425af662dfdf8b6ca9d6aa565f5..74e4e48ffac6c0ed5090563d506f789a4de82efa 100644 --- a/common/djangoapps/student/helpers.py +++ b/common/djangoapps/student/helpers.py @@ -235,8 +235,8 @@ def get_next_url_for_login_page(request): /account/finish_auth/ view following login, which will take care of auto-enrollment in the specified course. - Otherwise, we go to the `next` param or to the dashboard if nothing else is - specified. + Otherwise, we go to the ?next= query param or the configured custom + redirection url (the default behaviour is to go to /dashboard). If THIRD_PARTY_AUTH_HINT is set, then `tpa_hint=<hint>` is added as a query parameter. @@ -250,9 +250,25 @@ def get_next_url_for_login_page(request): request_is_https=request.is_secure(), ) if not redirect_to: - try: - redirect_to = reverse('dashboard') - except NoReverseMatch: + if settings.ROOT_URLCONF == 'lms.urls': + login_redirect_url = configuration_helpers.get_value('DEFAULT_REDIRECT_AFTER_LOGIN') + + if login_redirect_url: + try: + redirect_to = reverse(login_redirect_url) + except NoReverseMatch: + log.warning( + u'Default redirect after login doesn\'t exist: %(login_redirect_url)r. ' + u'Check the value set on DEFAULT_REDIRECT_AFTER_LOGIN configuration variable.', + {"login_redirect_url": login_redirect_url} + ) + + # If redirect url isn't set, reverse to dashboard + if not redirect_to: + # Tries reversing the LMS dashboard if the url doesn't exist + redirect_to = reverse('dashboard') + + elif settings.ROOT_URLCONF == 'cms.urls': redirect_to = reverse('home') if any(param in request_params for param in POST_AUTH_PARAMS): diff --git a/common/djangoapps/student/tests/test_helpers.py b/common/djangoapps/student/tests/test_helpers.py index eb8289b74920be0dbe84e85694212b2379b9b770..3992cf3e6c77c94a2b4d8d79e3ecb4715c919977 100644 --- a/common/djangoapps/student/tests/test_helpers.py +++ b/common/djangoapps/student/tests/test_helpers.py @@ -2,6 +2,7 @@ import logging +import unittest import ddt from django.conf import settings @@ -133,3 +134,23 @@ class TestLoginHelper(TestCase): with with_site_configuration_context(configuration=dict(THIRD_PARTY_AUTH_HINT=tpa_hint)): validate_login() + + @unittest.skipUnless(settings.ROOT_URLCONF == 'lms.urls', 'Test only valid in lms') + @ddt.data( + (None, '/dashboard'), + ('invalid-url', '/dashboard'), + ('courses', '/courses'), + ) + @ddt.unpack + def test_custom_redirect_url(self, redirect, expected_url): + """ + Test custom redirect after login + """ + configuration_values = {"DEFAULT_REDIRECT_AFTER_LOGIN": redirect} + req = self.request.get(settings.LOGIN_URL) + req.META["HTTP_ACCEPT"] = "text/html" + + with with_site_configuration_context(configuration=configuration_values): + next_page = get_next_url_for_login_page(req) + + self.assertEqual(next_page, expected_url)