Пример #1
0
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,
    )
Пример #2
0
 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))
Пример #3
0
    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
Пример #4
0
 def test_course_run_keys_for_program_one_course(self):
     self.assertEqual({'course-run-1'},
                      course_run_keys_for_program(self.simple_program))
Пример #5
0
 def test_course_run_keys_for_program_no_courses(self):
     self.assertEqual(set(),
                      course_run_keys_for_program(self.empty_program))
Пример #6
0
 def test_course_run_keys_for_program_one_course(self):
     assert {'course-run-1'
             } == course_run_keys_for_program(self.simple_program)
Пример #7
0
 def test_course_run_keys_for_program_no_courses(self):
     assert set() == course_run_keys_for_program(self.empty_program)
Пример #8
0
    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)