def create(self, request, *args, **kwargs): support_details = request.data.pop('support_details', []) email_opt_in = request.data.pop('email_opt_in', False) 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) # The owners for a course are the organizations that own the course. By taking owner.key, # we are able to pass in the organization key for email_opt_in owners = get_owners_for_course(entitlement.course_uuid) for owner in owners: update_email_opt_in(entitlement.user, owner['key'], email_opt_in) 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 upgradeable_enrollments = self.get_upgradeable_enrollments_for_entitlement(entitlement) # if there is only one upgradeable enrollment, update the mode to the paid entitlement.mode # if there is any ambiguity about which enrollment to upgrade # (i.e. multiple upgradeable enrollments or no available upgradeable enrollment), don't alter # the enrollment 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_owners_by_course(self, mock_get_edx_api_data): """ Test retrieval of course runs. """ 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_owners_for_course(course_uuid=str(catalog_course['uuid'])) self.assertTrue(mock_get_edx_api_data.called) self.assertEqual(data, catalog_course['owners'])