Commit f2c3fa90 by Andy Armstrong Committed by GitHub

Merge pull request #13677 from edx/andya/move-language-apps

Move dark_lang and lang_pref apps to openedx/core
parents 9a23babc 4d4097e1
...@@ -226,6 +226,7 @@ SOCIAL_SHARING_SETTINGS = { ...@@ -226,6 +226,7 @@ SOCIAL_SHARING_SETTINGS = {
PROJECT_ROOT = path(__file__).abspath().dirname().dirname() # /edx-platform/cms PROJECT_ROOT = path(__file__).abspath().dirname().dirname() # /edx-platform/cms
REPO_ROOT = PROJECT_ROOT.dirname() REPO_ROOT = PROJECT_ROOT.dirname()
COMMON_ROOT = REPO_ROOT / "common" COMMON_ROOT = REPO_ROOT / "common"
OPENEDX_ROOT = REPO_ROOT / "openedx"
CMS_ROOT = REPO_ROOT / "cms" CMS_ROOT = REPO_ROOT / "cms"
LMS_ROOT = REPO_ROOT / "lms" LMS_ROOT = REPO_ROOT / "lms"
ENV_ROOT = REPO_ROOT.dirname() # virtualenv dir /edx-platform is in ENV_ROOT = REPO_ROOT.dirname() # virtualenv dir /edx-platform is in
...@@ -251,6 +252,7 @@ MAKO_TEMPLATES['main'] = [ ...@@ -251,6 +252,7 @@ MAKO_TEMPLATES['main'] = [
COMMON_ROOT / 'templates', COMMON_ROOT / 'templates',
COMMON_ROOT / 'djangoapps' / 'pipeline_mako' / 'templates', COMMON_ROOT / 'djangoapps' / 'pipeline_mako' / 'templates',
COMMON_ROOT / 'static', # required to statically include common Underscore templates COMMON_ROOT / 'static', # required to statically include common Underscore templates
OPENEDX_ROOT / 'core' / 'djangoapps' / 'dark_lang' / 'templates',
CMS_ROOT / 'djangoapps' / 'pipeline_js' / 'templates', CMS_ROOT / 'djangoapps' / 'pipeline_js' / 'templates',
] ]
...@@ -360,10 +362,10 @@ MIDDLEWARE_CLASSES = ( ...@@ -360,10 +362,10 @@ MIDDLEWARE_CLASSES = (
'track.middleware.TrackMiddleware', 'track.middleware.TrackMiddleware',
# This is used to set or update the user language preferences. # This is used to set or update the user language preferences.
'lang_pref.middleware.LanguagePreferenceMiddleware', 'openedx.core.djangoapps.lang_pref.middleware.LanguagePreferenceMiddleware',
# Allows us to dark-launch particular languages # Allows us to dark-launch particular languages
'dark_lang.middleware.DarkLangMiddleware', 'openedx.core.djangoapps.dark_lang.middleware.DarkLangMiddleware',
'embargo.middleware.EmbargoMiddleware', 'embargo.middleware.EmbargoMiddleware',
...@@ -856,7 +858,7 @@ INSTALLED_APPS = ( ...@@ -856,7 +858,7 @@ INSTALLED_APPS = (
'course_modes', 'course_modes',
# Dark-launching languages # Dark-launching languages
'dark_lang', 'openedx.core.djangoapps.dark_lang',
# User preferences # User preferences
'openedx.core.djangoapps.user_api', 'openedx.core.djangoapps.user_api',
......
...@@ -10,6 +10,6 @@ from django.utils.translation import ugettext as _ ...@@ -10,6 +10,6 @@ from django.utils.translation import ugettext as _
<%block name="bodyclass">is-signedin pattern-library</%block> <%block name="bodyclass">is-signedin pattern-library</%block>
<%block name="content"> <%block name="content">
<%include file="/darklang/preview_lang_include.html" /> <%include file="/dark_lang/preview_lang_include.html" />
</%block> </%block>
...@@ -55,10 +55,14 @@ urlpatterns = patterns( ...@@ -55,10 +55,14 @@ urlpatterns = patterns(
url(r'^api/user/', include('openedx.core.djangoapps.user_api.urls')), url(r'^api/user/', include('openedx.core.djangoapps.user_api.urls')),
# Update session view # Update session view
url(r'^lang_pref/session_language', 'lang_pref.views.update_session_language', name='session_language'), url(
r'^lang_pref/session_language',
'openedx.core.djangoapps.lang_pref.views.update_session_language',
name='session_language'
),
# Darklang View to change the preview language (or dark language) # Darklang View to change the preview language (or dark language)
url(r'^update_lang/', include('dark_lang.urls', namespace='darklang')), url(r'^update_lang/', include('openedx.core.djangoapps.dark_lang.urls', namespace='dark_lang')),
) )
# restful api # restful api
......
...@@ -17,7 +17,7 @@ from openedx.core.djangoapps.theming.helpers import ( ...@@ -17,7 +17,7 @@ from openedx.core.djangoapps.theming.helpers import (
is_request_in_themed_site, is_request_in_themed_site,
) )
from certificates.api import get_asset_url_by_slug from certificates.api import get_asset_url_by_slug
from lang_pref.api import released_languages from openedx.core.djangoapps.lang_pref.api import released_languages
%> %>
<%def name="marketing_link(name)"><% <%def name="marketing_link(name)"><%
......
...@@ -15,7 +15,7 @@ import mock ...@@ -15,7 +15,7 @@ import mock
import pytz import pytz
from openedx.core.djangoapps.user_api.preferences.api import get_user_preference from openedx.core.djangoapps.user_api.preferences.api import get_user_preference
from lang_pref import LANGUAGE_KEY from openedx.core.djangoapps.lang_pref import LANGUAGE_KEY
from notification_prefs import NOTIFICATION_PREF_KEY from notification_prefs import NOTIFICATION_PREF_KEY
from openedx.core.djangoapps.external_auth.models import ExternalAuthMap from openedx.core.djangoapps.external_auth.models import ExternalAuthMap
import student import student
......
...@@ -85,8 +85,6 @@ from openedx.core.djangoapps.external_auth.login_and_register import ( ...@@ -85,8 +85,6 @@ from openedx.core.djangoapps.external_auth.login_and_register import (
register as external_auth_register register as external_auth_register
) )
from lang_pref import LANGUAGE_KEY
import track.views import track.views
import dogstats_wrapper as dog_stats_api import dogstats_wrapper as dog_stats_api
...@@ -120,11 +118,12 @@ from eventtracking import tracker ...@@ -120,11 +118,12 @@ from eventtracking import tracker
from notification_prefs.views import enable_notifications from notification_prefs.views import enable_notifications
from openedx.core.djangoapps.credit.email_utils import get_credit_provider_display_names, make_providers_strings from openedx.core.djangoapps.credit.email_utils import get_credit_provider_display_names, make_providers_strings
from openedx.core.djangoapps.user_api.preferences import api as preferences_api from openedx.core.djangoapps.lang_pref import LANGUAGE_KEY
from openedx.core.djangoapps.programs.models import ProgramsApiConfig
from openedx.core.djangoapps.programs import utils as programs_utils from openedx.core.djangoapps.programs import utils as programs_utils
from openedx.core.djangoapps.programs.models import ProgramsApiConfig
from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers
from openedx.core.djangoapps.theming import helpers as theming_helpers from openedx.core.djangoapps.theming import helpers as theming_helpers
from openedx.core.djangoapps.user_api.preferences import api as preferences_api
log = logging.getLogger("edx.student") log = logging.getLogger("edx.student")
......
""" """
Tests i18n in courseware Tests i18n in courseware
""" """
import re import re
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.core.urlresolvers import reverse from django.core.urlresolvers import reverse
...@@ -9,10 +11,10 @@ from django.test import TestCase ...@@ -9,10 +11,10 @@ from django.test import TestCase
from django.test.client import Client from django.test.client import Client
from django.utils import translation from django.utils import translation
from nose.plugins.attrib import attr from nose.plugins.attrib import attr
from openedx.core.djangoapps.user_api.preferences.api import set_user_preference
from dark_lang.models import DarkLangConfig from openedx.core.djangoapps.dark_lang.models import DarkLangConfig
from lang_pref import LANGUAGE_KEY from openedx.core.djangoapps.lang_pref import LANGUAGE_KEY
from openedx.core.djangoapps.user_api.preferences.api import set_user_preference
from student.tests.factories import UserFactory from student.tests.factories import UserFactory
......
...@@ -22,10 +22,10 @@ import logging ...@@ -22,10 +22,10 @@ import logging
import newrelic.agent import newrelic.agent
import urllib import urllib
from lang_pref import LANGUAGE_KEY
from xblock.fragment import Fragment from xblock.fragment import Fragment
from opaque_keys.edx.keys import CourseKey from opaque_keys.edx.keys import CourseKey
from openedx.core.lib.time_zone_utils import get_user_time_zone from openedx.core.lib.time_zone_utils import get_user_time_zone
from openedx.core.djangoapps.lang_pref import LANGUAGE_KEY
from openedx.core.djangoapps.user_api.preferences.api import get_user_preference from openedx.core.djangoapps.user_api.preferences.api import get_user_preference
from shoppingcart.models import CourseRegistrationCode from shoppingcart.models import CourseRegistrationCode
from student.models import CourseEnrollment from student.models import CourseEnrollment
......
...@@ -14,21 +14,19 @@ from django.core.mail import send_mail ...@@ -14,21 +14,19 @@ from django.core.mail import send_mail
from django.utils.translation import override as override_language from django.utils.translation import override as override_language
from course_modes.models import CourseMode from course_modes.models import CourseMode
from courseware.models import StudentModule
from courseware.model_data import FieldDataCache from courseware.model_data import FieldDataCache
from courseware.module_render import get_module_for_descriptor from courseware.module_render import get_module_for_descriptor
from courseware.models import StudentModule
from edxmako.shortcuts import render_to_string from edxmako.shortcuts import render_to_string
from lms.djangoapps.grades.scores import weighted_score from lms.djangoapps.grades.scores import weighted_score
from lms.djangoapps.grades.signals.signals import SCORE_CHANGED from lms.djangoapps.grades.signals.signals import SCORE_CHANGED
from lang_pref import LANGUAGE_KEY from openedx.core.djangoapps.lang_pref import LANGUAGE_KEY
from student.models import CourseEnrollment, CourseEnrollmentAllowed from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers
from submissions import api as sub_api # installed from the edx-submissions repository
from student.models import anonymous_id_for_user
from openedx.core.djangoapps.user_api.models import UserPreference from openedx.core.djangoapps.user_api.models import UserPreference
from submissions import api as sub_api # installed from the edx-submissions repository
from student.models import CourseEnrollment, CourseEnrollmentAllowed, anonymous_id_for_user
from xmodule.modulestore.django import modulestore from xmodule.modulestore.django import modulestore
from xmodule.modulestore.exceptions import ItemNotFoundError from xmodule.modulestore.exceptions import ItemNotFoundError
from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
......
...@@ -9,10 +9,10 @@ from django.test.utils import override_settings ...@@ -9,10 +9,10 @@ from django.test.utils import override_settings
from nose.plugins.attrib import attr from nose.plugins.attrib import attr
from courseware.tests.factories import InstructorFactory from courseware.tests.factories import InstructorFactory
from lang_pref import LANGUAGE_KEY from openedx.core.djangoapps.lang_pref import LANGUAGE_KEY
from openedx.core.djangoapps.user_api.preferences.api import set_user_preference, delete_user_preference
from student.models import CourseEnrollment from student.models import CourseEnrollment
from student.tests.factories import UserFactory from student.tests.factories import UserFactory
from openedx.core.djangoapps.user_api.preferences.api import set_user_preference, delete_user_preference
from xmodule.modulestore.tests.factories import CourseFactory from xmodule.modulestore.tests.factories import CourseFactory
from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase
......
...@@ -3,8 +3,9 @@ from django.http import Http404 ...@@ -3,8 +3,9 @@ from django.http import Http404
from rest_framework import serializers from rest_framework import serializers
from openedx.core.djangoapps.course_groups.cohorts import is_course_cohorted from openedx.core.djangoapps.course_groups.cohorts import is_course_cohorted
from notification_prefs import NOTIFICATION_PREF_KEY from openedx.core.djangoapps.lang_pref import LANGUAGE_KEY
from lang_pref import LANGUAGE_KEY
from lms.djangoapps.notification_prefs import NOTIFICATION_PREF_KEY
class NotifierUserSerializer(serializers.ModelSerializer): class NotifierUserSerializer(serializers.ModelSerializer):
......
...@@ -5,14 +5,14 @@ from django.conf import settings ...@@ -5,14 +5,14 @@ from django.conf import settings
from django.test.client import RequestFactory from django.test.client import RequestFactory
from django.test.utils import override_settings from django.test.utils import override_settings
from openedx.core.djangoapps.course_groups.tests.helpers import CohortFactory
from django_comment_common.models import Role, Permission from django_comment_common.models import Role, Permission
from lang_pref import LANGUAGE_KEY
from notification_prefs import NOTIFICATION_PREF_KEY from notification_prefs import NOTIFICATION_PREF_KEY
from notifier_api.views import NotifierUsersViewSet from notifier_api.views import NotifierUsersViewSet
from opaque_keys.edx.locator import CourseLocator from opaque_keys.edx.locator import CourseLocator
from student.models import CourseEnrollment from student.models import CourseEnrollment
from student.tests.factories import UserFactory, CourseEnrollmentFactory from student.tests.factories import UserFactory, CourseEnrollmentFactory
from openedx.core.djangoapps.course_groups.tests.helpers import CohortFactory
from openedx.core.djangoapps.lang_pref import LANGUAGE_KEY
from openedx.core.djangoapps.user_api.models import UserPreference from openedx.core.djangoapps.user_api.models import UserPreference
from openedx.core.djangoapps.user_api.tests.factories import UserPreferenceFactory from openedx.core.djangoapps.user_api.tests.factories import UserPreferenceFactory
from util.testing import UrlResetMixin from util.testing import UrlResetMixin
......
...@@ -5,10 +5,10 @@ from django.core.cache import cache ...@@ -5,10 +5,10 @@ from django.core.cache import cache
from courseware.access import has_access from courseware.access import has_access
from openedx.core.djangoapps.content.course_overviews.models import CourseOverview from openedx.core.djangoapps.content.course_overviews.models import CourseOverview
from openedx.core.djangoapps.lang_pref import LANGUAGE_KEY
from openedx.core.djangoapps.user_api.models import UserPreference from openedx.core.djangoapps.user_api.models import UserPreference
from student.models import anonymous_id_for_user from student.models import anonymous_id_for_user
from student.models import UserProfile from student.models import UserProfile
from lang_pref import LANGUAGE_KEY
from student.roles import GlobalStaff, CourseStaffRole, CourseInstructorRole from student.roles import GlobalStaff, CourseStaffRole, CourseInstructorRole
......
# pylint: disable=missing-docstring # pylint: disable=missing-docstring
from django.core.cache import cache from django.core.cache import cache
from django.test.utils import override_settings from django.test.utils import override_settings
from lang_pref import LANGUAGE_KEY
from xmodule.modulestore.tests.factories import (check_mongo_calls, CourseFactory) from xmodule.modulestore.tests.factories import (check_mongo_calls, CourseFactory)
from student.models import anonymous_id_for_user from student.models import anonymous_id_for_user
...@@ -9,6 +8,7 @@ from student.models import UserProfile ...@@ -9,6 +8,7 @@ from student.models import UserProfile
from student.roles import (CourseInstructorRole, CourseStaffRole, GlobalStaff, from student.roles import (CourseInstructorRole, CourseStaffRole, GlobalStaff,
OrgInstructorRole, OrgStaffRole) OrgInstructorRole, OrgStaffRole)
from student.tests.factories import UserFactory, UserProfileFactory from student.tests.factories import UserFactory, UserProfileFactory
from openedx.core.djangoapps.lang_pref import LANGUAGE_KEY
from openedx.core.djangoapps.user_api.preferences.api import set_user_preference from openedx.core.djangoapps.user_api.preferences.api import set_user_preference
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
......
...@@ -26,11 +26,11 @@ from openedx.core.djangoapps.external_auth.login_and_register import ( ...@@ -26,11 +26,11 @@ from openedx.core.djangoapps.external_auth.login_and_register import (
login as external_auth_login, login as external_auth_login,
register as external_auth_register register as external_auth_register
) )
from lang_pref.api import released_languages, all_languages
from openedx.core.djangoapps.commerce.utils import ecommerce_api_client from openedx.core.djangoapps.commerce.utils import ecommerce_api_client
from openedx.core.djangoapps.lang_pref.api import released_languages, all_languages
from openedx.core.djangoapps.programs.models import ProgramsApiConfig from openedx.core.djangoapps.programs.models import ProgramsApiConfig
from openedx.core.djangoapps.theming.helpers import is_request_in_themed_site
from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers
from openedx.core.djangoapps.theming.helpers import is_request_in_themed_site
from openedx.core.djangoapps.user_api.accounts.api import request_password_change from openedx.core.djangoapps.user_api.accounts.api import request_password_change
from openedx.core.djangoapps.user_api.errors import UserNotFound from openedx.core.djangoapps.user_api.errors import UserNotFound
from openedx.core.lib.time_zone_utils import TIME_ZONE_CHOICES from openedx.core.lib.time_zone_utils import TIME_ZONE_CHOICES
......
...@@ -380,6 +380,7 @@ XQUEUE_WAITTIME_BETWEEN_REQUESTS = 5 # seconds ...@@ -380,6 +380,7 @@ XQUEUE_WAITTIME_BETWEEN_REQUESTS = 5 # seconds
PROJECT_ROOT = path(__file__).abspath().dirname().dirname() # /edx-platform/lms PROJECT_ROOT = path(__file__).abspath().dirname().dirname() # /edx-platform/lms
REPO_ROOT = PROJECT_ROOT.dirname() REPO_ROOT = PROJECT_ROOT.dirname()
COMMON_ROOT = REPO_ROOT / "common" COMMON_ROOT = REPO_ROOT / "common"
OPENEDX_ROOT = REPO_ROOT / "openedx"
ENV_ROOT = REPO_ROOT.dirname() # virtualenv dir /edx-platform is in ENV_ROOT = REPO_ROOT.dirname() # virtualenv dir /edx-platform is in
COURSES_ROOT = ENV_ROOT / "data" COURSES_ROOT = ENV_ROOT / "data"
...@@ -460,10 +461,13 @@ OAUTH2_PROVIDER = { ...@@ -460,10 +461,13 @@ OAUTH2_PROVIDER = {
import tempfile import tempfile
MAKO_MODULE_DIR = os.path.join(tempfile.gettempdir(), 'mako_lms') MAKO_MODULE_DIR = os.path.join(tempfile.gettempdir(), 'mako_lms')
MAKO_TEMPLATES = {} MAKO_TEMPLATES = {}
MAKO_TEMPLATES['main'] = [PROJECT_ROOT / 'templates', MAKO_TEMPLATES['main'] = [
COMMON_ROOT / 'templates', PROJECT_ROOT / 'templates',
COMMON_ROOT / 'lib' / 'capa' / 'capa' / 'templates', COMMON_ROOT / 'templates',
COMMON_ROOT / 'djangoapps' / 'pipeline_mako' / 'templates'] COMMON_ROOT / 'lib' / 'capa' / 'capa' / 'templates',
COMMON_ROOT / 'djangoapps' / 'pipeline_mako' / 'templates',
OPENEDX_ROOT / 'core' / 'djangoapps' / 'dark_lang' / 'templates',
]
# Django templating # Django templating
TEMPLATES = [ TEMPLATES = [
...@@ -1131,12 +1135,12 @@ MIDDLEWARE_CLASSES = ( ...@@ -1131,12 +1135,12 @@ MIDDLEWARE_CLASSES = (
'embargo.middleware.EmbargoMiddleware', 'embargo.middleware.EmbargoMiddleware',
# Allows us to set user preferences # Allows us to set user preferences
'lang_pref.middleware.LanguagePreferenceMiddleware', 'openedx.core.djangoapps.lang_pref.middleware.LanguagePreferenceMiddleware',
# Allows us to dark-launch particular languages. # Allows us to dark-launch particular languages.
# Must be after LangPrefMiddleware, so ?preview-lang query params can override # Must be after LangPrefMiddleware, so ?preview-lang query params can override
# user's language preference. ?clear-lang resets to user's language preference. # user's language preference. ?clear-lang resets to user's language preference.
'dark_lang.middleware.DarkLangMiddleware', 'openedx.core.djangoapps.dark_lang.middleware.DarkLangMiddleware',
# Detects user-requested locale from 'accept-language' header in http request. # Detects user-requested locale from 'accept-language' header in http request.
# Must be after DarkLangMiddleware. # Must be after DarkLangMiddleware.
...@@ -2014,7 +2018,7 @@ INSTALLED_APPS = ( ...@@ -2014,7 +2018,7 @@ INSTALLED_APPS = (
'lms.djangoapps.verify_student', 'lms.djangoapps.verify_student',
# Dark-launching languages # Dark-launching languages
'dark_lang', 'openedx.core.djangoapps.dark_lang',
# Microsite configuration # Microsite configuration
'microsite_configuration', 'microsite_configuration',
......
...@@ -11,5 +11,5 @@ from django.utils.translation import ugettext as _ ...@@ -11,5 +11,5 @@ from django.utils.translation import ugettext as _
<%block name="bodyclass">pattern-library</%block> <%block name="bodyclass">pattern-library</%block>
<%block name="content"> <%block name="content">
<%include file="/darklang/preview_lang_include.html" /> <%include file="/dark_lang/preview_lang_include.html" />
</%block> </%block>
...@@ -85,14 +85,20 @@ urlpatterns = ( ...@@ -85,14 +85,20 @@ urlpatterns = (
url(r'^api/organizations/', include('organizations.urls', namespace='organizations')), url(r'^api/organizations/', include('organizations.urls', namespace='organizations')),
# Update session view # Update session view
url(r'^lang_pref/session_language', 'lang_pref.views.update_session_language', name='session_language'), url(
r'^lang_pref/session_language',
'openedx.core.djangoapps.lang_pref.views.update_session_language',
name='session_language'
),
# Multiple course modes and identity verification # Multiple course modes and identity verification
# TODO Namespace these! # TODO Namespace these!
url(r'^course_modes/', include('course_modes.urls')), url(r'^course_modes/', include('course_modes.urls')),
url(r'^verify_student/', include('verify_student.urls')), url(r'^verify_student/', include('verify_student.urls')),
url(r'^update_lang/', include('dark_lang.urls', namespace='darklang')), # URLs for managing dark launches of languages
url(r'^update_lang/', include('openedx.core.djangoapps.dark_lang.urls', namespace='dark_lang')),
# URLs for API access management # URLs for API access management
url(r'^api-admin/', include('openedx.core.djangoapps.api_admin.urls', namespace='api_admin')), url(r'^api-admin/', include('openedx.core.djangoapps.api_admin.urls', namespace='api_admin')),
) )
......
...@@ -5,6 +5,6 @@ Admin site bindings for dark_lang ...@@ -5,6 +5,6 @@ Admin site bindings for dark_lang
from django.contrib import admin from django.contrib import admin
from config_models.admin import ConfigurationModelAdmin from config_models.admin import ConfigurationModelAdmin
from dark_lang.models import DarkLangConfig from openedx.core.djangoapps.dark_lang.models import DarkLangConfig
admin.site.register(DarkLangConfig, ConfigurationModelAdmin) admin.site.register(DarkLangConfig, ConfigurationModelAdmin)
...@@ -8,14 +8,14 @@ This middleware must be placed before the LocaleMiddleware, but after ...@@ -8,14 +8,14 @@ This middleware must be placed before the LocaleMiddleware, but after
the SessionMiddleware. the SessionMiddleware.
""" """
from django.conf import settings from django.conf import settings
from django.utils.translation.trans_real import parse_accept_lang_header
from django.utils.translation import LANGUAGE_SESSION_KEY
from dark_lang import DARK_LANGUAGE_KEY from openedx.core.djangoapps.dark_lang import DARK_LANGUAGE_KEY
from dark_lang.models import DarkLangConfig from openedx.core.djangoapps.dark_lang.models import DarkLangConfig
from openedx.core.djangoapps.user_api.preferences.api import ( from openedx.core.djangoapps.user_api.preferences.api import (
get_user_preference get_user_preference
) )
from django.utils.translation.trans_real import parse_accept_lang_header
from django.utils.translation import LANGUAGE_SESSION_KEY
# If django 1.7 or higher is used, the right-side can be updated with new-style codes. # If django 1.7 or higher is used, the right-side can be updated with new-style codes.
CHINESE_LANGUAGE_CODE_MAP = { CHINESE_LANGUAGE_CODE_MAP = {
......
...@@ -8,13 +8,16 @@ from config_models.models import ConfigurationModel ...@@ -8,13 +8,16 @@ from config_models.models import ConfigurationModel
class DarkLangConfig(ConfigurationModel): class DarkLangConfig(ConfigurationModel):
""" """
Configuration for the dark_lang django app Configuration for the dark_lang django app.
""" """
released_languages = models.TextField( released_languages = models.TextField(
blank=True, blank=True,
help_text="A comma-separated list of language codes to release to the public." help_text="A comma-separated list of language codes to release to the public."
) )
def __unicode__(self):
return u"DarkLangConfig()"
@property @property
def released_languages_list(self): def released_languages_list(self):
""" """
......
...@@ -4,15 +4,17 @@ Tests of DarkLangMiddleware ...@@ -4,15 +4,17 @@ Tests of DarkLangMiddleware
import unittest import unittest
import ddt import ddt
from mock import Mock
from django.http import HttpRequest from django.http import HttpRequest
from django.test import TestCase from django.test import TestCase
from django.test.client import Client from django.test.client import Client
from django.utils.translation import LANGUAGE_SESSION_KEY from django.utils.translation import LANGUAGE_SESSION_KEY
from mock import Mock
from dark_lang.middleware import DarkLangMiddleware from openedx.core.djangoapps.dark_lang.middleware import DarkLangMiddleware
from dark_lang.models import DarkLangConfig from openedx.core.djangoapps.dark_lang.models import DarkLangConfig
from student.tests.factories import UserFactory from student.tests.factories import UserFactory
UNSET = object() UNSET = object()
......
...@@ -4,7 +4,7 @@ Contains all the URLs for the Dark Language Support App ...@@ -4,7 +4,7 @@ Contains all the URLs for the Dark Language Support App
from django.conf.urls import patterns, url from django.conf.urls import patterns, url
from dark_lang import views from openedx.core.djangoapps.dark_lang import views
urlpatterns = patterns( urlpatterns = patterns(
'', '',
......
...@@ -6,16 +6,15 @@ from django.utils.decorators import method_decorator ...@@ -6,16 +6,15 @@ from django.utils.decorators import method_decorator
from django.utils.translation import LANGUAGE_SESSION_KEY from django.utils.translation import LANGUAGE_SESSION_KEY
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from django.views.generic.base import View from django.views.generic.base import View
from edxmako.shortcuts import render_to_response
from openedx.core.djangoapps.dark_lang import DARK_LANGUAGE_KEY
from openedx.core.djangoapps.dark_lang.models import DarkLangConfig
from openedx.core.djangoapps.lang_pref import LANGUAGE_KEY
from openedx.core.djangoapps.user_api.preferences.api import ( from openedx.core.djangoapps.user_api.preferences.api import (
delete_user_preference, get_user_preference, set_user_preference delete_user_preference, get_user_preference, set_user_preference
) )
from openedx.core.lib.api.view_utils import view_auth_classes from openedx.core.lib.api.view_utils import view_auth_classes
from dark_lang import DARK_LANGUAGE_KEY
from dark_lang.models import DarkLangConfig
from edxmako.shortcuts import render_to_response
from lang_pref import LANGUAGE_KEY
LANGUAGE_INPUT_FIELD = 'preview_lang' LANGUAGE_INPUT_FIELD = 'preview_lang'
......
...@@ -5,7 +5,7 @@ from collections import namedtuple ...@@ -5,7 +5,7 @@ from collections import namedtuple
from django.conf import settings from django.conf import settings
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from dark_lang.models import DarkLangConfig from openedx.core.djangoapps.dark_lang.models import DarkLangConfig
# Named tuples can be referenced using object-like variable # Named tuples can be referenced using object-like variable
...@@ -38,15 +38,13 @@ def released_languages(): ...@@ -38,15 +38,13 @@ def released_languages():
released_language_codes.sort() released_language_codes.sort()
# Intersect the list of valid language tuples with the list # Intersect the list of valid language tuples with the list
# of release language codes # of released language codes
released_languages = [ return [
Language(tuple[0], tuple[1]) Language(language_info[0], language_info[1])
for tuple in settings.LANGUAGES for language_info in settings.LANGUAGES
if tuple[0] in released_language_codes if language_info[0] in released_language_codes
] ]
return released_languages
def all_languages(): def all_languages():
"""Retrieve the list of all languages, translated and sorted. """Retrieve the list of all languages, translated and sorted.
......
...@@ -2,11 +2,12 @@ ...@@ -2,11 +2,12 @@
Middleware for Language Preferences Middleware for Language Preferences
""" """
from openedx.core.djangoapps.user_api.preferences.api import get_user_preference, delete_user_preference
from lang_pref import LANGUAGE_KEY
from django.utils.translation import LANGUAGE_SESSION_KEY from django.utils.translation import LANGUAGE_SESSION_KEY
from django.utils.translation.trans_real import parse_accept_lang_header from django.utils.translation.trans_real import parse_accept_lang_header
from lang_pref.api import released_languages
from openedx.core.djangoapps.lang_pref import LANGUAGE_KEY
from openedx.core.djangoapps.lang_pref.api import released_languages
from openedx.core.djangoapps.user_api.preferences.api import get_user_preference, delete_user_preference
class LanguagePreferenceMiddleware(object): class LanguagePreferenceMiddleware(object):
......
...@@ -4,17 +4,26 @@ ...@@ -4,17 +4,26 @@
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.utils import translation from django.utils import translation
from lang_pref import api as language_api
from openedx.core.djangoapps.lang_pref import api as language_api
class LanguageApiTest(TestCase):
class LanguageApiTest(TestCase):
"""
Tests of the language APIs.
"""
def test_released_languages(self): def test_released_languages(self):
"""
Tests for the released languages.
"""
released_languages = language_api.released_languages() released_languages = language_api.released_languages()
self.assertGreaterEqual(len(released_languages), 1) self.assertGreaterEqual(len(released_languages), 1)
@override_settings(ALL_LANGUAGES=[[u"cs", u"Czech"], [u"nl", u"Dutch"]]) @override_settings(ALL_LANGUAGES=[[u"cs", u"Czech"], [u"nl", u"Dutch"]])
def test_all_languages(self): def test_all_languages(self):
"""
Tests for the list of all languages.
"""
with translation.override('fr'): with translation.override('fr'):
all_languages = language_api.all_languages() all_languages = language_api.all_languages()
......
"""
Tests for lang_pref middleware.
"""
import mock
from django.test import TestCase 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 django.utils.translation import LANGUAGE_SESSION_KEY from django.utils.translation import LANGUAGE_SESSION_KEY
from lang_pref.middleware import LanguagePreferenceMiddleware from openedx.core.djangoapps.lang_pref import LANGUAGE_KEY
from openedx.core.djangoapps.lang_pref.middleware import LanguagePreferenceMiddleware
from openedx.core.djangoapps.user_api.preferences.api import set_user_preference, get_user_preference from openedx.core.djangoapps.user_api.preferences.api import set_user_preference, get_user_preference
from lang_pref import LANGUAGE_KEY
from student.tests.factories import UserFactory from student.tests.factories import UserFactory
from student.tests.factories import AnonymousUserFactory from student.tests.factories import AnonymousUserFactory
import mock
class TestUserPreferenceMiddleware(TestCase): class TestUserPreferenceMiddleware(TestCase):
""" """
Tests to make sure user preferences are getting properly set in the middleware Tests to make sure user preferences are getting properly set in the middleware.
""" """
def setUp(self): def setUp(self):
...@@ -30,18 +35,22 @@ class TestUserPreferenceMiddleware(TestCase): ...@@ -30,18 +35,22 @@ class TestUserPreferenceMiddleware(TestCase):
def test_no_language_set_in_session_or_prefs(self): def test_no_language_set_in_session_or_prefs(self):
# nothing set in the session or the prefs # nothing set in the session or the prefs
self.middleware.process_request(self.request) self.middleware.process_request(self.request)
self.assertNotIn(LANGUAGE_SESSION_KEY, self.request.session) self.assertNotIn(LANGUAGE_SESSION_KEY, self.request.session) # pylint: disable=no-member
@mock.patch('lang_pref.middleware.released_languages', mock.Mock(return_value=[('eo', 'esperanto')])) @mock.patch(
'openedx.core.djangoapps.lang_pref.middleware.released_languages',
mock.Mock(return_value=[('eo', 'esperanto')])
)
def test_language_in_user_prefs(self): def test_language_in_user_prefs(self):
# language set in the user preferences and not the session # language set in the user preferences and not the session
set_user_preference(self.user, LANGUAGE_KEY, 'eo') set_user_preference(self.user, LANGUAGE_KEY, 'eo')
self.middleware.process_request(self.request) self.middleware.process_request(self.request)
self.assertEquals(self.request.session[LANGUAGE_SESSION_KEY], 'eo') self.assertEquals(self.request.session[LANGUAGE_SESSION_KEY], 'eo') # pylint: disable=no-member
@mock.patch('lang_pref.middleware.released_languages', mock.Mock( @mock.patch(
return_value=[('en', 'english'), ('eo', 'esperanto')] 'openedx.core.djangoapps.lang_pref.middleware.released_languages',
)) mock.Mock(return_value=[('en', 'english'), ('eo', 'esperanto')])
)
def test_language_in_session(self): def test_language_in_session(self):
# language set in both the user preferences and session, # language set in both the user preferences and session,
# preference should get precedence. The session will hold the last value, # preference should get precedence. The session will hold the last value,
...@@ -49,14 +58,16 @@ class TestUserPreferenceMiddleware(TestCase): ...@@ -49,14 +58,16 @@ class TestUserPreferenceMiddleware(TestCase):
# Dark lang middleware should run after this middleware, so it can # Dark lang middleware should run after this middleware, so it can
# set a session language as an override of the user's preference. # set a session language as an override of the user's preference.
self.request.session[LANGUAGE_SESSION_KEY] = 'en' self.request.session[LANGUAGE_SESSION_KEY] = 'en' # pylint: disable=no-member
set_user_preference(self.user, LANGUAGE_KEY, 'eo') set_user_preference(self.user, LANGUAGE_KEY, 'eo')
self.middleware.process_request(self.request) self.middleware.process_request(self.request)
self.assertEquals(self.request.session[LANGUAGE_SESSION_KEY], 'eo') self.assertEquals(self.request.session[LANGUAGE_SESSION_KEY], 'eo') # pylint: disable=no-member
@mock.patch('lang_pref.middleware.released_languages', @mock.patch(
mock.Mock(return_value=[('eo', 'dummy Esperanto'), ('ar', 'arabic')])) 'openedx.core.djangoapps.lang_pref.middleware.released_languages',
mock.Mock(return_value=[('eo', 'dummy Esperanto'), ('ar', 'arabic')])
)
def test_supported_browser_language_in_session(self): def test_supported_browser_language_in_session(self):
""" """
test: browser language should be set in user session if it is supported by system for unauthenticated user. test: browser language should be set in user session if it is supported by system for unauthenticated user.
...@@ -65,7 +76,10 @@ class TestUserPreferenceMiddleware(TestCase): ...@@ -65,7 +76,10 @@ class TestUserPreferenceMiddleware(TestCase):
self.middleware.process_request(self.request) self.middleware.process_request(self.request)
self.assertEqual(self.request.session[LANGUAGE_SESSION_KEY], 'ar') # pylint: disable=no-member self.assertEqual(self.request.session[LANGUAGE_SESSION_KEY], 'ar') # pylint: disable=no-member
@mock.patch('lang_pref.middleware.released_languages', mock.Mock(return_value=[('en', 'english')])) @mock.patch(
'openedx.core.djangoapps.lang_pref.middleware.released_languages',
mock.Mock(return_value=[('en', 'english')])
)
def test_browser_language_not_be_in_session(self): def test_browser_language_not_be_in_session(self):
""" """
test: browser language should not be set in user session if it is not supported by system. test: browser language should not be set in user session if it is not supported by system.
...@@ -74,9 +88,10 @@ class TestUserPreferenceMiddleware(TestCase): ...@@ -74,9 +88,10 @@ class TestUserPreferenceMiddleware(TestCase):
self.middleware.process_request(self.request) self.middleware.process_request(self.request)
self.assertNotEqual(self.request.session.get(LANGUAGE_SESSION_KEY), 'ar') # pylint: disable=no-member self.assertNotEqual(self.request.session.get(LANGUAGE_SESSION_KEY), 'ar') # pylint: disable=no-member
@mock.patch('lang_pref.middleware.released_languages', mock.Mock( @mock.patch(
return_value=[('en', 'english'), ('ar', 'arabic')] 'openedx.core.djangoapps.lang_pref.middleware.released_languages',
)) mock.Mock(return_value=[('en', 'english'), ('ar', 'arabic')])
)
def test_delete_user_lang_preference_not_supported_by_system(self): def test_delete_user_lang_preference_not_supported_by_system(self):
""" """
test: user preferred language has been removed from user preferences model if it is not supported by system test: user preferred language has been removed from user preferences model if it is not supported by system
......
""" """
Language Preference Views Language Preference Views
""" """
import json import json
from django.conf import settings from django.conf import settings
from django.http import HttpResponse
from django.views.decorators.csrf import ensure_csrf_cookie from django.views.decorators.csrf import ensure_csrf_cookie
from django.utils.translation import LANGUAGE_SESSION_KEY from django.utils.translation import LANGUAGE_SESSION_KEY
from lang_pref import LANGUAGE_KEY
from django.http import HttpResponse from openedx.core.djangoapps.lang_pref import LANGUAGE_KEY
@ensure_csrf_cookie @ensure_csrf_cookie
......
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