Commit b61649f9 by thedeadparrot Committed by Julia Hansbrough

Refactor out new lang_pref djangoapp

parent efe7bdac
"""
Useful information for setting the language preference
"""
# this is the UserPreference key for the user's preferred language
LANGUAGE_KEY = 'pref-lang'
""" """
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. Middleware for user preferences.
......
...@@ -2,8 +2,9 @@ from django.test import TestCase ...@@ -2,8 +2,9 @@ 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
from user_api.middleware import UserPreferenceMiddleware from lang_pref.middleware import LanguagePreferenceMiddleware
from user_api.models import UserPreference, LANGUAGE_KEY from user_api.models import UserPreference
from lang_pref import LANGUAGE_KEY
from student.tests.factories import UserFactory from student.tests.factories import UserFactory
...@@ -13,7 +14,7 @@ class TestUserPreferenceMiddleware(TestCase): ...@@ -13,7 +14,7 @@ class TestUserPreferenceMiddleware(TestCase):
""" """
def setUp(self): def setUp(self):
self.middleware = UserPreferenceMiddleware() self.middleware = LanguagePreferenceMiddleware()
self.session_middleware = SessionMiddleware() self.session_middleware = SessionMiddleware()
self.user = UserFactory.create() self.user = UserFactory.create()
self.request = RequestFactory().get('/somewhere') self.request = RequestFactory().get('/somewhere')
......
"""
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))
"""
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')
)
"""
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 ...@@ -62,7 +62,8 @@ import external_auth.views
from bulk_email.models import Optout, CourseAuthorization from bulk_email.models import Optout, CourseAuthorization
import shoppingcart 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 import track.views
...@@ -472,13 +473,17 @@ def dashboard(request): ...@@ -472,13 +473,17 @@ def dashboard(request):
language_options = DarkLangConfig.current().released_languages_list 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: if settings.LANGUAGE_CODE not in language_options:
language_options.append(settings.LANGUAGE_CODE) 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) cur_lang_code = UserPreference.get_preference(request.user, LANGUAGE_KEY)
if cur_lang_code: if cur_lang_code:
# if the user has a preference, get the name from the code
current_language = settings.LANGUAGE_DICT[cur_lang_code] current_language = settings.LANGUAGE_DICT[cur_lang_code]
else: else:
# if the user doesn't have a preference, use the default language
current_language = settings.LANGUAGE_DICT[settings.LANGUAGE_CODE] current_language = settings.LANGUAGE_DICT[settings.LANGUAGE_CODE]
context = { context = {
......
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.db import models from django.db import models
# this is the UserPreference key for the user's preferred language
LANGUAGE_KEY = 'pref-lang'
class UserPreference(models.Model): class UserPreference(models.Model):
"""A user's preference, stored as generic text to be processed by client""" """A user's preference, stored as generic text to be processed by client"""
......
...@@ -29,6 +29,8 @@ class UserPreferenceModelTest(TestCase): ...@@ -29,6 +29,8 @@ class UserPreferenceModelTest(TestCase):
) )
def test_get_set_preference(self): def test_get_set_preference(self):
# tests for the getters and setters of preferences
user = UserFactory.create() user = UserFactory.create()
key = 'testkey' key = 'testkey'
value = 'testvalue' value = 'testvalue'
......
...@@ -2,12 +2,11 @@ import base64 ...@@ -2,12 +2,11 @@ import base64
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.core.urlresolvers import reverse
import json import json
import re import re
from student.tests.factories import UserFactory from student.tests.factories import UserFactory
from unittest import SkipTest 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 from user_api.tests.factories import UserPreferenceFactory
...@@ -84,7 +83,7 @@ class ApiTestCase(TestCase): ...@@ -84,7 +83,7 @@ class ApiTestCase(TestCase):
self.assertEqual(response.status_code, 403) self.assertEqual(response.status_code, 403)
def assertHttpBadRequest(self, response): 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) self.assertEqual(response.status_code, 400)
def assertHttpMethodNotAllowed(self, response): def assertHttpMethodNotAllowed(self, response):
...@@ -92,7 +91,7 @@ class ApiTestCase(TestCase): ...@@ -92,7 +91,7 @@ class ApiTestCase(TestCase):
self.assertEqual(response.status_code, 405) self.assertEqual(response.status_code, 405)
class NoUserApiTestCase(ApiTestCase): class EmptyUserTestCase(ApiTestCase):
def test_get_list_empty(self): def test_get_list_empty(self):
result = self.get_json(self.LIST_URI) result = self.get_json(self.LIST_URI)
self.assertEqual(result["count"], 0) self.assertEqual(result["count"], 0)
...@@ -360,29 +359,3 @@ class UserPreferenceViewSetTest(UserApiTestCase): ...@@ -360,29 +359,3 @@ class UserPreferenceViewSetTest(UserApiTestCase):
"url": uri, "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) ...@@ -9,5 +9,4 @@ user_api_router.register(r'user_prefs', user_api_views.UserPreferenceViewSet)
urlpatterns = patterns( urlpatterns = patterns(
'', '',
url(r'^v1/', include(user_api_router.urls)), url(r'^v1/', include(user_api_router.urls)),
url(r'^v1/setlang/', 'user_api.views.set_language', name='user_api_set_language')
) )
from django.conf import settings from django.conf import settings
from django.contrib.auth.models import User 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 authentication
from rest_framework import filters from rest_framework import filters
from rest_framework import permissions from rest_framework import permissions
from rest_framework import viewsets from rest_framework import viewsets
from user_api.models import UserPreference, LANGUAGE_KEY
from user_api.serializers import UserSerializer, UserPreferenceSerializer from user_api.serializers import UserSerializer, UserPreferenceSerializer
from user_api.models import UserPreference
class ApiKeyHeaderPermission(permissions.BasePermission): class ApiKeyHeaderPermission(permissions.BasePermission):
...@@ -45,18 +43,3 @@ class UserPreferenceViewSet(viewsets.ReadOnlyModelViewSet): ...@@ -45,18 +43,3 @@ class UserPreferenceViewSet(viewsets.ReadOnlyModelViewSet):
serializer_class = UserPreferenceSerializer serializer_class = UserPreferenceSerializer
paginate_by = 10 paginate_by = 10
paginate_by_param = "page_size" 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): ...@@ -95,6 +95,7 @@ class LanguageTest(UniqueCourseTest):
self.dashboard_page.visit() self.dashboard_page.visit()
# Change language to Dummy Esperanto # Change language to Dummy Esperanto
self.dashboard_page.change_language(self.test_new_lang) 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)) self.assertTrue(self.browser.is_text_present(self.current_courses_text))
def test_language_persists(self): def test_language_persists(self):
...@@ -112,7 +113,7 @@ class LanguageTest(UniqueCourseTest): ...@@ -112,7 +113,7 @@ class LanguageTest(UniqueCourseTest):
auto_auth_page.visit() auto_auth_page.visit()
self.dashboard_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.browser.is_text_present(self.current_courses_text)
self.assertTrue(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 = ( ...@@ -703,7 +703,7 @@ MIDDLEWARE_CLASSES = (
# Allows us to set user preferences # Allows us to set user preferences
# should be after DarkLangMiddleware # should be after DarkLangMiddleware
'user_api.middleware.UserPreferenceMiddleware', 'lang_pref.middleware.LanguagePreferenceMiddleware',
# Detects user-requested locale from 'accept-language' header in http request # Detects user-requested locale from 'accept-language' header in http request
'django.middleware.locale.LocaleMiddleware', 'django.middleware.locale.LocaleMiddleware',
......
...@@ -85,7 +85,7 @@ ...@@ -85,7 +85,7 @@
$("#submit-lang").click(function(event, xhr) { $("#submit-lang").click(function(event, xhr) {
event.preventDefault(); event.preventDefault();
$.post('/user_api/v1/setlang/', $.post('/lang_pref/setlang/',
{"language": $('#settings-language-value').val()}) {"language": $('#settings-language-value').val()})
.done( .done(
function(data){ function(data){
......
...@@ -61,6 +61,8 @@ urlpatterns = ('', # nopep8 ...@@ -61,6 +61,8 @@ urlpatterns = ('', # nopep8
url(r'^user_api/', include('user_api.urls')), url(r'^user_api/', include('user_api.urls')),
url(r'^lang_pref/', include('lang_pref.urls')),
url(r'^', include('waffle.urls')), url(r'^', include('waffle.urls')),
url(r'^i18n/', include('django.conf.urls.i18n')), url(r'^i18n/', include('django.conf.urls.i18n')),
......
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