diff --git a/cms/djangoapps/contentstore/views/course.py b/cms/djangoapps/contentstore/views/course.py index b4b14a64b6..54d711a597 100644 --- a/cms/djangoapps/contentstore/views/course.py +++ b/cms/djangoapps/contentstore/views/course.py @@ -26,7 +26,8 @@ from xmodule.partitions.partitions import UserPartition, Group from xmodule.modulestore.exceptions import ItemNotFoundError, InvalidLocationError from opaque_keys import InvalidKeyError -from opaque_keys.edx.locations import Location, SlashSeparatedCourseKey +from opaque_keys.edx.locations import Location +from opaque_keys.edx.locator import CourseLocator from contentstore.course_info_model import get_course_updates, update_course_updates, delete_course_update from contentstore.utils import ( @@ -460,7 +461,7 @@ def _create_or_rerun_course(request): status=400 ) - course_key = SlashSeparatedCourseKey(org, number, run) + course_key = CourseLocator(org, number, run) fields = {'display_name': display_name} if display_name is not None else {} if 'source_course_key' in request.json: @@ -492,6 +493,7 @@ def _create_new_course(request, course_key, fields): """ Create a new course. Returns the URL for the course overview page. + Raises InvalidLocationError if the course already exists """ # Set a unique wiki_slug for newly created courses. To maintain active wiki_slugs for # existing xml courses this cannot be changed in CourseDescriptor. @@ -501,14 +503,16 @@ def _create_new_course(request, course_key, fields): definition_data = {'wiki_slug': wiki_slug} fields.update(definition_data) - # Creating the course raises InvalidLocationError if an existing course with this org/name is found - new_course = modulestore().create_course( - course_key.org, - course_key.course, - course_key.run, - request.user.id, - fields=fields, - ) + store = modulestore() + with store.default_store(settings.FEATURES.get('DEFAULT_STORE_FOR_NEW_COURSE', 'mongo')): + # Creating the course raises InvalidLocationError if an existing course with this org/name is found + new_course = modulestore().create_course( + course_key.org, + course_key.course, + course_key.run, + request.user.id, + fields=fields, + ) # Make sure user has instructor and staff access to the new course add_instructor(new_course.id, request.user, request.user) diff --git a/cms/djangoapps/contentstore/views/item.py b/cms/djangoapps/contentstore/views/item.py index f96f7e9632..6373f373a1 100644 --- a/cms/djangoapps/contentstore/views/item.py +++ b/cms/djangoapps/contentstore/views/item.py @@ -424,6 +424,11 @@ def _create_item(request): if display_name is not None: metadata['display_name'] = display_name + # TODO need to fix components that are sending definition_data as strings, instead of as dicts + # For now, migrate them into dicts here. + if isinstance(data, basestring): + data = {'data': data} + created_block = store.create_child( request.user.id, usage_key, diff --git a/cms/envs/common.py b/cms/envs/common.py index df5df07af7..2f39d754dc 100644 --- a/cms/envs/common.py +++ b/cms/envs/common.py @@ -106,6 +106,9 @@ FEATURES = { # Toggles Group Configuration editing functionality 'ENABLE_GROUP_CONFIGURATIONS': os.environ.get('FEATURE_GROUP_CONFIGURATIONS'), + + # Modulestore to use for new courses + 'DEFAULT_STORE_FOR_NEW_COURSE': 'mongo', } ENABLE_JASMINE = False diff --git a/common/lib/xmodule/xmodule/modulestore/split_mongo/caching_descriptor_system.py b/common/lib/xmodule/xmodule/modulestore/split_mongo/caching_descriptor_system.py index a2733d35b0..611423d7c5 100644 --- a/common/lib/xmodule/xmodule/modulestore/split_mongo/caching_descriptor_system.py +++ b/common/lib/xmodule/xmodule/modulestore/split_mongo/caching_descriptor_system.py @@ -151,6 +151,8 @@ class CachingDescriptorSystem(MakoDescriptorSystem): edit_info = json_data.get('edit_info', {}) module.edited_by = edit_info.get('edited_by') module.edited_on = edit_info.get('edited_on') + module.published_by = None # TODO + module.published_date = None # TODO module.previous_version = edit_info.get('previous_version') module.update_version = edit_info.get('update_version') module.source_version = edit_info.get('source_version', None) diff --git a/common/lib/xmodule/xmodule/modulestore/split_mongo/split.py b/common/lib/xmodule/xmodule/modulestore/split_mongo/split.py index 886b790f67..7adffe89d6 100644 --- a/common/lib/xmodule/xmodule/modulestore/split_mongo/split.py +++ b/common/lib/xmodule/xmodule/modulestore/split_mongo/split.py @@ -820,6 +820,12 @@ class SplitMongoModuleStore(ModuleStoreWriteBase): the course id'd by version_guid but instead in one w/ a new version_guid. Ensure in this case that you get the new version_guid from the locator in the returned object! """ + # split handles all the fields in one dict not separated by scope + fields = kwargs.get('fields', {}) + fields.update(kwargs.pop('metadata', {}) or {}) + fields.update(kwargs.pop('definition_data', {}) or {}) + kwargs['fields'] = fields + # find course_index entry if applicable and structures entry index_entry = self._get_index_if_valid(course_key, force, continue_version) structure = self._lookup_course(course_key)['structure'] @@ -1844,6 +1850,7 @@ class SplitMongoModuleStore(ModuleStoreWriteBase): destination_block['edit_info']['previous_version'] = previous_version destination_block['edit_info']['update_version'] = destination_version destination_block['edit_info']['edited_by'] = user_id + destination_block['edit_info']['edited_on'] = datetime.datetime.now(UTC) else: destination_block = self._new_block( user_id, new_block['category'],