Esempio n. 1
0
    def get_upgradeable_enrollments_for_entitlement(self, entitlement):
        """
        Retrieve all the CourseEnrollments that are upgradeable for a given CourseEntitlement

        Arguments:
            entitlement: CourseEntitlement that we are requesting the CourseEnrollments for.

        Returns:
            list: List of upgradeable CourseEnrollments
        """
        # find all course_runs within the course
        course_runs = get_course_runs_for_course(entitlement.course_uuid)

        # check if the user has enrollments for any of the course_runs
        upgradeable_enrollments = []
        for course_run in course_runs:
            course_run_id = CourseKey.from_string(course_run.get('key'))
            enrollment = CourseEnrollment.get_enrollment(
                entitlement.user, course_run_id)

            if (enrollment and enrollment.is_active
                    and is_course_run_entitlement_fulfillable(
                        course_run_id, entitlement)):
                upgradeable_enrollments.append(enrollment)

        return upgradeable_enrollments
Esempio n. 2
0
    def get_upgradeable_enrollments_for_entitlement(self, entitlement):
        """
        Retrieve all the CourseEnrollments that are upgradeable for a given CourseEntitlement

        Arguments:
            entitlement: CourseEntitlement that we are requesting the CourseEnrollments for.

        Returns:
            list: List of upgradeable CourseEnrollments
        """
        # find all course_runs within the course
        course_runs = get_course_runs_for_course(entitlement.course_uuid)

        # check if the user has enrollments for any of the course_runs
        upgradeable_enrollments = []
        for course_run in course_runs:
            course_run_id = CourseKey.from_string(course_run.get('key'))
            enrollment = CourseEnrollment.get_enrollment(entitlement.user, course_run_id)

            if (enrollment and
                    enrollment.is_active and
                    is_course_run_entitlement_fulfillable(course_run_id, entitlement)):
                upgradeable_enrollments.append(enrollment)

        return upgradeable_enrollments
Esempio n. 3
0
    def create(self, request, *args, **kwargs):
        support_details = request.data.pop('support_details', [])
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)

        entitlement = serializer.instance
        set_entitlement_policy(entitlement, request.site)

        if support_details:
            for support_detail in support_details:
                support_detail['entitlement'] = entitlement
                support_detail['support_user'] = request.user
                CourseEntitlementSupportDetail.objects.create(**support_detail)
        else:
            user = entitlement.user

            # find all course_runs within the course
            course_runs = get_course_runs_for_course(entitlement.course_uuid)

            # check if the user has enrollments for any of the course_runs
            user_run_enrollments = [
                CourseEnrollment.get_enrollment(
                    user, CourseKey.from_string(course_run.get('key')))
                for course_run in course_runs
                if CourseEnrollment.get_enrollment(
                    user, CourseKey.from_string(course_run.get('key')))
            ]

            # filter to just enrollments that can be upgraded.
            upgradeable_enrollments = [
                enrollment for enrollment in user_run_enrollments
                if enrollment.is_active and enrollment.upgrade_deadline
                and enrollment.upgrade_deadline > timezone.now()
            ]

            # if there is only one upgradeable enrollment, convert it from audit to the entitlement.mode
            # if there is any ambiguity about which enrollment to upgrade
            # (i.e. multiple upgradeable enrollments or no available upgradeable enrollment), dont enroll
            if len(upgradeable_enrollments) == 1:
                enrollment = upgradeable_enrollments[0]
                log.info(
                    'Upgrading enrollment [%s] from %s to %s while adding entitlement for user [%s] for course [%s]',
                    enrollment, enrollment.mode, serializer.data.get('mode'),
                    user.username, serializer.data.get('course_uuid'))
                enrollment.update_enrollment(mode=entitlement.mode)
                entitlement.set_enrollment(enrollment)
            else:
                log.info(
                    'No enrollment upgraded while adding entitlement for user [%s] for course [%s] ',
                    user.username, serializer.data.get('course_uuid'))

        headers = self.get_success_headers(serializer.data)
        # Note, the entitlement is re-serialized before getting added to the Response,
        # so that the 'modified' date reflects changes that occur when upgrading enrollment.
        return Response(CourseEntitlementSerializer(entitlement).data,
                        status=status.HTTP_201_CREATED,
                        headers=headers)
Esempio n. 4
0
 def _verify_course_run_for_entitlement(self, entitlement, course_run_id):
     """
     Verifies that a Course run is a child of the Course assigned to the entitlement.
     """
     course_runs = get_course_runs_for_course(entitlement.course_uuid)
     for run in course_runs:
         if course_run_id == run.get('key', ''):
             return True
     return False
Esempio n. 5
0
 def _verify_course_run_for_entitlement(self, entitlement, course_run_id):
     """
     Verifies that a Course run is a child of the Course assigned to the entitlement.
     """
     course_runs = get_course_runs_for_course(entitlement.course_uuid)
     for run in course_runs:
         if course_run_id == run.get('key', ''):
             return True
     return False
Esempio n. 6
0
    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)

        entitlement = serializer.instance
        user = entitlement.user

        # find all course_runs within the course
        course_runs = get_course_runs_for_course(entitlement.course_uuid)

        # check if the user has enrollments for any of the course_runs
        user_run_enrollments = [
            CourseEnrollment.get_enrollment(user, CourseKey.from_string(course_run.get('key')))
            for course_run
            in course_runs
            if CourseEnrollment.get_enrollment(user, CourseKey.from_string(course_run.get('key')))
        ]

        # filter to just enrollments that can be upgraded.
        upgradeable_enrollments = [
            enrollment
            for enrollment
            in user_run_enrollments
            if enrollment.is_active and enrollment.upgrade_deadline and enrollment.upgrade_deadline > timezone.now()
        ]

        # if there is only one upgradeable enrollment, convert it from audit to the entitlement.mode
        # if there is any ambiguity about which enrollment to upgrade
        # (i.e. multiple upgradeable enrollments or no available upgradeable enrollment), dont enroll
        if len(upgradeable_enrollments) == 1:
            enrollment = upgradeable_enrollments[0]
            log.info(
                'Upgrading enrollment [%s] from %s to %s while adding entitlement for user [%s] for course [%s]',
                enrollment,
                enrollment.mode,
                serializer.data.get('mode'),
                user.username,
                serializer.data.get('course_uuid')
            )
            enrollment.update_enrollment(mode=entitlement.mode)
            entitlement.set_enrollment(enrollment)
        else:
            log.info(
                'No enrollment upgraded while adding entitlement for user [%s] for course [%s] ',
                user.username,
                serializer.data.get('course_uuid')
            )

        headers = self.get_success_headers(serializer.data)
        # Note, the entitlement is re-serialized before getting added to the Response,
        # so that the 'modified' date reflects changes that occur when upgrading enrollment.
        return Response(
            CourseEntitlementSerializer(entitlement).data,
            status=status.HTTP_201_CREATED, headers=headers
        )
Esempio n. 7
0
    def test_get_course_runs_by_course(self, mock_get_edx_api_data):
        """
        Test retrievals of run from a Course.
        """
        catalog_course_runs = CourseRunFactory.create_batch(10)
        catalog_course = CourseFactory(course_runs=catalog_course_runs)
        mock_get_edx_api_data.return_value = catalog_course

        data = get_course_runs_for_course(course_uuid=str(catalog_course['uuid']))
        self.assertTrue(mock_get_edx_api_data.called)
        self.assertEqual(data, catalog_course_runs)