From cb6b52f890f3b75e85d52298b2270224bfb682f2 Mon Sep 17 00:00:00 2001 From: Julia Hansbrough Date: Mon, 3 Feb 2014 21:37:36 +0000 Subject: [PATCH] wiring for language selector --- common/djangoapps/dark_lang/models.py | 2 + .../student/tests/test_languages.py | 24 +++++ common/djangoapps/student/views.py | 7 ++ common/test/acceptance/pages/lms/dashboard.py | 6 ++ common/test/acceptance/tests/test_lms.py | 26 +++++ lms/envs/common.py | 4 +- lms/templates/dashboard.html | 11 +++ .../dashboard/_dashboard_info_language.html | 4 +- .../modal/_modal-settings-language.html | 98 +++---------------- lms/urls.py | 2 + 10 files changed, 97 insertions(+), 87 deletions(-) create mode 100644 common/djangoapps/student/tests/test_languages.py diff --git a/common/djangoapps/dark_lang/models.py b/common/djangoapps/dark_lang/models.py index 9912287b4e..6379a21fe2 100644 --- a/common/djangoapps/dark_lang/models.py +++ b/common/djangoapps/dark_lang/models.py @@ -19,6 +19,8 @@ class DarkLangConfig(ConfigurationModel): def released_languages_list(self): """ ``released_languages`` as a list of language codes. + + Example: ['it', 'de-at', 'es', 'pt-br'] """ if not self.released_languages.strip(): # pylint: disable=no-member return [] diff --git a/common/djangoapps/student/tests/test_languages.py b/common/djangoapps/student/tests/test_languages.py new file mode 100644 index 0000000000..42d100672e --- /dev/null +++ b/common/djangoapps/student/tests/test_languages.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +""" +This test file will verify functionality relating to changing language settings for a user +""" +from django.test import TestCase +from django.core.urlresolvers import reverse +from student.tests.factories import UserFactory + + +class TestLanguageSettings(TestCase): + """ + Language settings tests + """ + def setUp(self): + self.user = UserFactory.create(username="rusty", password="test") + self.client.login(username="rusty", password="test") + + def test_successful_language_change(self): + # Esperanto is our dummy language + post_data = dict(language='eo',) + response = self.client.post('/i18n/setlang/', data=post_data) + self.assertEqual(response.status_code, 302) + session = self.client.session + self.assertEqual(session['django_language'], 'eo') diff --git a/common/djangoapps/student/views.py b/common/djangoapps/student/views.py index bb00430da3..1168e856c2 100644 --- a/common/djangoapps/student/views.py +++ b/common/djangoapps/student/views.py @@ -27,6 +27,7 @@ from django.http import (HttpResponse, HttpResponseBadRequest, HttpResponseForbi from django.shortcuts import redirect from django_future.csrf import ensure_csrf_cookie from django.utils.http import cookie_date, base36_to_int +from django.utils import translation from django.utils.translation import ugettext as _ from django.views.decorators.http import require_POST, require_GET @@ -45,6 +46,7 @@ from student.firebase_token_generator import create_token from verify_student.models import SoftwareSecurePhotoVerification, MidcourseReverificationWindow from certificates.models import CertificateStatuses, certificate_status_for_student +from dark_lang.models import DarkLangConfig from xmodule.course_module import CourseDescriptor from xmodule.modulestore.exceptions import ItemNotFoundError @@ -468,6 +470,9 @@ def dashboard(request): # we'll display the banner denied_banner = any(item.display for item in reverifications["denied"]) + language_options = DarkLangConfig.current().released_languages_list + current_language = translation.get_language_info(translation.get_language()) + context = {'course_enrollment_pairs': course_enrollment_pairs, 'course_optouts': course_optouts, 'message': message, @@ -484,6 +489,8 @@ def dashboard(request): 'show_refund_option_for': show_refund_option_for, 'denied_banner': denied_banner, 'billing_email': settings.PAYMENT_SUPPORT_EMAIL, + 'language_options': language_options, + 'current_language': current_language, } return render_to_response('dashboard.html', context) diff --git a/common/test/acceptance/pages/lms/dashboard.py b/common/test/acceptance/pages/lms/dashboard.py index 0f768af60d..eaa5c83b83 100644 --- a/common/test/acceptance/pages/lms/dashboard.py +++ b/common/test/acceptance/pages/lms/dashboard.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """ Student dashboard page. """ @@ -59,3 +60,8 @@ class DashboardPage(PageObject): return "a.enter-course:nth-of-type({0})".format(link_index + 1) else: return None + + def change_language(self): + self.css_click(".edit-language") + self.select_option("language", "eo") + self.css_click("#submit-lang") diff --git a/common/test/acceptance/tests/test_lms.py b/common/test/acceptance/tests/test_lms.py index 4f65729895..535c3eaf02 100644 --- a/common/test/acceptance/tests/test_lms.py +++ b/common/test/acceptance/tests/test_lms.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """ E2E tests for the LMS. """ @@ -17,6 +18,7 @@ from ..pages.lms.course_info import CourseInfoPage from ..pages.lms.tab_nav import TabNavPage from ..pages.lms.course_nav import CourseNavPage from ..pages.lms.progress import ProgressPage +from ..pages.lms.dashboard import DashboardPage from ..pages.lms.video import VideoPage from ..pages.xblock.acid import AcidView from ..fixtures.course import CourseFixture, XBlockFixtureDesc, CourseUpdateDesc @@ -68,6 +70,30 @@ class RegistrationTest(UniqueCourseTest): self.assertIn(self.course_info['display_name'], course_names) +class LanguageTest(UniqueCourseTest): + """ + Tests that the change language functionality on the dashboard works + """ + + def setUp(self): + """ + Initiailize dashboard page + """ + super(LanguageTest, self).setUp() + self.dashboard_page = DashboardPage(self.browser) + + def test_change_lang(self): + AutoAuthPage(self.browser, course_id=self.course_id).visit() + self.dashboard_page.visit() + # Change language to Esperanto + self.dashboard_page.change_language() + self.fail() + self.dashboard_page.visit() + body = self.browser.body + matches = re.match(u'^FÏND ÇØÜRSÉS.+$', body) + self.assertTrue(matches is not None) + + class HighLevelTabTest(UniqueCourseTest): """ Tests that verify each of the high-level tabs available within a course. diff --git a/lms/envs/common.py b/lms/envs/common.py index a3879e15f6..a1a8ad89e6 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -501,8 +501,8 @@ LANGUAGE_CODE = 'en' # http://www.i18nguy.com/unicode/language-identifiers.html # Sourced from http://www.localeplanet.com/icu/ and wikipedia LANGUAGES = ( - ('eo', u'Dummy Language (Esperanto)'), # Dummy language used for testing - ('fake2', u'Fake translations'), # Another dummy language for testing (not pushed to prod) + ('en', u'English'), + ('eo', u'Dummy Language (Esperanto)'), # Dummy languaged used for testing ('ach', u'Acholi'), # Acoli ('ar', u'العربية'), # Arabic diff --git a/lms/templates/dashboard.html b/lms/templates/dashboard.html index a19c07d3a7..e3b484bd24 100644 --- a/lms/templates/dashboard.html +++ b/lms/templates/dashboard.html @@ -1,4 +1,5 @@ <%! from django.utils.translation import ugettext as _ %> +<%! from django.template import RequestContext %> <%! from django.core.urlresolvers import reverse @@ -82,6 +83,16 @@ }); }); + $("#change_language_form").submit(function(event, xhr) { + $.post('/i18n/setlang/', + {"language": language,}, + function(data) { + if (data.success){ + location.reload(); + } + }) + }); + $("#change_email_form").submit(function(){ var new_email = $('#new_email_field').val(); var new_password = $('#new_email_password').val(); diff --git a/lms/templates/dashboard/_dashboard_info_language.html b/lms/templates/dashboard/_dashboard_info_language.html index 3d6276f539..2f1a3ca158 100644 --- a/lms/templates/dashboard/_dashboard_info_language.html +++ b/lms/templates/dashboard/_dashboard_info_language.html @@ -8,9 +8,9 @@
  • ${_("Preferred Language")} - (${_("edit")}) + (${_("edit")}) - English (US) + ${current_language['name_local']}
  • diff --git a/lms/templates/modal/_modal-settings-language.html b/lms/templates/modal/_modal-settings-language.html index 4e3f565bbd..6a7cdbd5f8 100644 --- a/lms/templates/modal/_modal-settings-language.html +++ b/lms/templates/modal/_modal-settings-language.html @@ -14,98 +14,30 @@
    -
    + +
    1. - + % for abbrv in language_options: + % for language in settings.LANGUAGES: + % if abbrv == language[0]: + % if abbrv == current_language['code']: + + % else: + + % endif + % endif + % endfor + % endfor
    • - +
    • diff --git a/lms/urls.py b/lms/urls.py index c4920ba0e2..47f1acc911 100644 --- a/lms/urls.py +++ b/lms/urls.py @@ -62,6 +62,8 @@ urlpatterns = ('', # nopep8 url(r'^user_api/', include('user_api.urls')), url(r'^', include('waffle.urls')), + + url(r'^i18n/', include('django.conf.urls.i18n')), ) # if settings.FEATURES.get("MULTIPLE_ENROLLMENT_ROLES"):