def _query_children_for_cache_children(self, items): # first get non-draft in a round-trip to_process_non_drafts = super(DraftModuleStore, self)._query_children_for_cache_children(items) to_process_dict = {} for non_draft in to_process_non_drafts: to_process_dict[Location(non_draft["_id"])] = non_draft # now query all draft content in another round-trip query = { '_id': {'$in': [namedtuple_to_son(as_draft(Location(item))) for item in items]} } to_process_drafts = list(self.collection.find(query)) # now we have to go through all drafts and replace the non-draft # with the draft. This is because the semantics of the DraftStore is to # always return the draft - if available for draft in to_process_drafts: draft_loc = Location(draft["_id"]) draft_as_non_draft_loc = draft_loc.replace(revision=None) # does non-draft exist in the collection # if so, replace it if draft_as_non_draft_loc in to_process_dict: to_process_dict[draft_as_non_draft_loc] = draft # convert the dict - which is used for look ups - back into a list queried_children = to_process_dict.values() return queried_children
def convert_to_draft(self, source_location): """ Create a copy of the source and mark its revision as draft. :param source: the location of the source (its revision must be None) """ original = self.collection.find_one(location_to_query(source_location)) draft_location = as_draft(source_location) if draft_location.category in DIRECT_ONLY_CATEGORIES: raise InvalidVersionError(source_location) if not original: raise ItemNotFoundError(source_location) original['_id'] = namedtuple_to_son(draft_location) try: self.collection.insert(original) except pymongo.errors.DuplicateKeyError: raise DuplicateItemError(original['_id']) self.refresh_cached_metadata_inheritance_tree(draft_location) self.fire_updated_modulestore_signal(get_course_id_no_run(draft_location), draft_location) return self._load_items([original])[0]
def convert_to_draft(self, source_location): """ Create a copy of the source and mark its revision as draft. :param source: the location of the source (its revision must be None) """ original = self.collection.find_one(location_to_query(source_location)) draft_location = as_draft(source_location) if draft_location.category in DIRECT_ONLY_CATEGORIES: raise InvalidVersionError(source_location) if not original: raise ItemNotFoundError original['_id'] = namedtuple_to_son(draft_location) try: self.collection.insert(original) except pymongo.errors.DuplicateKeyError: raise DuplicateItemError(original['_id']) self.refresh_cached_metadata_inheritance_tree(draft_location) self.fire_updated_modulestore_signal( get_course_id_no_run(draft_location), draft_location) return self._load_items([original])[0]
def _query_children_for_cache_children(self, items): # first get non-draft in a round-trip to_process_non_drafts = super( DraftModuleStore, self)._query_children_for_cache_children(items) to_process_dict = {} for non_draft in to_process_non_drafts: to_process_dict[Location(non_draft["_id"])] = non_draft # now query all draft content in another round-trip query = { '_id': { '$in': [ namedtuple_to_son(as_draft(Location(item))) for item in items ] } } to_process_drafts = list(self.collection.find(query)) # now we have to go through all drafts and replace the non-draft # with the draft. This is because the semantics of the DraftStore is to # always return the draft - if available for draft in to_process_drafts: draft_loc = Location(draft["_id"]) draft_as_non_draft_loc = draft_loc.replace(revision=None) # does non-draft exist in the collection # if so, replace it if draft_as_non_draft_loc in to_process_dict: to_process_dict[draft_as_non_draft_loc] = draft # convert the dict - which is used for look ups - back into a list queried_children = to_process_dict.values() return queried_children