From 4d4097e13c65039fe2f44cfb20dc0d92bb13b36f Mon Sep 17 00:00:00 2001 From: Andy Armstrong <andya@edx.org> Date: Thu, 6 Oct 2016 14:57:20 -0400 Subject: [PATCH] Move dark_lang and lang_pref apps to openedx/core --- cms/envs/common.py | 8 +-- cms/templates/darklang/preview_lang.html | 2 +- cms/urls.py | 8 ++- .../templates/static_content.html | 2 +- .../student/tests/test_create_account.py | 2 +- common/djangoapps/student/views.py | 7 ++- lms/djangoapps/courseware/tests/test_i18n.py | 8 +-- lms/djangoapps/courseware/views/index.py | 2 +- lms/djangoapps/instructor/enrollment.py | 12 ++--- .../tests/test_api_email_localization.py | 4 +- lms/djangoapps/notifier_api/serializers.py | 5 +- lms/djangoapps/notifier_api/tests.py | 4 +- lms/djangoapps/oauth2_handler/handlers.py | 2 +- lms/djangoapps/oauth2_handler/tests.py | 2 +- lms/djangoapps/student_account/views.py | 4 +- lms/envs/common.py | 18 ++++--- lms/templates/darklang/preview_lang.html | 2 +- lms/urls.py | 10 +++- .../core}/djangoapps/dark_lang/__init__.py | 0 .../core}/djangoapps/dark_lang/admin.py | 2 +- .../core}/djangoapps/dark_lang/middleware.py | 8 +-- .../dark_lang/migrations/0001_initial.py | 0 .../0002_data__enable_on_install.py | 0 .../dark_lang/migrations/__init__.py | 0 .../core}/djangoapps/dark_lang/models.py | 5 +- .../dark_lang}/preview_lang_include.html | 0 .../core}/djangoapps/dark_lang/tests.py | 8 +-- .../core}/djangoapps/dark_lang/urls.py | 2 +- .../core}/djangoapps/dark_lang/views.py | 9 ++-- .../core}/djangoapps/lang_pref/__init__.py | 0 .../core}/djangoapps/lang_pref/api.py | 14 +++-- .../core}/djangoapps/lang_pref/middleware.py | 7 +-- .../djangoapps/lang_pref/tests/__init__.py | 0 .../djangoapps/lang_pref/tests/test_api.py | 13 ++++- .../lang_pref/tests/test_middleware.py | 51 ++++++++++++------- .../djangoapps/lang_pref/tests/test_views.py | 0 .../core}/djangoapps/lang_pref/views.py | 7 ++- 37 files changed, 137 insertions(+), 91 deletions(-) rename {common => openedx/core}/djangoapps/dark_lang/__init__.py (100%) rename {common => openedx/core}/djangoapps/dark_lang/admin.py (74%) rename {common => openedx/core}/djangoapps/dark_lang/middleware.py (97%) rename {common => openedx/core}/djangoapps/dark_lang/migrations/0001_initial.py (100%) rename {common => openedx/core}/djangoapps/dark_lang/migrations/0002_data__enable_on_install.py (100%) rename {common => openedx/core}/djangoapps/dark_lang/migrations/__init__.py (100%) rename {common => openedx/core}/djangoapps/dark_lang/models.py (87%) rename {common/templates/darklang => openedx/core/djangoapps/dark_lang/templates/dark_lang}/preview_lang_include.html (100%) rename {common => openedx/core}/djangoapps/dark_lang/tests.py (98%) rename {common => openedx/core}/djangoapps/dark_lang/urls.py (80%) rename {common => openedx/core}/djangoapps/dark_lang/views.py (96%) rename {common => openedx/core}/djangoapps/lang_pref/__init__.py (100%) rename {common => openedx/core}/djangoapps/lang_pref/api.py (86%) rename {common => openedx/core}/djangoapps/lang_pref/middleware.py (93%) rename {common => openedx/core}/djangoapps/lang_pref/tests/__init__.py (100%) rename {common => openedx/core}/djangoapps/lang_pref/tests/test_api.py (78%) rename {common => openedx/core}/djangoapps/lang_pref/tests/test_middleware.py (73%) rename {common => openedx/core}/djangoapps/lang_pref/tests/test_views.py (100%) rename {common => openedx/core}/djangoapps/lang_pref/views.py (91%) diff --git a/cms/envs/common.py b/cms/envs/common.py index 686dd1ed344..9a9aa3ea2c7 100644 --- a/cms/envs/common.py +++ b/cms/envs/common.py @@ -226,6 +226,7 @@ SOCIAL_SHARING_SETTINGS = { PROJECT_ROOT = path(__file__).abspath().dirname().dirname() # /edx-platform/cms REPO_ROOT = PROJECT_ROOT.dirname() COMMON_ROOT = REPO_ROOT / "common" +OPENEDX_ROOT = REPO_ROOT / "openedx" CMS_ROOT = REPO_ROOT / "cms" LMS_ROOT = REPO_ROOT / "lms" ENV_ROOT = REPO_ROOT.dirname() # virtualenv dir /edx-platform is in @@ -251,6 +252,7 @@ MAKO_TEMPLATES['main'] = [ COMMON_ROOT / 'templates', COMMON_ROOT / 'djangoapps' / 'pipeline_mako' / 'templates', COMMON_ROOT / 'static', # required to statically include common Underscore templates + OPENEDX_ROOT / 'core' / 'djangoapps' / 'dark_lang' / 'templates', CMS_ROOT / 'djangoapps' / 'pipeline_js' / 'templates', ] @@ -360,10 +362,10 @@ MIDDLEWARE_CLASSES = ( 'track.middleware.TrackMiddleware', # 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 - 'dark_lang.middleware.DarkLangMiddleware', + 'openedx.core.djangoapps.dark_lang.middleware.DarkLangMiddleware', 'embargo.middleware.EmbargoMiddleware', @@ -856,7 +858,7 @@ INSTALLED_APPS = ( 'course_modes', # Dark-launching languages - 'dark_lang', + 'openedx.core.djangoapps.dark_lang', # User preferences 'openedx.core.djangoapps.user_api', diff --git a/cms/templates/darklang/preview_lang.html b/cms/templates/darklang/preview_lang.html index 3b845135914..0efadc53bcf 100644 --- a/cms/templates/darklang/preview_lang.html +++ b/cms/templates/darklang/preview_lang.html @@ -10,6 +10,6 @@ from django.utils.translation import ugettext as _ <%block name="bodyclass">is-signedin pattern-library</%block> <%block name="content"> - <%include file="/darklang/preview_lang_include.html" /> + <%include file="/dark_lang/preview_lang_include.html" /> </%block> diff --git a/cms/urls.py b/cms/urls.py index 8c740f8ce2b..5db5de764af 100644 --- a/cms/urls.py +++ b/cms/urls.py @@ -55,10 +55,14 @@ urlpatterns = patterns( url(r'^api/user/', include('openedx.core.djangoapps.user_api.urls')), # 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) - 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 diff --git a/common/djangoapps/pipeline_mako/templates/static_content.html b/common/djangoapps/pipeline_mako/templates/static_content.html index 58a6b4f0142..281ce7d7372 100644 --- a/common/djangoapps/pipeline_mako/templates/static_content.html +++ b/common/djangoapps/pipeline_mako/templates/static_content.html @@ -17,7 +17,7 @@ from openedx.core.djangoapps.theming.helpers import ( is_request_in_themed_site, ) 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)"><% diff --git a/common/djangoapps/student/tests/test_create_account.py b/common/djangoapps/student/tests/test_create_account.py index 9dd217ef04f..a9978380358 100644 --- a/common/djangoapps/student/tests/test_create_account.py +++ b/common/djangoapps/student/tests/test_create_account.py @@ -15,7 +15,7 @@ import mock import pytz 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 openedx.core.djangoapps.external_auth.models import ExternalAuthMap import student diff --git a/common/djangoapps/student/views.py b/common/djangoapps/student/views.py index 8302b4b2837..9456883c766 100644 --- a/common/djangoapps/student/views.py +++ b/common/djangoapps/student/views.py @@ -85,8 +85,6 @@ from openedx.core.djangoapps.external_auth.login_and_register import ( register as external_auth_register ) -from lang_pref import LANGUAGE_KEY - import track.views import dogstats_wrapper as dog_stats_api @@ -120,11 +118,12 @@ from eventtracking import tracker 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.user_api.preferences import api as preferences_api -from openedx.core.djangoapps.programs.models import ProgramsApiConfig +from openedx.core.djangoapps.lang_pref import LANGUAGE_KEY 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.theming import helpers as theming_helpers +from openedx.core.djangoapps.user_api.preferences import api as preferences_api log = logging.getLogger("edx.student") diff --git a/lms/djangoapps/courseware/tests/test_i18n.py b/lms/djangoapps/courseware/tests/test_i18n.py index 725a3f2195b..094f7ed3e28 100644 --- a/lms/djangoapps/courseware/tests/test_i18n.py +++ b/lms/djangoapps/courseware/tests/test_i18n.py @@ -1,7 +1,9 @@ """ Tests i18n in courseware """ + import re + from django.conf import settings from django.contrib.auth.models import User from django.core.urlresolvers import reverse @@ -9,10 +11,10 @@ from django.test import TestCase from django.test.client import Client from django.utils import translation 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 lang_pref import 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 set_user_preference from student.tests.factories import UserFactory diff --git a/lms/djangoapps/courseware/views/index.py b/lms/djangoapps/courseware/views/index.py index 3b3668924b9..f07a4a0412b 100644 --- a/lms/djangoapps/courseware/views/index.py +++ b/lms/djangoapps/courseware/views/index.py @@ -22,10 +22,10 @@ import logging import newrelic.agent import urllib -from lang_pref import LANGUAGE_KEY from xblock.fragment import Fragment from opaque_keys.edx.keys import CourseKey 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 shoppingcart.models import CourseRegistrationCode from student.models import CourseEnrollment diff --git a/lms/djangoapps/instructor/enrollment.py b/lms/djangoapps/instructor/enrollment.py index 69acebff365..f1e3b0b4369 100644 --- a/lms/djangoapps/instructor/enrollment.py +++ b/lms/djangoapps/instructor/enrollment.py @@ -14,21 +14,19 @@ from django.core.mail import send_mail from django.utils.translation import override as override_language from course_modes.models import CourseMode +from courseware.models import StudentModule from courseware.model_data import FieldDataCache from courseware.module_render import get_module_for_descriptor -from courseware.models import StudentModule from edxmako.shortcuts import render_to_string from lms.djangoapps.grades.scores import weighted_score from lms.djangoapps.grades.signals.signals import SCORE_CHANGED -from lang_pref import LANGUAGE_KEY -from student.models import CourseEnrollment, CourseEnrollmentAllowed -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.lang_pref import LANGUAGE_KEY +from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers 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.exceptions import ItemNotFoundError -from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers log = logging.getLogger(__name__) diff --git a/lms/djangoapps/instructor/tests/test_api_email_localization.py b/lms/djangoapps/instructor/tests/test_api_email_localization.py index 5406374f7e3..9bf0f3d70ef 100644 --- a/lms/djangoapps/instructor/tests/test_api_email_localization.py +++ b/lms/djangoapps/instructor/tests/test_api_email_localization.py @@ -9,10 +9,10 @@ from django.test.utils import override_settings from nose.plugins.attrib import attr 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.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.django_utils import SharedModuleStoreTestCase diff --git a/lms/djangoapps/notifier_api/serializers.py b/lms/djangoapps/notifier_api/serializers.py index 4ca1c06f9ae..dc21bb48ef1 100644 --- a/lms/djangoapps/notifier_api/serializers.py +++ b/lms/djangoapps/notifier_api/serializers.py @@ -3,8 +3,9 @@ from django.http import Http404 from rest_framework import serializers from openedx.core.djangoapps.course_groups.cohorts import is_course_cohorted -from notification_prefs import NOTIFICATION_PREF_KEY -from lang_pref import LANGUAGE_KEY +from openedx.core.djangoapps.lang_pref import LANGUAGE_KEY + +from lms.djangoapps.notification_prefs import NOTIFICATION_PREF_KEY class NotifierUserSerializer(serializers.ModelSerializer): diff --git a/lms/djangoapps/notifier_api/tests.py b/lms/djangoapps/notifier_api/tests.py index 4b173c77f50..e55857e7521 100644 --- a/lms/djangoapps/notifier_api/tests.py +++ b/lms/djangoapps/notifier_api/tests.py @@ -5,14 +5,14 @@ from django.conf import settings from django.test.client import RequestFactory 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 lang_pref import LANGUAGE_KEY from notification_prefs import NOTIFICATION_PREF_KEY from notifier_api.views import NotifierUsersViewSet from opaque_keys.edx.locator import CourseLocator from student.models import CourseEnrollment 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.tests.factories import UserPreferenceFactory from util.testing import UrlResetMixin diff --git a/lms/djangoapps/oauth2_handler/handlers.py b/lms/djangoapps/oauth2_handler/handlers.py index 017078bd0d0..c898008e1d7 100644 --- a/lms/djangoapps/oauth2_handler/handlers.py +++ b/lms/djangoapps/oauth2_handler/handlers.py @@ -5,10 +5,10 @@ from django.core.cache import cache from courseware.access import has_access 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 student.models import anonymous_id_for_user from student.models import UserProfile -from lang_pref import LANGUAGE_KEY from student.roles import GlobalStaff, CourseStaffRole, CourseInstructorRole diff --git a/lms/djangoapps/oauth2_handler/tests.py b/lms/djangoapps/oauth2_handler/tests.py index c4ab36ce21a..6c304733c86 100644 --- a/lms/djangoapps/oauth2_handler/tests.py +++ b/lms/djangoapps/oauth2_handler/tests.py @@ -1,7 +1,6 @@ # pylint: disable=missing-docstring from django.core.cache import cache from django.test.utils import override_settings -from lang_pref import LANGUAGE_KEY from xmodule.modulestore.tests.factories import (check_mongo_calls, CourseFactory) from student.models import anonymous_id_for_user @@ -9,6 +8,7 @@ from student.models import UserProfile from student.roles import (CourseInstructorRole, CourseStaffRole, GlobalStaff, OrgInstructorRole, OrgStaffRole) 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 xmodule.modulestore.tests.django_utils import ModuleStoreTestCase diff --git a/lms/djangoapps/student_account/views.py b/lms/djangoapps/student_account/views.py index 05629eab5e4..ffe1570b7f5 100644 --- a/lms/djangoapps/student_account/views.py +++ b/lms/djangoapps/student_account/views.py @@ -26,11 +26,11 @@ from openedx.core.djangoapps.external_auth.login_and_register import ( login as external_auth_login, 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.lang_pref.api import released_languages, all_languages 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.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.errors import UserNotFound from openedx.core.lib.time_zone_utils import TIME_ZONE_CHOICES diff --git a/lms/envs/common.py b/lms/envs/common.py index 602d20987ad..f1d6727bd32 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -380,6 +380,7 @@ XQUEUE_WAITTIME_BETWEEN_REQUESTS = 5 # seconds PROJECT_ROOT = path(__file__).abspath().dirname().dirname() # /edx-platform/lms REPO_ROOT = PROJECT_ROOT.dirname() COMMON_ROOT = REPO_ROOT / "common" +OPENEDX_ROOT = REPO_ROOT / "openedx" ENV_ROOT = REPO_ROOT.dirname() # virtualenv dir /edx-platform is in COURSES_ROOT = ENV_ROOT / "data" @@ -460,10 +461,13 @@ OAUTH2_PROVIDER = { import tempfile MAKO_MODULE_DIR = os.path.join(tempfile.gettempdir(), 'mako_lms') MAKO_TEMPLATES = {} -MAKO_TEMPLATES['main'] = [PROJECT_ROOT / 'templates', - COMMON_ROOT / 'templates', - COMMON_ROOT / 'lib' / 'capa' / 'capa' / 'templates', - COMMON_ROOT / 'djangoapps' / 'pipeline_mako' / 'templates'] +MAKO_TEMPLATES['main'] = [ + PROJECT_ROOT / 'templates', + COMMON_ROOT / 'templates', + COMMON_ROOT / 'lib' / 'capa' / 'capa' / 'templates', + COMMON_ROOT / 'djangoapps' / 'pipeline_mako' / 'templates', + OPENEDX_ROOT / 'core' / 'djangoapps' / 'dark_lang' / 'templates', +] # Django templating TEMPLATES = [ @@ -1131,12 +1135,12 @@ MIDDLEWARE_CLASSES = ( 'embargo.middleware.EmbargoMiddleware', # Allows us to set user preferences - 'lang_pref.middleware.LanguagePreferenceMiddleware', + 'openedx.core.djangoapps.lang_pref.middleware.LanguagePreferenceMiddleware', # Allows us to dark-launch particular languages. # Must be after LangPrefMiddleware, so ?preview-lang query params can override # 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. # Must be after DarkLangMiddleware. @@ -2014,7 +2018,7 @@ INSTALLED_APPS = ( 'lms.djangoapps.verify_student', # Dark-launching languages - 'dark_lang', + 'openedx.core.djangoapps.dark_lang', # Microsite configuration 'microsite_configuration', diff --git a/lms/templates/darklang/preview_lang.html b/lms/templates/darklang/preview_lang.html index 7b781b47433..02a05f17f2f 100644 --- a/lms/templates/darklang/preview_lang.html +++ b/lms/templates/darklang/preview_lang.html @@ -11,5 +11,5 @@ from django.utils.translation import ugettext as _ <%block name="bodyclass">pattern-library</%block> <%block name="content"> - <%include file="/darklang/preview_lang_include.html" /> + <%include file="/dark_lang/preview_lang_include.html" /> </%block> diff --git a/lms/urls.py b/lms/urls.py index 262132b65f4..e879ceaccc5 100644 --- a/lms/urls.py +++ b/lms/urls.py @@ -85,14 +85,20 @@ urlpatterns = ( url(r'^api/organizations/', include('organizations.urls', namespace='organizations')), # 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 # TODO Namespace these! url(r'^course_modes/', include('course_modes.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 url(r'^api-admin/', include('openedx.core.djangoapps.api_admin.urls', namespace='api_admin')), ) diff --git a/common/djangoapps/dark_lang/__init__.py b/openedx/core/djangoapps/dark_lang/__init__.py similarity index 100% rename from common/djangoapps/dark_lang/__init__.py rename to openedx/core/djangoapps/dark_lang/__init__.py diff --git a/common/djangoapps/dark_lang/admin.py b/openedx/core/djangoapps/dark_lang/admin.py similarity index 74% rename from common/djangoapps/dark_lang/admin.py rename to openedx/core/djangoapps/dark_lang/admin.py index cc80e49b255..fec604d3f31 100644 --- a/common/djangoapps/dark_lang/admin.py +++ b/openedx/core/djangoapps/dark_lang/admin.py @@ -5,6 +5,6 @@ Admin site bindings for dark_lang from django.contrib import admin 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) diff --git a/common/djangoapps/dark_lang/middleware.py b/openedx/core/djangoapps/dark_lang/middleware.py similarity index 97% rename from common/djangoapps/dark_lang/middleware.py rename to openedx/core/djangoapps/dark_lang/middleware.py index 4e4e97f4c75..510438c7d57 100644 --- a/common/djangoapps/dark_lang/middleware.py +++ b/openedx/core/djangoapps/dark_lang/middleware.py @@ -8,14 +8,14 @@ This middleware must be placed before the LocaleMiddleware, but after the SessionMiddleware. """ 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 dark_lang.models import DarkLangConfig +from openedx.core.djangoapps.dark_lang import DARK_LANGUAGE_KEY +from openedx.core.djangoapps.dark_lang.models import DarkLangConfig from openedx.core.djangoapps.user_api.preferences.api import ( 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. CHINESE_LANGUAGE_CODE_MAP = { diff --git a/common/djangoapps/dark_lang/migrations/0001_initial.py b/openedx/core/djangoapps/dark_lang/migrations/0001_initial.py similarity index 100% rename from common/djangoapps/dark_lang/migrations/0001_initial.py rename to openedx/core/djangoapps/dark_lang/migrations/0001_initial.py diff --git a/common/djangoapps/dark_lang/migrations/0002_data__enable_on_install.py b/openedx/core/djangoapps/dark_lang/migrations/0002_data__enable_on_install.py similarity index 100% rename from common/djangoapps/dark_lang/migrations/0002_data__enable_on_install.py rename to openedx/core/djangoapps/dark_lang/migrations/0002_data__enable_on_install.py diff --git a/common/djangoapps/dark_lang/migrations/__init__.py b/openedx/core/djangoapps/dark_lang/migrations/__init__.py similarity index 100% rename from common/djangoapps/dark_lang/migrations/__init__.py rename to openedx/core/djangoapps/dark_lang/migrations/__init__.py diff --git a/common/djangoapps/dark_lang/models.py b/openedx/core/djangoapps/dark_lang/models.py similarity index 87% rename from common/djangoapps/dark_lang/models.py rename to openedx/core/djangoapps/dark_lang/models.py index de9194b468d..101ab0b4d32 100644 --- a/common/djangoapps/dark_lang/models.py +++ b/openedx/core/djangoapps/dark_lang/models.py @@ -8,13 +8,16 @@ from config_models.models import ConfigurationModel class DarkLangConfig(ConfigurationModel): """ - Configuration for the dark_lang django app + Configuration for the dark_lang django app. """ released_languages = models.TextField( blank=True, help_text="A comma-separated list of language codes to release to the public." ) + def __unicode__(self): + return u"DarkLangConfig()" + @property def released_languages_list(self): """ diff --git a/common/templates/darklang/preview_lang_include.html b/openedx/core/djangoapps/dark_lang/templates/dark_lang/preview_lang_include.html similarity index 100% rename from common/templates/darklang/preview_lang_include.html rename to openedx/core/djangoapps/dark_lang/templates/dark_lang/preview_lang_include.html diff --git a/common/djangoapps/dark_lang/tests.py b/openedx/core/djangoapps/dark_lang/tests.py similarity index 98% rename from common/djangoapps/dark_lang/tests.py rename to openedx/core/djangoapps/dark_lang/tests.py index bc3fda776ca..2101ed9038b 100644 --- a/common/djangoapps/dark_lang/tests.py +++ b/openedx/core/djangoapps/dark_lang/tests.py @@ -4,15 +4,17 @@ Tests of DarkLangMiddleware import unittest import ddt +from mock import Mock + from django.http import HttpRequest from django.test import TestCase from django.test.client import Client from django.utils.translation import LANGUAGE_SESSION_KEY -from mock import Mock -from dark_lang.middleware import DarkLangMiddleware -from dark_lang.models import DarkLangConfig +from openedx.core.djangoapps.dark_lang.middleware import DarkLangMiddleware +from openedx.core.djangoapps.dark_lang.models import DarkLangConfig from student.tests.factories import UserFactory + UNSET = object() diff --git a/common/djangoapps/dark_lang/urls.py b/openedx/core/djangoapps/dark_lang/urls.py similarity index 80% rename from common/djangoapps/dark_lang/urls.py rename to openedx/core/djangoapps/dark_lang/urls.py index be3dafc3e44..9572f11797c 100644 --- a/common/djangoapps/dark_lang/urls.py +++ b/openedx/core/djangoapps/dark_lang/urls.py @@ -4,7 +4,7 @@ Contains all the URLs for the Dark Language Support App from django.conf.urls import patterns, url -from dark_lang import views +from openedx.core.djangoapps.dark_lang import views urlpatterns = patterns( '', diff --git a/common/djangoapps/dark_lang/views.py b/openedx/core/djangoapps/dark_lang/views.py similarity index 96% rename from common/djangoapps/dark_lang/views.py rename to openedx/core/djangoapps/dark_lang/views.py index 2d7d69aa43d..df3f7621e76 100644 --- a/common/djangoapps/dark_lang/views.py +++ b/openedx/core/djangoapps/dark_lang/views.py @@ -6,16 +6,15 @@ from django.utils.decorators import method_decorator from django.utils.translation import LANGUAGE_SESSION_KEY from django.utils.translation import ugettext as _ 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 ( delete_user_preference, get_user_preference, set_user_preference ) 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' diff --git a/common/djangoapps/lang_pref/__init__.py b/openedx/core/djangoapps/lang_pref/__init__.py similarity index 100% rename from common/djangoapps/lang_pref/__init__.py rename to openedx/core/djangoapps/lang_pref/__init__.py diff --git a/common/djangoapps/lang_pref/api.py b/openedx/core/djangoapps/lang_pref/api.py similarity index 86% rename from common/djangoapps/lang_pref/api.py rename to openedx/core/djangoapps/lang_pref/api.py index 82624806c37..499033c43ed 100644 --- a/common/djangoapps/lang_pref/api.py +++ b/openedx/core/djangoapps/lang_pref/api.py @@ -5,7 +5,7 @@ from collections import namedtuple from django.conf import settings 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 @@ -38,15 +38,13 @@ def released_languages(): released_language_codes.sort() # Intersect the list of valid language tuples with the list - # of release language codes - released_languages = [ - Language(tuple[0], tuple[1]) - for tuple in settings.LANGUAGES - if tuple[0] in released_language_codes + # of released language codes + return [ + Language(language_info[0], language_info[1]) + for language_info in settings.LANGUAGES + if language_info[0] in released_language_codes ] - return released_languages - def all_languages(): """Retrieve the list of all languages, translated and sorted. diff --git a/common/djangoapps/lang_pref/middleware.py b/openedx/core/djangoapps/lang_pref/middleware.py similarity index 93% rename from common/djangoapps/lang_pref/middleware.py rename to openedx/core/djangoapps/lang_pref/middleware.py index ad94534eeca..685d94ff820 100644 --- a/common/djangoapps/lang_pref/middleware.py +++ b/openedx/core/djangoapps/lang_pref/middleware.py @@ -2,11 +2,12 @@ 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.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): diff --git a/common/djangoapps/lang_pref/tests/__init__.py b/openedx/core/djangoapps/lang_pref/tests/__init__.py similarity index 100% rename from common/djangoapps/lang_pref/tests/__init__.py rename to openedx/core/djangoapps/lang_pref/tests/__init__.py diff --git a/common/djangoapps/lang_pref/tests/test_api.py b/openedx/core/djangoapps/lang_pref/tests/test_api.py similarity index 78% rename from common/djangoapps/lang_pref/tests/test_api.py rename to openedx/core/djangoapps/lang_pref/tests/test_api.py index aa5dc0c3adc..ff201e76f42 100644 --- a/common/djangoapps/lang_pref/tests/test_api.py +++ b/openedx/core/djangoapps/lang_pref/tests/test_api.py @@ -4,17 +4,26 @@ from django.test import TestCase from django.test.utils import override_settings 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): + """ + Tests for the released languages. + """ released_languages = language_api.released_languages() self.assertGreaterEqual(len(released_languages), 1) @override_settings(ALL_LANGUAGES=[[u"cs", u"Czech"], [u"nl", u"Dutch"]]) def test_all_languages(self): + """ + Tests for the list of all languages. + """ with translation.override('fr'): all_languages = language_api.all_languages() diff --git a/common/djangoapps/lang_pref/tests/test_middleware.py b/openedx/core/djangoapps/lang_pref/tests/test_middleware.py similarity index 73% rename from common/djangoapps/lang_pref/tests/test_middleware.py rename to openedx/core/djangoapps/lang_pref/tests/test_middleware.py index 0166c46747e..a622d8d8907 100644 --- a/common/djangoapps/lang_pref/tests/test_middleware.py +++ b/openedx/core/djangoapps/lang_pref/tests/test_middleware.py @@ -1,19 +1,24 @@ +""" +Tests for lang_pref middleware. +""" + +import mock + from django.test import TestCase from django.test.client import RequestFactory from django.contrib.sessions.middleware import SessionMiddleware 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 lang_pref import LANGUAGE_KEY from student.tests.factories import UserFactory from student.tests.factories import AnonymousUserFactory -import mock 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): @@ -30,18 +35,22 @@ class TestUserPreferenceMiddleware(TestCase): def test_no_language_set_in_session_or_prefs(self): # nothing set in the session or the prefs 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): # language set in the user preferences and not the session set_user_preference(self.user, LANGUAGE_KEY, 'eo') 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( - return_value=[('en', 'english'), ('eo', 'esperanto')] - )) + @mock.patch( + 'openedx.core.djangoapps.lang_pref.middleware.released_languages', + mock.Mock(return_value=[('en', 'english'), ('eo', 'esperanto')]) + ) def test_language_in_session(self): # language set in both the user preferences and session, # preference should get precedence. The session will hold the last value, @@ -49,14 +58,16 @@ class TestUserPreferenceMiddleware(TestCase): # Dark lang middleware should run after this middleware, so it can # 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') 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(return_value=[('eo', 'dummy Esperanto'), ('ar', 'arabic')])) + @mock.patch( + '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): """ 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): self.middleware.process_request(self.request) 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): """ test: browser language should not be set in user session if it is not supported by system. @@ -74,9 +88,10 @@ class TestUserPreferenceMiddleware(TestCase): self.middleware.process_request(self.request) self.assertNotEqual(self.request.session.get(LANGUAGE_SESSION_KEY), 'ar') # pylint: disable=no-member - @mock.patch('lang_pref.middleware.released_languages', mock.Mock( - return_value=[('en', 'english'), ('ar', 'arabic')] - )) + @mock.patch( + '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): """ test: user preferred language has been removed from user preferences model if it is not supported by system diff --git a/common/djangoapps/lang_pref/tests/test_views.py b/openedx/core/djangoapps/lang_pref/tests/test_views.py similarity index 100% rename from common/djangoapps/lang_pref/tests/test_views.py rename to openedx/core/djangoapps/lang_pref/tests/test_views.py diff --git a/common/djangoapps/lang_pref/views.py b/openedx/core/djangoapps/lang_pref/views.py similarity index 91% rename from common/djangoapps/lang_pref/views.py rename to openedx/core/djangoapps/lang_pref/views.py index e444724fb9d..0331ff2c8c2 100644 --- a/common/djangoapps/lang_pref/views.py +++ b/openedx/core/djangoapps/lang_pref/views.py @@ -1,12 +1,15 @@ """ Language Preference Views """ + import json + from django.conf import settings +from django.http import HttpResponse from django.views.decorators.csrf import ensure_csrf_cookie 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 -- GitLab