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
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
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)
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
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
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 )
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)