def handle_refund_order(sender, course_enrollment=None, **kwargs): """ Signal receiver for unenrollments, used to automatically initiate refunds when applicable. """ if not is_commerce_service_configured(): return if course_enrollment and course_enrollment.refundable(): try: request_user = get_request_user() or course_enrollment.user if isinstance(request_user, AnonymousUser): # Assume the request was initiated via server-to-server # API call (presumably Otto). In this case we cannot # construct a client to call Otto back anyway, because # the client does not work anonymously, and furthermore, # there's certainly no need to inform Otto about this request. return refund_seat(course_enrollment) except: # pylint: disable=bare-except # don't assume the signal was fired with `send_robust`. # avoid blowing up other signal handlers by gracefully # trapping the Exception and logging an error. log.exception( "Unexpected exception while attempting to initiate refund for user [%s], course [%s]", course_enrollment.user.id, course_enrollment.course_id, )
def refund_entitlement(course_entitlement): """ Attempt a refund of a course entitlement. Verify the User before calling this refund method Returns: bool: True if the Refund is successfully processed. """ user_model = get_user_model() enrollee = course_entitlement.user entitlement_uuid = str(course_entitlement.uuid) if not is_commerce_service_configured(): log.error( 'Ecommerce service is not configured, cannot refund for user [%s], course entitlement [%s].', enrollee.id, entitlement_uuid ) return False service_user = user_model.objects.get(username=settings.ECOMMERCE_SERVICE_WORKER_USERNAME) api_client = ecommerce_api_client(service_user) log.info( 'Attempting to create a refund for user [%s], course entitlement [%s]...', enrollee.id, entitlement_uuid ) try: refund_ids = api_client.refunds.post( { 'order_number': course_entitlement.order_number, 'username': enrollee.username, 'entitlement_uuid': entitlement_uuid, } ) except Exception as exc: # pylint: disable=broad-except # Catch any possible exceptions from the Ecommerce service to ensure we fail gracefully log.exception( "Unexpected exception while attempting to initiate refund for user [%s], " "course entitlement [%s] message: [%s]", enrollee.id, course_entitlement.uuid, str(exc) ) return False if refund_ids: log.info( 'Refund successfully opened for user [%s], course entitlement [%s]: %r', enrollee.id, entitlement_uuid, refund_ids, ) return _process_refund( refund_ids=refund_ids, api_client=api_client, mode=course_entitlement.mode, user=enrollee, always_notify=True, ) else: log.warn('No refund opened for user [%s], course entitlement [%s]', enrollee.id, entitlement_uuid) return False
def refund_entitlement(course_entitlement): """ Attempt a refund of a course entitlement. Verify the User before calling this refund method Returns: bool: True if the Refund is successfully processed. """ user_model = get_user_model() enrollee = course_entitlement.user entitlement_uuid = str(course_entitlement.uuid) if not is_commerce_service_configured(): log.error( 'Ecommerce service is not configured, cannot refund for user [%s], course entitlement [%s].', enrollee.id, entitlement_uuid) return False service_user = user_model.objects.get( username=settings.ECOMMERCE_SERVICE_WORKER_USERNAME) api_client = ecommerce_api_client(service_user) log.info( 'Attempting to create a refund for user [%s], course entitlement [%s]...', enrollee.id, entitlement_uuid) try: refund_ids = api_client.refunds.post({ 'order_number': course_entitlement.order_number, 'username': enrollee.username, 'entitlement_uuid': entitlement_uuid, }) except Exception as exc: # pylint: disable=broad-except # Catch any possible exceptions from the Ecommerce service to ensure we fail gracefully log.exception( "Unexpected exception while attempting to initiate refund for user [%s], " "course entitlement [%s] message: [%s]", enrollee.id, course_entitlement.uuid, str(exc)) return False if refund_ids: log.info( 'Refund successfully opened for user [%s], course entitlement [%s]: %r', enrollee.id, entitlement_uuid, refund_ids, ) return _process_refund( refund_ids=refund_ids, api_client=api_client, mode=course_entitlement.mode, user=enrollee, always_notify=True, ) else: log.warning('No refund opened for user [%s], course entitlement [%s]', enrollee.id, entitlement_uuid) return False