diff --git a/cms/envs/bok_choy.py b/cms/envs/bok_choy.py
index 2218fed90e..b088ccd880 100644
--- a/cms/envs/bok_choy.py
+++ b/cms/envs/bok_choy.py
@@ -16,8 +16,6 @@ os.environ['SERVICE_VARIANT'] = 'bok_choy'
os.environ['CONFIG_ROOT'] = path(__file__).abspath().dirname() #pylint: disable=E1120
from .aws import * # pylint: disable=W0401, W0614
-from xmodule.modulestore import prefer_xmodules
-
######################### Testing overrides ####################################
@@ -49,8 +47,5 @@ for log_name, log_level in LOG_OVERRIDES:
# Use the auto_auth workflow for creating users and logging them in
FEATURES['AUTOMATIC_AUTH_FOR_TESTING'] = True
-# Enable XBlocks
-XBLOCK_SELECT_FUNCTION = prefer_xmodules
-
# Unfortunately, we need to use debug mode to serve staticfiles
DEBUG = True
diff --git a/cms/envs/common.py b/cms/envs/common.py
index e9f5455080..03c1df3c22 100644
--- a/cms/envs/common.py
+++ b/cms/envs/common.py
@@ -34,9 +34,6 @@ from path import path
from lms.lib.xblock.mixin import LmsBlockMixin
from cms.lib.xblock.mixin import CmsBlockMixin
-from xmodule.modulestore.inheritance import InheritanceMixin
-from xmodule.modulestore import prefer_xmodules
-from xmodule.x_module import XModuleMixin
from dealer.git import git
############################ FEATURE CONFIGURATION #############################
@@ -220,6 +217,11 @@ X_FRAME_OPTIONS = 'ALLOW'
############# XBlock Configuration ##########
+# Import after sys.path fixup
+from xmodule.modulestore.inheritance import InheritanceMixin
+from xmodule.modulestore import prefer_xmodules
+from xmodule.x_module import XModuleMixin
+
# This should be moved into an XBlock Runtime/Application object
# once the responsibility of XBlock creation is moved out of modulestore - cpennington
XBLOCK_MIXINS = (LmsBlockMixin, CmsBlockMixin, InheritanceMixin, XModuleMixin)
diff --git a/cms/envs/test.py b/cms/envs/test.py
index b48ba2787b..64887e312c 100644
--- a/cms/envs/test.py
+++ b/cms/envs/test.py
@@ -16,7 +16,6 @@ from .common import *
import os
from path import path
from warnings import filterwarnings
-from xmodule.modulestore import prefer_xmodules
# Nose Test Runner
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
@@ -158,10 +157,6 @@ INSTALLED_APPS += ('external_auth', )
filterwarnings('ignore', message='No request passed to the backend, unable to rate-limit')
-################################# XBLOCK ######################################
-XBLOCK_SELECT_FUNCTION = prefer_xmodules
-
-
################################# CELERY ######################################
CELERY_ALWAYS_EAGER = True
diff --git a/common/lib/xmodule/xmodule/html_module.py b/common/lib/xmodule/xmodule/html_module.py
index e245c91b31..98183ff537 100644
--- a/common/lib/xmodule/xmodule/html_module.py
+++ b/common/lib/xmodule/xmodule/html_module.py
@@ -229,7 +229,7 @@ class AboutFields(object):
)
data = String(
help="Html contents to display for this module",
- default="",
+ default=u"",
scope=Scope.content
)
@@ -263,7 +263,7 @@ class StaticTabFields(object):
default="Empty",
)
data = String(
- default=textwrap.dedent("""\
+ default=textwrap.dedent(u"""\
This is where you can add additional pages to your courseware. Click the 'edit' button to begin editing.
"""),
scope=Scope.content,
@@ -300,7 +300,7 @@ class CourseInfoFields(object):
)
data = String(
help="Html contents to display for this module",
- default="
",
+ default=u"
",
scope=Scope.content
)
diff --git a/common/lib/xmodule/xmodule/modulestore/mongo/base.py b/common/lib/xmodule/xmodule/modulestore/mongo/base.py
index b364bc789e..0770852d31 100644
--- a/common/lib/xmodule/xmodule/modulestore/mongo/base.py
+++ b/common/lib/xmodule/xmodule/modulestore/mongo/base.py
@@ -60,7 +60,10 @@ class MongoKeyValueStore(InheritanceKeyValueStore):
"""
def __init__(self, data, children, metadata):
super(MongoKeyValueStore, self).__init__()
- self._data = data
+ if not isinstance(data, dict):
+ self._data = {'data': data}
+ else:
+ self._data = data
self._children = children
self._metadata = metadata
@@ -72,10 +75,7 @@ class MongoKeyValueStore(InheritanceKeyValueStore):
elif key.scope == Scope.settings:
return self._metadata[key.field_name]
elif key.scope == Scope.content:
- if key.field_name == 'data' and not isinstance(self._data, dict):
- return self._data
- else:
- return self._data[key.field_name]
+ return self._data[key.field_name]
else:
raise InvalidScopeError(key)
@@ -85,10 +85,7 @@ class MongoKeyValueStore(InheritanceKeyValueStore):
elif key.scope == Scope.settings:
self._metadata[key.field_name] = value
elif key.scope == Scope.content:
- if key.field_name == 'data' and not isinstance(self._data, dict):
- self._data = value
- else:
- self._data[key.field_name] = value
+ self._data[key.field_name] = value
else:
raise InvalidScopeError(key)
@@ -99,9 +96,7 @@ class MongoKeyValueStore(InheritanceKeyValueStore):
if key.field_name in self._metadata:
del self._metadata[key.field_name]
elif key.scope == Scope.content:
- if key.field_name == 'data' and not isinstance(self._data, dict):
- self._data = None
- else:
+ if key.field_name in self._data:
del self._data[key.field_name]
else:
raise InvalidScopeError(key)
@@ -112,10 +107,7 @@ class MongoKeyValueStore(InheritanceKeyValueStore):
elif key.scope == Scope.settings:
return key.field_name in self._metadata
elif key.scope == Scope.content:
- if key.field_name == 'data' and not isinstance(self._data, dict):
- return True
- else:
- return key.field_name in self._data
+ return key.field_name in self._data
else:
return False
@@ -655,6 +647,10 @@ class MongoModuleStore(ModuleStoreWriteBase):
# layer but added it here to enable quick conversion. I'll need to reconcile these.
if metadata is None:
metadata = {}
+
+ if definition_data is None:
+ definition_data = {}
+
if system is None:
services = {}
if self.i18n_service:
@@ -673,11 +669,6 @@ class MongoModuleStore(ModuleStoreWriteBase):
services=services,
)
xblock_class = system.load_block_type(location.category)
- if definition_data is None:
- if hasattr(xblock_class, 'data') and xblock_class.data.default is not None:
- definition_data = xblock_class.data.default
- else:
- definition_data = {}
dbmodel = self._create_new_field_data(location.category, location, definition_data, metadata)
xmodule = system.construct_xblock_from_class(
xblock_class,
@@ -793,8 +784,6 @@ class MongoModuleStore(ModuleStoreWriteBase):
"""
try:
definition_data = xblock.get_explicitly_set_fields_by_scope()
- if len(definition_data) == 1 and 'data' in definition_data:
- definition_data = definition_data['data']
payload = {
'definition.data': definition_data,
'metadata': own_metadata(xblock),
diff --git a/common/lib/xmodule/xmodule/modulestore/tests/test_mongo.py b/common/lib/xmodule/xmodule/modulestore/tests/test_mongo.py
index 33b6eaa2a4..ad43c59e2e 100644
--- a/common/lib/xmodule/xmodule/modulestore/tests/test_mongo.py
+++ b/common/lib/xmodule/xmodule/modulestore/tests/test_mongo.py
@@ -300,7 +300,7 @@ class TestMongoKeyValueStore(object):
assert_false(self.kvs.has(key))
def test_read_non_dict_data(self):
- self.kvs._data = 'xml_data'
+ self.kvs = MongoKeyValueStore('xml_data', self.children, self.metadata)
assert_equals('xml_data', self.kvs.get(KeyValueStore.Key(Scope.content, None, None, 'data')))
def _check_write(self, key, value):
@@ -313,7 +313,7 @@ class TestMongoKeyValueStore(object):
yield (self._check_write, KeyValueStore.Key(Scope.settings, None, None, 'meta'), 'new_settings')
def test_write_non_dict_data(self):
- self.kvs._data = 'xml_data'
+ self.kvs = MongoKeyValueStore('xml_data', self.children, self.metadata)
self._check_write(KeyValueStore.Key(Scope.content, None, None, 'data'), 'new_data')
def test_write_invalid_scope(self):
diff --git a/lms/envs/bok_choy.py b/lms/envs/bok_choy.py
index afeb08d1d5..177bbdcdc4 100644
--- a/lms/envs/bok_choy.py
+++ b/lms/envs/bok_choy.py
@@ -4,8 +4,6 @@ Settings for bok choy tests
import os
from path import path
-from xmodule.modulestore import prefer_xmodules
-
CONFIG_ROOT = path(__file__).abspath().dirname() #pylint: disable=E1120
TEST_ROOT = CONFIG_ROOT.dirname().dirname() / "test_root"
@@ -60,8 +58,5 @@ LOG_OVERRIDES = [
for log_name, log_level in LOG_OVERRIDES:
logging.getLogger(log_name).setLevel(log_level)
-# Enable XBlocks
-XBLOCK_SELECT_FUNCTION = prefer_xmodules
-
# Unfortunately, we need to use debug mode to serve staticfiles
DEBUG = True
diff --git a/lms/envs/common.py b/lms/envs/common.py
index 35e5a39f68..6cbea1776c 100644
--- a/lms/envs/common.py
+++ b/lms/envs/common.py
@@ -34,9 +34,6 @@ from path import path
from .discussionsettings import *
from lms.lib.xblock.mixin import LmsBlockMixin
-from xmodule.modulestore.inheritance import InheritanceMixin
-from xmodule.modulestore import prefer_xmodules
-from xmodule.x_module import XModuleMixin
################################### FEATURES ###################################
# The display name of the platform to be used in templates/emails/etc.
@@ -437,6 +434,11 @@ DOC_STORE_CONFIG = {
############# XBlock Configuration ##########
+# Import after sys.path fixup
+from xmodule.modulestore.inheritance import InheritanceMixin
+from xmodule.modulestore import prefer_xmodules
+from xmodule.x_module import XModuleMixin
+
# This should be moved into an XBlock Runtime/Application object
# once the responsibility of XBlock creation is moved out of modulestore - cpennington
XBLOCK_MIXINS = (LmsBlockMixin, InheritanceMixin, XModuleMixin)
@@ -1201,6 +1203,17 @@ FEATURES['CLASS_DASHBOARD'] = False
if FEATURES.get('CLASS_DASHBOARD'):
INSTALLED_APPS += ('class_dashboard',)
+######################## CAS authentication ###########################
+
+if FEATURES.get('AUTH_USE_CAS'):
+ CAS_SERVER_URL = 'https://provide_your_cas_url_here'
+ AUTHENTICATION_BACKENDS = (
+ 'django.contrib.auth.backends.ModelBackend',
+ 'django_cas.backends.CASBackend',
+ )
+ INSTALLED_APPS += ('django_cas',)
+ MIDDLEWARE_CLASSES += ('django_cas.middleware.CASMiddleware',)
+
###################### Registration ##################################
# For each of the fields, give one of the following values:
diff --git a/requirements/edx/edx-private.txt b/requirements/edx/edx-private.txt
index 9e19b30730..34999f38ad 100644
--- a/requirements/edx/edx-private.txt
+++ b/requirements/edx/edx-private.txt
@@ -1,4 +1,3 @@
-<<<<<<< HEAD
# Requirements for edx.org that aren't necessarily needed for Open edX.
-e git+ssh://git@github.com/jazkarta/edX-jsdraw.git@df9d048e331a642193e5aa2e03650fb84a9d715f#egg=edx-jsdraw