def get_enrollments_for_courses_in_program(user, program): """ Get a user's active enrollments for course runs with the given program. Note that this is distinct from the user's *program course enrollments*, which refers to courses that were enrollmed in *through* a program. In the case of this function, the course runs themselves must be part of the program, but the enrollments do not need to be associated with a program enrollment. Arguments: user (User) program (dict) Returns QuerySet[CourseEnrollment] """ course_keys = [ CourseKey.from_string(key) for key in course_run_keys_for_program(program) ] return CourseEnrollment.objects.filter( user=user, course_id__in=course_keys, mode__in=[ CourseMode.VERIFIED, CourseMode.MASTERS, CourseMode.EXECUTIVE_EDUCATION, CourseMode.PAID_EXECUTIVE_EDUCATION ], is_active=True, )
def test_course_run_keys_for_program_many_courses(self): expected_course_runs = { 'course-run-2', 'course-run-3', 'course-run-4', } self.assertEqual(expected_course_runs, course_run_keys_for_program(self.complex_program))
def get_courses(self, programs): """ Get all courses for the programs. TODO: when course discovery can handle it, use that instead. That will allow us to put all course runs in the cache not just the course runs in a program. Therefore, a cache miss would be different from a course not in a program. """ course_runs = defaultdict(list) for program in programs.values(): for course_run_key in course_run_keys_for_program(program): course_run_cache_key = COURSE_PROGRAMS_CACHE_KEY_TPL.format(course_run_id=course_run_key) course_runs[course_run_cache_key].append(program['uuid']) return course_runs
def test_course_run_keys_for_program_one_course(self): self.assertEqual({'course-run-1'}, course_run_keys_for_program(self.simple_program))
def test_course_run_keys_for_program_no_courses(self): self.assertEqual(set(), course_run_keys_for_program(self.empty_program))
def test_course_run_keys_for_program_one_course(self): assert {'course-run-1' } == course_run_keys_for_program(self.simple_program)
def test_course_run_keys_for_program_no_courses(self): assert set() == course_run_keys_for_program(self.empty_program)
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(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)