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.
......
......@@ -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')
......
"""
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
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 = {
......
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')
)
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')),
......
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