Ejemplo n.º 1
0
def PracticeIVR_TreeRoot_New(request):
	"""
	will be called if it is practice manager calling and set up was done already
	update set up option only, we have no msgs on this number
	"""
	r = twilio.Response()
	#practice = PracticeLocation.objects.get(id=request.session['practice_id'])
	if ('Digits' in request.POST):
		logger.debug('%s: PracticeIVR_TreeRoot_New digits %s' % (
			request.session.session_key, request.POST['Digits']))
		digits = request.POST['Digits']
		p = re.compile('[0-9#*]$')
		if (not p.match(digits)):
			r.append(tts(_('I\'m sorry, I didn\'t understand that.')))
		elif (digits == '3'):
			request.session['ivr2_state'] = 'PracticeIVR_Options_New'
			request.session.modified = True
			return PracticeIVR_Options_New(request, r)
		elif (digits == '*'):
			pass
		else:
			r.append(tts(_('I\'m sorry, I didn\'t understand that.')))

	gather = twilio.Gather(finishOnKey='', numDigits=1, timeout=30)

	r.append(tts(_("Wecome to you voice mail account. Your set up is "
						"complete. This account does not have mail box.")))
	gather.append(tts(_('To manage your settings, press 3')))
	gather.append(tts(_('To repeat this menu, press star')))
	r.append(gather)

	return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
Ejemplo n.º 2
0
def PracticeIVR_LeaveRegularMsg(request):
	"""
	Sends office manager text message, in attachment there is voice file of recording
	"""		
	if 'CallStatus' in request.POST:
		logger.debug('%s: Into LeaveTextMsg with call status %s' % (
				request.session.session_key, request.POST['CallStatus']))
	if('CallStatus' in request.POST and request.POST['CallStatus'] == 'completed'):
		try:
			callSID = request.POST['CallSid']
			auth, uri, = client.auth, client.account_uri
			resp = make_twilio_request('GET', uri + '/Calls/%s' % callSID, auth=auth)
			content = json.loads(resp.content)
			log = callLog.objects.get(callSID=callSID)
			log.call_duration = content['TwilioResponse']['Call']['Duration']
			log.save()
		except TwilioRestException as tre:
			logger.critical('Unable to get call status: %s' % tre.msg)
		except ObjectDoesNotExist as odne:
			logger.warning('Call log does not exist for sid: %s. Caller may have '
				'hung up shortly after Twilio starts call process.' % str(odne))

	#if already got recording - this must be second ittiration	
	if ('ivr_makeRecording_recording' in request.session or 
			request.session['ivr_only_callbacknumber'] == True):
		# get a list of all office managers for this practice
		mgrs = get_all_practice_managers(request.session['practice_id'])

		# after unique'ifying save_answering_service_message() expects recips 
		# as a list, see https://redmine.mdcom.com/issues/1374 for details
		save_answering_service_message(request, False, list(set(m.user for m in mgrs)))

		r = twilio.Response()
		r.append(tts(_('Your message have been sent. Good Buy')))
		r.append(twilio.Hangup())
		return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
	else:
		# first or second iteration, get call back number and message recoding
		if ('ivr_makeRecording_callbacknumber' in request.session):	
			# get recording for non urgent message
			request.session['ivr_makeRecording_maxLength'] = 600  # 10 minutes
			request.session['ivr_makeRecording_leadSilence'] = 2
			request.session['ivr_makeRecording_promptOnce'] = True
			request.session['ivr_makeRecording_prompt'] = tts(_('Please say your '
					'non urgent message after the beep. Please state your name and '
					'speak clearly. Press pound when finished.'))
			request.session['ivr_makeRecording_returnOnHangup'] = \
				'MHLogin.DoctorCom.IVR.views_practice.PracticeIVR_LeaveRegularMsg'
			request.session['ivr_call_stack'].append('PracticeIVR_LeaveRegularMsg')
			request.session.modified = True

			# Pass off the recording action to the getRecording function.
			return getQuickRecording(request)
		else:	 
			#get call back number
			request.session['ivr_call_stack'].append('PracticeIVR_LeaveRegularMsg')
			request.session['ivr_callback_returnOnHangup'] = \
				'MHLogin.DoctorCom.IVR.views_practice.PracticeIVR_LeaveRegularMsg'
			return getCallBackNumber(request)
Ejemplo n.º 3
0
def getRecording_playRecordingAndConfirmation(request, twilioResponse):
	gather = twilio.Gather(numDigits=1, finishOnKey='', action=reverse('getRecording'))
	gather.append(tts(_("You said")))
	gather.append(twilio.Play(request.session['ivr_makeRecording_recording']))
	gather.append(tts(_('If you wish to record again, please press three.'
			'Press one to continue. Press any other key to replay the recording.')))
	twilioResponse.append(gather)
	twilioResponse.append(twilio.Redirect())
Ejemplo n.º 4
0
def ProviderIVR_ForwardCall_Vet(request):
	"""
	This function is executed on Number nouns within Dial verbs. The idea is to
	try to determine if it's a human who picked up, or a machine. Alternatively,
	this gives the called party a chance to send the call to voicemail without
	the caller knowing they're rejecting the call.
	"""
	logger.debug('%s: ProviderIVR_ForwardCall_Vet POST %s' %
		(request.session.session_key, str(request.POST)))

	r = twilio.Response()
	callSID = request.POST['CallSid']
	# second leg calls have their own callSIDs - may need parentCallSID
	(log, plog) = _getCallLogOrParent(request)

	if (request.method == 'POST' and 'Digits' in request.POST):
		# Connect the calls, get parent log if any
		if log:
			logger.debug('%s: ProviderIVR_ForwardCall_Vet connected callsid %s logSID %s' %
				(request.session.session_key, callSID, log.callSID))
			log.call_connected = True
			log.save()
			if plog:
				plog.call_connected = True
				plog.save()
				logger.debug('%s: ProviderIVR_ForwardCall_Vet update parent of logsid %s plogSID %s' %
					(request.session.session_key, log.callSID, plog.callSID))

		else:
			logger.debug('%s: ProviderIVR_ForwardCall_Vet connected log not found %s' %
				(request.session.session_key, callSID))

		event = callEvent(callSID=request.POST['CallSid'], event='C_ACC')
		event.save()

		return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)

	if log:
		caller_spoken_name = log.caller_spoken_name
		if (log.mdcom_caller):
			# Great. Is it a Provider?
			if (isinstance(log.mdcom_caller, Provider) and log.mdcom_caller.vm_config.count()):
				vm_config = log.mdcom_caller.vm_config.get()
				if (vm_config.config_complete):
					caller_spoken_name = vm_config.name
	else:
		logger.debug('%s: ProviderIVR_ForwardCall_Vet call log sid %s not found' % 
			(request.session.session_key, callSID))

	gather = twilio.Gather(numDigits=1, finishOnKey='', 
		action=reverse('ProviderIVR_ForwardCall_Vet'))
	gather.append(tts("You have a call from"))
	gather.append(twilio.Play(caller_spoken_name))
	gather.append(tts("Press any key to accept."))
	r.append(gather)
	r.append(twilio.Hangup())

	return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
Ejemplo n.º 5
0
def PracticeIVR_Options_Actions(request, internalCall=False):
	"""
	changes setting on doctor com number for practice
	"""
	#practice = PracticeLocation.objects.get(id=request.session['practice_id'])
	logger.debug('%s: PracticeIVR_Options_Actions POST data is %s' % (
		request.session.session_key, str(request.POST)))

	if (not internalCall and request.method == 'POST' and 'Digits' in request.POST):
		digits = request.POST['Digits']
		p = re.compile('[0-9#*]$')
		if (not p.match(digits)):
			r = twilio.Response()
			r.append(tts(_('I\'m sorry, I didn\'t understand that.')))
		elif (digits == '1'):
			# Change name
			request.session['ivr2_sub_state'] = 'PracticeIVR_Options_1'
			request.session.modified = True
			return changeNameNew(request)
		elif (digits == '3'):
			# Change closed greeting - ivr2_setup_stage to indicate which greeting
#			request.session['ivr2_setup_stage'] = 3  # deprecated
			request.session['ivr2_sub_state'] = 'PracticeIVR_Options_2'
			request.session.modified = True
			return changeGreetingNew(request)
		elif (digits == '5'):
			# change temporarily closed office greeting
#			request.session['ivr2_setup_stage'] = 5  # deprecated
			request.session['ivr2_sub_state'] = 'PracticeIVR_Options_3'
			request.session.modified = True
			return changeGreetingNew(request)
		elif (digits == '7'):
			# change pin
			request.session['ivr2_sub_state'] = 'PracticeIVR_Options_4'
			request.session.modified = True
			return changePinNew(request)
		elif (digits == '9'):
			# Return to the main menu
			r = twilio.Response()
			request.session['ivr2_state'] = 'PracticeIVR_TreeRoot_New'
			r.append(twilio.Redirect(reverse('PracticeIVR_TreeRoot_New')))
			return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
		elif (digits == '*'):
			# Repeat menu
			r = twilio.Response()
			pass
		else:
			r = twilio.Response()
			r.append(tts(_('I\'m sorry, that wasn\'t a valid selection.')))
		return PracticeIVR_Options_New(request, r)
	else:
		# should never happen but if we get here, we log and goto main
		logger.debug('%s: PracticeIVR_Options_Actions is called with no post or digits' % (
			request.session.session_key))
		request.session['ivr2_state'] = 'PracticeIVR_Main_New'
		return PracticeIVR_Main_New(request)
Ejemplo n.º 6
0
def ProviderIVR_Options_Actions(request):
    """
	Options to change VM settings - twilio calls back here
	We do the option processing here
	We track the ivr2_sub_state so we know where recording and pin go since
	we call the same method for setup
	"""
    assert (request.session['provider_id'])
    assert (request.session['ivr2_state'] == 'ProviderIVR_Options_New')
    provider = Provider.objects.get(id=request.session['provider_id'])
    logger.debug(
        '%s: ProviderIVR_Options_Actions provider %s POST data is %s' %
        (request.session.session_key, provider, str(request.POST)))
    r = twilio.Response()
    if (request.method == 'POST' and 'Digits' in request.POST):
        digits = request.POST['Digits']
        p = re.compile('[0-9#*]$')
        if (not p.match(digits)):
            r.append(tts('I\'m sorry, I didn\'t understand that.'))
        elif (digits == '1'):
            # Change name
            event = callEvent(callSID=request.POST['CallSid'], event='F_NCH')
            request.session['ivr2_sub_state'] = 'ProviderIVR_Options_1'
            return changeNameNew(request)
        elif (digits == '3'):
            # Change greeting
            event = callEvent(callSID=request.POST['CallSid'], event='F_GCH')
            request.session['ivr2_sub_state'] = 'ProviderIVR_Options_3'
            return changeGreetingNew(request)
        elif (digits == '5'):
            # change pin
            event = callEvent(callSID=request.POST['CallSid'], event='F_PCH')
            request.session['ivr2_sub_state'] = 'ProviderIVR_Options_5'
            return changePinNew(request)
        elif (digits == '9'):
            # Return to the main menu
            request.session['ivr2_state'] = 'ProviderIVR_TreeRoot_New'
            r.append(twilio.Redirect(reverse('ProviderIVR_TreeRoot_New')))
            return HttpResponse(str(r),
                                mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
        elif (digits == '*'):
            # Repeat menu
            pass
        else:
            r.append(tts('I\'m sorry, that wasn\'t a valid selection.'))
        return ProviderIVR_Options_New(request, r)
    else:
        # should never happen - but if we get here without Digits, we log and go back to Main
        logger.debug(
            '%s: ProviderIVR_TreeRoot_Actions is called with no post or digits'
            % (request.session.session_key))
        request.session['ivr2_state'] = 'ProviderIVR_Main_New'
        return ProviderIVR_Main_New(request)
Ejemplo n.º 7
0
def changeGreeting(request, prependPrompt=''):
	"""Requests the user record their greeting and stores it in the config with id
	at request.session['config_id'].

	:param request: the usual Django view argument
	:param prependPrompt: The string to prepend to the start of the request. Note
		that sending None will result in an error. If you don't wish to
		prepend anything explicitly, please pass in an empty string.
	:returns: django.http.HttpResponse -- the result
	"""

	if ('ivr_makeRecording_recording' in request.session):
		if ('answering_service' in request.session and 
				request.session['answering_service'] == 'yes'):
			practice = PracticeLocation.objects.get(id=request.session['practice_id'])
			if (request.session['ivr_setup_stage'] == 3):
				practice.greeting_closed = request.session['ivr_makeRecording_recording']
			else:
				practice.greeting_lunch = request.session['ivr_makeRecording_recording']
			del request.session['ivr_makeRecording_recording']
			practice.save()
		else:
			config = VMBox_Config.objects.get(id=request.session['config_id'])
			config.greeting = request.session['ivr_makeRecording_recording']
			del request.session['ivr_makeRecording_recording']
			config.save()

			event = callEvent(callSID=request.POST['CallSid'], event='F_GCH')
			event.save()

		r = twilio.Response()
		r.append(twilio.Redirect(reverse(request.session['ivr_call_stack'].pop())))
		request.session.modified = True
		return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)

	#make twilio say different things based on who called it, prepend seemed to
	#be never used, i will investigate later and see why not to use it
	if ('answering_service' in request.session and request.session['answering_service'] == 'yes'):
		if (request.session['ivr_setup_stage'] == 3):
			request.session['ivr_makeRecording_prompt'] = tts(_("Please say your "
				"new greeting for closed office after the tone. Press pound to finish."))
		else:
			request.session['ivr_makeRecording_prompt'] = tts(_("Please say your greeting "
				"greeting for temporarily closed office after the tone. Press pound to finish."))
	else:
		request.session['ivr_makeRecording_prompt'] = tts(_("Please say your new "
				"greeting after the tone. Press pound to finish."))

	request.session['ivr_makeRecording_maxLength'] = 120
	request.session['ivr_makeRecording_timeout'] = 3

	request.session['ivr_call_stack'].append('changeGreeting')
	return getRecording(request)
Ejemplo n.º 8
0
def ProviderIVR_TreeRoot_New(request, provider=None, twilioResponse=None):
	"""
	call tree of a provider:
	1 to listen to all msgs;
	2 to listen to urgent msgs
	3 to listen to voice mail
	4 to manage voicemail settings
	* to repeat menu
	Require: session variable: provider_id to be set
	Require: request.session['ivr2_state'] == ProviderIVR_TreeRoot_New
	sets up twilio response with message and url to go to ProviderIVR_TreeRoot_Actions
	"""
	if (provider == None):
		provider = Provider.objects.get(id=request.session['provider_id'])
	logger.debug('%s: ProviderIVR_TreeRoot_New prov %s' % 
		(request.session.session_key, provider))
	request.session['ivr2_state'] = 'ProviderIVR_TreeRoot_New'
	unread_anssvc_msg_count = MessageBodyUserStatus.objects.filter(user=provider.user,
		read_flag=False, delete_flag=False, msg_body__message___resolved_by=None,
			msg_body__message__message_type='ANS').count()
	unread_msg_count = MessageBodyUserStatus.objects.filter(user=provider.user,
			read_flag=False, delete_flag=False, msg_body__message___resolved_by=None,
				msg_body__message__message_type='VM').count()
	saved_msg_count = MessageBodyUserStatus.objects.filter(user=provider.user, read_flag=True,
			delete_flag=False, msg_body__message___resolved_by=None,
				msg_body__message__message_type='VM').count()
	saved_anssvc_msg_count = MessageBodyUserStatus.objects.filter(user=provider.user,
			read_flag=True, delete_flag=False, msg_body__message___resolved_by=None,
				msg_body__message__message_type='ANS').count()
	logger.debug('%s: ProviderIVR_TreeRoot_New msg counts %d, %d, %d, %d' % 
		(request.session.session_key, unread_anssvc_msg_count, unread_msg_count,
			saved_msg_count, saved_anssvc_msg_count))

	say_str = []
	say_str.append('You have %i new, and %i saved urgent messages,' % (
						unread_anssvc_msg_count, saved_anssvc_msg_count))
	say_str.append(' ')
	say_str.append('and %i new, and %i saved voice messages,' % (unread_msg_count, saved_msg_count))

	if (any((unread_msg_count, unread_anssvc_msg_count, saved_msg_count, saved_anssvc_msg_count))):
		say_str.append('To listen to all your messages, press one. ')
		say_str.append('To listen to your urgent messages, press two. ')
		say_str.append('To listen to your voice mail, press three. ')

	r = twilioResponse or twilio.Response()
	gather = twilio.Gather(action=reverse('ProviderIVR_TreeRoot_Actions'), finishOnKey='', numDigits=1)
	gather.append(tts(''.join(say_str)))
	gather.append(tts('To manage your voicemail settings, press four.'))
	gather.append(tts('To repeat this menu, press star.'))
	r.append(gather)
	return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
Ejemplo n.º 9
0
def PracticeIVR_Options(request, internalCall=False):
	"""
	changes setting on doctor com number for practice
	"""	
	r = twilio.Response()

	if (not internalCall and 'Digits' in request.POST):
		digits = request.POST['Digits']
		p = re.compile('[0-9#*]$')
		if (not p.match(digits)):
			r.append(tts(_('I\'m sorry, I didn\'t understand that.')))
		elif (digits == '1'):
			# Change name
			request.session['ivr_call_stack'].append('PracticeIVR_Options')
			request.session.modified = True
			return changeName(request)
		elif (digits == '3'):
			# Change closed greeting
			request.session['ivr_setup_stage'] = 3
			request.session['ivr_call_stack'].append('PracticeIVR_Options')
			request.session.modified = True
			return changeGreeting(request)
		elif (digits == '5'):
			# change temporarily closed office greeting
			request.session['ivr_setup_stage'] = 5
			request.session['ivr_call_stack'].append('PracticeIVR_Options')
			request.session.modified = True
			return changeGreeting(request)
		elif (digits == '7'):
			# change pin
			request.session['ivr_call_stack'].append('PracticeIVR_Options')
			request.session.modified = True
			return changePin(request, None, True)
		elif (digits == '*'):
			# Repeat menu
			pass
		elif (digits == '9'):
			# Return to the main menu
			r.append(twilio.Redirect(reverse(request.session['ivr_call_stack'].pop())))
			request.session.modified = True
			return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
		else:
			r.append(tts(_('I\'m sorry, that wasn\t a valid selection.')))

	gather = twilio.Gather(finishOnKey='', numDigits=1, action=reverse('PracticeIVR_Options'))

	gather.append(tts(_('Options menu')))
	gather.append(tts(_('To re-record your name, press 1')))
	gather.append(tts(_('To record a new closed office greeting, press 3')))
	gather.append(tts(_('To record a new greeting while the office is open, press 5')))
	gather.append(tts(_('To change your pin, press 7')))
	gather.append(tts(_('To return to the main menu, press 9')))
	gather.append(tts(_('To repeat this menu, press star')))

	r.append(gather)
	return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
Ejemplo n.º 10
0
def ProviderIVR_Options_Actions(request):
	"""
	Options to change VM settings - twilio calls back here
	We do the option processing here
	We track the ivr2_sub_state so we know where recording and pin go since
	we call the same method for setup
	"""
	assert(request.session['provider_id'])
	assert(request.session['ivr2_state'] == 'ProviderIVR_Options_New')
	provider = Provider.objects.get(id=request.session['provider_id'])
	logger.debug('%s: ProviderIVR_Options_Actions provider %s POST data is %s' % (
		request.session.session_key, provider, str(request.POST)))
	r = twilio.Response()
	if (request.method == 'POST' and 'Digits' in request.POST):
		digits = request.POST['Digits']
		p = re.compile('[0-9#*]$')
		if (not p.match(digits)):
			r.append(tts('I\'m sorry, I didn\'t understand that.'))
		elif (digits == '1'):
			# Change name
			event = callEvent(callSID=request.POST['CallSid'], event='F_NCH')
			request.session['ivr2_sub_state'] = 'ProviderIVR_Options_1'			
			return changeNameNew(request)
		elif (digits == '3'):
			# Change greeting
			event = callEvent(callSID=request.POST['CallSid'], event='F_GCH')
			request.session['ivr2_sub_state'] = 'ProviderIVR_Options_3'			
			return changeGreetingNew(request)
		elif (digits == '5'):
			# change pin
			event = callEvent(callSID=request.POST['CallSid'], event='F_PCH')
			request.session['ivr2_sub_state'] = 'ProviderIVR_Options_5'			
			return changePinNew(request)
		elif (digits == '9'):
			# Return to the main menu
			request.session['ivr2_state'] = 'ProviderIVR_TreeRoot_New'
			r.append(twilio.Redirect(reverse('ProviderIVR_TreeRoot_New')))
			return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
		elif (digits == '*'):
			# Repeat menu
			pass
		else:
			r.append(tts('I\'m sorry, that wasn\'t a valid selection.'))
		return ProviderIVR_Options_New(request, r)
	else:
		# should never happen - but if we get here without Digits, we log and go back to Main
		logger.debug('%s: ProviderIVR_TreeRoot_Actions is called with no post or digits' % (
			request.session.session_key))
		request.session['ivr2_state'] = 'ProviderIVR_Main_New'
		return ProviderIVR_Main_New(request)
Ejemplo n.º 11
0
def PracticeIVR_CallerResponse(request, twilioResponse=None):
	"""
	This function process callers response, 
	1=leave msg in doc com mailbox, 
	2=page doctor on call
	"""
	practice = PracticeLocation.objects.get(id=request.session['practice_id'])
	r = twilioResponse or twilio.Response() 

	if ('Digits' in request.POST):
		digits = request.POST['Digits']
		p = re.compile('[0-9#*]$')
		if (not p.match(digits)):
			r.append(tts(_('I\'m sorry, I didn\'t understand that.')))
		elif (digits == '1'):
			# leave msg in doctor com mailbox
			request.session['ivr_call_stack'].append('PracticeIVR_CallerResponse')
			request.session.modified = True
			return PracticeIVR_LeaveRegularMsg(request)
		elif (digits == '2'):
			request.session['ivr_call_stack'].append('PracticeIVR_CallerResponse')
			request.session.modified = True
			request.session['provider_id'] = _getRecentOncallProvider(request).id
			if(not request.session['provider_id']):
				r.append(tts(_('We\'re sorry, an application error has '
										'occurred. Goodbye.', voice='woman')))
				r.append(twilio.Hangup())
				return r
			return PracticeIVR_ForwardCall(request)
		elif (digits == '*'):
			pass
		else:
			r.append(tts(_('I\'m sorry, I didn\'t understand that.')))

	gather = twilio.Gather(finishOnKey='', numDigits=1, timeout=60)

	if (not 'practice_greeting' in request.session):
		if (practice.is_open()):
			request.session['practice_greeting'] = practice.greeting_lunch
		else:
			request.session['practice_greeting'] = practice.greeting_closed
	if (practice.skip_to_rmsg and practice.is_open()):
		r.append(twilio.Play(request.session['practice_greeting']))
		r.append(twilio.Redirect(reverse('PracticeIVR_LeaveRegularMsg')))
	else:
		gather.append(twilio.Play(request.session['practice_greeting']))
		r.append(gather)

	return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
Ejemplo n.º 12
0
def UnaffiliatedNumber(request):
	r = twilio.Response()
	r.append(twilio.Pause())  # one second pause keeps the first words from getting cut off.
	r.append(tts(_("You have called an inactive phone number affiliated with "
				"doctorcom. Please visit us online at w w w dot m d com dot com. Good bye.")))
	r.append(twilio.Hangup())
	return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
Ejemplo n.º 13
0
	def test_util_tts(self):
		""" Test the speech view request using tts() """
		c = Client()
		tts_text = "Is the universe a holographic simulation?"
		retry = 5
		# sleep 3 seconds if max error (only for trial version) and retry up to 5 times
		while retry > 0:
			sayplay = tts(tts_text, SpeechConfig.objects.get_subclass(name=self.neo[0]))
			if not isinstance(sayplay, Play):
				time.sleep(3.0)
			else:
				break
			retry -= 1
		self.assertTrue(sayplay != None)
		self.assertIsInstance(sayplay, Play, sayplay.__class__)

		url_path = urlparse.urlsplit(sayplay.body).path.split('/')
		conf = {'confname': url_path[-3], 'filename': url_path[-2]}

		url = reverse('MHLogin.DoctorCom.speech.views.get_voice_clip', kwargs=conf)
		path = "http://testserver" + url  # TODO: figure better way to get server name
		sig = encodestring(hmac.new(settings.TWILIO_ACCOUNT_TOKEN, path, sha1).digest()).strip()
		response = c.get(url, **{'HTTP_X_TWILIO_SIGNATURE': sig})

		# do more validation but check generally we OK and no exceptions
		self.assertTrue(response.status_code == 200)

		# verify content disposition field set in view and filenames match
		filename = response['Content-Disposition'].split('=')[1]
		self.assertTrue(filename == conf['filename'], filename)
Ejemplo n.º 14
0
def connect_call(request):
    sid = request.POST['CallSid']
    caller = request.POST['Caller']
    r = twilio.Response()
    log = Click2Call_Log.objects.filter(
        caller_number=caller,
        timestamp__gt=datetime.now() -
        timedelta(minutes=3)).order_by('-timestamp')[:1]
    log = log[0] if len(log) else None

    if not log or log.connected:
        r.append(
            tts(
                _("Sorry, this number is a DoctorCOM public number. Please "
                  "call back the Answering Service.")))
        return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
    log.sid = sid
    log.connected = True
    log.save()

    provider_qs = Provider.objects.filter(mobile_phone=log.called_number)
    if provider_qs:
        provider = provider_qs.get()
        ProviderIVR_OutsideInit(request, log.caller_number, provider, log)
        return ProviderIVR_ForwardCall(request)

    # for privacy reasons caller id always our c2c number
    caller_id = settings.TWILIO_C2C_NUMBER

    dial = twilio.Dial(log.called_number,
                       action='',
                       callerId=caller_id,
                       timeout=120)
    r.append(dial)
    return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
Ejemplo n.º 15
0
def ProviderIVR_LeaveMsg_Action(request):
    """
	Step 2 of ProviderIVR_LeaveMsg_New - we get called back from getRecording process
	based on ivr2_state. We save the message recorded and continue
	TODO: if caller is a provider, we want to be able to hit the # key to go back to his voice mailbox
	"""
    provider = Provider.objects.get(id=request.session['provider_id'])
    logger.debug(
        '%s: ProviderIVR_LeaveMsg_Action provider %s state %s POST data %s' %
        (request.session.session_key, provider,
         request.session.get('ivr2_state', 'None'), str(request.POST)))

    callEnded = _checkCallbackDuration(request, False)
    if ('ivr2_Record_recording' in request.session):
        # if caller is provider, we mask the callbacknumber; otherwise, show it in message
        provider_qs = Provider.objects.filter(
            mobile_phone=request.session['Caller'])
        if (provider_qs):
            request.session['ivr2_Record_callbacknumber'] = provider_qs[
                0].mdcom_phone
            subject = "Voice Mail from %s %s" % (provider_qs[0].first_name,
                                                 provider_qs[0].last_name)
        else:
            request.session['ivr2_Record_callbacknumber'] = request.session[
                'Caller']
            subject = "Voice Mail from %s" % request.session[
                'ivr2_Record_callbacknumber']

        # set up for save_message
        request.session['ivr_makeRecording_recording'] = request.session[
            'ivr2_Record_recording']
        if ('ivr2_Record_callbacknumber' in request.session):
            request.session[
                'ivr_makeRecording_callbacknumber'] = request.session[
                    'ivr2_Record_callbacknumber']
            del request.session['ivr2_Record_callbacknumber']
            logger.debug(
                '%s: ProviderIVR_LeaveMsg_Action recording url: %s callback %s'
                % (request.session.session_key,
                   request.session['ivr_makeRecording_recording'],
                   request.session['ivr_makeRecording_callbacknumber']))
        else:
            logger.debug('%s: ProviderIVR_LeaveMsg_Action recording url: %s ' %
                         (request.session.session_key,
                          request.session['ivr_makeRecording_recording']))
        _copyStateVariables(request)
        save_message(request, subject, [provider.user], None, "VM", False)
        del request.session['ivr2_Record_recording']

        r = twilio.Response()
        r.append(tts('Good bye'))
        r.append(twilio.Hangup())
        return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
    else:
        # no recording? user might have hung up
        logger.debug(
            '%s: ProviderIVR_LeaveMsg_Action is called with no recording for provider %s'
            % (request.session.session_key, request.session['provider_id']))
        r = twilio.Response()
        return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
Ejemplo n.º 16
0
def connect_call(request):
	sid = request.POST['CallSid']
	caller = request.POST['Caller']
	r = twilio.Response()
	log = Click2Call_Log.objects.filter(caller_number=caller, 
			timestamp__gt=datetime.now() - timedelta(minutes=3)).order_by('-timestamp')[:1]
	log = log[0] if len(log) else None

	if not log or log.connected:
		r.append(tts(_("Sorry, this number is a DoctorCOM public number. Please "
					"call back the Answering Service.")))
		return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
	log.sid = sid
	log.connected = True
	log.save()

	provider_qs = Provider.objects.filter(mobile_phone=log.called_number)
	if provider_qs:
		provider = provider_qs.get()
		ProviderIVR_OutsideInit(request, log.caller_number, provider, log)
		return ProviderIVR_ForwardCall(request)

	# for privacy reasons caller id always our c2c number
	caller_id = settings.TWILIO_C2C_NUMBER 

	dial = twilio.Dial(log.called_number,
				action='',
				callerId=caller_id,
				timeout=120)
	r.append(dial)
	return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
Ejemplo n.º 17
0
    def test_util_tts(self):
        """ Test the speech view request using tts() """
        c = Client()
        tts_text = "Is the universe a holographic simulation?"
        retry = 5
        # sleep 3 seconds if max error (only for trial version) and retry up to 5 times
        while retry > 0:
            sayplay = tts(tts_text,
                          SpeechConfig.objects.get_subclass(name=self.neo[0]))
            if not isinstance(sayplay, Play):
                time.sleep(3.0)
            else:
                break
            retry -= 1
        self.assertTrue(sayplay != None)
        self.assertIsInstance(sayplay, Play, sayplay.__class__)

        url_path = urlparse.urlsplit(sayplay.body).path.split('/')
        conf = {'confname': url_path[-3], 'filename': url_path[-2]}

        url = reverse('MHLogin.DoctorCom.speech.views.get_voice_clip',
                      kwargs=conf)
        path = "http://testserver" + url  # TODO: figure better way to get server name
        sig = encodestring(
            hmac.new(settings.TWILIO_ACCOUNT_TOKEN, path,
                     sha1).digest()).strip()
        response = c.get(url, **{'HTTP_X_TWILIO_SIGNATURE': sig})

        # do more validation but check generally we OK and no exceptions
        self.assertTrue(response.status_code == 200)

        # verify content disposition field set in view and filenames match
        filename = response['Content-Disposition'].split('=')[1]
        self.assertTrue(filename == conf['filename'], filename)
Ejemplo n.º 18
0
def PracticeIVR_ForwardCall_Vet(request):
	"""
	This function is executed on Number nouns within Dial verbs. The idea is to
	try to determine if it's a human who picked up, or a machine. Alternatively,
	this gives the called party a chance to send the call to voicemail without
	the caller knowing they're rejecting the call.
	"""
	logger.debug('%s: PracticeIVR_ForwardCall_Vet ' % (request.session.session_key))

	r = twilio.Response()
	# First, find the recording to play
	callSID = request.POST['CallSid']
	# second leg calls have their own callSIDs - may need parentCallSID
	(log, plog) = _getCallLogOrParent(request)

	if (request.method == 'POST' and 'Digits' in request.POST):
		# Connect the calls
		log.call_connected = True
		log.save()
		if plog:
			plog.call_connected = True
			plog.save()
			logger.debug('%s: PracticeIVR_ForwardCall_Vet update parent of logsid %s plogSID %s' %
				(request.session.session_key, log.callSID, plog.callSID))

		event = callEvent(callSID=callSID, event='C_ACC')
		event.save()

		return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)

	caller_spoken_name = log.caller_spoken_name

	gather = twilio.Gather(numDigits=1, finishOnKey='',
						action=reverse('PracticeIVR_ForwardCall_Vet'))
	if('click2call' in request.session):
		gather.append(tts(_("You have a call from")))
		gather.append(twilio.Play(caller_spoken_name))
		gather.append(tts(_("Press any key to accept.")))
	else:
		gather.append(tts(_("You have an urgent answering service call from")))
		gather.append(twilio.Play(caller_spoken_name))
		gather.append(tts(_("Press any key to accept.")))

	r.append(gather)
	r.append(twilio.Hangup())

	return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
Ejemplo n.º 19
0
def PracticeIVR_LeaveRegularMsg_New(request):
	"""
	3 steps:
	1. get callback number
	2. get message (recording) from caller
	3. Sends office manager text message, in attachment there is voice file of recording
	"""
	callEnded = _checkCallbackDuration(request, False)  # if someone hangs up, we still want to keep processing
	logger.debug('%s: PracticeIVR_LeaveRegularMsg_New state %s' %
		(request.session.session_key, request.session['ivr2_state']))
	if ('ivr2_sub_state' not in request.session):
		# first time around
		request.session['ivr2_sub_state'] = 'PracticeIVR_LeaveRegularMsg_Start'
	else:
		logger.debug('%s: PracticeIVR_LeaveRegularMsg_New sub_state %s' %
			(request.session.session_key, request.session['ivr2_sub_state']))
	# we have recording, or callback number or we are in the GetMsg sub_state
	if ('ivr2_Record_recording' in request.session or 
		('ivr2_only_callbacknumber' in request.session and 
			request.session['ivr2_only_callbacknumber'] == True) or
		request.session['ivr2_sub_state'] == 'PracticeIVR_LeaveRegularMsg_GetMsg'):
		# final or third iteration - get and send message
		del request.session['ivr2_sub_state']
		# get a list of all office managers for this practice
		mgrs = get_all_practice_managers(request.session['practice_id'])
		# after unique'ifying save_answering_service_message() expects recips
		# as a list, see https://redmine.mdcom.com/issues/1374 for details
		_copyStateVariables(request)
		save_answering_service_message(request, False, list(set(m.user for m in mgrs)))
		r = twilio.Response()
		r.append(tts(_('Your message have been sent. Good Buy')))
		r.append(twilio.Hangup())
		return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
	if (request.session['ivr2_sub_state'] == 'PracticeIVR_LeaveRegularMsg_Start'):
		# first iteration, getCallBackNumber
		request.session['ivr2_sub_state'] = 'PracticeIVR_LeaveRegularMsg_GetCallback'
		request.session['ivr2_returnOnHangup'] = \
			'MHLogin.DoctorCom.IVR.views_practice_v2.PracticeIVR_LeaveRegularMsg_New'
		return getCallBackNumberNew(request)
	elif request.session['ivr2_sub_state'] == 'PracticeIVR_LeaveRegularMsg_GetCallback':
		# second iteration, get Message recording
		request.session['ivr2_sub_state'] = 'PracticeIVR_LeaveRegularMsg_GetMsg'
		request.session['ivr2_Record_maxLength'] = 600  # 10 minutes
		request.session['ivr2_Record_leadSilence'] = 2
		request.session['ivr2_Record_promptOnce'] = True
		request.session['ivr2_Record_prompt_str'] = 'Please say your \
			non urgent message after the beep. Please state your name and \
			speak clearly. Press pound when finished.'
		request.session['ivr2_returnOnHangup'] = \
			'MHLogin.DoctorCom.IVR.views_practice_v2.PracticeIVR_LeaveRegularMsg_New'
		request.session.modified = True
		# Pass off the recording action to the getRecording function.
		return getQuickRecordingNew(request)
	else:
		# should never get here with unknown state
		logger.info('%s: PracticeIVR_LeaveRegularMsg_New called with state %s' % (
			request.session.session_key, request.session['ivr2_state']))
		request.session['ivr2_state'] = 'PracticeIVR_LeaveRegularMsg_New'
		return PracticeIVR_LeaveRegularMsg_New(request)
Ejemplo n.º 20
0
def ProviderIVR_Options(request, internalCall=False):
    r = twilio.Response()

    if (not internalCall and request.method == 'POST'
            and 'Digits' in request.POST):
        digits = request.POST['Digits']
        p = re.compile('[0-9#*]$')
        if (not p.match(digits)):
            r.append(tts('I\'m sorry, I didn\'t understand that.'))
        elif (digits == '1'):
            # Change name
            request.session['ivr_call_stack'].append('ProviderIVR_Options')
            request.session.modified = True
            event = callEvent(callSID=request.POST['CallSid'], event='F_NCH')
            return changeName(request)
        elif (digits == '3'):
            # Change greeting
            request.session['ivr_call_stack'].append('ProviderIVR_Options')
            request.session.modified = True
            event = callEvent(callSID=request.POST['CallSid'], event='F_GCH')
            return changeGreeting(request)
        elif (digits == '5'):
            # Change pin
            request.session['ivr_call_stack'].append('ProviderIVR_Options')
            request.session.modified = True
            event = callEvent(callSID=request.POST['CallSid'], event='F_PCH')
            return changePin(request, None, True)
        elif (digits == '*'):
            # Repeat menu
            pass
        elif (digits == '9'):
            # Return to the main menu
            r.append(
                twilio.Redirect(
                    reverse(request.session['ivr_call_stack'].pop())))
            request.session.modified = True
            return HttpResponse(str(r),
                                mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
        else:
            r.append(tts('I\'m sorry, that wasn\t a valid selection.'))

    gather = twilio.Gather(finishOnKey='',
                           numDigits=1,
                           action=reverse('ProviderIVR_Options'))

    gather.append(tts('Options menu'))
    gather.append(tts('To re-record your name, press 1'))
    gather.append(tts('To record a new greeting, press 3'))
    gather.append(tts('To change your pin, press 5'))
    gather.append(tts('To return to the main menu, press 9'))
    gather.append(tts('To repeat this menu, press star'))

    r.append(gather)
    return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
Ejemplo n.º 21
0
def ProviderIVR_ForwardCall_VetAnswer(request):
    """
	This function is executed on Number nouns within Dial verbs. The idea is to
	try to determine if it's a human who picked up, or a machine. Alternatively,
	this gives the called party a chance to send the call to voicemail without
	the caller knowing they're rejecting the call.
	"""
    r = twilio.Response()
    request.session.modified = True

    callSID = request.POST['CallSid']
    log = callLog.objects.get(callSID=callSID)

    if (request.method == 'POST' and 'Digits' in request.POST):
        # Connect the calls
        log.call_connected = True
        log.save()

        event = callEvent(callSID=callSID, event='C_ACC')
        event.save()

        return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)

    caller_spoken_name = log.caller_spoken_name
    if (log.mdcom_caller):
        # Great. Is it a Provider?
        if (isinstance(log.mdcom_caller, Provider)
                and log.mdcom_caller.vm_config.count()):
            vm_config = log.mdcom_caller.vm_config.get()
            if (vm_config.config_complete):
                caller_spoken_name = vm_config.name
    gather = twilio.Gather(numDigits=1,
                           finishOnKey='',
                           action=reverse('ProviderIVR_ForwardCall_VetAnswer'))
    gather.append(tts("You have a call from"))
    gather.append(twilio.Play(caller_spoken_name))
    gather.append(tts("Press any key to accept."))
    r.append(gather)
    r.append(twilio.Hangup())

    return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
Ejemplo n.º 22
0
def PracticeIVR_ForwardCall_VetAnswer(request):
	"""
	This function is executed on Number nouns within Dial verbs. The idea is to
	try to determine if it's a human who picked up, or a machine. Alternatively,
	this gives the called party a chance to send the call to voicemail without
	the caller knowing they're rejecting the call.
	"""
	r = twilio.Response()
	request.session.modified = True

	# First, find the recording to play
	callSID = request.POST['CallSid']
	log = callLog.objects.get(callSID=callSID)

	if 'Digits' in request.POST:
		# Connect the calls
		log.call_connected = True
		log.save()

		event = callEvent(callSID=request.POST['CallSid'], event='C_ACC')
		event.save()

		return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)

	caller_spoken_name = log.caller_spoken_name

	gather = twilio.Gather(numDigits=1, finishOnKey='', 
					action=reverse('PracticeIVR_ForwardCall_VetAnswer'))
	if('click2call' in request.session):
		gather.append(tts(_("You have a call from")))
		gather.append(twilio.Play(caller_spoken_name))
		gather.append(tts(_("Press any key to accept.")))
	else:
		gather.append(tts(_("You have an urgent answering service call from")))
		gather.append(twilio.Play(caller_spoken_name))
		gather.append(tts(_("Press any key to accept.")))

	r.append(gather)
	r.append(twilio.Hangup())

	return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
Ejemplo n.º 23
0
def ProviderIVR_ForwardCall_VetAnswer(request):
	"""
	This function is executed on Number nouns within Dial verbs. The idea is to
	try to determine if it's a human who picked up, or a machine. Alternatively,
	this gives the called party a chance to send the call to voicemail without
	the caller knowing they're rejecting the call.
	"""
	r = twilio.Response()
	request.session.modified = True

	callSID = request.POST['CallSid']
	log = callLog.objects.get(callSID=callSID)

	if (request.method == 'POST' and 'Digits' in request.POST):
		# Connect the calls
		log.call_connected = True
		log.save()

		event = callEvent(callSID=callSID, event='C_ACC')
		event.save()

		return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)

	caller_spoken_name = log.caller_spoken_name
	if (log.mdcom_caller):
		# Great. Is it a Provider?
		if (isinstance(log.mdcom_caller, Provider) and log.mdcom_caller.vm_config.count()):
			vm_config = log.mdcom_caller.vm_config.get()
			if (vm_config.config_complete):
				caller_spoken_name = vm_config.name
	gather = twilio.Gather(numDigits=1, finishOnKey='', action=reverse(
					'ProviderIVR_ForwardCall_VetAnswer'))
	gather.append(tts("You have a call from"))
	gather.append(twilio.Play(caller_spoken_name))
	gather.append(tts("Press any key to accept."))
	r.append(gather)
	r.append(twilio.Hangup())

	return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
Ejemplo n.º 24
0
def ProviderIVR_Options(request, internalCall=False):
	r = twilio.Response()

	if (not internalCall and request.method == 'POST' and 'Digits' in request.POST):
		digits = request.POST['Digits']
		p = re.compile('[0-9#*]$')
		if (not p.match(digits)):
			r.append(tts('I\'m sorry, I didn\'t understand that.'))
		elif (digits == '1'):
			# Change name
			request.session['ivr_call_stack'].append('ProviderIVR_Options')
			request.session.modified = True
			event = callEvent(callSID=request.POST['CallSid'], event='F_NCH')
			return changeName(request)
		elif (digits == '3'):
			# Change greeting
			request.session['ivr_call_stack'].append('ProviderIVR_Options')
			request.session.modified = True
			event = callEvent(callSID=request.POST['CallSid'], event='F_GCH')
			return changeGreeting(request)
		elif (digits == '5'):
			# Change pin
			request.session['ivr_call_stack'].append('ProviderIVR_Options')
			request.session.modified = True
			event = callEvent(callSID=request.POST['CallSid'], event='F_PCH')
			return changePin(request, None, True)
		elif (digits == '*'):
			# Repeat menu
			pass
		elif (digits == '9'):
			# Return to the main menu
			r.append(twilio.Redirect(reverse(request.session['ivr_call_stack'].pop())))
			request.session.modified = True
			return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
		else:
			r.append(tts('I\'m sorry, that wasn\t a valid selection.'))

	gather = twilio.Gather(finishOnKey='', numDigits=1, action=reverse('ProviderIVR_Options'))

	gather.append(tts('Options menu'))
	gather.append(tts('To re-record your name, press 1'))
	gather.append(tts('To record a new greeting, press 3'))
	gather.append(tts('To change your pin, press 5'))
	gather.append(tts('To return to the main menu, press 9'))
	gather.append(tts('To repeat this menu, press star'))

	r.append(gather)
	return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
Ejemplo n.º 25
0
def ProviderIVR_LeaveMsg_Action(request):
	"""
	Step 2 of ProviderIVR_LeaveMsg_New - we get called back from getRecording process
	based on ivr2_state. We save the message recorded and continue
	TODO: if caller is a provider, we want to be able to hit the # key to go back to his voice mailbox
	"""
	provider = Provider.objects.get(id=request.session['provider_id'])
	logger.debug('%s: ProviderIVR_LeaveMsg_Action provider %s state %s POST data %s' % (
		request.session.session_key, provider,
		request.session.get('ivr2_state', 'None'), str(request.POST)))

	callEnded = _checkCallbackDuration(request, False)
	if ('ivr2_Record_recording' in request.session):
		# if caller is provider, we mask the callbacknumber; otherwise, show it in message
		provider_qs = Provider.objects.filter(mobile_phone=request.session['Caller'])
		if(provider_qs):
			request.session['ivr2_Record_callbacknumber'] = provider_qs[0].mdcom_phone
			subject = "Voice Mail from %s %s" % (provider_qs[0].first_name, provider_qs[0].last_name)
		else:
			request.session['ivr2_Record_callbacknumber'] = request.session['Caller']
			subject = "Voice Mail from %s" % request.session['ivr2_Record_callbacknumber']

		# set up for save_message
		request.session['ivr_makeRecording_recording'] = request.session['ivr2_Record_recording']
		if ('ivr2_Record_callbacknumber' in request.session):
			request.session['ivr_makeRecording_callbacknumber'] = request.session['ivr2_Record_callbacknumber']
			del request.session['ivr2_Record_callbacknumber']
			logger.debug('%s: ProviderIVR_LeaveMsg_Action recording url: %s callback %s' % (
				request.session.session_key, request.session['ivr_makeRecording_recording'],
				request.session['ivr_makeRecording_callbacknumber']))
		else:
			logger.debug('%s: ProviderIVR_LeaveMsg_Action recording url: %s ' % (
				request.session.session_key, request.session['ivr_makeRecording_recording']))
		_copyStateVariables(request)
		save_message(request, subject, [provider.user], None,  "VM", False)
		del request.session['ivr2_Record_recording']

		r = twilio.Response()
		r.append(tts('Good bye'))
		r.append(twilio.Hangup())
		return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
	else:
		# no recording? user might have hung up
		logger.debug('%s: ProviderIVR_LeaveMsg_Action is called with no recording for provider %s' % (
							request.session.session_key, request.session['provider_id']))
		r = twilio.Response()
		return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
Ejemplo n.º 26
0
def PracticeIVR_Options_New(request, twilioResponse=None):
	"""
	Options Menu to change practice pin, name, greetings
	"""
	r = twilioResponse or twilio.Response()
	gather = twilio.Gather(finishOnKey='', numDigits=1, action=reverse('PracticeIVR_Options_Actions'))
	gather.append(tts(_('Options menu')))
	gather.append(tts(_('To re-record your name, press 1')))
	gather.append(tts(_('To record a new closed office greeting, press 3')))
	gather.append(tts(_('To record a new greeting while the office is open, press 5')))
	gather.append(tts(_('To change your pin, press 7')))
	gather.append(tts(_('To return to the main menu, press 9')))
	gather.append(tts(_('To repeat this menu, press star')))
	r.append(gather)
	return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
Ejemplo n.º 27
0
def PracticeIVR_CallerResponse_New(request, twilioResponse=None):
	"""
	This function process callers response - set up practice greeting based on practice hours and
	callgroups and specialties (via create_dynamic_greeting)
	"""
	request.session['ivr2_state'] = 'PracticeIVR_CallerResponse_New'
	practice = PracticeLocation.objects.get(id=request.session['practice_id'])
	logger.debug('%s: PracticeIVR_CallerResponse_New state %s practice %s' % (
		request.session.session_key, request.session['ivr2_state'], practice))

	r = twilioResponse or twilio.Response()
	gather = twilio.Gather(action=reverse('PracticeIVR_CallerResponse_Action'),
		finishOnKey='', numDigits=1, timeout=60)
	if (not 'practice_greeting' in request.session):
		if (practice.is_open()):
			request.session['practice_greeting'] = practice.greeting_lunch
		else:
			request.session['practice_greeting'] = practice.greeting_closed

	if(practice.skip_to_rmsg and practice.is_open()):
		request.session['ivr2_state'] = 'PracticeIVR_LeaveRegularMsg_New'
		r.append(twilio.Play(request.session['practice_greeting']))
		r.append(twilio.Redirect(reverse('PracticeIVR_LeaveRegularMsg_New')))
		logger.debug('%s: PracticeIVR_CallerResponse_New skip to leave msg for %s open greeting' % (
			request.session.session_key, practice))
	else:
		if practice.uses_original_answering_serice():
			gather.append(twilio.Play(request.session['practice_greeting']))
			r.append(gather)
			logger.debug('%s: PracticeIVR_CallerResponse_New practice %s orig greeting' % (
				request.session.session_key, practice))
		else:
			#layer 1 greeting, it recites call group lists,
			#populates  request.session['call_groups_map'] and request.session['specialty_map']
			dynamic_greeting = create_dynamic_greeting(request, practice)
			request.session['last_played'] = dynamic_greeting
			gather.append(twilio.Play(request.session['practice_greeting']))
			gather.append(tts(_('%s.') % (''.join(request.session['last_played']))))
			r.append(gather)
			logger.debug('%s: PracticeIVR_CallerResponse_New practice %s greeting %s' % (
				request.session.session_key, practice, request.session['last_played']))

	return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
Ejemplo n.º 28
0
def changeName(request, prependPrompt=''):
	"""Requests the user record their name and stores it in the config with id
	at request.session['config_id'].

	:param request: the usual Django view argument
	:param prependPrompt: The string to prepend to the start of the request. Note
		that sending None will result in an error. If you don't wish to
		prepend anything explicitly, please pass in an empty string.
	:returns: django.http.HttpResponse -- the result
	"""

	if ('ivr_makeRecording_recording' in request.session):
		if ('answering_service' in request.session and 
				request.session['answering_service'] == 'yes'):
			practice = PracticeLocation.objects.get(id=request.session['practice_id'])
			practice.name_greeting = request.session['ivr_makeRecording_recording']
			del request.session['ivr_makeRecording_recording']
			practice.save()
		else:
			config = VMBox_Config.objects.get(id=request.session['config_id'])
			config.name = request.session['ivr_makeRecording_recording']
			del request.session['ivr_makeRecording_recording']
			config.save()

		event = callEvent(callSID=request.POST['CallSid'], event='F_NCH')
		event.save()

		r = twilio.Response()
		r.append(twilio.Redirect(reverse(request.session['ivr_call_stack'].pop())))
		request.session.modified = True
		return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)

	request.session['ivr_makeRecording_prompt'] = tts(_("Please say your name "
							"after the tone. Press pound to finish."))
	request.session['ivr_makeRecording_maxLength'] = 10
	request.session['ivr_makeRecording_timeout'] = 3

	request.session['ivr_call_stack'].append('changeName')
	return getRecording(request)
Ejemplo n.º 29
0
def ProviderIVR_Options_New(request, twilioResponse=None):
	"""
	Options Menu to change VM settings
	Sets up what we say to user for options choices
	"""
	r = twilioResponse or twilio.Response()
	request.session['ivr2_state'] = 'ProviderIVR_Options_New'
	# reset sub_state
	if ('ivr2_sub_state' in request.session):
		del request.session['ivr2_sub_state']
	gather = twilio.Gather(finishOnKey='', numDigits=1, action=reverse('ProviderIVR_Options_Actions'))
	gather.append(tts('Options menu'))
	gather.append(tts('To re-record your name, press 1'))
	gather.append(tts('To record a new greeting, press 3'))
	gather.append(tts('To change your pin, press 5'))
	gather.append(tts('To return to the main menu, press 9'))
	gather.append(tts('To repeat this menu, press star'))
	r.append(gather)
	return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
Ejemplo n.º 30
0
def ProviderIVR_Options_New(request, twilioResponse=None):
    """
	Options Menu to change VM settings
	Sets up what we say to user for options choices
	"""
    r = twilioResponse or twilio.Response()
    request.session['ivr2_state'] = 'ProviderIVR_Options_New'
    # reset sub_state
    if ('ivr2_sub_state' in request.session):
        del request.session['ivr2_sub_state']
    gather = twilio.Gather(finishOnKey='',
                           numDigits=1,
                           action=reverse('ProviderIVR_Options_Actions'))
    gather.append(tts('Options menu'))
    gather.append(tts('To re-record your name, press 1'))
    gather.append(tts('To record a new greeting, press 3'))
    gather.append(tts('To change your pin, press 5'))
    gather.append(tts('To return to the main menu, press 9'))
    gather.append(tts('To repeat this menu, press star'))
    r.append(gather)
    return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
Ejemplo n.º 31
0
def ProviderIVR_TreeRoot_Actions(request):
	"""
	called after IVR_TreeRoot_New for Main calltree related operations
	gets and checks choice digit from user and do the next step
	"""
	assert(request.session['provider_id'])
	provider = Provider.objects.get(id=request.session['provider_id'])
	logger.debug('%s: ProviderIVR_TreeRoot_Actions Provider %s POST data is %s' % (
		request.session.session_key, provider, str(request.POST)))

	r = twilio.Response()
	if (request.method == 'POST' and 'Digits' in request.POST):
		digits = request.POST['Digits']
		p = re.compile('[0-9#*]$')
		if (not p.match(digits)):
			r.append(tts('I\'m sorry, I didn\'t understand that.'))
			# invalids - go back to tree root
			return ProviderIVR_TreeRoot_New(request, provider, r)
		elif (digits == '1'):
			# all messages
			messages = MessageBodyUserStatus.objects.filter(user=provider.user,
				delete_flag=False, msg_body__message___resolved_by=None,
				msg_body__message__message_type__in=('ANS', 'VM'))
			if (messages == [] or len(messages) == 0):
				return ProviderIVR_TreeRoot_New(request, provider, r)
			else:
				request.session['ivr2_state'] = 'ProviderIVR_TreeRoot_New'
				return playMessagesNew(request, messages, r)
		elif (digits == '2'):
			# urgent msgs
			messages = MessageBodyUserStatus.objects.filter(user=provider.user,
				delete_flag=False, msg_body__message___resolved_by=None,
				msg_body__message__message_type__in=('ANS',))
			if (messages == [] or len(messages) == 0):
				return ProviderIVR_TreeRoot_New(request, provider, r)
			else:
				request.session['ivr2_state'] = 'ProviderIVR_TreeRoot_New'
				return playMessagesNew(request, messages, r)
		elif (digits == '3'):
			# voicemail
			messages = MessageBodyUserStatus.objects.filter(user=provider.user,
				delete_flag=False, msg_body__message___resolved_by=None,
				msg_body__message__message_type__in=('VM',))
			if (messages == [] or len(messages) == 0):
				return ProviderIVR_TreeRoot_New(request, provider, r)
			else:
				request.session['ivr2_state'] = 'ProviderIVR_TreeRoot_New'
				return playMessagesNew(request, messages, r)
		elif (digits == '4'):
			# manage VM Settings
			request.session['ivr2_state'] = 'ProviderIVR_Options_New'
			return ProviderIVR_Options_New(request, r)
		elif (digits == '*'):
			return ProviderIVR_TreeRoot_New(request, provider, r)
		else:
			r.append(tts('I\'m sorry, I didn\'t understand that.'))
			return ProviderIVR_TreeRoot_New(request, provider, r)
	else:
		# should never happen - but if we get here without Digits, we log and go back to Main
		logger.debug('%s: ProviderIVR_TreeRoot_Actions is called with no post or digits' % (
			request.session.session_key))
		request.session['ivr2_state'] = 'ProviderIVR_Main_New'
		return ProviderIVR_Main_New(request)
Ejemplo n.º 32
0
def ProviderIVR_TreeRoot(request):

    r = twilio.Response()
    provider = Provider.objects.get(id=request.session['provider_id'])

    if (request.method == 'POST' and 'Digits' in request.POST):
        digits = request.POST['Digits']
        p = re.compile('[0-9#*]$')
        if (not p.match(digits)):
            r.append(tts('I\'m sorry, I didn\'t understand that.'))
        elif (digits == '1'):
            # play messages
            request.session['ivr_call_stack'].append('ProviderIVR_TreeRoot')
            request.session.modified = True
            messages = MessageBodyUserStatus.objects.filter(
                user=provider.user,
                delete_flag=False,
                msg_body__message___resolved_by=None,
                msg_body__message__message_type__in=('ANS', 'VM'))
            return playMessages(request, messages, r)
        elif (digits == '2'):
            request.session['ivr_call_stack'].append('ProviderIVR_TreeRoot')
            request.session.modified = True
            messages = MessageBodyUserStatus.objects.filter(
                user=provider.user,
                delete_flag=False,
                msg_body__message___resolved_by=None,
                msg_body__message__message_type__in=('ANS', ))
            return playMessages(request, messages, r)
        elif (digits == '3'):
            request.session['ivr_call_stack'].append('ProviderIVR_TreeRoot')
            request.session.modified = True
            messages = MessageBodyUserStatus.objects.filter(
                user=provider.user,
                delete_flag=False,
                msg_body__message___resolved_by=None,
                msg_body__message__message_type__in=('VM', ))
            # fix for issue 2257 - if we go to playMessages, it will use 3 in its digit and try to replay
            # current message which fails if there are no messages
            if (messages == [] or len(messages) == 0):
                pass
            else:
                request.session['ivr_call_stack'].append(
                    'ProviderIVR_TreeRoot')
                return playMessages(request, messages, r)

        elif (digits == '4'):
            request.session['ivr_call_stack'].append('ProviderIVR_TreeRoot')
            request.session.modified = True
            return ProviderIVR_Options(request, True)
        elif (digits == '*'):
            pass
        else:
            r.append(tts('I\'m sorry, I didn\'t understand that.'))

    gather = twilio.Gather(finishOnKey='', numDigits=1)
    #	messages = MessageBodyUserStatus
    unread_anssvc_msg_count = MessageBodyUserStatus.objects.filter(
        user=provider.user,
        read_flag=False,
        delete_flag=False,
        msg_body__message___resolved_by=None,
        msg_body__message__message_type='ANS').count()
    unread_msg_count = MessageBodyUserStatus.objects.filter(
        user=provider.user,
        read_flag=False,
        delete_flag=False,
        msg_body__message___resolved_by=None,
        msg_body__message__message_type='VM').count()

    saved_msg_count = MessageBodyUserStatus.objects.filter(
        user=provider.user,
        read_flag=True,
        delete_flag=False,
        msg_body__message___resolved_by=None,
        msg_body__message__message_type='VM').count()
    saved_anssvc_msg_count = MessageBodyUserStatus.objects.filter(
        user=provider.user,
        read_flag=True,
        delete_flag=False,
        msg_body__message___resolved_by=None,
        msg_body__message__message_type='ANS').count()

    say_str = []

    say_str.append('You have %i new, and %i saved urgent messages,' %
                   (unread_anssvc_msg_count, saved_anssvc_msg_count))
    say_str.append(' ')
    say_str.append('and %i new, and %i saved voice messages,' %
                   (unread_msg_count, saved_msg_count))

    if (any((unread_msg_count, unread_anssvc_msg_count, saved_msg_count,
             saved_anssvc_msg_count))):
        say_str.append('To listen to all your messages, press one. ')
        say_str.append('To listen to your urgent messages, press two. ')
        say_str.append('To listen to your voice mail, press three. ')
    gather.append(tts(''.join(say_str)))

    gather.append(tts('To manage your voicemail settings, press four.'))
    gather.append(tts('To repeat this menu, press star.'))
    r.append(gather)

    return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
Ejemplo n.º 33
0
def PracticeIVR_LeaveUrgentMsg_New(request):
	"""
	This lets caller leave an urgent message for a practice in foll steps:
	1. get callback number
	2. Records a voicemail message for the doctor on call
	3. leave notification to the doctor based on preferences.
	"""
	# TODO:
	# Update this code so that users can hit the pound key to pop back and log
	# into their own voicemail box.
	requestDataDict = {"GET": request.GET, "POST": request.POST}[request.method]
	logger.debug('%s: PracticeIVR_LeaveUrgentMsg_New state %s POST data is %s' % (
		request.session.session_key, request.session['ivr2_state'], str(request.POST)))
	# if caller hangs up, we still continue
	if ('ivr2_sub_state' not in request.session):
		request.session['ivr2_sub_state'] = 'PracticeIVR_LeaveUrgentMsg_Start'
	else:
		logger.debug('%s: PracticeIVR_LeaveUrgentMsg_New sub_state %s' % (
			request.session.session_key, request.session['ivr2_sub_state']))

	callEnded = _checkCallbackDuration(request, False)
	if (callEnded):
		logger.debug('%s: PracticeIVR_LeaveUrgentMsg_New caller hung up. State %s' % (
			request.session.session_key, request.session.get('ivr2_sub_state', 'None')))
		# we deal with leftover recording or , if any
		if (request.session['ivr2_sub_state'] == 'PracticeIVR_LeaveUrgentMsg_GetMsg' or
			'ivr2_Record_recording' in request.session or
			('ivr2_only_callbacknumber' in request.session and
				request.session['ivr2_only_callbacknumber'] == True)):
			# send msg to office managers
			del request.session['ivr2_sub_state']
			provider = Provider.objects.get(id=_getRecentOncallProviderId(request))
			logger.debug('%s: PracticeIVR_LeaveUrgentMsg_New caller hung up -- saving urgent msg for %s' % (
				request.session.session_key, provider))
			config = None
			config_complete = provider.vm_config.count() == 1 and provider.vm_config.get().config_complete
			if (config_complete):
				config = provider.vm_config.get()
			mgrs = get_all_practice_managers(request.session['practice_id'])
			_copyStateVariables(request)
			save_answering_service_message(request, True, [provider],
				list(set(m.user for m in mgrs)))
	else:
		if (request.session['ivr2_sub_state'] == 'PracticeIVR_LeaveUrgentMsg_Start'):
			# step 1: get callback number
			request.session['ivr2_sub_state'] = 'PracticeIVR_LeaveUrgentMsg_GetCallback'
			request.session['ivr2_returnOnHangup'] = \
				'MHLogin.DoctorCom.IVR.views_practice_v2.PracticeIVR_LeaveUrgentMsg_New'
			return getCallBackNumberNew(request)

		elif request.session['ivr2_sub_state'] == 'PracticeIVR_LeaveUrgentMsg_GetCallback':
			# step 2: after getting callback number, we get caller's message
			request.session['ivr2_sub_state'] = 'PracticeIVR_LeaveUrgentMsg_GetMsg'
			request.session['ivr2_Record_prompt_str'] = 'Please say your message \
					for the doctor on call after the beep. Press pound when finished.'
			request.session['ivr2_Record_maxLength'] = 600  # 10 minutes
			request.session['ivr2_Record_leadSilence'] = 2
			request.session['ivr2_Record_promptOnce'] = True
			request.session['ivr2_returnOnHangup'] = \
				'MHLogin.DoctorCom.IVR.views_practice_v2.PracticeIVR_LeaveUrgentMsg_New'
			request.session.modified = True
			# Pass off the recording action to the getRecording function.
			return getQuickRecordingNew(request)

		elif (request.session['ivr2_sub_state'] == 'PracticeIVR_LeaveUrgentMsg_GetMsg' or
			'ivr2_Record_recording' in request.session or
			('ivr2_only_callbacknumber' in request.session and
				request.session['ivr2_only_callbacknumber'] == True)):
			# step 3 - send msg to office managers
			del request.session['ivr2_sub_state']
			provider = Provider.objects.get(id=_getRecentOncallProviderId(request))
			logger.debug('%s: PracticeIVR_LeaveUrgentMsg_New saving urgent msg for %s' % (
				request.session.session_key, provider))
			config = None
			config_complete = provider.vm_config.count() == 1 and provider.vm_config.get().config_complete
			if (config_complete):
				config = provider.vm_config.get()
			mgrs = get_all_practice_managers(request.session['practice_id'])
			_copyStateVariables(request)
			save_answering_service_message(request, True, [provider],
				list(set(m.user for m in mgrs)))

			#if pager number is entered, also page call back number
			r = twilio.Response()
			r.append(tts(_('Your message has been sent. Good bye')))
			r.append(twilio.Hangup())
			return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
		else:  # should not get here
			logger.debug('%s: Into PracticeIVR_LeaveUrgentMsg_New with invalid ivr2_state %s' %
				(request.session.session_key, request.session['ivr2_state']))
			request.session['ivr2_state'] = 'PracticeIVR_LeaveUrgentMsg_New'
			return PracticeIVR_LeaveUrgentMsg_New(request)
Ejemplo n.º 34
0
def ProviderIVR_Setup_New(request, provider=None):
	"""
	New version of ProviderIVR_Setup processing. This is done in 4 consecutive steps:
	0. initial sub state: ProviderIVR_Setup_Start
	1. setup pin
	2. setup Name
	3. setup Greeting
	We use generic calls to setup Pin, Name and Greeting, but use ivr2_state
	to direct the return calls here so it could be redirected to the next step
	"""
	# we always need provider
	assert(request.session['provider_id'])
	assert(request.session['ivr2_state'] == 'ProviderIVR_Setup_New')
	if (provider == None):
		provider = Provider.objects.get(id=request.session['provider_id'])
	# we also need VMBox_config's config_id 
	if (not 'config_id' in request.session):
		config = _getProviderVMConfig(provider)
		request.session['config_id'] = config.id

	logger.debug('%s: ProviderIVR_Setup_New state %s provider %s config %s' % (
		request.session.session_key, request.session['ivr2_state'], provider, request.session['config_id']))
	if ('ivr2_sub_state' not in request.session):
		# new setup processing
		request.session['ivr2_sub_state'] = 'ProviderIVR_Setup_Start'
	else:
		logger.debug('%s: ProviderIVR_Setup_New sub_state %s' % (
			request.session.session_key, request.session['ivr2_sub_state']))
	if (request.session['ivr2_sub_state'] == 'ProviderIVR_Setup_Start'):
		# set up pin
		r = twilio.Response()
		r.append(twilio.Pause())  # one second pause keeps the first words from getting cut off.
		request.session['ivr2_prompt_str'] = "Welcome to your voicemail account. It "\
			"looks like some setup is needed. Let's get started. First, we need to "\
			"set up your pin number."
		event = callEvent(callSID=request.POST['CallSid'], event='I_STR')
		event.save()
		request.session['ivr2_sub_state'] = 'ProviderIVR_Setup_Pin'
		return changePinNew(request, r)

	elif (request.session['ivr2_sub_state'] == 'ProviderIVR_Setup_Pin'):
		request.session['ivr2_sub_state'] = 'ProviderIVR_Setup_Name'
		return changeNameNew(request, 'Now, we need to record your name.')

	elif (request.session['ivr2_sub_state'] == 'ProviderIVR_Setup_Name'):
		request.session['ivr2_sub_state'] = 'ProviderIVR_Setup_Greeting'
		return changeGreetingNew(request, 'Finally, we need to set up a greeting.')

	elif (request.session['ivr2_sub_state'] == 'ProviderIVR_Setup_Greeting'):
		# setup is complete - automatically "log" user in
		request.session['authenticated'] = True
		del request.session['ivr2_sub_state']
		request.session['ivr2_state'] = 'ProviderIVR_TreeRoot_New'
		config = VMBox_Config.objects.get(id=request.session['config_id'])
		config.config_complete = True
		config.save()

		event = callEvent(callSID=request.POST['CallSid'], event='I_FIN')
		event.save()
		logger.debug('%s: ProviderIVR_Setup is complete config %s' % (
			request.session.session_key, config))
		# we don't need the welcome msg anymore
		if ('ivr2_prompt_str' in request.session):
			del request.session['ivr2_prompt_str']
		r = twilio.Response()
		r.append(tts('Your voice mail account is now set up. You may hang up '
			'now, or stay on the line to be taken to your voice mail box home.'))
		# after VM Setup, we go to main
		r.append(twilio.Redirect(reverse('ProviderIVR_TreeRoot_New')))
		return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)

	else:
		# should not get here with unknown state - log state and return to main
		logger.debug('%s: ProviderIVR_Setup has unhandled state set to %s' % (
			request.session.session_key, request.session['ivr2_state']))
		request.session['ivr2_state'] = 'ProviderIVR_Main_New'
		return ProviderIVR_Main_New(request)
Ejemplo n.º 35
0
def ProviderIVR_TreeRoot(request):

	r = twilio.Response()
	provider = Provider.objects.get(id=request.session['provider_id'])

	if (request.method == 'POST' and 'Digits' in request.POST):
		digits = request.POST['Digits']
		p = re.compile('[0-9#*]$')
		if (not p.match(digits)):
			r.append(tts('I\'m sorry, I didn\'t understand that.'))
		elif (digits == '1'):
			# play messages
			request.session['ivr_call_stack'].append('ProviderIVR_TreeRoot')
			request.session.modified = True
			messages = MessageBodyUserStatus.objects.filter(user=provider.user, 
				delete_flag=False, msg_body__message___resolved_by=None, 
					msg_body__message__message_type__in=('ANS', 'VM'))
			return playMessages(request, messages, r)
		elif (digits == '2'):
			request.session['ivr_call_stack'].append('ProviderIVR_TreeRoot')
			request.session.modified = True
			messages = MessageBodyUserStatus.objects.filter(user=provider.user, 
				delete_flag=False, msg_body__message___resolved_by=None, 
					msg_body__message__message_type__in=('ANS',))
			return playMessages(request, messages, r)
		elif (digits == '3'):
			request.session['ivr_call_stack'].append('ProviderIVR_TreeRoot')
			request.session.modified = True
			messages = MessageBodyUserStatus.objects.filter(user=provider.user, 
				delete_flag=False, msg_body__message___resolved_by=None, 
					msg_body__message__message_type__in=('VM',))
			# fix for issue 2257 - if we go to playMessages, it will use 3 in its digit and try to replay
			# current message which fails if there are no messages
			if (messages == [] or len(messages) == 0):
				pass
			else:
				request.session['ivr_call_stack'].append('ProviderIVR_TreeRoot')
				return playMessages(request, messages, r)

		elif (digits == '4'):
			request.session['ivr_call_stack'].append('ProviderIVR_TreeRoot')
			request.session.modified = True
			return ProviderIVR_Options(request, True)
		elif (digits == '*'):
			pass
		else:
			r.append(tts('I\'m sorry, I didn\'t understand that.'))

	gather = twilio.Gather(finishOnKey='', numDigits=1)
#	messages = MessageBodyUserStatus
	unread_anssvc_msg_count = MessageBodyUserStatus.objects.filter(user=provider.user, 
		read_flag=False, delete_flag=False, msg_body__message___resolved_by=None, 
			msg_body__message__message_type='ANS').count()
	unread_msg_count = MessageBodyUserStatus.objects.filter(user=provider.user, 
			read_flag=False, delete_flag=False, msg_body__message___resolved_by=None, 
				msg_body__message__message_type='VM').count()

	saved_msg_count = MessageBodyUserStatus.objects.filter(user=provider.user, read_flag=True, 
			delete_flag=False, msg_body__message___resolved_by=None, 
				msg_body__message__message_type='VM').count()
	saved_anssvc_msg_count = MessageBodyUserStatus.objects.filter(user=provider.user, 
			read_flag=True, delete_flag=False, msg_body__message___resolved_by=None, 
				msg_body__message__message_type='ANS').count()

	say_str = []

	say_str.append('You have %i new, and %i saved urgent messages,' % (
			unread_anssvc_msg_count, saved_anssvc_msg_count))
	say_str.append(' ')
	say_str.append('and %i new, and %i saved voice messages,' % (unread_msg_count, saved_msg_count))

	if (any((unread_msg_count, unread_anssvc_msg_count, saved_msg_count, saved_anssvc_msg_count))):
		say_str.append('To listen to all your messages, press one. ')
		say_str.append('To listen to your urgent messages, press two. ')
		say_str.append('To listen to your voice mail, press three. ')
	gather.append(tts(''.join(say_str)))

	gather.append(tts('To manage your voicemail settings, press four.'))
	gather.append(tts('To repeat this menu, press star.'))
	r.append(gather)

	return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
Ejemplo n.º 36
0
def ProviderIVR_ForwardCall_Vet(request):
    """
	This function is executed on Number nouns within Dial verbs. The idea is to
	try to determine if it's a human who picked up, or a machine. Alternatively,
	this gives the called party a chance to send the call to voicemail without
	the caller knowing they're rejecting the call.
	"""
    logger.debug('%s: ProviderIVR_ForwardCall_Vet POST %s' %
                 (request.session.session_key, str(request.POST)))

    r = twilio.Response()
    callSID = request.POST['CallSid']
    # second leg calls have their own callSIDs - may need parentCallSID
    (log, plog) = _getCallLogOrParent(request)

    if (request.method == 'POST' and 'Digits' in request.POST):
        # Connect the calls, get parent log if any
        if log:
            logger.debug(
                '%s: ProviderIVR_ForwardCall_Vet connected callsid %s logSID %s'
                % (request.session.session_key, callSID, log.callSID))
            log.call_connected = True
            log.save()
            if plog:
                plog.call_connected = True
                plog.save()
                logger.debug(
                    '%s: ProviderIVR_ForwardCall_Vet update parent of logsid %s plogSID %s'
                    % (request.session.session_key, log.callSID, plog.callSID))

        else:
            logger.debug(
                '%s: ProviderIVR_ForwardCall_Vet connected log not found %s' %
                (request.session.session_key, callSID))

        event = callEvent(callSID=request.POST['CallSid'], event='C_ACC')
        event.save()

        return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)

    if log:
        caller_spoken_name = log.caller_spoken_name
        if (log.mdcom_caller):
            # Great. Is it a Provider?
            if (isinstance(log.mdcom_caller, Provider)
                    and log.mdcom_caller.vm_config.count()):
                vm_config = log.mdcom_caller.vm_config.get()
                if (vm_config.config_complete):
                    caller_spoken_name = vm_config.name
    else:
        logger.debug(
            '%s: ProviderIVR_ForwardCall_Vet call log sid %s not found' %
            (request.session.session_key, callSID))

    gather = twilio.Gather(numDigits=1,
                           finishOnKey='',
                           action=reverse('ProviderIVR_ForwardCall_Vet'))
    gather.append(tts("You have a call from"))
    gather.append(twilio.Play(caller_spoken_name))
    gather.append(tts("Press any key to accept."))
    r.append(gather)
    r.append(twilio.Hangup())

    return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
Ejemplo n.º 37
0
def PracticeIVR_Setup_New(request):
	"""
	This function is heavily dependent upon request.session; Twilio is kind
	enough to keep session cookies for us.
	sets up doctor com answering service practice open/closed greetings and pin
	"""
	assert(request.session['practice_id'])
	assert(request.session['ivr2_state'] == 'PracticeIVR_Setup_New')
	_checkCallbackDuration(request)
	logger.debug('%s: PracticeIVR_Setup_New POST data is %s' % (
		request.session.session_key, str(request.POST)))
	logger.debug('%s: PracticeIVR_Setup_New state %s practice %s' % (
		request.session.session_key, request.session['ivr2_state'], request.session['practice_id']))

	# TODO - check if we need to create event for this
	if ('ivr2_sub_state' not in request.session):
		request.session['ivr2_sub_state'] = 'PracticeIVR_Setup_Start'
	else:
		logger.debug('%s: PracticeIVR_Setup_New sub_state %s' % (
			request.session.session_key, request.session['ivr2_sub_state']))
	if (request.session['ivr2_sub_state'] == 'PracticeIVR_Setup_Start'):
		# Okay, this is the first time this function is being executed for this call.
		request.session['ivr2_sub_state'] = 'PracticeIVR_Setup_1'
		#will need to Practice Location and see if this needs set up and values that are there already
		r = twilio.Response()
		r.append(twilio.Pause())  # one second pause keeps the first words from getting cut off.
		request.session['ivr2_prompt_str'] = "Welcome to your voicemail account. It looks like some setup is needed. \
Let's get started. First, we need to set up your pin number."
		return changePinNew(request, r)

	elif (request.session['ivr2_sub_state'] == 'PracticeIVR_Setup_1'):  # Record name
		request.session['ivr2_sub_state'] = 'PracticeIVR_Setup_2'
		return changeNameNew(request, _('Now, we need to record your office name.'))

	elif (request.session['ivr2_sub_state'] == 'PracticeIVR_Setup_2'):
		# Record a greeting for closed office
		request.session['ivr2_sub_state'] = 'PracticeIVR_Setup_3'
#		request.session['ivr2_setup_stage'] = 3  # deprecated
		return changeGreetingNew(request, _('Next, we need to set up your answering service '
			'greeting. This will be played when the office is closed.'))

	elif (request.session['ivr2_sub_state'] == 'PracticeIVR_Setup_3'):  # Record a greeting for open
		request.session['ivr2_sub_state'] = 'PracticeIVR_Setup_4'
#		request.session['ivr2_setup_stage'] = 4  # deprecated
		return changeGreetingNew(request, _('Finally, we need to set up a greeting that '
			'will be played when the office is open.'))

	elif (request.session['ivr2_sub_state'] == 'PracticeIVR_Setup_4'):  # Configuration complete!
		#store new information in Practice Locations
		del request.session['ivr2_sub_state']
		request.session['ivr2_state'] = 'PracticeIVR_TreeRoot_New'
		practice = PracticeLocation.objects.get(id=request.session['practice_id'])
		practice.config_complete = True
		practice.save()
		# we don't need the welcome msg anymore
		if ('ivr2_prompt_str' in request.session):
			del request.session['ivr2_prompt_str']

		r = twilio.Response()
		r.append(tts(_('Your voice mail account is now set up. You may hang up now.')))
		r.append(twilio.Redirect(reverse('PracticeIVR_TreeRoot_New')))
		return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)

	else:
		# should not get here with unknown state - log state and return to main; or throw exception?
		logger.debug('%s: PracticeIVR_Setup_New has unhandled state set to %s' % (
			request.session.session_key, request.session['ivr2_state']))
		request.session['ivr2_state'] = 'PracticeIVR_Main_New'
		return PracticeIVR_Main_New(request)
Ejemplo n.º 38
0
def ProviderIVR_TreeRoot_Actions(request):
    """
	called after IVR_TreeRoot_New for Main calltree related operations
	gets and checks choice digit from user and do the next step
	"""
    assert (request.session['provider_id'])
    provider = Provider.objects.get(id=request.session['provider_id'])
    logger.debug(
        '%s: ProviderIVR_TreeRoot_Actions Provider %s POST data is %s' %
        (request.session.session_key, provider, str(request.POST)))

    r = twilio.Response()
    if (request.method == 'POST' and 'Digits' in request.POST):
        digits = request.POST['Digits']
        p = re.compile('[0-9#*]$')
        if (not p.match(digits)):
            r.append(tts('I\'m sorry, I didn\'t understand that.'))
            # invalids - go back to tree root
            return ProviderIVR_TreeRoot_New(request, provider, r)
        elif (digits == '1'):
            # all messages
            messages = MessageBodyUserStatus.objects.filter(
                user=provider.user,
                delete_flag=False,
                msg_body__message___resolved_by=None,
                msg_body__message__message_type__in=('ANS', 'VM'))
            if (messages == [] or len(messages) == 0):
                return ProviderIVR_TreeRoot_New(request, provider, r)
            else:
                request.session['ivr2_state'] = 'ProviderIVR_TreeRoot_New'
                return playMessagesNew(request, messages, r)
        elif (digits == '2'):
            # urgent msgs
            messages = MessageBodyUserStatus.objects.filter(
                user=provider.user,
                delete_flag=False,
                msg_body__message___resolved_by=None,
                msg_body__message__message_type__in=('ANS', ))
            if (messages == [] or len(messages) == 0):
                return ProviderIVR_TreeRoot_New(request, provider, r)
            else:
                request.session['ivr2_state'] = 'ProviderIVR_TreeRoot_New'
                return playMessagesNew(request, messages, r)
        elif (digits == '3'):
            # voicemail
            messages = MessageBodyUserStatus.objects.filter(
                user=provider.user,
                delete_flag=False,
                msg_body__message___resolved_by=None,
                msg_body__message__message_type__in=('VM', ))
            if (messages == [] or len(messages) == 0):
                return ProviderIVR_TreeRoot_New(request, provider, r)
            else:
                request.session['ivr2_state'] = 'ProviderIVR_TreeRoot_New'
                return playMessagesNew(request, messages, r)
        elif (digits == '4'):
            # manage VM Settings
            request.session['ivr2_state'] = 'ProviderIVR_Options_New'
            return ProviderIVR_Options_New(request, r)
        elif (digits == '*'):
            return ProviderIVR_TreeRoot_New(request, provider, r)
        else:
            r.append(tts('I\'m sorry, I didn\'t understand that.'))
            return ProviderIVR_TreeRoot_New(request, provider, r)
    else:
        # should never happen - but if we get here without Digits, we log and go back to Main
        logger.debug(
            '%s: ProviderIVR_TreeRoot_Actions is called with no post or digits'
            % (request.session.session_key))
        request.session['ivr2_state'] = 'ProviderIVR_Main_New'
        return ProviderIVR_Main_New(request)
Ejemplo n.º 39
0
def PracticeIVR_ForwardCall_New(request, twilioResponse=None):
	"""
	Forward the call to the dialed user, there are no preferences
	for office managers, just call their cell phone
	Done in 3 steps:
	1. get caller name
	2. forward call
	3. if connected, done; if fail to connect, go to LeaveUrgentMsg_New
	"""
	provider = None
	forward = None
	try:
		provider = Provider.objects.get(id=request.session['provider_id'])
		if(not 'ProviderIVR_ForwardCall_forward' in request.session):
			request.session['ProviderIVR_ForwardCall_forward'] = provider.forward_anssvc
		forward = provider.forward_anssvc
	except Provider.DoesNotExist:
		pass
	logger.debug('%s: PracticeIVR_ForwardCall_New provider %s practice %s state %s substate %s' % (
		request.session.session_key, provider, request.session.get('practice_id', None), 
		request.session.get('ivr2_state', None), request.session.get('ivr2_sub_state', None)))

	callSID = request.POST['CallSid']
	# TODO - what if we don't get the callLog?
	log = callLog.objects.get(callSID=callSID)
	log.call_source = 'AS'
	log.save()

	if('click2call' in request.session):
		forward = 'MO'  # hack to keep click2call working

	if(forward == 'VM'):
		request.session['ivr2_state'] = 'PracticeIVR_LeaveUrgentMsg_New'
		logger.debug('%s: PracticeIVR_ForwardCall_New forward to VM - LeaveUrgentMsg_New to %s' % (
			request.session.session_key, provider))
		return PracticeIVR_LeaveUrgentMsg_New(request)

	r = twilioResponse or twilio.Response()
	if ('ivr2_sub_state' not in request.session):
		request.session['ivr2_sub_state'] = 'PracticeIVR_ForwardCall_Start'
	else:
		logger.debug('%s: PracticeIVR_ForwardCall_New sub_state %s' % (
			request.session.session_key, request.session['ivr2_sub_state']))
	# now we get caller name, dial and handle failure to connect by going to leave urgent message
	if (request.session['ivr2_sub_state'] == 'PracticeIVR_ForwardCall_Start'):
		request.session['ivr2_sub_state'] = 'PracticeIVR_ForwardCall_GetName'

		# Is the user a DoctorCom user with a recorded name?
		if (log.mdcom_caller and isinstance(log.mdcom_caller, Provider)):
			if (log.mdcom_caller.vm_config.count()):
				prov_vmconfig = log.mdcom_caller.vm_config.get()
				if (prov_vmconfig.config_complete):
					logger.debug('%s/%s sub %s: Found the caller\'s name! Forwarding call' % (
							request.session.session_key, request.session['ivr2_state'],
							request.session['ivr2_sub_state'],
						))
					log.caller_spoken_name = prov_vmconfig.name
					log.save()
					return PracticeIVR_ForwardCall_New(request, r)  # restart execution of this function
				else:
					logger.debug('%s/%s sub %s: Caller\'s vm_config incomplete!' % (
							request.session.session_key, request.session['ivr2_state'],
							request.session['ivr2_sub_state'],
						))
			else:
				logger.debug('%s/%s sub %s: An unsuitable number of vm_config objects found: %i' % (
						request.session.session_key, request.session['ivr2_state'],
						request.session['ivr2_sub_state'],
						log.mdcom_caller.vm_config.count(),
					))
		else:
			logger.debug('%s/%s sub %s: mdcom_caller %s either isn\'t defined or doesn\'t seem to be a Provider' % (
					request.session.session_key, request.session['ivr2_state'],
					request.session['ivr2_sub_state'],
					str(log.mdcom_caller),
				))

		# Okay, it's not a user with a name recording. Get one.
		request.session['ivr2_Record_prompt_str'] = 'Please say your name after the tone.'
		request.session['ivr2_Record_maxLength'] = 4
		request.session['ivr2_Record_timeout'] = 2
		request.session['ivr2_Record_leadSilence'] = 1
		return getQuickRecordingNew(request)

	elif (request.session['ivr2_sub_state'] == 'PracticeIVR_ForwardCall_GetName'):
		request.session['ivr2_sub_state'] = 'PracticeIVR_ForwardCall_Dial'
		# save caller name
		logger.debug('%s/%s: Set session to %s' % (
				request.session.session_key, request.session['ivr2_state'],
				request.session['ivr2_sub_state']
			))
		if (not log.caller_spoken_name):
			log.caller_spoken_name = request.session['ivr2_Record_recording']
			del request.session['ivr2_Record_recording']
			log.save()
		# now find the number to dial
		user_number = ''
		try:
			office_staff = OfficeStaff.objects.get(user=request.session['provider_id'])  # manager being called
			logger.debug('%s/%s: got office staff \'%s\' \'%s\' with id %s office phone \'%s\'.' % (
					request.session.session_key,
					request.session['ivr2_state'],
					office_staff.user.first_name,
					office_staff.user.last_name,
					office_staff.pk,
					office_staff.user.mobile_phone,
				))
			user_number = office_staff.user.mobile_phone
		except OfficeStaff.DoesNotExist:
			#it's a provider
			if(forward == 'MO'):
				user_number = provider.mobile_phone
			elif(forward == 'OF'):
				user_number = provider.office_phone
			elif(forward == 'OT'):
				user_number = provider.phone

		logger.debug('%s/%s: Setting user_number to \'%s\'' % (
					request.session.session_key,
					request.session['ivr2_state'],
					user_number,
				))

		logger.debug('%s/%s: Tried to get called\'s number. Got \'%s\'' % (
				request.session.session_key,
				request.session['ivr2_state'],
				user_number,
			))

		dial = twilio.Dial(
				action=reverse('PracticeIVR_ForwardCall_New'),
				timeout=22,
				timeLimit=14400,  # 4 hours
				callerId=request.session['Caller'],
			)
		dial.append(twilio.Number(user_number,
				url=reverse('PracticeIVR_ForwardCall_Vet')
			))
		r.append(dial)
		r.append(twilio.Redirect(reverse('PracticeIVR_LeaveUrgentMsg_New')))
		return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)

	elif (request.session['ivr2_sub_state'] == 'PracticeIVR_ForwardCall_Dial'):
		del request.session['ivr2_sub_state']
		(clog, plog) = _getCallLogOrParent(request)
		if clog:
			logger.debug('%s/%s: PracticeIVR_ForwardCall_New state connected %s' % (
				request.session.session_key, request.session['ivr2_state'],
				str(clog.call_connected)))
		else:
			logger.debug('%s/%s: ProviderIVR_ForwardCall_New state no log SID %s' % (
				request.session.session_key, request.session['ivr2_state'],
				request.POST['CallSid']))
		if ('DialCallStatus' in request.POST):
			if (request.POST['DialCallStatus'] == 'completed'):
				# update child log call duration
				diallog = callLog.objects.get(callSID=request.POST['DialCallSid'])
				if diallog:
					diallog.call_duration = request.POST['DialCallDuration']
					diallog.save()
					logger.debug('%s: PracticeIVR_ForwardCall_New update child diallog dialSid %s duration %s' % (
						request.session.session_key, request.POST['DialCallSid'], request.POST['DialCallDuration']))
				else:
					logger.debug('%s: PracticeIVR_ForwardCall_New diallog not found: dialSid %s duration %s' % (
						request.session.session_key, request.POST['DialCallSid'], request.POST['DialCallDuration']))
				# Do nothing so that the second leg call continues un-interrupted
				return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
		if (clog.call_connected):
			r.append(twilio.Hangup())
			return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
		r.append(tts("The provider is not available right now."))
		r.append(twilio.Redirect(reverse('PracticeIVR_LeaveUrgentMsg_New')))
		# redirecting to LeaveUrgentMsg_New
		request.session['ivr2_state'] = 'PracticeIVR_LeaveUrgentMsg_New'
		return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)

	else:
		# else: Do nothing so that the call continues un-interrupted
		return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
Ejemplo n.º 40
0
def ProviderIVR_ForwardCall(request):
    """Forward the call to the dialed user, as per the user's preferences.

	Uses the following session variables:
		ProviderIVR_ForwardCall_state: The most recent "state" of execution. May
			have the following values:
				- None/Undefined/Empty String: First execution of this function.
				- Getting_Name: Getting the caller's name, if one hasn't been
						defined.
				- Dialing: Phone(s) have been dialed, and waiting for a response Caller
	"""
    r = twilio.Response()
    request.session.modified = True
    provider = Provider.objects.get(id=request.session['provider_id'])

    if ('CallStatus' in request.POST
            and request.POST['CallStatus'] == 'completed'):
        if ('Duration' in request.POST):
            callSID = request.POST['CallSid']
            log = callLog.objects.get(callSID=callSID)
            log.call_duration = request.POST['Duration']
            log.save()

    if (not 'ProviderIVR_ForwardCall_forward' in request.session):
        request.session[
            'ProviderIVR_ForwardCall_forward'] = provider.forward_voicemail
    forward = provider.forward_voicemail
    if (forward == 'VM'):
        return ProviderIVR_LeaveMsg(request)

    if (not 'ProviderIVR_ForwardCall_state' in request.session
            or not request.session['ProviderIVR_ForwardCall_state']):
        # New call. First, check to see if we should go straight to voicemail

        # Okay, the call isn't going to voicemail directly. Now, set state.
        request.session['ProviderIVR_ForwardCall_state'] = 'Getting_Name'

        # Now, get the caller's name

        # Is the user a DoctorCom user with a recorded name?
        callSID = request.POST['CallSid']
        log = callLog.objects.get(callSID=callSID)

        if (log.mdcom_caller and isinstance(log.mdcom_caller, Provider)):
            if (log.mdcom_caller.vm_config.count()):
                prov_vmconfig = log.mdcom_caller.vm_config.get()
                if (prov_vmconfig.config_complete):
                    logger.debug('%s/%s: Found the caller\'s name!' % (
                        request.session.session_key,
                        request.session['ProviderIVR_ForwardCall_state'],
                    ))
                    log.caller_spoken_name = prov_vmconfig.name
                    log.save()
                    return ProviderIVR_ForwardCall(
                        request)  # restart execution of this function
                else:
                    logger.debug('%s/%s: Caller\'s vm_config incomplete!' % (
                        request.session.session_key,
                        request.session['ProviderIVR_ForwardCall_state'],
                    ))
            else:
                logger.debug(
                    '%s/%s: An unsuitable number of vm_config objects found: %i'
                    % (
                        request.session.session_key,
                        request.session['ProviderIVR_ForwardCall_state'],
                        log.mdcom_caller.vm_config.count(),
                    ))
        else:
            logger.debug(
                '%s/%s: mdcom_caller %s either isn\'t defined or doesn\'t '
                'seem to be a Provider' % (
                    request.session.session_key,
                    request.session['ProviderIVR_ForwardCall_state'],
                    str(log.mdcom_caller),
                ))

        # Okay, it's not a user with a name recording. Get one.
        request.session['ivr_call_stack'].append('ProviderIVR_ForwardCall')
        request.session['ivr_makeRecording_prompt'] = \
         tts('Please say your name after the tone.')
        request.session['ivr_makeRecording_maxLength'] = 4
        request.session['ivr_makeRecording_timeout'] = 2
        request.session['ivr_makeRecording_leadSilence'] = 1
        return getQuickRecording(request)

    if (request.session['ProviderIVR_ForwardCall_state'] == 'Getting_Name'):
        request.session['ProviderIVR_ForwardCall_state'] = 'Dialed'

        logger.debug('%s/%s: Set session to %s' % (
            request.session.session_key,
            request.session['ProviderIVR_ForwardCall_state'],
            request.session['ProviderIVR_ForwardCall_state'],
        ))

        callSID = request.POST['CallSid']
        log = callLog.objects.get(callSID=callSID)
        if (not log.caller_spoken_name):
            log.caller_spoken_name = request.session.pop(
                'ivr_makeRecording_recording')
            log.save()

        logger.debug('%s/%s: got provider \'%s\' \'%s\' with id %s' % (
            request.session.session_key,
            request.session['ProviderIVR_ForwardCall_state'],
            provider.first_name,
            provider.last_name,
            provider.pk,
        ))
        logger.debug(
            '%s/%s: Provider phone is \'%s\' and forward_other is \'%s\'' % (
                request.session.session_key,
                request.session['ProviderIVR_ForwardCall_state'],
                provider.user.phone,
                str(provider.forward_other),
            ))

        # Okay, let's dial!
        user_number = None
        if (forward == 'MO'):
            logger.debug('%s/%s: provider.forward_mobile True' % (
                request.session.session_key,
                request.session['ProviderIVR_ForwardCall_state'],
            ))
            user_number = provider.user.mobile_phone
            logger.debug('%s/%s: Setting user_number to \'%s\'' % (
                request.session.session_key,
                request.session['ProviderIVR_ForwardCall_state'],
                provider.user.mobile_phone,
            ))
        elif (forward == 'OF'):
            logger.debug('%s/%s: provider.forward_office True' % (
                request.session.session_key,
                request.session['ProviderIVR_ForwardCall_state'],
            ))
            user_number = provider.office_phone
            logger.debug('%s/%s: Setting user_number to \'%s\'' % (
                request.session.session_key,
                request.session['ProviderIVR_ForwardCall_state'],
                provider.office_phone,
            ))
        elif (forward == 'OT'):
            logger.debug('%s/%s: provider.forward_other True' % (
                request.session.session_key,
                request.session['ProviderIVR_ForwardCall_state'],
            ))
            user_number = provider.user.phone
            logger.debug('%s/%s: Setting user_number to \'%s\'' % (
                request.session.session_key,
                request.session['ProviderIVR_ForwardCall_state'],
                provider.user.phone,
            ))

        logger.debug('%s/%s: Tried to get called\'s number. Got \'%s\'' % (
            request.session.session_key,
            request.session['ProviderIVR_ForwardCall_state'],
            user_number,
        ))
        logger.debug(
            '%s/%s: Provider phone is \'%s\' and forward_other is \'%s\'' % (
                request.session.session_key,
                request.session['ProviderIVR_ForwardCall_state'],
                provider.user.phone,
                str(provider.forward_other),
            ))

        if (not user_number):
            # no flags were set.
            if (provider.user.mobile_phone):
                user_number = provider.user.mobile_phone
            else:
                return ProviderIVR_LeaveMsg(request)

        dial = twilio.Dial(
            action=reverse('ProviderIVR_ForwardCall'),
            timeout=22,
            timeLimit=14400,  # 4 hours
            callerId=request.session['Caller'])
        dial.append(
            twilio.Number(user_number,
                          url=reverse('ProviderIVR_ForwardCall_VetAnswer')))
        r.append(dial)
        r.append(twilio.Redirect(reverse('ProviderIVR_LeaveMsg')))
        return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)

    if (request.session['ProviderIVR_ForwardCall_state'] == 'Dialed'):
        callSID = request.POST['CallSid']
        log = callLog.objects.get(callSID=callSID)

        if (log.call_connected):
            r.append(twilio.Hangup())
            return HttpResponse(str(r),
                                mimetype=settings.TWILIO_RESPONSE_MIMETYPE)

        return ProviderIVR_LeaveMsg(request)

    r = twilio.Response()
    if (request.POST['DialStatus'] != 'answered'):
        if (request.POST['DialStatus'] == 'failed'):
            # TODO: Figure out how to deal with connection problems. Most
            # likely, send an email to the user and administrators.
            subject = 'ProviderIVR_ForwardCall Call Forward DialStatus Fail'
            message = 'ProviderIVR_ForwardCall got DialStatus failed. Post data: %s' % \
             (str(request.POST),)
            mail_admins(subject=subject, message=message, fail_silently=False)
        # else request.POST['DialStatus'] == 'busy' or request.POST['DialStatus'] == 'no-answer'
        return ProviderIVR_LeaveMsg(request)
    # else: Do nothing so that the call continues un-interrupted
    return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
Ejemplo n.º 41
0
def ProviderIVR_TreeRoot_New(request, provider=None, twilioResponse=None):
    """
	call tree of a provider:
	1 to listen to all msgs;
	2 to listen to urgent msgs
	3 to listen to voice mail
	4 to manage voicemail settings
	* to repeat menu
	Require: session variable: provider_id to be set
	Require: request.session['ivr2_state'] == ProviderIVR_TreeRoot_New
	sets up twilio response with message and url to go to ProviderIVR_TreeRoot_Actions
	"""
    if (provider == None):
        provider = Provider.objects.get(id=request.session['provider_id'])
    logger.debug('%s: ProviderIVR_TreeRoot_New prov %s' %
                 (request.session.session_key, provider))
    request.session['ivr2_state'] = 'ProviderIVR_TreeRoot_New'
    unread_anssvc_msg_count = MessageBodyUserStatus.objects.filter(
        user=provider.user,
        read_flag=False,
        delete_flag=False,
        msg_body__message___resolved_by=None,
        msg_body__message__message_type='ANS').count()
    unread_msg_count = MessageBodyUserStatus.objects.filter(
        user=provider.user,
        read_flag=False,
        delete_flag=False,
        msg_body__message___resolved_by=None,
        msg_body__message__message_type='VM').count()
    saved_msg_count = MessageBodyUserStatus.objects.filter(
        user=provider.user,
        read_flag=True,
        delete_flag=False,
        msg_body__message___resolved_by=None,
        msg_body__message__message_type='VM').count()
    saved_anssvc_msg_count = MessageBodyUserStatus.objects.filter(
        user=provider.user,
        read_flag=True,
        delete_flag=False,
        msg_body__message___resolved_by=None,
        msg_body__message__message_type='ANS').count()
    logger.debug('%s: ProviderIVR_TreeRoot_New msg counts %d, %d, %d, %d' %
                 (request.session.session_key, unread_anssvc_msg_count,
                  unread_msg_count, saved_msg_count, saved_anssvc_msg_count))

    say_str = []
    say_str.append('You have %i new, and %i saved urgent messages,' %
                   (unread_anssvc_msg_count, saved_anssvc_msg_count))
    say_str.append(' ')
    say_str.append('and %i new, and %i saved voice messages,' %
                   (unread_msg_count, saved_msg_count))

    if (any((unread_msg_count, unread_anssvc_msg_count, saved_msg_count,
             saved_anssvc_msg_count))):
        say_str.append('To listen to all your messages, press one. ')
        say_str.append('To listen to your urgent messages, press two. ')
        say_str.append('To listen to your voice mail, press three. ')

    r = twilioResponse or twilio.Response()
    gather = twilio.Gather(action=reverse('ProviderIVR_TreeRoot_Actions'),
                           finishOnKey='',
                           numDigits=1)
    gather.append(tts(''.join(say_str)))
    gather.append(tts('To manage your voicemail settings, press four.'))
    gather.append(tts('To repeat this menu, press star.'))
    r.append(gather)
    return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
Ejemplo n.º 42
0
def ProviderIVR_LeaveMsg(request):
	"""
	Records a voicemail message.

	Arguments:
		request - The standard Django request argument

	request.session Keys:
		provider_id - The ID of the Provider user who owns this voicemail box.
	"""
	# TODO: Update this code so that users can hit the pound key to 
	# pop back and log into their own voicemail box.
	provider = Provider.objects.get(id=request.session['provider_id'])

	config = None
	config_complete = provider.vm_config.count() == 1 and provider.vm_config.get().config_complete
	if (config_complete):
		config = provider.vm_config.get()

	if('CallStatus' in request.POST and request.POST['CallStatus'] == 'completed'):
		try:
			callSID = request.POST['CallSid']
			auth, uri, = client.auth, client.account_uri
			resp = make_twilio_request('GET', uri + '/Calls/%s' % callSID, auth=auth)
			content = json.loads(resp.content)
			log = callLog.objects.get(callSID=callSID)
			log.call_duration = content['TwilioResponse']['Call']['Duration']
			log.save()
		except:
			pass  # this is really ugly, but letting this exception fall through
				# destroys a message analytics will pick up the duration later on if it's missing

	if ('ivr_makeRecording_recording' in request.session):
		provider_qs = Provider.objects.filter(mobile_phone=request.session['Caller'])
		if(provider_qs):
			request.session['ivr_makeRecording_callbacknumber'] = provider_qs[0].mdcom_phone
			subject = "Voice Mail from %s %s" % (provider_qs[0].first_name, provider_qs[0].last_name)
		else:
			request.session['ivr_makeRecording_callbacknumber'] = request.session['Caller']
			subject = "Voice Mail from %s" % request.session['ivr_makeRecording_callbacknumber']
		save_message(request, subject, [provider.user], None, "VM", False)
		request.session.pop('ivr_makeRecording_recording')

		r = twilio.Response()
		r.append(tts('Good bye'))
		r.append(twilio.Hangup())
		return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)

	# Get the configuration file for this Provider
	if (not config_complete):
		# FIXME:
		# Probably not the best way to create the spoken number. We need to
		# break the number down so that there are spaces between each digit, and
		# so that there are commas after the third and sixth digits.
		if (not 'Called' in request.session or (not request.session['Called'])):
			# This will occur if click2call calls this function
			request.session['ivr_makeRecording_prompt'] = tts('The user is not available. '
					'Please leave a message after the beep. Press pound when finished for options.')
		else:
			number = request.session['Called']
			spoken_number = []
			[spoken_number.extend([i, ' ']) for i in number]
			spoken_number.pop()  # drop the last element
			spoken_number.insert(5, ',')
			spoken_number.insert(12, ',')
			request.session['ivr_makeRecording_prompt'] = tts('The person at %s '
				'is not available. Please leave a message after the beep. Press pound '
				'when finished for options.' % (''.join(spoken_number),))
	else:
		p = re.compile('http')
		if (p.match(config.greeting)):
			# This is a Twilio recording.
			request.session['ivr_makeRecording_prompt'] = twilio.Play(config.greeting)
		else:
			# TODO: 
			raise Exception('Unimplemented playback of local files')

	request.session['ivr_makeRecording_maxLength'] = 120  # 2 minutes
	request.session['ivr_makeRecording_leadSilence'] = 2
	request.session['ivr_makeRecording_promptOnce'] = True
	request.session['ivr_makeRecording_returnOnHangup'] = \
		'MHLogin.DoctorCom.IVR.views_provider.ProviderIVR_LeaveMsg'
	request.session['ivr_call_stack'].append('ProviderIVR_LeaveMsg')
	request.session.modified = True

	# Pass off the recording action to the getRecording function.
	return getRecording(request)
Ejemplo n.º 43
0
def ProviderIVR_Setup_New(request, provider=None):
    """
	New version of ProviderIVR_Setup processing. This is done in 4 consecutive steps:
	0. initial sub state: ProviderIVR_Setup_Start
	1. setup pin
	2. setup Name
	3. setup Greeting
	We use generic calls to setup Pin, Name and Greeting, but use ivr2_state
	to direct the return calls here so it could be redirected to the next step
	"""
    # we always need provider
    assert (request.session['provider_id'])
    assert (request.session['ivr2_state'] == 'ProviderIVR_Setup_New')
    if (provider == None):
        provider = Provider.objects.get(id=request.session['provider_id'])
    # we also need VMBox_config's config_id
    if (not 'config_id' in request.session):
        config = _getProviderVMConfig(provider)
        request.session['config_id'] = config.id

    logger.debug('%s: ProviderIVR_Setup_New state %s provider %s config %s' %
                 (request.session.session_key, request.session['ivr2_state'],
                  provider, request.session['config_id']))
    if ('ivr2_sub_state' not in request.session):
        # new setup processing
        request.session['ivr2_sub_state'] = 'ProviderIVR_Setup_Start'
    else:
        logger.debug(
            '%s: ProviderIVR_Setup_New sub_state %s' %
            (request.session.session_key, request.session['ivr2_sub_state']))
    if (request.session['ivr2_sub_state'] == 'ProviderIVR_Setup_Start'):
        # set up pin
        r = twilio.Response()
        r.append(twilio.Pause(
        ))  # one second pause keeps the first words from getting cut off.
        request.session['ivr2_prompt_str'] = "Welcome to your voicemail account. It "\
         "looks like some setup is needed. Let's get started. First, we need to "\
         "set up your pin number."
        event = callEvent(callSID=request.POST['CallSid'], event='I_STR')
        event.save()
        request.session['ivr2_sub_state'] = 'ProviderIVR_Setup_Pin'
        return changePinNew(request, r)

    elif (request.session['ivr2_sub_state'] == 'ProviderIVR_Setup_Pin'):
        request.session['ivr2_sub_state'] = 'ProviderIVR_Setup_Name'
        return changeNameNew(request, 'Now, we need to record your name.')

    elif (request.session['ivr2_sub_state'] == 'ProviderIVR_Setup_Name'):
        request.session['ivr2_sub_state'] = 'ProviderIVR_Setup_Greeting'
        return changeGreetingNew(request,
                                 'Finally, we need to set up a greeting.')

    elif (request.session['ivr2_sub_state'] == 'ProviderIVR_Setup_Greeting'):
        # setup is complete - automatically "log" user in
        request.session['authenticated'] = True
        del request.session['ivr2_sub_state']
        request.session['ivr2_state'] = 'ProviderIVR_TreeRoot_New'
        config = VMBox_Config.objects.get(id=request.session['config_id'])
        config.config_complete = True
        config.save()

        event = callEvent(callSID=request.POST['CallSid'], event='I_FIN')
        event.save()
        logger.debug('%s: ProviderIVR_Setup is complete config %s' %
                     (request.session.session_key, config))
        # we don't need the welcome msg anymore
        if ('ivr2_prompt_str' in request.session):
            del request.session['ivr2_prompt_str']
        r = twilio.Response()
        r.append(
            tts('Your voice mail account is now set up. You may hang up '
                'now, or stay on the line to be taken to your voice mail box home.'
                ))
        # after VM Setup, we go to main
        r.append(twilio.Redirect(reverse('ProviderIVR_TreeRoot_New')))
        return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)

    else:
        # should not get here with unknown state - log state and return to main
        logger.debug(
            '%s: ProviderIVR_Setup has unhandled state set to %s' %
            (request.session.session_key, request.session['ivr2_state']))
        request.session['ivr2_state'] = 'ProviderIVR_Main_New'
        return ProviderIVR_Main_New(request)
Ejemplo n.º 44
0
def twiMLCall_callback(request):
	form = TwiMLCallbackForm(request.POST)
	r = twilio.Response()
	if (not form.is_valid()):
		r.append(tts(_("A system error has occurred. "
			"Please contact the administrator or try it later.")))
		return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)

	callSid = form.cleaned_data["CallSid"]
	caller_user_id = form.cleaned_data["caller_user_id"]
	called_number = form.cleaned_data["called_number"]
	called_user_id = form.cleaned_data["called_user_id"]
	called_practice_id = form.cleaned_data["called_practice_id"]

	# decide called number or called user.
	called_user = None
	if called_user_id:
		called_users = MHLUser.objects.filter(pk=called_user_id)
		if (not called_users):
			r.append(tts(_("The person you called doesn't exist.")))
			return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
		called_user = called_users[0]
		called_number = called_user.mobile_phone
	elif called_practice_id:
		called_practice = PracticeLocation.objects.filter(id=called_practice_id)
		if not called_practice:
			r.append(tts(_("The practice you called doesn't exist.")))
			return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
		called_number = called_practice[0].practice_phone

	# decide which number is caller_number.
	caller_mhluser = MHLUser.objects.get(pk=caller_user_id)
	caller_provider = user_is_provider(caller_mhluser)

	caller_manager = None
	caller_mgrs = Office_Manager.objects.filter(user__user=caller_mhluser)
	if caller_mgrs:
		caller_manager = caller_mgrs[0]

	caller_number = caller_mhluser.mobile_phone
	if not caller_provider and caller_manager:
		staffs = OfficeStaff.objects.filter(user=caller_mhluser)
		if (staffs.count() != 1):
			pass
#
		staff = staffs[0]
		if staff.caller_anssvc == 'MO':
			caller_number = staff.user.mobile_phone
		elif staff.caller_anssvc == 'OF':
			caller_number = staff.office_phone
		elif staff.caller_anssvc == 'OT':
			caller_number = staff.user.phone
		else:
			pass

	log = Click2Call_Log(
			caller=caller_mhluser,
			caller_number=caller_number,
			callid=callSid,
			called_number=called_number,
			called_user=called_user,
			source='APP'
		)
	log.save()

	# decide which number is caller_id.
	caller_id = settings.TWILIO_CALLER_ID
	if (caller_provider and caller_provider.mdcom_phone):
		caller_id = caller_provider.mdcom_phone
	else:
		if caller_manager:
			if caller_manager and caller_manager.user.current_practice and \
					caller_manager.user.current_practice.mdcom_phone:
				caller_id = caller_manager.user.current_practice.mdcom_phone

	# check called person/number, decide call process
	if called_user:
		called_provider = user_is_provider(called_user)
		if (not called_provider):
			#office managers can get phone calls too, but they must have mobile phone
			manager_info = OfficeStaff.objects.filter(user=called_user)
			if (manager_info.count() > 0 and manager_info[0].user.mobile_phone):
				called_manager = manager_info[0]

		if(called_provider):
			# Send the call through the IVR
			ProviderIVR_OutsideInit(request, log.caller_number, called_provider, log)
			request.session['Caller'] = caller_id
			return ProviderIVR_ForwardCall(request)
		elif called_manager:
			# Send the call through the IVR
			from MHLogin.DoctorCom.IVR.views_practice import \
				PracticeIVR_ForwardCall, PracticeIVR_OutsideInit
			PracticeIVR_OutsideInit(request, log.caller_number, called_manager, log)
			request.session['click2call'] = True
			request.session['Caller'] = caller_id
			return PracticeIVR_ForwardCall(request)

	dial = twilio.Dial(called_number,
				callerId=caller_id,
				timeout=120)
	r.append(dial)
	return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
Ejemplo n.º 45
0
def twiMLCall_callback(request):
    form = TwiMLCallbackForm(request.POST)
    r = twilio.Response()
    if (not form.is_valid()):
        r.append(
            tts(
                _("A system error has occurred. "
                  "Please contact the administrator or try it later.")))
        return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)

    callSid = form.cleaned_data["CallSid"]
    caller_user_id = form.cleaned_data["caller_user_id"]
    called_number = form.cleaned_data["called_number"]
    called_user_id = form.cleaned_data["called_user_id"]
    called_practice_id = form.cleaned_data["called_practice_id"]

    # decide called number or called user.
    called_user = None
    if called_user_id:
        called_users = MHLUser.objects.filter(pk=called_user_id)
        if (not called_users):
            r.append(tts(_("The person you called doesn't exist.")))
            return HttpResponse(str(r),
                                mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
        called_user = called_users[0]
        called_number = called_user.mobile_phone
    elif called_practice_id:
        called_practice = PracticeLocation.objects.filter(
            id=called_practice_id)
        if not called_practice:
            r.append(tts(_("The practice you called doesn't exist.")))
            return HttpResponse(str(r),
                                mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
        called_number = called_practice[0].practice_phone

    # decide which number is caller_number.
    caller_mhluser = MHLUser.objects.get(pk=caller_user_id)
    caller_provider = user_is_provider(caller_mhluser)

    caller_manager = None
    caller_mgrs = Office_Manager.objects.filter(user__user=caller_mhluser)
    if caller_mgrs:
        caller_manager = caller_mgrs[0]

    caller_number = caller_mhluser.mobile_phone
    if not caller_provider and caller_manager:
        staffs = OfficeStaff.objects.filter(user=caller_mhluser)
        if (staffs.count() != 1):
            pass
#
        staff = staffs[0]
        if staff.caller_anssvc == 'MO':
            caller_number = staff.user.mobile_phone
        elif staff.caller_anssvc == 'OF':
            caller_number = staff.office_phone
        elif staff.caller_anssvc == 'OT':
            caller_number = staff.user.phone
        else:
            pass

    log = Click2Call_Log(caller=caller_mhluser,
                         caller_number=caller_number,
                         callid=callSid,
                         called_number=called_number,
                         called_user=called_user,
                         source='APP')
    log.save()

    # decide which number is caller_id.
    caller_id = settings.TWILIO_CALLER_ID
    if (caller_provider and caller_provider.mdcom_phone):
        caller_id = caller_provider.mdcom_phone
    else:
        if caller_manager:
            if caller_manager and caller_manager.user.current_practice and \
              caller_manager.user.current_practice.mdcom_phone:
                caller_id = caller_manager.user.current_practice.mdcom_phone

    # check called person/number, decide call process
    if called_user:
        called_provider = user_is_provider(called_user)
        if (not called_provider):
            #office managers can get phone calls too, but they must have mobile phone
            manager_info = OfficeStaff.objects.filter(user=called_user)
            if (manager_info.count() > 0
                    and manager_info[0].user.mobile_phone):
                called_manager = manager_info[0]

        if (called_provider):
            # Send the call through the IVR
            ProviderIVR_OutsideInit(request, log.caller_number,
                                    called_provider, log)
            request.session['Caller'] = caller_id
            return ProviderIVR_ForwardCall(request)
        elif called_manager:
            # Send the call through the IVR
            from MHLogin.DoctorCom.IVR.views_practice import \
             PracticeIVR_ForwardCall, PracticeIVR_OutsideInit
            PracticeIVR_OutsideInit(request, log.caller_number, called_manager,
                                    log)
            request.session['click2call'] = True
            request.session['Caller'] = caller_id
            return PracticeIVR_ForwardCall(request)

    dial = twilio.Dial(called_number, callerId=caller_id, timeout=120)
    r.append(dial)
    return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
Ejemplo n.º 46
0
def ProviderIVR_ForwardCall(request):
	"""Forward the call to the dialed user, as per the user's preferences.

	Uses the following session variables:
		ProviderIVR_ForwardCall_state: The most recent "state" of execution. May
			have the following values:
				- None/Undefined/Empty String: First execution of this function.
				- Getting_Name: Getting the caller's name, if one hasn't been
						defined.
				- Dialing: Phone(s) have been dialed, and waiting for a response Caller
	"""
	r = twilio.Response()
	request.session.modified = True
	provider = Provider.objects.get(id=request.session['provider_id'])

	if('CallStatus' in request.POST and request.POST['CallStatus'] == 'completed'):
		if('Duration' in request.POST):
			callSID = request.POST['CallSid']
			log = callLog.objects.get(callSID=callSID)
			log.call_duration = request.POST['Duration']
			log.save()

	if(not 'ProviderIVR_ForwardCall_forward' in request.session):
		request.session['ProviderIVR_ForwardCall_forward'] = provider.forward_voicemail
	forward = provider.forward_voicemail
	if (forward == 'VM'):
		return ProviderIVR_LeaveMsg(request)

	if (not 'ProviderIVR_ForwardCall_state' in request.session or
			not request.session['ProviderIVR_ForwardCall_state']):
		# New call. First, check to see if we should go straight to voicemail

		# Okay, the call isn't going to voicemail directly. Now, set state.
		request.session['ProviderIVR_ForwardCall_state'] = 'Getting_Name'

		# Now, get the caller's name

		# Is the user a DoctorCom user with a recorded name?
		callSID = request.POST['CallSid']
		log = callLog.objects.get(callSID=callSID)

		if (log.mdcom_caller and isinstance(log.mdcom_caller, Provider)):
			if (log.mdcom_caller.vm_config.count()):
				prov_vmconfig = log.mdcom_caller.vm_config.get()
				if (prov_vmconfig.config_complete):
					logger.debug('%s/%s: Found the caller\'s name!' % (
							request.session.session_key,
							request.session['ProviderIVR_ForwardCall_state'],
						))
					log.caller_spoken_name = prov_vmconfig.name
					log.save()
					return ProviderIVR_ForwardCall(request)  # restart execution of this function
				else:
					logger.debug('%s/%s: Caller\'s vm_config incomplete!' % (
							request.session.session_key,
							request.session['ProviderIVR_ForwardCall_state'],
						))
			else:
				logger.debug('%s/%s: An unsuitable number of vm_config objects found: %i' % 
					(request.session.session_key,
						request.session['ProviderIVR_ForwardCall_state'],
						log.mdcom_caller.vm_config.count(),
					))
		else:
			logger.debug('%s/%s: mdcom_caller %s either isn\'t defined or doesn\'t '
						'seem to be a Provider' % (request.session.session_key,
					request.session['ProviderIVR_ForwardCall_state'],
					str(log.mdcom_caller),
				))

		# Okay, it's not a user with a name recording. Get one.
		request.session['ivr_call_stack'].append('ProviderIVR_ForwardCall')
		request.session['ivr_makeRecording_prompt'] = \
			tts('Please say your name after the tone.')
		request.session['ivr_makeRecording_maxLength'] = 4
		request.session['ivr_makeRecording_timeout'] = 2
		request.session['ivr_makeRecording_leadSilence'] = 1
		return getQuickRecording(request)

	if (request.session['ProviderIVR_ForwardCall_state'] == 'Getting_Name'):
		request.session['ProviderIVR_ForwardCall_state'] = 'Dialed'

		logger.debug('%s/%s: Set session to %s' % (
				request.session.session_key,
				request.session['ProviderIVR_ForwardCall_state'],
				request.session['ProviderIVR_ForwardCall_state'],
			))

		callSID = request.POST['CallSid']
		log = callLog.objects.get(callSID=callSID)
		if (not log.caller_spoken_name):
			log.caller_spoken_name = request.session.pop('ivr_makeRecording_recording')
			log.save()

		logger.debug('%s/%s: got provider \'%s\' \'%s\' with id %s' % (
				request.session.session_key,
				request.session['ProviderIVR_ForwardCall_state'],
				provider.first_name,
				provider.last_name,
				provider.pk,
			))
		logger.debug('%s/%s: Provider phone is \'%s\' and forward_other is \'%s\'' % (
				request.session.session_key,
				request.session['ProviderIVR_ForwardCall_state'],
				provider.user.phone,
				str(provider.forward_other),
			))

		# Okay, let's dial!
		user_number = None
		if (forward == 'MO'):
			logger.debug('%s/%s: provider.forward_mobile True' % (
					request.session.session_key,
					request.session['ProviderIVR_ForwardCall_state'],
				))
			user_number = provider.user.mobile_phone
			logger.debug('%s/%s: Setting user_number to \'%s\'' % (
					request.session.session_key,
					request.session['ProviderIVR_ForwardCall_state'],
					provider.user.mobile_phone,
				))
		elif (forward == 'OF'):
			logger.debug('%s/%s: provider.forward_office True' % (
					request.session.session_key,
					request.session['ProviderIVR_ForwardCall_state'],
				))
			user_number = provider.office_phone
			logger.debug('%s/%s: Setting user_number to \'%s\'' % (
					request.session.session_key,
					request.session['ProviderIVR_ForwardCall_state'],
					provider.office_phone,
				))
		elif (forward == 'OT'):
			logger.debug('%s/%s: provider.forward_other True' % (
					request.session.session_key,
					request.session['ProviderIVR_ForwardCall_state'],
				))
			user_number = provider.user.phone
			logger.debug('%s/%s: Setting user_number to \'%s\'' % (
					request.session.session_key,
					request.session['ProviderIVR_ForwardCall_state'],
					provider.user.phone,
				))

		logger.debug('%s/%s: Tried to get called\'s number. Got \'%s\'' % (
				request.session.session_key,
				request.session['ProviderIVR_ForwardCall_state'],
				user_number,
			))
		logger.debug('%s/%s: Provider phone is \'%s\' and forward_other is \'%s\'' % (
				request.session.session_key,
				request.session['ProviderIVR_ForwardCall_state'],
				provider.user.phone,
				str(provider.forward_other),
			))

		if (not user_number):
			# no flags were set.
			if (provider.user.mobile_phone):
				user_number = provider.user.mobile_phone
			else:
				return ProviderIVR_LeaveMsg(request)

		dial = twilio.Dial(
				action=reverse('ProviderIVR_ForwardCall'),
				timeout=22,
				timeLimit=14400,  # 4 hours
				callerId=request.session['Caller']
			)
		dial.append(twilio.Number(user_number,
				url=reverse('ProviderIVR_ForwardCall_VetAnswer')
			))
		r.append(dial)
		r.append(twilio.Redirect(reverse('ProviderIVR_LeaveMsg')))
		return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)

	if (request.session['ProviderIVR_ForwardCall_state'] == 'Dialed'):
		callSID = request.POST['CallSid']
		log = callLog.objects.get(callSID=callSID)

		if (log.call_connected):
			r.append(twilio.Hangup())
			return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)

		return ProviderIVR_LeaveMsg(request)

	r = twilio.Response()
	if (request.POST['DialStatus'] != 'answered'):
		if (request.POST['DialStatus'] == 'failed'):
			# TODO: Figure out how to deal with connection problems. Most
			# likely, send an email to the user and administrators.
			subject = 'ProviderIVR_ForwardCall Call Forward DialStatus Fail'
			message = 'ProviderIVR_ForwardCall got DialStatus failed. Post data: %s' % \
				(str(request.POST),)
			mail_admins(subject=subject, message=message, fail_silently=False)
		# else request.POST['DialStatus'] == 'busy' or request.POST['DialStatus'] == 'no-answer'
		return ProviderIVR_LeaveMsg(request)
	# else: Do nothing so that the call continues un-interrupted
	return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
Ejemplo n.º 47
0
def PracticeIVR_CallerResponse_Action(request, twilioResponse=None):
	"""
	This function process callers response in 2 ways:
	old way (original answering service):
		1=leave msg in doc com  mailbox via PracticeIVR_LeaveRegularMsg_New (to all practice managers)
		2=page doctor on call (LeaveUrgentMsg_New)
	new way (dynamic greeting already called):
		create greeting based on call_groups info in db
		if 1 call group  for THIS practice, take message via PracticeIVR_LeaveRegularMsg_New
		if > 1 call group, add a layer to first pick call group, then pick type of message
		PracticeIVR_ForwardCall_New
	"""
	practice = PracticeLocation.objects.get(id=request.session['practice_id'])
	logger.debug('%s: PracticeIVR_CallerResponse_Action practice %s POST data is %s' % (
		request.session.session_key, practice, str(request.POST)))

	r = twilioResponse or twilio.Response()
	if (request.method == 'POST' and 'Digits' in request.POST):
		digits = request.POST['Digits']
		if practice.uses_original_answering_serice():  # old way
			logger.debug('%s: PracticeIVR_CallerResponse_Action via old ans svc' % (
				request.session.session_key))
			p = re.compile('[0-9#*]$')
			if (not p.match(digits)):
				r.append(tts(_('I\'m sorry, I didn\'t understand that.')))
			elif (digits == '1'):
				# leave msg in doctor com mailbox
				request.session['ivr2_state'] = 'PracticeIVR_LeaveRegularMsg_New'
				request.session.modified = True
				return PracticeIVR_LeaveRegularMsg_New(request)
			elif (digits == '2'):
				# forward the call
				request.session['ivr2_state'] = 'PracticeIVR_ForwardCall_New'
				request.session.modified = True
				request.session['provider_id'] = _getRecentOncallProviderId(request)
				logger.debug('%s: PracticeIVR_CallerResponse_Action old ans svc NO oncall provider' %
					(request.session.session_key))
				if(not request.session['provider_id']):
					r.append(tts(_('We\'re sorry, an application error has occurred. Goodbye.',
						voice='woman')))
					r.append(twilio.Hangup())
					# return r
					return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
				return PracticeIVR_ForwardCall_New(request)
			elif (digits == '*'):
				pass
			else:
				r.append(tts(_('I\'m sorry, I didn\'t understand that.')))
			return PracticeIVR_CallerResponse_New(request, r)
		else:
			# new V2 dynamic greeting and call groups
			call_groups_map = request.session['call_groups_map']
			specialties_map = request.session['specialties_map']
			logger.debug('%s: PracticeIVR_CallerResponse_Action via new ans svc cg %s sp %s' % (
				request.session.session_key, call_groups_map, specialties_map))
			gather = twilio.Gather(action=reverse('PracticeIVR_CallerResponse_Action'),
				finishOnKey='', numDigits=1, timeout=60)

			p = re.compile('[0-9]$')
			if (not p.match(digits)):
				r.append(tts(_('I\'m sorry, I didn\'t understand that.')))
				r.append(tts(_('%s.') % (''.join(request.session['last_played']),)))
				r.append(gather)

			elif (digits == '1' and request.session['one_ok'] == '1'):  # one_ok is set in create_dynamic_greeting
				# leave msg in doctor com mailbox
				request.session['ivr2_state'] = 'PracticeIVR_LeaveRegularMsg_New'
				request.session.modified = True
				return PracticeIVR_LeaveRegularMsg_New(request)

			elif (digits in call_groups_map):
				#Call Group reached, get provider on call
				request.session['callgroup_id'] = call_groups_map.get(digits)
				request.session['ivr2_state'] = 'PracticeIVR_ForwardCall_New'
				request.session.modified = True
				request.session['provider_id'] = _getRecentOncallProviderId(request)
				logger.debug('%s: PracticeIVR_CallerResponse_Action new ans svc NO oncall provider' %
					(request.session.session_key))
				if(not request.session['provider_id']):
					r.append(tts(_('We\'re sorry, an application error has occurred. Goodbye.',
						voice='woman')))
					r.append(twilio.Hangup())
					# return r
					return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
				return PracticeIVR_ForwardCall_New(request)
			elif (digits in specialties_map):
				#specialty reached, get list of call groups,
				#populates request.session['call_groups_map'] and blanks out request.session['specialty_map']
				call_groups_greeting = create_call_group_list(request, specialties_map.get(digits))
				gather.append(tts(_('%s.') % (''.join(call_groups_greeting),)))
				request.session['last_played'] = call_groups_greeting
				r.append(gather)
			#elif (digits == '*'): treat * as invalid input
				#pass
			else:
				gather.append(tts(_('I\'m sorry, I didn\'t understand that.')))
				gather.append(tts(_('%s.') % (''.join(request.session['last_played']),)))
				r.append(gather)
			return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
	else:
		# should never happen - but if we get here without Digits, we log and go back to Main
		logger.debug('%s: PracticeIVR_CallerResponse_Action is called with no post or digits' %
			(request.session.session_key))
		request.session['ivr2_state'] = 'PracticeIVR_Main_New'
		return PracticeIVR_Main_New(request)
Ejemplo n.º 48
0
def ProviderIVR_LeaveMsg(request):
    """
	Records a voicemail message.

	Arguments:
		request - The standard Django request argument

	request.session Keys:
		provider_id - The ID of the Provider user who owns this voicemail box.
	"""
    # TODO: Update this code so that users can hit the pound key to
    # pop back and log into their own voicemail box.
    provider = Provider.objects.get(id=request.session['provider_id'])

    config = None
    config_complete = provider.vm_config.count(
    ) == 1 and provider.vm_config.get().config_complete
    if (config_complete):
        config = provider.vm_config.get()

    if ('CallStatus' in request.POST
            and request.POST['CallStatus'] == 'completed'):
        try:
            callSID = request.POST['CallSid']
            auth, uri, = client.auth, client.account_uri
            resp = make_twilio_request('GET',
                                       uri + '/Calls/%s' % callSID,
                                       auth=auth)
            content = json.loads(resp.content)
            log = callLog.objects.get(callSID=callSID)
            log.call_duration = content['TwilioResponse']['Call']['Duration']
            log.save()
        except:
            pass  # this is really ugly, but letting this exception fall through
            # destroys a message analytics will pick up the duration later on if it's missing

    if ('ivr_makeRecording_recording' in request.session):
        provider_qs = Provider.objects.filter(
            mobile_phone=request.session['Caller'])
        if (provider_qs):
            request.session['ivr_makeRecording_callbacknumber'] = provider_qs[
                0].mdcom_phone
            subject = "Voice Mail from %s %s" % (provider_qs[0].first_name,
                                                 provider_qs[0].last_name)
        else:
            request.session[
                'ivr_makeRecording_callbacknumber'] = request.session['Caller']
            subject = "Voice Mail from %s" % request.session[
                'ivr_makeRecording_callbacknumber']
        save_message(request, subject, [provider.user], None, "VM", False)
        request.session.pop('ivr_makeRecording_recording')

        r = twilio.Response()
        r.append(tts('Good bye'))
        r.append(twilio.Hangup())
        return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)

    # Get the configuration file for this Provider
    if (not config_complete):
        # FIXME:
        # Probably not the best way to create the spoken number. We need to
        # break the number down so that there are spaces between each digit, and
        # so that there are commas after the third and sixth digits.
        if (not 'Called' in request.session
                or (not request.session['Called'])):
            # This will occur if click2call calls this function
            request.session['ivr_makeRecording_prompt'] = tts(
                'The user is not available. '
                'Please leave a message after the beep. Press pound when finished for options.'
            )
        else:
            number = request.session['Called']
            spoken_number = []
            [spoken_number.extend([i, ' ']) for i in number]
            spoken_number.pop()  # drop the last element
            spoken_number.insert(5, ',')
            spoken_number.insert(12, ',')
            request.session['ivr_makeRecording_prompt'] = tts(
                'The person at %s '
                'is not available. Please leave a message after the beep. Press pound '
                'when finished for options.' % (''.join(spoken_number), ))
    else:
        p = re.compile('http')
        if (p.match(config.greeting)):
            # This is a Twilio recording.
            request.session['ivr_makeRecording_prompt'] = twilio.Play(
                config.greeting)
        else:
            # TODO:
            raise Exception('Unimplemented playback of local files')

    request.session['ivr_makeRecording_maxLength'] = 120  # 2 minutes
    request.session['ivr_makeRecording_leadSilence'] = 2
    request.session['ivr_makeRecording_promptOnce'] = True
    request.session['ivr_makeRecording_returnOnHangup'] = \
     'MHLogin.DoctorCom.IVR.views_provider.ProviderIVR_LeaveMsg'
    request.session['ivr_call_stack'].append('ProviderIVR_LeaveMsg')
    request.session.modified = True

    # Pass off the recording action to the getRecording function.
    return getRecording(request)
Ejemplo n.º 49
0
def ProviderIVR_Setup(request, config=None):
    """
	This function is heavily dependent upon request.session; Twilio is kind
	enough to keep session cookies for us.
	"""
    # DEBUG:
    #if (not 'ProviderIVR_Setup' in request.session['callCounts']):
    #   request.session['callCounts']['ProviderIVR_Setup'] = 1
    #else:
    #   request.session['callCounts']['ProviderIVR_Setup'] += 1

    # DEBUG:
    #if (not 'debug_semaphore' in request.session):
    #   request.session['ivr_setup_stage'] = 1
    #   request.session['debug_semaphore'] = True
    #else:
    #   raise Exception(request.session['ivr_call_stack'])
    if ('CallStatus' in request.POST
            and request.POST['CallStatus'] == 'completed'):
        # call ended
        #raise Exception('Ending inappropriately. Call stack is %s'%(str(
        # request.session['ivr_call_stack']),)) # DEBUG
        r = twilio.Response()
        return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
    elif (not 'CallStatus' in request.POST):
        # call ended
        #raise Exception('Ending inappropriately. Call stack is %s'%(str(
        # request.session['ivr_call_stack']),)) # DEBUG
        r = twilio.Response()
        return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)

    if 'ivr_setup_stage' not in request.session:
        # Okay, this is the first time this function is being executed for this
        # call.
        #raise Exception(request.session['ivr_call_stack']) # DEBUG

        r = twilio.Response()

        # Set up our session variables.
        request.session['ivr_setup_stage'] = 1
        request.session['ivr_call_stack'].append('ProviderIVR_Setup')
        request.session.modified = True

        provider = Provider.objects.get(id=request.session['provider_id'])
        if (not provider.vm_config.count()):
            # This user needs a voicemailbox configuration object
            config = VMBox_Config()
            config.owner = provider
            config.save()
            request.session['config_id'] = config.id

        r.append(twilio.Pause(
        ))  # one second pause keeps the first words from getting cut off.
        r.append(
            tts("Welcome to your voicemail account. It looks like some "
                "setup is needed. Let's get started."))
        r.append(tts("First, we need to set up your pin number."))

        event = callEvent(callSID=request.POST['CallSid'], event='I_STR')
        event.save()

        #raise Exception(request.session['ivr_call_stack']) # DEBUG
        return changePin(request, r, True)

    elif (request.session['ivr_setup_stage'] == 1):  # Record name
        request.session['ivr_call_stack'].append('ProviderIVR_Setup')
        request.session.modified = True
        request.session['ivr_setup_stage'] = 2

        return changeName(request, 'Now, we need to record your name.')
    elif (request.session['ivr_setup_stage'] == 2):  # Record a greeting
        request.session['ivr_call_stack'].append('ProviderIVR_Setup')
        request.session.modified = True
        request.session['ivr_setup_stage'] = 3

        return changeGreeting(request,
                              'Finally, we need to set up a greeting.')
    elif (request.session['ivr_setup_stage'] == 3):  # Configuration complete!
        #raise Exception(request.session['ivr_call_stack']) # DEBUG
        #raise Exception(request.session['callCounts']) # DEBUG
        # Automatically "log" this user in.
        request.session['authenticated'] = True

        config = VMBox_Config.objects.get(id=request.session['config_id'])
        config.config_complete = True
        config.save()

        r = twilio.Response()
        r.append(
            tts('Your voice mail account is now set up. You may hang up '
                'now, or stay on the line to be taken to your voice mail box home.'
                ))

        event = callEvent(callSID=request.POST['CallSid'], event='I_FIN')
        event.save()

        r.append(
            twilio.Redirect(reverse(request.session['ivr_call_stack'].pop())))
        request.session.modified = True
        return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)

    raise Exception(
        'Reached the end of ProviderIVR_Setup. This should never happen.')
Ejemplo n.º 50
0
def ProviderIVR_Setup(request, config=None):
	"""
	This function is heavily dependent upon request.session; Twilio is kind
	enough to keep session cookies for us.
	"""
	# DEBUG:
	#if (not 'ProviderIVR_Setup' in request.session['callCounts']):
	#   request.session['callCounts']['ProviderIVR_Setup'] = 1
	#else:
	#   request.session['callCounts']['ProviderIVR_Setup'] += 1

	# DEBUG:
	#if (not 'debug_semaphore' in request.session):
	#   request.session['ivr_setup_stage'] = 1
	#   request.session['debug_semaphore'] = True
	#else:
	#   raise Exception(request.session['ivr_call_stack'])
	if ('CallStatus' in request.POST and request.POST['CallStatus'] == 'completed'):
		# call ended
		#raise Exception('Ending inappropriately. Call stack is %s'%(str(
		# request.session['ivr_call_stack']),)) # DEBUG
		r = twilio.Response()
		return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)
	elif (not 'CallStatus' in request.POST):
		# call ended
		#raise Exception('Ending inappropriately. Call stack is %s'%(str(
		# request.session['ivr_call_stack']),)) # DEBUG
		r = twilio.Response()
		return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)

	if 'ivr_setup_stage' not in request.session:
		# Okay, this is the first time this function is being executed for this
		# call.
		#raise Exception(request.session['ivr_call_stack']) # DEBUG

		r = twilio.Response()

		# Set up our session variables.
		request.session['ivr_setup_stage'] = 1
		request.session['ivr_call_stack'].append('ProviderIVR_Setup')
		request.session.modified = True

		provider = Provider.objects.get(id=request.session['provider_id'])
		if (not provider.vm_config.count()):
			# This user needs a voicemailbox configuration object
			config = VMBox_Config()
			config.owner = provider
			config.save()
			request.session['config_id'] = config.id

		r.append(twilio.Pause())  # one second pause keeps the first words from getting cut off.
		r.append(tts("Welcome to your voicemail account. It looks like some "
			"setup is needed. Let's get started."))
		r.append(tts("First, we need to set up your pin number."))

		event = callEvent(callSID=request.POST['CallSid'], event='I_STR')
		event.save()

		#raise Exception(request.session['ivr_call_stack']) # DEBUG
		return changePin(request, r, True)

	elif (request.session['ivr_setup_stage'] == 1):  # Record name
		request.session['ivr_call_stack'].append('ProviderIVR_Setup')
		request.session.modified = True
		request.session['ivr_setup_stage'] = 2

		return changeName(request, 'Now, we need to record your name.')
	elif (request.session['ivr_setup_stage'] == 2):  # Record a greeting
		request.session['ivr_call_stack'].append('ProviderIVR_Setup')
		request.session.modified = True
		request.session['ivr_setup_stage'] = 3

		return changeGreeting(request, 'Finally, we need to set up a greeting.')
	elif (request.session['ivr_setup_stage'] == 3):  # Configuration complete!
		#raise Exception(request.session['ivr_call_stack']) # DEBUG
		#raise Exception(request.session['callCounts']) # DEBUG
		# Automatically "log" this user in.
		request.session['authenticated'] = True

		config = VMBox_Config.objects.get(id=request.session['config_id'])
		config.config_complete = True
		config.save()

		r = twilio.Response()
		r.append(tts('Your voice mail account is now set up. You may hang up '
					'now, or stay on the line to be taken to your voice mail box home.'))

		event = callEvent(callSID=request.POST['CallSid'], event='I_FIN')
		event.save()

		r.append(twilio.Redirect(reverse(request.session['ivr_call_stack'].pop())))
		request.session.modified = True
		return HttpResponse(str(r), mimetype=settings.TWILIO_RESPONSE_MIMETYPE)

	raise Exception('Reached the end of ProviderIVR_Setup. This should never happen.')