Commit 073e29cc by Calen Pennington

Don't capture browser language into unauthenticated user session

[LEARNER-243]
parent 58f1ce0a
...@@ -35,19 +35,3 @@ class LanguagePreferenceMiddleware(object): ...@@ -35,19 +35,3 @@ class LanguagePreferenceMiddleware(object):
request.session[LANGUAGE_SESSION_KEY] = user_pref request.session[LANGUAGE_SESSION_KEY] = user_pref
else: else:
delete_user_preference(request.user, LANGUAGE_KEY) delete_user_preference(request.user, LANGUAGE_KEY)
else:
preferred_language = request.META.get('HTTP_ACCEPT_LANGUAGE', '')
lang_headers = [seq[0] for seq in parse_accept_lang_header(preferred_language)]
prefixes = [prefix.split("-")[0] for prefix in system_released_languages]
# Setting the session language to the browser language, if it is supported.
for browser_lang in lang_headers:
if browser_lang in system_released_languages:
pass
elif browser_lang in prefixes:
browser_lang = system_released_languages[prefixes.index(browser_lang)]
else:
continue
if request.session.get(LANGUAGE_SESSION_KEY, None) is None:
request.session[LANGUAGE_SESSION_KEY] = unicode(browser_lang)
break
...@@ -4,20 +4,44 @@ ...@@ -4,20 +4,44 @@
from django.test import TestCase from django.test import TestCase
from django.test.utils import override_settings from django.test.utils import override_settings
from django.utils import translation from django.utils import translation
from django.contrib.auth.models import User
import ddt
from openedx.core.djangoapps.dark_lang.models import DarkLangConfig
from openedx.core.djangoapps.lang_pref import api as language_api from openedx.core.djangoapps.lang_pref import api as language_api
EN = language_api.Language('en', 'English')
ES_419 = language_api.Language('es-419', u'Español (Latinoamérica)')
@ddt.ddt
class LanguageApiTest(TestCase): class LanguageApiTest(TestCase):
""" """
Tests of the language APIs. Tests of the language APIs.
""" """
def test_released_languages(self): @ddt.data(*[
('en', [], [], []),
('en', [EN], [], [EN]),
('en', [EN, ES_419], [], [EN]),
('en', [EN, ES_419], ['es-419'], [EN, ES_419]),
('es-419', [EN, ES_419], ['es-419'], [ES_419]),
('en', [EN, ES_419], ['es'], [EN]),
])
@ddt.unpack
def test_released_languages(self, default_lang, languages, dark_lang_released, expected_languages):
""" """
Tests for the released languages. Tests for the released languages.
""" """
released_languages = language_api.released_languages() with override_settings(LANGUAGES=languages, LANGUAGE_CODE=default_lang):
self.assertGreaterEqual(len(released_languages), 1) user = User()
user.save()
DarkLangConfig(
released_languages=', '.join(dark_lang_released),
changed_by=user,
enabled=True
).save()
released_languages = language_api.released_languages()
self.assertEqual(released_languages, expected_languages)
@override_settings(ALL_LANGUAGES=[[u"cs", u"Czech"], [u"nl", u"Dutch"]]) @override_settings(ALL_LANGUAGES=[[u"cs", u"Czech"], [u"nl", u"Dutch"]])
def test_all_languages(self): def test_all_languages(self):
......
...@@ -4,6 +4,7 @@ Tests for lang_pref middleware. ...@@ -4,6 +4,7 @@ Tests for lang_pref middleware.
import mock import mock
import ddt
from django.test import TestCase from django.test import TestCase
from django.test.client import RequestFactory from django.test.client import RequestFactory
from django.contrib.sessions.middleware import SessionMiddleware from django.contrib.sessions.middleware import SessionMiddleware
...@@ -16,6 +17,7 @@ from student.tests.factories import UserFactory ...@@ -16,6 +17,7 @@ from student.tests.factories import UserFactory
from student.tests.factories import AnonymousUserFactory from student.tests.factories import AnonymousUserFactory
@ddt.ddt
class TestUserPreferenceMiddleware(TestCase): class TestUserPreferenceMiddleware(TestCase):
""" """
Tests to make sure user preferences are getting properly set in the middleware. Tests to make sure user preferences are getting properly set in the middleware.
...@@ -66,15 +68,17 @@ class TestUserPreferenceMiddleware(TestCase): ...@@ -66,15 +68,17 @@ class TestUserPreferenceMiddleware(TestCase):
@mock.patch( @mock.patch(
'openedx.core.djangoapps.lang_pref.middleware.released_languages', 'openedx.core.djangoapps.lang_pref.middleware.released_languages',
mock.Mock(return_value=[('eo', 'dummy Esperanto'), ('ar', 'arabic')]) mock.Mock(return_value=[('eo', 'dummy Esperanto'), ('ar', 'arabic'), ('eu-es', 'euskara (Espainia)')])
) )
def test_supported_browser_language_in_session(self): @ddt.data('ar;q=1.0', 'eu;q=1.0', 'es-419;q=1.0')
def test_browser_language_in_session_for_unauthenticated_user(self, accept_language):
""" """
test: browser language should be set in user session if it is supported by system for unauthenticated user. test: browser language should not be set in user session for unauthenticated user.
""" """
self.request.META['HTTP_ACCEPT_LANGUAGE'] = accept_language # pylint: disable=no-member
self.request.user = self.anonymous_user self.request.user = self.anonymous_user
self.middleware.process_request(self.request) self.middleware.process_request(self.request)
self.assertEqual(self.request.session[LANGUAGE_SESSION_KEY], 'ar') # pylint: disable=no-member self.assertNotIn(LANGUAGE_SESSION_KEY, self.request.session) # pylint: disable=no-member
@mock.patch( @mock.patch(
'openedx.core.djangoapps.lang_pref.middleware.released_languages', 'openedx.core.djangoapps.lang_pref.middleware.released_languages',
...@@ -100,30 +104,3 @@ class TestUserPreferenceMiddleware(TestCase): ...@@ -100,30 +104,3 @@ class TestUserPreferenceMiddleware(TestCase):
set_user_preference(self.user, LANGUAGE_KEY, 'eo') set_user_preference(self.user, LANGUAGE_KEY, 'eo')
self.middleware.process_request(self.request) self.middleware.process_request(self.request)
self.assertEqual(get_user_preference(self.request.user, LANGUAGE_KEY), None) self.assertEqual(get_user_preference(self.request.user, LANGUAGE_KEY), None)
@mock.patch(
'openedx.core.djangoapps.lang_pref.middleware.released_languages',
mock.Mock(return_value=[('eu-es', 'euskara (Espainia)'), ('en', 'english')])
)
def test_supported_browser_language_prefix_in_session(self):
"""
test: browser language should be set in user session if it's prefix is supported by system for
unathenticated users
"""
self.request.META['HTTP_ACCEPT_LANGUAGE'] = 'eu;q=1.0' # pylint: disable=no-member
self.request.user = self.anonymous_user
self.middleware.process_request(self.request)
self.assertEqual(self.request.session.get(LANGUAGE_SESSION_KEY), 'eu-es') # pylint: disable=no-member
@mock.patch(
'openedx.core.djangoapps.lang_pref.middleware.released_languages',
mock.Mock(return_value=[('en', 'english')])
)
def test_unsupported_browser_language_prefix(self):
"""
test: browser language should not be set in user session if it's prefix is not supported by system.
"""
self.request.META['HTTP_ACCEPT_LANGUAGE'] = 'eu;q=1.0' # pylint: disable=no-member
self.request.user = self.anonymous_user
self.middleware.process_request(self.request)
self.assertNotEqual(self.request.session.get(LANGUAGE_SESSION_KEY), 'eu-es') # pylint: disable=no-member
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment