def conference(request, name, muted=None, beep=None, start_conference_on_enter=None, end_conference_on_exit=None, wait_url=None, wait_method='POST', max_participants=None): """See: http://www.twilio.com/docs/api/twiml/conference. Usage:: # urls.py urlpatterns = patterns('', # ... url(r'^conference/?(P<name>\\w+)/$', 'django_twilio.views.conference', {'max_participants': 10}), # ... ) """ r = Response() r.dial().conference( name=name, muted=muted, beep=beep, startConferenceOnEnter=start_conference_on_enter, endConferenceOnExit=end_conference_on_exit, waitUrl=wait_url, waitMethod=wait_method, ) return r
def handle_ringdown(): stack = request.args.getlist('stack') sorry = request.args.get('sorry', 'Sorry, no one answered') if len(stack) == 0: # Nothing else to ringdown resp = Response() resp.say(sorry) return str(resp) top = stack.pop(0) data = { 'stack': stack, 'sorry': sorry } qs = urlencode(data, True) resp = Response() resp.dial(top, timeout=10, action="/ringdown/handle?{}".format(qs), method='GET') return str(resp)
def conference(request, name, muted=None, beep=None, start_conference_on_enter=None, end_conference_on_exit=None, wait_url=None, wait_method=None, max_participants=None): """See: http://www.twilio.com/docs/api/twiml/conference. Usage:: # urls.py urlpatterns = patterns('', # ... url(r'^conference/?(P<name>\\w+)/$', 'django_twilio.views.conference', {'max_participants': 10}), # ... ) """ r = Response() r.dial().conference( name = name, muted = muted, beep = beep, startConferenceOnEnter = start_conference_on_enter, endConferenceOnExit = end_conference_on_exit, waitUrl = wait_url, waitMethod = wait_method, ) return r
def dial(request, number, action=None, method='POST', timeout=None, hangup_on_star=None, time_limit=None, caller_id=None): """See: http://www.twilio.com/docs/api/twiml/dial. Usage:: # urls.py urlpatterns = patterns('', # ... url(r'^dial/?(P<number>\\w+)/$', 'django_twilio.views.dial'), # ... ) """ r = Response() r.dial(number=number, action=action, method=method, timeout=timeout, hangupOnStar=hangup_on_star, timeLimit=time_limit, callerId=caller_id) return r
def conference(request): response = Response() response.dial().conference( name=request.REQUEST['room'], startConferenceOnEnter=True, endConferenceOnExit=True ) return response
def call_reference(request): r = Response() if request.GET['key'] == settings.TWILIO_KEY: kwargs = {'number':'+447513623450', 'action':None, 'method':None, 'timeout':settings.TWILIO_TIMEOUT, 'hangupOnStar':False,'timeLimit':None, 'callerId':None,'record':True} r.dial(**kwargs) kwargs = {'text':settings.ENDCALL, 'voice':None, 'language':None, 'loop':None} r.say(**kwargs) return r
def dispatch(self, request, *args, **kwargs): print(request.GET) try: manager = get_object_or_404(CallbackManager, pk=Signer().unsign( request.GET.get('manager', 0))) except (BadSignature, CallbackManager.DoesNotExist): raise PermissionDenied callback_request = get_object_or_404(CallbackRequest, pk=request.GET.get('request')) entry = CallEntry.objects.create(manager=manager, state='direct', request=callback_request) phone = callback_request.right_phone resp = Response() dial = resp.dial(callerId=settings.TWILIO_DEFAULT_FROM, record=True) dial.number(phone, statusCallback=get_full_url( reverse('callback_caller:direct_result', args=(Signer().sign(entry.pk), ))), statusCallbackMethod='GET') return HttpResponse(str(resp), content_type='text/xml')
def testSipUsernamePass(self): """ should redirect the call """ r = Response() d = r.dial() d.sip('*****@*****.**', username='******', password='******') r = self.strip(r) assert_equal(r, '<?xml version="1.0" encoding="UTF-8"?><Response><Dial><Sip password="******" username="******">[email protected]</Sip></Dial></Response>')
def test_add_queue(self): """ add a queue to a dial """ r = Response() d = r.dial() d.append(twiml.Queue("The Cute Queue")) r = self.strip(r) assert_equal(r, '<?xml version="1.0" encoding="UTF-8"?><Response><Dial><Queue>The Cute Queue</Queue></Dial></Response>')
def handle_conference_line(): whitelist = request.args.getlist('whitelist') if len(whitelist) > 0: if request.args['From'] not in whitelist: resp = Response() resp.say('Sorry, you are not authorized to call this number') return str(resp) room = request.args.get('room', False) if room: resp = Response() with resp.dial() as d: d.conference(room) return str(resp) # Gather the room code resp = Response() with resp.gather(numDigits=3, action='/conference-line/connect', method='GET') as g: g.say("Enter a 3-digit room code") return str(resp)
def handle_twilio_request(): """Respond to incoming Twilio requests.""" now = strftime("%Y-%m-%d %H:%M:%S", gmtime()) call_number = request.args.get('Called') call_number = phonenumbers.parse("+" + call_number, None) call_number = phonenumbers.format_number( call_number, phonenumbers.PhoneNumberFormat.E164) agent = models.Agent.query.filter_by(phone=call_number).first() conference_name = '{time}-{name}'.format(time=now, name=agent.username) response = Response() with response.dial() as r: r.conference(conference_name, beep=False, waitUrl='', startConferenceOnEnter="true", endConferenceOnExit="true") conf = models.Conference(name=conference_name, status="waiting", agent_id=agent.id) models.add(conf) models.commit() return str(response)
def handle_twilio_request(): """Respond to incoming Twilio requests.""" now = strftime("%Y-%m-%d %H:%M:%S", gmtime()) call_number = request.args.get('Called') call_number = phonenumbers.parse("+" + call_number, None) call_number = phonenumbers.format_number(call_number, phonenumbers.PhoneNumberFormat.E164) agent = models.Agent.query.filter_by(phone=call_number).first() conference_name = '{time}-{name}'.format(time=now, name=agent.username) response = Response() with response.dial() as r: r.conference(conference_name, beep=False, waitUrl='', startConferenceOnEnter="true", endConferenceOnExit="true") conf = models.Conference(name=conference_name, status="waiting", agent_id=agent.id) models.add(conf) models.commit() return str(response)
def testSip(self): """ should redirect the call """ r = Response() d = r.dial() d.sip('*****@*****.**') r = self.strip(r) assert_equal(r, '<?xml version="1.0" encoding="UTF-8"?><Response><Dial><Sip>[email protected]</Sip></Dial></Response>')
def testSipUri(self): """ should redirect the call""" r = Response() d = r.dial() s = d.sip() s.uri('*****@*****.**') r = self.strip(r) self.assertEquals(r, '<?xml version="1.0" encoding="UTF-8"?><Response><Dial><Sip><Uri>[email protected]</Uri></Sip></Dial></Response>')
def handle_key(): """Handle key press from a user.""" digit_pressed = request.values.get('Digits', None) if digit_pressed == "1": resp = Response() resp.dial(phone_dave) resp.say("The call failed, or the party hung up. Goodbye.") return str(resp) elif digit_pressed == "2": resp = Response() resp.say("Record your monkey howl after the tone.") resp.record(maxLength="30", action="/hello-monkey/handle-recording/") return str(resp) elif digit_pressed == "3": return redirect("/hello-monkey/voice/") else: return redirect("/hello-monkey/")
def testSipUri(self): """ should redirect the call""" r = Response() d = r.dial() s = d.sip() s.uri('*****@*****.**') r = self.strip(r) self.assertEquals(r, '<?xml version="1.0" encoding="UTF-8"?><Response><Dial><Sip><Uri>[email protected]</Uri></Sip></Dial></Response>')
def dial(request, number, action=None, method='POST', timeout=None, hangup_on_star=None, time_limit=None, caller_id=None): """See: http://www.twilio.com/docs/api/twiml/dial. Usage:: # urls.py urlpatterns = patterns('', # ... url(r'^dial/?(P<number>\\w+)/$', 'django_twilio.views.dial'), # ... ) """ r = Response() r.dial(number=number, action=action, method=method, timeout=timeout, hangupOnStar=hangup_on_star, timeLimit=time_limit, callerId=caller_id) return r
def voice(): dest_number = request.values.get('PhoneNumber', None) resp = Response() with resp.dial(callerId=caller_id) as r: if dest_number and re.search(r'^\d{11}$', dest_number): r.number(dest_number) else: r.client('jenny') return str(resp)
def test_add_empty_client(self): """ add an empty client to a dial """ r = Response() d = r.dial() d.client("") assert_equal( str(r), '<?xml version="1.0" encoding="UTF-8"?><Response><Dial><Client /></Dial></Response>' )
def test_add_client(self): """ add a client to a dial""" r = Response() d = r.dial() d.client("alice") self.assertEquals( str(r), '<?xml version="1.0" encoding="UTF-8"?><Response><Dial><Client>alice</Client></Dial></Response>' )
def setUp(self): r = Response() with r.dial() as dial: dial.conference("TestConferenceAttributes", beep=False, waitUrl="", startConferenceOnEnter=True, endConferenceOnExit=True) xml = r.toxml() #parse twiml XML string with Element Tree and inspect structure tree = ET.fromstring(xml) self.conf = tree.find(".//Conference")
def setUp(self): r = Response() with r.dial() as dial: dial.conference("TestConferenceAttributes", beep=False, waitUrl="", startConferenceOnEnter=True, endConferenceOnExit=True) xml = r.toxml() #parse twiml XML string with Element Tree and inspect structure tree = ET.fromstring(xml) self.conf = tree.find(".//Dial/Conference")
def setUp(self): r = Response() with r.dial() as dial: dial.queue("TestQueueAttribute", url="", method='GET') xml = r.toxml() #parse twiml XML string with Element Tree and inspect #structure tree = ET.fromstring(xml) self.conf = tree.find(".//Queue")
def handle_call(conference_id): conference = models.Conference.query.get(conference_id) response = Response() with response.dial() as r: r.conference(conference.name, beep=False, waitUrl='', startConferenceOnEnter="true", endConferenceOnExit="false") return str(response)
def twilio_call_input(request, calllog_id): call_log = get_object_or_404(CallLog, id=int(calllog_id)) digit = request.POST["Digits"] call_log.log["input"] = dict(request.POST) call_log.log["input"]["_request"] = get_request_log_info(request) resp = TwilioResponse() if digit != "1": # basically an abuse report call_log.log["input"]["response"] = "did-not-request-call" resp.say( "We apologize for the inconvenience. Call 202-558-7227 or visit w w w dot gov track dot u s to report abuse. Good bye." ) resp.hangup() elif settings.DEBUG: resp.say("Site is in debug mode. Call cancelled.") resp.hangup() else: phone = "+1" + "".join( c for c in call_log.target.phone if unicode.isdigit(c)) call_log.log["input"]["response"] = "continue" call_log.log["input"]["transfer_to"] = phone resp.say("Okay. Hold on.") resp.dial( phone, action=request.build_absolute_uri( "/poll/_twilio/call-transfer-end/" + str(call_log.id)), timeout=30, callerId=request.POST["To"], record=True, ) call_log.status = "connecting" call_log.save() return resp
def handle_opt(): response = Response() digit = request.form["Digits"] opt = request.args.get("opt_" + digit, None) if opt is None: response.say(err_say) response.redirect("{}?{}".format(request.base_url, request.query_string)) return str(response) opt_args = opt.split(":") if opt_args[0] == "Call": response.dial(opt_args[2]) elif opt_args[0] == "Info": response.say(opt_args[2], voice=voice) response.say(end_say, voice=voice) return str(response)
def answer_call(): r = Response() if request.form['From'] != config.intercom: r.reject(reason='rejected') if not config.auth: r.verbs.extend(grant_access()) else: with r.gather(action=url_for('.check_input'), numDigits=4, timeout=4) as g: g.say('Please enter a pin or hold.') try: contact = models.Contact.objects.get(pk=config.forward) r.dial(contact.phone_number) except models.Contact.DoesNotExist: pass r.say('Goodbye.') return r
def handle_call(conference_id): conference = models.Conference.query.get(conference_id) response = Response() with response.dial() as r: r.conference(conference.name, beep=False, waitUrl='', startConferenceOnEnter="true", endConferenceOnExit="false") return str(response)
def handle_opt(): response = Response() digit = request.form['Digits'] opt = request.args.get('opt_' + digit, None) if opt is None: response.say(err_say) response.redirect("{}?{}".format(request.base_url, request.query_string)) return str(response) opt_args = opt.split(':') if opt_args[0] == 'Call': response.dial(opt_args[2]) elif opt_args[0] == 'Info': response.say(opt_args[2], voice=voice) response.say(end_say, voice=voice) return str(response)
def twilio_call_input(request, call_id): report = get_object_or_404(WhipReport, id=int(call_id)) digit = request.POST["Digits"] report.call_log["input"] = dict(request.POST) report.call_log["input"]["_request"] = get_request_log_info(request) resp = TwilioResponse() if digit != "1": # basically an abuse report report.call_log["input"]["response"] = "did-not-request-call" resp.say("We apologize for the inconvenience. Call 202-558-7227 or visit w w w dot gov track dot u s to report abuse. Good bye.") resp.hangup() elif settings.DEBUG: resp.say("Site is in debug mode. Call cancelled.") resp.hangup() else: phone = "+1" + "".join(c for c in report.target.phone if unicode.isdigit(c)) report.call_log["input"]["response"] = "continue" report.call_log["input"]["transfer_to"] = phone resp.say("Okay. Hold on.") resp.dial( phone, action=build_twilio_callback_url(request, report, "call-transfer-end"), timeout=30, callerId=request.POST["To"], record=True, ) report.call_status = "connecting" report.save() return resp
def dispatch(self, request, *args, **kwargs): print(request.GET) entry = get_call_request(CallEntry, **kwargs) status = request.GET['DialCallStatus'] resp = Response() if status in ['no-answer', 'failed']: entry.fail() next_entry = entry.request.get_entry() if request.GET.get('client', None) == 'voximplant': if next_entry is None: return JsonResponse({'next': 'hangup'}) data = { 'action': get_full_url(next_entry.get_absolute_url()), 'timeout': settings.CALLBACK_MANAGER_CALL_TIMEOUT, 'phones': [ phone.number for phone in next_entry.phones.filter( phone_type='phone') ], } return JsonResponse(data) if next_entry is None: resp.hangup() else: dial = resp.dial( callerId=next_entry.request.right_phone, action=get_full_url(next_entry.get_absolute_url()), method='GET', record=True, timeout=settings.CALLBACK_MANAGER_CALL_TIMEOUT) # TODO: refactor repeating for phone in entry.phones.all(): if phone.phone_type == 'sip': dial.sip('sip:' + phone.number) else: dial.number(phone.number) elif status == 'completed': entry.record_url = request.GET.get('RecordingUrl', None) entry.duration = request.GET.get('RecordingDuration', 0) entry.success() resp.hangup() else: raise Exception('Wrong status: %s' % status) return HttpResponse(str(resp), content_type='text/xml')
def handle_ringdown(): stack = request.args.getlist('stack') sorry = request.args.get('sorry', 'Sorry, no one answered') if len(stack) == 0: # Nothing else to ringdown resp = Response() resp.say(sorry) return str(resp) top = stack.pop(0) data = {'stack': stack, 'sorry': sorry} qs = urlencode(data, True) resp = Response() resp.dial(top, timeout=10, action="/ringdown/handle?{}".format(qs), method='GET') return str(resp)
def dispatch(self, request, *args, **kwargs): print(request.GET) call_request = get_call_request(CallbackRequest, **kwargs) entry = call_request.get_entry() if request.GET.get('client', None) == 'voximplant': if entry is None: return JsonResponse({'next': 'hangup'}) data = { 'intro': settings.CALLBACK_INTRO_MP3, 'action': get_full_url(entry.get_absolute_url()), 'timeout': settings.CALLBACK_MANAGER_CALL_TIMEOUT, 'phones': [ phone.number for phone in entry.phones.filter(phone_type='phone') ], } return JsonResponse(data) resp = Response() if entry is None: resp.hangup() else: intro_url = settings.CALLBACK_INTRO_MP3 if intro_url is not None: resp.play(intro_url) dial = resp.dial(callerId=call_request.right_phone, action=get_full_url(entry.get_absolute_url()), method='GET', record=True, timeout=settings.CALLBACK_MANAGER_CALL_TIMEOUT) # TODO: add statusCallback and statusCallbackMethod # for every request, so we can mark phone who really answered the call # https://www.twilio.com/docs/api/twiml/number#attributes for phone in entry.phones.all(): if phone.phone_type == 'sip': dial.sip('sip:' + phone.number) else: dial.number(phone.number) return HttpResponse(str(resp), content_type='text/xml')
def handle_conference_line(): whitelist = request.args.getlist("whitelist") if len(whitelist) > 0: if request.args["From"] not in whitelist: resp = Response() resp.say("Sorry, you are not authorized to call this number") return str(resp) room = request.args.get("room", False) if room: resp = Response() with resp.dial() as d: d.conference(room) return str(resp) # Gather the room code resp = Response() with resp.gather(numDigits=3, action="/conference-line/connect", method="GET") as g: g.say("Enter a 3-digit room code") return str(resp)
def test_add_client(self): """ add a client to a dial""" r = Response() d = r.dial() d.client("alice") self.assertEquals(str(r), '<?xml version="1.0" encoding="UTF-8"?><Response><Dial><Client>alice</Client></Dial></Response>')
def test_add_empty_client(self): """ add an empty client to a dial """ r = Response() d = r.dial() d.client("") assert_equal(str(r), '<?xml version="1.0" encoding="UTF-8"?><Response><Dial><Client /></Dial></Response>')
def connect_conference_line(): resp = Response() with resp.dial() as d: d.conference(request.args['Digits']) return str(resp)
def connect_conference_line(): resp = Response() with resp.dial() as d: d.conference(request.args["Digits"]) return str(resp)