From b61649f9eb1e1966e6756ff9a8ecf208d646709a Mon Sep 17 00:00:00 2001 From: thedeadparrot Date: Fri, 14 Feb 2014 15:07:15 -0500 Subject: [PATCH] Refactor out new lang_pref djangoapp --- common/djangoapps/lang_pref/__init__.py | 6 ++++ .../{user_api => lang_pref}/middleware.py | 7 ++-- .../tests/test_middleware.py | 7 ++-- .../djangoapps/lang_pref/tests/test_views.py | 33 +++++++++++++++++++ common/djangoapps/lang_pref/urls.py | 10 ++++++ common/djangoapps/lang_pref/views.py | 22 +++++++++++++ common/djangoapps/student/views.py | 7 +++- common/djangoapps/user_api/models.py | 3 -- .../djangoapps/user_api/tests/test_models.py | 2 ++ .../djangoapps/user_api/tests/test_views.py | 33 ++----------------- common/djangoapps/user_api/urls.py | 1 - common/djangoapps/user_api/views.py | 19 +---------- common/test/acceptance/tests/test_lms.py | 3 +- lms/envs/common.py | 2 +- lms/templates/dashboard.html | 2 +- lms/urls.py | 2 ++ 16 files changed, 97 insertions(+), 62 deletions(-) create mode 100644 common/djangoapps/lang_pref/__init__.py rename common/djangoapps/{user_api => lang_pref}/middleware.py (81%) rename common/djangoapps/{user_api => lang_pref}/tests/test_middleware.py (88%) create mode 100644 common/djangoapps/lang_pref/tests/test_views.py create mode 100644 common/djangoapps/lang_pref/urls.py create mode 100644 common/djangoapps/lang_pref/views.py diff --git a/common/djangoapps/lang_pref/__init__.py b/common/djangoapps/lang_pref/__init__.py new file mode 100644 index 0000000000..4182bb6978 --- /dev/null +++ b/common/djangoapps/lang_pref/__init__.py @@ -0,0 +1,6 @@ +""" +Useful information for setting the language preference +""" + +# this is the UserPreference key for the user's preferred language +LANGUAGE_KEY = 'pref-lang' diff --git a/common/djangoapps/user_api/middleware.py b/common/djangoapps/lang_pref/middleware.py similarity index 81% rename from common/djangoapps/user_api/middleware.py rename to common/djangoapps/lang_pref/middleware.py index faeb51423d..b14ea33690 100644 --- a/common/djangoapps/user_api/middleware.py +++ b/common/djangoapps/lang_pref/middleware.py @@ -1,11 +1,12 @@ """ -Middleware for UserPreferences +Middleware for Language Preferences """ -from user_api.models import UserPreference, LANGUAGE_KEY +from user_api.models import UserPreference +from lang_pref import LANGUAGE_KEY -class UserPreferenceMiddleware(object): +class LanguagePreferenceMiddleware(object): """ Middleware for user preferences. diff --git a/common/djangoapps/user_api/tests/test_middleware.py b/common/djangoapps/lang_pref/tests/test_middleware.py similarity index 88% rename from common/djangoapps/user_api/tests/test_middleware.py rename to common/djangoapps/lang_pref/tests/test_middleware.py index a3bbe8076b..68d39265b6 100644 --- a/common/djangoapps/user_api/tests/test_middleware.py +++ b/common/djangoapps/lang_pref/tests/test_middleware.py @@ -2,8 +2,9 @@ from django.test import TestCase from django.test.client import RequestFactory from django.contrib.sessions.middleware import SessionMiddleware -from user_api.middleware import UserPreferenceMiddleware -from user_api.models import UserPreference, LANGUAGE_KEY +from lang_pref.middleware import LanguagePreferenceMiddleware +from user_api.models import UserPreference +from lang_pref import LANGUAGE_KEY from student.tests.factories import UserFactory @@ -13,7 +14,7 @@ class TestUserPreferenceMiddleware(TestCase): """ def setUp(self): - self.middleware = UserPreferenceMiddleware() + self.middleware = LanguagePreferenceMiddleware() self.session_middleware = SessionMiddleware() self.user = UserFactory.create() self.request = RequestFactory().get('/somewhere') diff --git a/common/djangoapps/lang_pref/tests/test_views.py b/common/djangoapps/lang_pref/tests/test_views.py new file mode 100644 index 0000000000..54c6c73b20 --- /dev/null +++ b/common/djangoapps/lang_pref/tests/test_views.py @@ -0,0 +1,33 @@ +""" +Tests for the language setting view +""" +from django.core.urlresolvers import reverse +from django.test import TestCase +from student.tests.factories import UserFactory +from user_api.models import UserPreference +from lang_pref import LANGUAGE_KEY + +class TestLanguageSetting(TestCase): + """ + Test setting languages + """ + def test_set_preference_happy(self): + user = UserFactory.create() + self.client.login(username=user.username, password='test') + + lang = 'en' + response = self.client.post(reverse('lang_pref_set_language'), {'language': lang}) + + self.assertEquals(response.status_code, 200) + user_pref = UserPreference.get_preference(user, LANGUAGE_KEY) + self.assertEqual(user_pref, lang) + + def test_set_preference_missing_lang(self): + user = UserFactory.create() + self.client.login(username=user.username, password='test') + + response = self.client.post(reverse('lang_pref_set_language')) + + self.assertEquals(response.status_code, 400) + + self.assertIsNone(UserPreference.get_preference(user, LANGUAGE_KEY)) diff --git a/common/djangoapps/lang_pref/urls.py b/common/djangoapps/lang_pref/urls.py new file mode 100644 index 0000000000..5eb5ea3b96 --- /dev/null +++ b/common/djangoapps/lang_pref/urls.py @@ -0,0 +1,10 @@ +""" +Urls for managing language preferences +""" + +from django.conf.urls import patterns, url + +urlpatterns = patterns( + '', + url(r'^setlang/', 'lang_pref.views.set_language', name='lang_pref_set_language') +) diff --git a/common/djangoapps/lang_pref/views.py b/common/djangoapps/lang_pref/views.py new file mode 100644 index 0000000000..c04e4db6ad --- /dev/null +++ b/common/djangoapps/lang_pref/views.py @@ -0,0 +1,22 @@ +""" +Views for accessing language preferences +""" +from django.contrib.auth.decorators import login_required +from django.http import HttpResponse, HttpResponseBadRequest + +from user_api.models import UserPreference +from lang_pref import LANGUAGE_KEY + +@login_required +def set_language(request): + """ + This view is called when the user would like to set a language preference + """ + user = request.user + lang_pref = request.POST.get('language', None) + + if lang_pref: + UserPreference.set_preference(user, LANGUAGE_KEY, lang_pref) + return HttpResponse('{"success": true}') + + return HttpResponseBadRequest('no language provided') diff --git a/common/djangoapps/student/views.py b/common/djangoapps/student/views.py index d493608c5a..24808d7539 100644 --- a/common/djangoapps/student/views.py +++ b/common/djangoapps/student/views.py @@ -62,7 +62,8 @@ import external_auth.views from bulk_email.models import Optout, CourseAuthorization import shoppingcart -from user_api.models import UserPreference, LANGUAGE_KEY +from user_api.models import UserPreference +from lang_pref import LANGUAGE_KEY import track.views @@ -472,13 +473,17 @@ def dashboard(request): language_options = DarkLangConfig.current().released_languages_list + # add in the default language if it's not in the list of released languages if settings.LANGUAGE_CODE not in language_options: language_options.append(settings.LANGUAGE_CODE) + # try to get the prefered language for the user cur_lang_code = UserPreference.get_preference(request.user, LANGUAGE_KEY) if cur_lang_code: + # if the user has a preference, get the name from the code current_language = settings.LANGUAGE_DICT[cur_lang_code] else: + # if the user doesn't have a preference, use the default language current_language = settings.LANGUAGE_DICT[settings.LANGUAGE_CODE] context = { diff --git a/common/djangoapps/user_api/models.py b/common/djangoapps/user_api/models.py index ce3785fe1b..77ab4c6c95 100644 --- a/common/djangoapps/user_api/models.py +++ b/common/djangoapps/user_api/models.py @@ -1,9 +1,6 @@ from django.contrib.auth.models import User from django.db import models -# this is the UserPreference key for the user's preferred language -LANGUAGE_KEY = 'pref-lang' - class UserPreference(models.Model): """A user's preference, stored as generic text to be processed by client""" diff --git a/common/djangoapps/user_api/tests/test_models.py b/common/djangoapps/user_api/tests/test_models.py index 6e3e8c21a4..d69eda18cb 100644 --- a/common/djangoapps/user_api/tests/test_models.py +++ b/common/djangoapps/user_api/tests/test_models.py @@ -29,6 +29,8 @@ class UserPreferenceModelTest(TestCase): ) def test_get_set_preference(self): + # tests for the getters and setters of preferences + user = UserFactory.create() key = 'testkey' value = 'testvalue' diff --git a/common/djangoapps/user_api/tests/test_views.py b/common/djangoapps/user_api/tests/test_views.py index b7ac3c07d9..4143a467d7 100644 --- a/common/djangoapps/user_api/tests/test_views.py +++ b/common/djangoapps/user_api/tests/test_views.py @@ -2,12 +2,11 @@ import base64 from django.test import TestCase from django.test.utils import override_settings -from django.core.urlresolvers import reverse import json import re from student.tests.factories import UserFactory from unittest import SkipTest -from user_api.models import UserPreference, LANGUAGE_KEY +from user_api.models import UserPreference from user_api.tests.factories import UserPreferenceFactory @@ -84,7 +83,7 @@ class ApiTestCase(TestCase): self.assertEqual(response.status_code, 403) def assertHttpBadRequest(self, response): - """Assert that the given response has the status code 403""" + """Assert that the given response has the status code 400""" self.assertEqual(response.status_code, 400) def assertHttpMethodNotAllowed(self, response): @@ -92,7 +91,7 @@ class ApiTestCase(TestCase): self.assertEqual(response.status_code, 405) -class NoUserApiTestCase(ApiTestCase): +class EmptyUserTestCase(ApiTestCase): def test_get_list_empty(self): result = self.get_json(self.LIST_URI) self.assertEqual(result["count"], 0) @@ -360,29 +359,3 @@ class UserPreferenceViewSetTest(UserApiTestCase): "url": uri, } ) - - -class TestLanguageSetting(ApiTestCase): - """ - Test setting languages - """ - def test_set_preference_happy(self): - user = UserFactory.create() - self.client.login(username=user.username, password='test') - - lang = 'en' - response = self.client.post(reverse('user_api_set_language'), {'language': lang}) - - self.assertHttpOK(response) - user_pref = UserPreference.get_preference(user, LANGUAGE_KEY) - self.assertEqual(user_pref, lang) - - def test_set_preference_missing_lang(self): - user = UserFactory.create() - self.client.login(username=user.username, password='test') - - response = self.client.post(reverse('user_api_set_language')) - - self.assertHttpBadRequest(response) - - self.assertIsNone(UserPreference.get_preference(user, LANGUAGE_KEY)) diff --git a/common/djangoapps/user_api/urls.py b/common/djangoapps/user_api/urls.py index b904ebc446..de24b67f02 100644 --- a/common/djangoapps/user_api/urls.py +++ b/common/djangoapps/user_api/urls.py @@ -9,5 +9,4 @@ user_api_router.register(r'user_prefs', user_api_views.UserPreferenceViewSet) urlpatterns = patterns( '', url(r'^v1/', include(user_api_router.urls)), - url(r'^v1/setlang/', 'user_api.views.set_language', name='user_api_set_language') ) diff --git a/common/djangoapps/user_api/views.py b/common/djangoapps/user_api/views.py index 8c6b5b2ec9..23066920d8 100644 --- a/common/djangoapps/user_api/views.py +++ b/common/djangoapps/user_api/views.py @@ -1,13 +1,11 @@ from django.conf import settings from django.contrib.auth.models import User -from django.contrib.auth.decorators import login_required -from django.http import HttpResponse, HttpResponseBadRequest from rest_framework import authentication from rest_framework import filters from rest_framework import permissions from rest_framework import viewsets -from user_api.models import UserPreference, LANGUAGE_KEY from user_api.serializers import UserSerializer, UserPreferenceSerializer +from user_api.models import UserPreference class ApiKeyHeaderPermission(permissions.BasePermission): @@ -45,18 +43,3 @@ class UserPreferenceViewSet(viewsets.ReadOnlyModelViewSet): serializer_class = UserPreferenceSerializer paginate_by = 10 paginate_by_param = "page_size" - - -@login_required -def set_language(request): - """ - This view is called when the user would like to set a language preference - """ - user = request.user - lang_pref = request.POST.get('language', None) - - if lang_pref: - UserPreference.set_preference(user, LANGUAGE_KEY, lang_pref) - return HttpResponse('{"success": true}') - - return HttpResponseBadRequest('no language provided') diff --git a/common/test/acceptance/tests/test_lms.py b/common/test/acceptance/tests/test_lms.py index efb63d73ae..351748a7f3 100644 --- a/common/test/acceptance/tests/test_lms.py +++ b/common/test/acceptance/tests/test_lms.py @@ -95,6 +95,7 @@ class LanguageTest(UniqueCourseTest): self.dashboard_page.visit() # Change language to Dummy Esperanto self.dashboard_page.change_language(self.test_new_lang) + # We should see the dummy-language text on the page self.assertTrue(self.browser.is_text_present(self.current_courses_text)) def test_language_persists(self): @@ -112,7 +113,7 @@ class LanguageTest(UniqueCourseTest): auto_auth_page.visit() self.dashboard_page.visit() - # This string is unicode for "ÇÜRRÉNT ÇØÜRSÉS", which should appear in our Dummy Esperanto page + # We should see the dummy-language text on the page self.browser.is_text_present(self.current_courses_text) self.assertTrue(self.browser.is_text_present(self.current_courses_text)) diff --git a/lms/envs/common.py b/lms/envs/common.py index 0acc47e4b4..69b9440e15 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -703,7 +703,7 @@ MIDDLEWARE_CLASSES = ( # Allows us to set user preferences # should be after DarkLangMiddleware - 'user_api.middleware.UserPreferenceMiddleware', + 'lang_pref.middleware.LanguagePreferenceMiddleware', # Detects user-requested locale from 'accept-language' header in http request 'django.middleware.locale.LocaleMiddleware', diff --git a/lms/templates/dashboard.html b/lms/templates/dashboard.html index b4b122f497..dfccbe476b 100644 --- a/lms/templates/dashboard.html +++ b/lms/templates/dashboard.html @@ -85,7 +85,7 @@ $("#submit-lang").click(function(event, xhr) { event.preventDefault(); - $.post('/user_api/v1/setlang/', + $.post('/lang_pref/setlang/', {"language": $('#settings-language-value').val()}) .done( function(data){ diff --git a/lms/urls.py b/lms/urls.py index 47f1acc911..634aec78c3 100644 --- a/lms/urls.py +++ b/lms/urls.py @@ -61,6 +61,8 @@ urlpatterns = ('', # nopep8 url(r'^user_api/', include('user_api.urls')), + url(r'^lang_pref/', include('lang_pref.urls')), + url(r'^', include('waffle.urls')), url(r'^i18n/', include('django.conf.urls.i18n')),