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