From fe4bce8bba0ead6768d2ac3484d6967d8c3feffb Mon Sep 17 00:00:00 2001 From: Nimisha Asthagiri Date: Sun, 27 Jul 2014 18:20:51 -0400 Subject: [PATCH] clone_course: Add fields parameter to support new display_name. --- common/lib/xmodule/xmodule/modulestore/__init__.py | 5 ++--- common/lib/xmodule/xmodule/modulestore/mixed.py | 8 ++++---- .../lib/xmodule/xmodule/modulestore/mongo/draft.py | 13 ++++++++++--- .../xmodule/xmodule/modulestore/split_migrator.py | 8 ++++++-- .../xmodule/modulestore/split_mongo/split.py | 6 +++--- 5 files changed, 25 insertions(+), 15 deletions(-) diff --git a/common/lib/xmodule/xmodule/modulestore/__init__.py b/common/lib/xmodule/xmodule/modulestore/__init__.py index f7af93dace..f21507d185 100644 --- a/common/lib/xmodule/xmodule/modulestore/__init__.py +++ b/common/lib/xmodule/xmodule/modulestore/__init__.py @@ -396,7 +396,7 @@ class ModuleStoreWrite(ModuleStoreRead): pass @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 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): result[field.scope][field_name] = value 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 content. @@ -585,7 +585,6 @@ class ModuleStoreWriteBase(ModuleStoreReadBase, ModuleStoreWrite): # copy the assets if self.contentstore: 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 def delete_course(self, course_key, user_id): diff --git a/common/lib/xmodule/xmodule/modulestore/mixed.py b/common/lib/xmodule/xmodule/modulestore/mixed.py index 2e067c3c9d..85e3323b56 100644 --- a/common/lib/xmodule/xmodule/modulestore/mixed.py +++ b/common/lib/xmodule/xmodule/modulestore/mixed.py @@ -288,7 +288,7 @@ class MixedModuleStore(ModuleStoreDraftAndPublished, ModuleStoreWriteBase): store = self._verify_modulestore_support(None, 'create_course') 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. @@ -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 dest_modulestore = self._get_modulestore_for_courseid(dest_course_id) 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 # 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: split_migrator = SplitMigrator(dest_modulestore, source_modulestore) 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): diff --git a/common/lib/xmodule/xmodule/modulestore/mongo/draft.py b/common/lib/xmodule/xmodule/modulestore/mongo/draft.py index 66c2de808a..cd7e0bc4c2 100644 --- a/common/lib/xmodule/xmodule/modulestore/mongo/draft.py +++ b/common/lib/xmodule/xmodule/modulestore/mongo/draft.py @@ -155,7 +155,7 @@ class DraftModuleStore(MongoModuleStore): course_query = self._course_key_to_son(course_key) 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. * copy the courseware @@ -177,13 +177,20 @@ class DraftModuleStore(MongoModuleStore): ) # 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 new_course = self.get_course(dest_course_id) if new_course is None: # 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 modules = self.get_items(source_course_id, revision=ModuleStoreEnum.RevisionOption.published_only) diff --git a/common/lib/xmodule/xmodule/modulestore/split_migrator.py b/common/lib/xmodule/xmodule/modulestore/split_migrator.py index 17e92db137..1f3d66a123 100644 --- a/common/lib/xmodule/xmodule/modulestore/split_migrator.py +++ b/common/lib/xmodule/xmodule/modulestore/split_migrator.py @@ -25,7 +25,7 @@ class SplitMigrator(object): self.split_modulestore = split_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 original mongo store. And return the new CourseLocator @@ -51,10 +51,14 @@ class SplitMigrator(object): new_course = source_course_key.course if new_run is None: new_run = source_course_key.run + 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_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, ) diff --git a/common/lib/xmodule/xmodule/modulestore/split_mongo/split.py b/common/lib/xmodule/xmodule/modulestore/split_mongo/split.py index 6fb0da75db..6683acd8e0 100644 --- a/common/lib/xmodule/xmodule/modulestore/split_mongo/split.py +++ b/common/lib/xmodule/xmodule/modulestore/split_mongo/split.py @@ -938,17 +938,17 @@ class SplitMongoModuleStore(ModuleStoreWriteBase): # don't need to update the index b/c create_item did it for this version 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. In split, other than copying the assets, this is cheap as it merely creates a new version of the 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) 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'] )