diff --git a/cms/djangoapps/models/settings/course_details.py b/cms/djangoapps/models/settings/course_details.py index e8080846a8..21f344f706 100644 --- a/cms/djangoapps/models/settings/course_details.py +++ b/cms/djangoapps/models/settings/course_details.py @@ -11,6 +11,16 @@ from models.settings import course_grading from xmodule.fields import Date from xmodule.modulestore.django import modulestore +# This list represents the attribute keys for a course's 'about' info. +# Note: The 'video' attribute is intentionally excluded as it must be +# handled separately; its value maps to an alternate key name. +ABOUT_ATTRIBUTES = [ + 'syllabus', + 'short_description', + 'overview', + 'effort', +] + class CourseDetails(object): def __init__(self, org, course_id, run): @@ -30,6 +40,18 @@ class CourseDetails(object): self.course_image_name = "" self.course_image_asset_path = "" # URL of the course image + @classmethod + def _fetch_about_attribute(cls, course_key, attribute): + """ + Retrieve an attribute from a course's "about" info + """ + usage_key = course_key.make_usage_key('about', attribute) + try: + value = modulestore().get_item(usage_key).data + except ItemNotFoundError: + value = None + return value + @classmethod def fetch(cls, course_key): """ @@ -45,36 +67,14 @@ class CourseDetails(object): course_details.course_image_name = descriptor.course_image course_details.course_image_asset_path = course_image_url(descriptor) - temploc = course_key.make_usage_key('about', 'syllabus') - try: - course_details.syllabus = modulestore().get_item(temploc).data - except ItemNotFoundError: - pass + for attribute in ABOUT_ATTRIBUTES: + value = cls._fetch_about_attribute(course_key, attribute) + if value is not None: + setattr(course_details, attribute, value) - temploc = course_key.make_usage_key('about', 'short_description') - try: - course_details.short_description = modulestore().get_item(temploc).data - except ItemNotFoundError: - pass - - temploc = course_key.make_usage_key('about', 'overview') - try: - course_details.overview = modulestore().get_item(temploc).data - except ItemNotFoundError: - pass - - temploc = course_key.make_usage_key('about', 'effort') - try: - course_details.effort = modulestore().get_item(temploc).data - except ItemNotFoundError: - pass - - temploc = course_key.make_usage_key('about', 'video') - try: - raw_video = modulestore().get_item(temploc).data + raw_video = cls._fetch_about_attribute(course_key, 'video') + if raw_video: course_details.intro_video = CourseDetails.parse_video_tag(raw_video) - except ItemNotFoundError: - pass return course_details @@ -160,8 +160,8 @@ class CourseDetails(object): # NOTE: below auto writes to the db w/o verifying that any of the fields actually changed # to make faster, could compare against db or could have client send over a list of which fields changed. - for about_type in ['syllabus', 'overview', 'effort', 'short_description']: - cls.update_about_item(course_key, about_type, jsondict[about_type], descriptor, user) + for attribute in ABOUT_ATTRIBUTES: + cls.update_about_item(course_key, attribute, jsondict[attribute], descriptor, user) recomposed_video_tag = CourseDetails.recompose_video_tag(jsondict['intro_video']) cls.update_about_item(course_key, 'video', recomposed_video_tag, descriptor, user)