From 4b512626f827edb3d479262b2113e0d68df7650f Mon Sep 17 00:00:00 2001 From: Calen Pennington Date: Tue, 2 May 2017 11:22:13 -0400 Subject: [PATCH] Reset the SESSION language when the language-preference cookie changes --- .../core/djangoapps/lang_pref/middleware.py | 4 +++ .../lang_pref/tests/test_middleware.py | 31 +++++++++++-------- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/openedx/core/djangoapps/lang_pref/middleware.py b/openedx/core/djangoapps/lang_pref/middleware.py index a0d89acfc4..e9fd010c8f 100644 --- a/openedx/core/djangoapps/lang_pref/middleware.py +++ b/openedx/core/djangoapps/lang_pref/middleware.py @@ -44,6 +44,10 @@ class LanguagePreferenceMiddleware(object): accept_header = cookie_lang request.META[LANGUAGE_HEADER] = accept_header + # Allow the new cookie setting to update the language in the user's session + if LANGUAGE_SESSION_KEY in request.session and request.session[LANGUAGE_SESSION_KEY] != cookie_lang: + del request.session[LANGUAGE_SESSION_KEY] + def process_response(self, request, response): # If the user is logged in, check for their language preference if getattr(request, 'user', None) and request.user.is_authenticated(): diff --git a/openedx/core/djangoapps/lang_pref/tests/test_middleware.py b/openedx/core/djangoapps/lang_pref/tests/test_middleware.py index 5ee2b9db8e..7413b43469 100644 --- a/openedx/core/djangoapps/lang_pref/tests/test_middleware.py +++ b/openedx/core/djangoapps/lang_pref/tests/test_middleware.py @@ -105,25 +105,30 @@ class TestUserPreferenceMiddleware(TestCase): for logged_in in (True, False) for test_def in [ # (LANGUAGE_COOKIE, LANGUAGE_SESSION_KEY, Accept-Language In, Accept-Language Out) - (None, None, None, None), - (None, 'eo', None, None), - (None, 'eo', 'en', 'en'), - (None, None, 'en', 'en'), - ('en', None, None, 'en'), - ('en', None, 'eo', 'en;q=1.0,eo'), - ('en', None, 'en', 'en'), - ('en', 'eo', 'en', 'en'), - ('en', 'eo', 'eo', 'en;q=1.0,eo') + (None, None, None, None, None), + (None, 'eo', None, None, 'eo'), + (None, 'en', None, None, 'en'), + (None, 'eo', 'en', 'en', 'eo'), + (None, None, 'en', 'en', None), + ('en', None, None, 'en', None), + ('en', 'en', None, 'en', 'en'), + ('en', None, 'eo', 'en;q=1.0,eo', None), + ('en', None, 'en', 'en', None), + ('en', 'eo', 'en', 'en', None), + ('en', 'eo', 'eo', 'en;q=1.0,eo', None) ] )) @ddt.unpack - def test_preference_cookie_overrides_browser(self, logged_in, lang_cookie, lang_session, accept_lang_in, accept_lang_out): + def test_preference_cookie_overrides_browser( + self, logged_in, lang_cookie, lang_session_in, accept_lang_in, accept_lang_out, + lang_session_out, + ): if not logged_in: self.request.user = self.anonymous_user if lang_cookie: self.request.COOKIES[settings.LANGUAGE_COOKIE] = lang_cookie - if lang_session: - self.request.session[LANGUAGE_SESSION_KEY] = lang_session + if lang_session_in: + self.request.session[LANGUAGE_SESSION_KEY] = lang_session_in if accept_lang_in: self.request.META['HTTP_ACCEPT_LANGUAGE'] = accept_lang_in else: @@ -143,7 +148,7 @@ class TestUserPreferenceMiddleware(TestCase): else: self.assertEqual(accept_lang_result, accept_lang_out) - self.assertEquals(self.request.session.get(LANGUAGE_SESSION_KEY), lang_session) + self.assertEquals(self.request.session.get(LANGUAGE_SESSION_KEY), lang_session_out) @ddt.data(None, 'es', 'en') def test_logout_preserves_cookie(self, lang_cookie):