Commit fe4bce8b by Nimisha Asthagiri

clone_course: Add fields parameter to support new display_name.

parent 538bec92
...@@ -396,7 +396,7 @@ class ModuleStoreWrite(ModuleStoreRead): ...@@ -396,7 +396,7 @@ class ModuleStoreWrite(ModuleStoreRead):
pass pass
@abstractmethod @abstractmethod
def clone_course(self, source_course_id, dest_course_id, user_id): def clone_course(self, source_course_id, dest_course_id, user_id, fields=None):
""" """
Sets up source_course_id to point a course with the same content as the desct_course_id. This Sets up source_course_id to point a course with the same content as the desct_course_id. This
operation may be cheap or expensive. It may have to copy all assets and all xblock content or operation may be cheap or expensive. It may have to copy all assets and all xblock content or
...@@ -577,7 +577,7 @@ class ModuleStoreWriteBase(ModuleStoreReadBase, ModuleStoreWrite): ...@@ -577,7 +577,7 @@ class ModuleStoreWriteBase(ModuleStoreReadBase, ModuleStoreWrite):
result[field.scope][field_name] = value result[field.scope][field_name] = value
return result return result
def clone_course(self, source_course_id, dest_course_id, user_id): def clone_course(self, source_course_id, dest_course_id, user_id, fields=None):
""" """
This base method just copies the assets. The lower level impls must do the actual cloning of This base method just copies the assets. The lower level impls must do the actual cloning of
content. content.
...@@ -585,7 +585,6 @@ class ModuleStoreWriteBase(ModuleStoreReadBase, ModuleStoreWrite): ...@@ -585,7 +585,6 @@ class ModuleStoreWriteBase(ModuleStoreReadBase, ModuleStoreWrite):
# copy the assets # copy the assets
if self.contentstore: if self.contentstore:
self.contentstore.copy_all_course_assets(source_course_id, dest_course_id) self.contentstore.copy_all_course_assets(source_course_id, dest_course_id)
super(ModuleStoreWriteBase, self).clone_course(source_course_id, dest_course_id, user_id)
return dest_course_id return dest_course_id
def delete_course(self, course_key, user_id): def delete_course(self, course_key, user_id):
......
...@@ -288,7 +288,7 @@ class MixedModuleStore(ModuleStoreDraftAndPublished, ModuleStoreWriteBase): ...@@ -288,7 +288,7 @@ class MixedModuleStore(ModuleStoreDraftAndPublished, ModuleStoreWriteBase):
store = self._verify_modulestore_support(None, 'create_course') store = self._verify_modulestore_support(None, 'create_course')
return store.create_course(org, course, run, user_id, **kwargs) return store.create_course(org, course, run, user_id, **kwargs)
def clone_course(self, source_course_id, dest_course_id, user_id): def clone_course(self, source_course_id, dest_course_id, user_id, fields=None):
""" """
See the superclass for the general documentation. See the superclass for the general documentation.
...@@ -303,16 +303,16 @@ class MixedModuleStore(ModuleStoreDraftAndPublished, ModuleStoreWriteBase): ...@@ -303,16 +303,16 @@ class MixedModuleStore(ModuleStoreDraftAndPublished, ModuleStoreWriteBase):
# to have only course re-runs go to split. This code, however, uses the config'd priority # to have only course re-runs go to split. This code, however, uses the config'd priority
dest_modulestore = self._get_modulestore_for_courseid(dest_course_id) dest_modulestore = self._get_modulestore_for_courseid(dest_course_id)
if source_modulestore == dest_modulestore: if source_modulestore == dest_modulestore:
return source_modulestore.clone_course(source_course_id, dest_course_id, user_id) return source_modulestore.clone_course(source_course_id, dest_course_id, user_id, fields)
# ensure super's only called once. The delegation above probably calls it; so, don't move # ensure super's only called once. The delegation above probably calls it; so, don't move
# the invocation above the delegation call # the invocation above the delegation call
super(MixedModuleStore, self).clone_course(source_course_id, dest_course_id, user_id) super(MixedModuleStore, self).clone_course(source_course_id, dest_course_id, user_id, fields)
if dest_modulestore.get_modulestore_type() == ModuleStoreEnum.Type.split: if dest_modulestore.get_modulestore_type() == ModuleStoreEnum.Type.split:
split_migrator = SplitMigrator(dest_modulestore, source_modulestore) split_migrator = SplitMigrator(dest_modulestore, source_modulestore)
split_migrator.migrate_mongo_course( split_migrator.migrate_mongo_course(
source_course_id, user_id, dest_course_id.org, dest_course_id.course, dest_course_id.run source_course_id, user_id, dest_course_id.org, dest_course_id.course, dest_course_id.run, fields
) )
def create_item(self, user_id, course_key, block_type, block_id=None, fields=None, **kwargs): def create_item(self, user_id, course_key, block_type, block_id=None, fields=None, **kwargs):
......
...@@ -155,7 +155,7 @@ class DraftModuleStore(MongoModuleStore): ...@@ -155,7 +155,7 @@ class DraftModuleStore(MongoModuleStore):
course_query = self._course_key_to_son(course_key) course_query = self._course_key_to_son(course_key)
self.collection.remove(course_query, multi=True) self.collection.remove(course_query, multi=True)
def clone_course(self, source_course_id, dest_course_id, user_id): def clone_course(self, source_course_id, dest_course_id, user_id, fields=None):
""" """
Only called if cloning within this store or if env doesn't set up mixed. Only called if cloning within this store or if env doesn't set up mixed.
* copy the courseware * copy the courseware
...@@ -177,13 +177,20 @@ class DraftModuleStore(MongoModuleStore): ...@@ -177,13 +177,20 @@ class DraftModuleStore(MongoModuleStore):
) )
# clone the assets # clone the assets
super(DraftModuleStore, self).clone_course(source_course_id, dest_course_id, user_id) super(DraftModuleStore, self).clone_course(source_course_id, dest_course_id, user_id, fields)
# get the whole old course # get the whole old course
new_course = self.get_course(dest_course_id) new_course = self.get_course(dest_course_id)
if new_course is None: if new_course is None:
# create_course creates the about overview # create_course creates the about overview
new_course = self.create_course(dest_course_id.org, dest_course_id.course, dest_course_id.run, user_id) new_course = self.create_course(
dest_course_id.org, dest_course_id.course, dest_course_id.run, user_id, fields=fields
)
else:
# update fields on existing course
for key, value in fields.iteritems():
setattr(new_course, key, value)
self.update_item(new_course, user_id)
# Get all modules under this namespace which is (tag, org, course) tuple # Get all modules under this namespace which is (tag, org, course) tuple
modules = self.get_items(source_course_id, revision=ModuleStoreEnum.RevisionOption.published_only) modules = self.get_items(source_course_id, revision=ModuleStoreEnum.RevisionOption.published_only)
......
...@@ -25,7 +25,7 @@ class SplitMigrator(object): ...@@ -25,7 +25,7 @@ class SplitMigrator(object):
self.split_modulestore = split_modulestore self.split_modulestore = split_modulestore
self.source_modulestore = source_modulestore self.source_modulestore = source_modulestore
def migrate_mongo_course(self, source_course_key, user_id, new_org=None, new_course=None, new_run=None): def migrate_mongo_course(self, source_course_key, user_id, new_org=None, new_course=None, new_run=None, fields=None):
""" """
Create a new course in split_mongo representing the published and draft versions of the course from the Create a new course in split_mongo representing the published and draft versions of the course from the
original mongo store. And return the new CourseLocator original mongo store. And return the new CourseLocator
...@@ -51,10 +51,14 @@ class SplitMigrator(object): ...@@ -51,10 +51,14 @@ class SplitMigrator(object):
new_course = source_course_key.course new_course = source_course_key.course
if new_run is None: if new_run is None:
new_run = source_course_key.run new_run = source_course_key.run
new_course_key = CourseLocator(new_org, new_course, new_run, branch=ModuleStoreEnum.BranchName.published) new_course_key = CourseLocator(new_org, new_course, new_run, branch=ModuleStoreEnum.BranchName.published)
new_fields = self._get_json_fields_translate_references(original_course, new_course_key, None)
if fields:
new_fields.update(fields)
new_course = self.split_modulestore.create_course( new_course = self.split_modulestore.create_course(
new_org, new_course, new_run, user_id, new_org, new_course, new_run, user_id,
fields=self._get_json_fields_translate_references(original_course, new_course_key, None), fields=new_fields,
master_branch=ModuleStoreEnum.BranchName.published, master_branch=ModuleStoreEnum.BranchName.published,
) )
......
...@@ -938,17 +938,17 @@ class SplitMongoModuleStore(ModuleStoreWriteBase): ...@@ -938,17 +938,17 @@ class SplitMongoModuleStore(ModuleStoreWriteBase):
# don't need to update the index b/c create_item did it for this version # don't need to update the index b/c create_item did it for this version
return xblock return xblock
def clone_course(self, source_course_id, dest_course_id, user_id): def clone_course(self, source_course_id, dest_course_id, user_id, fields=None):
""" """
See :meth: `.ModuleStoreWrite.clone_course` for documentation. See :meth: `.ModuleStoreWrite.clone_course` for documentation.
In split, other than copying the assets, this is cheap as it merely creates a new version of the In split, other than copying the assets, this is cheap as it merely creates a new version of the
existing course. existing course.
""" """
super(SplitMongoModuleStore, self).clone_course(source_course_id, dest_course_id, user_id) super(SplitMongoModuleStore, self).clone_course(source_course_id, dest_course_id, user_id, fields)
source_index = self.get_course_index_info(source_course_id) source_index = self.get_course_index_info(source_course_id)
return self.create_course( return self.create_course(
dest_course_id.org, dest_course_id.course, dest_course_id.run, user_id, fields=None, # override start_date? dest_course_id.org, dest_course_id.course, dest_course_id.run, user_id, fields=fields,
versions_dict=source_index['versions'], search_targets=source_index['search_targets'] versions_dict=source_index['versions'], search_targets=source_index['search_targets']
) )
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment