예제 #1
0
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
예제 #2
0
    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)
예제 #3
0
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
예제 #4
0
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
예제 #5
0
파일: views.py 프로젝트: gnublade/echoic
def conference(request):
    response = Response()
    response.dial().conference(                                                         
        name=request.REQUEST['room'],
        startConferenceOnEnter=True,
        endConferenceOnExit=True
    ) 
    return response
예제 #6
0
파일: views.py 프로젝트: vinczente/xLines
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
예제 #7
0
    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')
예제 #8
0
 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>')
예제 #9
0
 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>')
예제 #10
0
    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)
예제 #11
0
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)
예제 #12
0
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)
예제 #13
0
 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>')
예제 #14
0
 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>')
예제 #15
0
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/")
예제 #16
0
 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>')
예제 #17
0
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
예제 #18
0
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)
예제 #19
0
 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>'
     )
예제 #20
0
 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>'
     )
예제 #21
0
    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")
예제 #22
0
    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")
예제 #23
0
    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")
예제 #24
0
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)
예제 #25
0
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
예제 #26
0
    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)
예제 #27
0
파일: views.py 프로젝트: jalaziz/doorman
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
예제 #28
0
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)
예제 #29
0
    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)
예제 #30
0
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
예제 #31
0
    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')
예제 #32
0
파일: ringdown.py 프로젝트: scottbarnes/rrk
    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)
예제 #33
0
    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')
예제 #34
0
    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)
예제 #35
0
 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>')
예제 #36
0
 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>')
예제 #37
0
 def connect_conference_line():
     resp = Response()
     with resp.dial() as d:
         d.conference(request.args['Digits'])
     return str(resp)
예제 #38
0
 def connect_conference_line():
     resp = Response()
     with resp.dial() as d:
         d.conference(request.args["Digits"])
     return str(resp)