def three_times(): """Get course metadata three times.""" for _ in range(0, 3): get_course_metadata(self.course.id)
def resource_to_dict(resource, term_info): """ Retrieve important values from a LearningResource to index. This dict corresponds to the mapping created in Elasticsearch. The titlesort bits, with the "0" and "1" prefixes, were copied from the prepare_titlesort function in search/search_indexes.py. It was there to make blank titles sort to the bottom instead of the top. Args: resource (LearningResource): Item to convert to dict. term_info (dict): Vocabulary terms assigned to resource. Returns: rec (dict): Dictionary representation of the LearningResource. """ rec = { "title": resource.title, # The zero is for sorting blank items to the bottom. See below. "titlesort": "0{0}".format(resource.title.strip()), "id": resource.id, "_id": resource.id, # The ID used by Elasticsearch. "resource_type": resource.learning_resource_type.name, "description": resource.description, "description_path": resource.description_path, "content_xml": resource.content_xml, "content_stripped": strip_xml(resource.content_xml), "xa_nr_views": resource.xa_nr_views, "xa_nr_attempts": resource.xa_nr_attempts, "xa_avg_grade": resource.xa_avg_grade, "xa_histogram_grade": resource.xa_histogram_grade, } course = get_course_metadata(resource.course_id) rec["preview_url"] = get_preview_url( resource, org=course["org"], course_number=course["course_number"], run=course["run"], ) rec["run"] = course["run"] rec["course"] = course["course_number"] rec["repository"] = course["repo_slug"] # Index term info. Since these fields all use the "not_analyzed" # index, they must all be exact matches. for vocab_id, term_ids in term_info.items(): rec[make_vocab_key(vocab_id)] = term_ids # If the title is empty, sort it to the bottom. See above. if rec["titlesort"] == "0": rec["titlesort"] = "1" # Keys that may have unicode issues. text_keys = ( 'title', 'titlesort', 'resource_type', 'description', 'content_xml', 'content_stripped', 'description_path', ) for key in text_keys: try: # Thanks to unicode_literals above, this works in # Python 2 and Python 3. Avoid trying to decode a string # if it's already unicode. if not isinstance(rec[key], type("")): rec[key] = rec[key].decode('utf-8') except AttributeError: pass # Python 3 return rec