'Returns the CourseGrade for the given user in the course as
persisted in storage.  Does NOT verify whether the grading
policy is still valid since the grade was last computed.
If not in storage, returns a ZeroGrade if ASSUME_ZERO_GRADE_IF_ABSENT
else returns None.
At least one of course, collected_block_structure, course_structure,
or course_key should be provided.'

def read(self, user, course=None, collected_block_structure=None, course_structure=None, course_key=None):

    course_data = CourseData(user, course, collected_block_structure, course_structure, course_key)
    try:
        (course_grade, _) = self._read(user, course_data)
        return course_grade
    except PersistentCourseGrade.DoesNotExist:
        if assume_zero_if_absent(course_data.course_key):
            return self._create_zero(user, course_data)
        else:
            return None
