def _get_certificates_for_user(self, username): """ Returns a user's viewable certificates sorted by course name. """ course_certificates = get_certificates_for_user(username) passing_certificates = {} for course_certificate in course_certificates: if course_certificate.get('is_passing', False): course_key = course_certificate['course_key'] passing_certificates[course_key] = course_certificate viewable_certificates = [] for course_key, course_overview in CourseOverview.get_from_ids_if_exists( passing_certificates.keys()).items(): if certificates_viewable_for_course(course_overview): course_certificate = passing_certificates[course_key] course_certificate[ 'course_display_name'] = course_overview.display_name_with_default course_certificate[ 'course_organization'] = course_overview.display_org_with_default viewable_certificates.append(course_certificate) viewable_certificates.sort( key=lambda certificate: certificate['created']) return viewable_certificates
def prefetch_courses(persistent_course_grades): """ Prefetch courses from the list of course_ids present in the persistent_course_grades. Arguments: persistent_course_grades (list): A list of PersistentCourseGrade. Returns: (dict): A dictionary containing course_id to course_overview mapping. """ return CourseOverview.get_from_ids_if_exists( [grade.course_id for grade in persistent_course_grades])
def get(self, request, program_uuid=None): """ Defines the GET endpoint for overviews of course enrollments for a user as part of a program. """ user = request.user user_program_enrollment = ProgramEnrollment.objects.filter( program_uuid=program_uuid, user=user, status='enrolled', ).order_by('-modified', ) user_program_enrollment_count = user_program_enrollment.count() if user_program_enrollment_count > 1: # in the unusual and unlikely case of a user having two # active program enrollments for the same program, # choose the most recently modified enrollment and log # a warning user_program_enrollment = user_program_enrollment[0] logger.warning( ('User with user_id {} has more than program enrollment' 'with an enrolled status for program uuid {}.').format( user.id, program_uuid, )) elif user_program_enrollment_count == 0: # if the user is not enrolled in the program, they are not authorized # to view the information returned by this endpoint raise PermissionDenied user_program_course_enrollments = ProgramCourseEnrollment.objects.filter( program_enrollment=user_program_enrollment).select_related( 'course_enrollment') enrollment_dict = { enrollment.course_key: enrollment.course_enrollment for enrollment in user_program_course_enrollments } overviews = CourseOverview.get_from_ids_if_exists( enrollment_dict.keys()) resume_course_run_urls = get_resume_urls_for_enrollments( user, enrollment_dict.values()) response = { 'course_runs': [], } for enrollment in user_program_course_enrollments: overview = overviews[enrollment.course_key] certificate_download_url = None is_certificate_passing = None certificate_creation_date = None certificate_info = get_certificate_for_user( user.username, enrollment.course_key) if certificate_info: certificate_download_url = certificate_info['download_url'] is_certificate_passing = certificate_info['is_passing'] certificate_creation_date = certificate_info['created'] course_run_dict = { 'course_run_id': enrollment.course_key, 'display_name': overview.display_name_with_default, 'course_run_status': self.get_course_run_status(overview, is_certificate_passing, certificate_creation_date), 'course_run_url': self.get_course_run_url(request, enrollment.course_key), 'start_date': overview.start, 'end_date': overview.end, 'due_dates': self.get_due_dates(request, enrollment.course_key, user), } if certificate_download_url: course_run_dict[ 'certificate_download_url'] = certificate_download_url emails_enabled = self.get_emails_enabled(user, enrollment.course_key) if emails_enabled is not None: course_run_dict['emails_enabled'] = emails_enabled micromasters_title = self.program['title'] if self.program[ 'type'] == 'MicroMasters' else None if micromasters_title: course_run_dict['micromasters_title'] = micromasters_title # if the url is '', then the url is None so we can omit it from the response resume_course_run_url = resume_course_run_urls[ enrollment.course_key] if resume_course_run_url: course_run_dict[ 'resume_course_run_url'] = resume_course_run_url response['course_runs'].append(course_run_dict) serializer = CourseRunOverviewListSerializer(response) return Response(serializer.data)
def get(self, request, program_uuid=None): """ Defines the GET endpoint for overviews of course enrollments for a user as part of a program. """ user = request.user user_program_enrollment = ProgramEnrollment.objects.filter( program_uuid=program_uuid, user=user, status='enrolled', ).order_by( '-modified', ) user_program_enrollment_count = user_program_enrollment.count() if user_program_enrollment_count > 1: # in the unusual and unlikely case of a user having two # active program enrollments for the same program, # choose the most recently modified enrollment and log # a warning user_program_enrollment = user_program_enrollment[0] logger.warning( ('User with user_id {} has more than program enrollment' 'with an enrolled status for program uuid {}.').format( user.id, program_uuid, ) ) elif user_program_enrollment_count == 0: # if the user is not enrolled in the program, they are not authorized # to view the information returned by this endpoint raise PermissionDenied user_program_course_enrollments = ProgramCourseEnrollment.objects.filter( program_enrollment=user_program_enrollment ).select_related('course_enrollment') enrollment_dict = {enrollment.course_key: enrollment.course_enrollment for enrollment in user_program_course_enrollments} overviews = CourseOverview.get_from_ids_if_exists(enrollment_dict.keys()) resume_course_run_urls = get_resume_urls_for_enrollments(user, enrollment_dict.values()) response = { 'course_runs': [], } for enrollment in user_program_course_enrollments: overview = overviews[enrollment.course_key] certificate_download_url = None is_certificate_passing = None certificate_creation_date = None certificate_info = get_certificate_for_user(user.username, enrollment.course_key) if certificate_info: certificate_download_url = certificate_info['download_url'] is_certificate_passing = certificate_info['is_passing'] certificate_creation_date = certificate_info['created'] course_run_dict = { 'course_run_id': enrollment.course_key, 'display_name': overview.display_name_with_default, 'course_run_status': self.get_course_run_status(overview, is_certificate_passing, certificate_creation_date), 'course_run_url': self.get_course_run_url(request, enrollment.course_key), 'start_date': overview.start, 'end_date': overview.end, 'due_dates': self.get_due_dates(request, enrollment.course_key, user), } if certificate_download_url: course_run_dict['certificate_download_url'] = certificate_download_url emails_enabled = self.get_emails_enabled(user, enrollment.course_key) if emails_enabled is not None: course_run_dict['emails_enabled'] = emails_enabled micromasters_title = self.program['title'] if self.program['type'] == 'MicroMasters' else None if micromasters_title: course_run_dict['micromasters_title'] = micromasters_title # if the url is '', then the url is None so we can omit it from the response resume_course_run_url = resume_course_run_urls[enrollment.course_key] if resume_course_run_url: course_run_dict['resume_course_run_url'] = resume_course_run_url response['course_runs'].append(course_run_dict) serializer = CourseRunOverviewListSerializer(response) return Response(serializer.data)
def get(self, request, program_uuid=None): """ Defines the GET endpoint for overviews of course enrollments for a user as part of a program. """ user = request.user self._check_program_enrollment_exists(user, program_uuid) course_run_keys = [ CourseKey.from_string(key) for key in course_run_keys_for_program(self.program) ] course_enrollments = CourseEnrollment.objects.filter( user=user, course_id__in=course_run_keys, mode__in=[CourseMode.VERIFIED, CourseMode.MASTERS], is_active=True, ) overviews = CourseOverview.get_from_ids_if_exists(course_run_keys) course_run_resume_urls = get_resume_urls_for_enrollments( user, course_enrollments) course_runs = [] for enrollment in course_enrollments: overview = overviews[enrollment.course_id] certificate_info = get_certificate_for_user( user.username, enrollment.course_id) or {} course_run_dict = { 'course_run_id': enrollment.course_id, 'display_name': overview.display_name_with_default, 'course_run_status': get_course_run_status(overview, certificate_info), 'course_run_url': get_course_run_url(request, enrollment.course_id), 'start_date': overview.start, 'end_date': overview.end, 'due_dates': get_due_dates(request, enrollment.course_id, user), } emails_enabled = get_emails_enabled(user, enrollment.course_id) if emails_enabled is not None: course_run_dict['emails_enabled'] = emails_enabled if certificate_info.get('download_url'): course_run_dict[ 'certificate_download_url'] = request.build_absolute_uri( certificate_info['download_url']) if self.program['type'] == 'MicroMasters': course_run_dict['micromasters_title'] = self.program['title'] if course_run_resume_urls.get(enrollment.course_id): relative_resume_course_run_url = course_run_resume_urls.get( enrollment.course_id) course_run_dict[ 'resume_course_run_url'] = request.build_absolute_uri( relative_resume_course_run_url) course_runs.append(course_run_dict) serializer = CourseRunOverviewListSerializer( {'course_runs': course_runs}) return Response(serializer.data)
def get(self, request, program_uuid=None): """ Defines the GET endpoint for overviews of course enrollments for a user as part of a program. """ user = request.user program_enrollment = self._get_program_enrollment(user, program_uuid) program_course_enrollments = ProgramCourseEnrollment.objects.filter( program_enrollment=program_enrollment).select_related( 'course_enrollment') enrollments_by_course_key = { enrollment.course_key: enrollment.course_enrollment for enrollment in program_course_enrollments } overviews = CourseOverview.get_from_ids_if_exists( enrollments_by_course_key.keys()) course_run_resume_urls = get_resume_urls_for_enrollments( user, enrollments_by_course_key.values()) course_runs = [] for enrollment in program_course_enrollments: overview = overviews[enrollment.course_key] certificate_info = get_certificate_for_user( user.username, enrollment.course_key) or {} course_run_dict = { 'course_run_id': enrollment.course_key, 'display_name': overview.display_name_with_default, 'course_run_status': self.get_course_run_status(overview, certificate_info), 'course_run_url': self.get_course_run_url(request, enrollment.course_key), 'start_date': overview.start, 'end_date': overview.end, 'due_dates': self.get_due_dates(request, enrollment.course_key, user), } emails_enabled = self.get_emails_enabled(user, enrollment.course_key) if emails_enabled is not None: course_run_dict['emails_enabled'] = emails_enabled if certificate_info.get('download_url'): course_run_dict['certificate_download_url'] = certificate_info[ 'download_url'] if self.program['type'] == 'MicroMasters': course_run_dict['micromasters_title'] = self.program['title'] if course_run_resume_urls.get(enrollment.course_key): course_run_dict[ 'resume_course_run_url'] = course_run_resume_urls.get( enrollment.course_key) course_runs.append(course_run_dict) serializer = CourseRunOverviewListSerializer( {'course_runs': course_runs}) return Response(serializer.data)