Refactor out new lang_pref djangoapp
This commit is contained in:
committed by
Julia Hansbrough
parent
efe7bdacfc
commit
b61649f9eb
6
common/djangoapps/lang_pref/__init__.py
Normal file
6
common/djangoapps/lang_pref/__init__.py
Normal file
@@ -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'
|
||||
@@ -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.
|
||||
|
||||
@@ -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')
|
||||
33
common/djangoapps/lang_pref/tests/test_views.py
Normal file
33
common/djangoapps/lang_pref/tests/test_views.py
Normal file
@@ -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))
|
||||
10
common/djangoapps/lang_pref/urls.py
Normal file
10
common/djangoapps/lang_pref/urls.py
Normal file
@@ -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')
|
||||
)
|
||||
22
common/djangoapps/lang_pref/views.py
Normal file
22
common/djangoapps/lang_pref/views.py
Normal file
@@ -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')
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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"""
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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')
|
||||
)
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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){
|
||||
|
||||
@@ -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')),
|
||||
|
||||
Reference in New Issue
Block a user