def progress(self, programs=None, count_only=True): """Gauge a user's progress towards program completion. Keyword Arguments: programs (list): Specific list of programs to check the user's progress against. If left unspecified, self.engaged_programs will be used. count_only (bool): Whether or not to return counts of completed, in progress, and unstarted courses instead of serialized representations of the courses. Returns: list of dict, each containing information about a user's progress towards completing a program. """ now = datetime.datetime.now(utc) progress = [] programs = programs or self.engaged_programs for program in programs: program_copy = deepcopy(program) completed, in_progress, not_started = [], [], [] for course in program_copy['courses']: active_entitlement = CourseEntitlement.get_entitlement_if_active( user=self.user, course_uuid=course['uuid']) if self._is_course_complete(course): completed.append(course) elif self._is_course_enrolled(course) or active_entitlement: # Show all currently enrolled courses and active entitlements as in progress if active_entitlement: course[ 'course_runs'] = get_fulfillable_course_runs_for_entitlement( active_entitlement, course['course_runs']) course[ 'user_entitlement'] = active_entitlement.to_dict() course['enroll_url'] = reverse( 'entitlements_api:v1:enrollments', args=[str(active_entitlement.uuid)]) in_progress.append(course) else: course_in_progress = self._is_course_in_progress( now, course) if course_in_progress: in_progress.append(course) else: course['expired'] = not course_in_progress not_started.append(course) else: not_started.append(course) grades = {} for run in self.course_run_ids: grade = self.course_grade_factory.read( self.user, course_key=CourseKey.from_string(run)) grades[run] = grade.percent progress.append({ 'uuid': program_copy['uuid'], 'completed': len(completed) if count_only else completed, 'in_progress': len(in_progress) if count_only else in_progress, 'not_started': len(not_started) if count_only else not_started, 'grades': grades, }) return progress
def progress(self, programs=None, count_only=True): """Gauge a user's progress towards program completion. Keyword Arguments: programs (list): Specific list of programs to check the user's progress against. If left unspecified, self.engaged_programs will be used. count_only (bool): Whether or not to return counts of completed, in progress, and unstarted courses instead of serialized representations of the courses. Returns: list of dict, each containing information about a user's progress towards completing a program. """ now = datetime.datetime.now(utc) progress = [] programs = programs or self.engaged_programs for program in programs: program_copy = deepcopy(program) completed, in_progress, not_started = [], [], [] for course in program_copy['courses']: active_entitlement = CourseEntitlement.get_entitlement_if_active( user=self.user, course_uuid=course['uuid'] ) if self._is_course_complete(course): completed.append(course) elif self._is_course_enrolled(course) or active_entitlement: # Show all currently enrolled courses and active entitlements as in progress if active_entitlement: course['course_runs'] = get_fulfillable_course_runs_for_entitlement( active_entitlement, course['course_runs'] ) course['user_entitlement'] = active_entitlement.to_dict() course['enroll_url'] = reverse( 'entitlements_api:v1:enrollments', args=[str(active_entitlement.uuid)] ) in_progress.append(course) else: course_in_progress = self._is_course_in_progress(now, course) if course_in_progress: in_progress.append(course) else: course['expired'] = not course_in_progress not_started.append(course) else: not_started.append(course) grades = {} for run in self.course_run_ids: grade = self.course_grade_factory.read(self.user, course_key=CourseKey.from_string(run)) grades[run] = grade.percent progress.append({ 'uuid': program_copy['uuid'], 'completed': len(completed) if count_only else completed, 'in_progress': len(in_progress) if count_only else in_progress, 'not_started': len(not_started) if count_only else not_started, 'grades': grades, }) return progress