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)
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)
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())
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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.')
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.')