File: //home/arjun/projects/buyercall_forms/buyercall/buyercall/lib/bandwidth_bxml.py
import os
import json
import logging
import xml.etree.ElementTree as ET
from xml.dom.minidom import parseString
import xmltodict
import requests
from requests.auth import HTTPBasicAuth
from urllib.parse import urlparse
log = logging.getLogger(__name__)
success_status_code = 200
def camel_case(thing):
if isinstance(thing, dict):
return {camel_case(key): val for key, val in thing.items()}
words = thing.split('_')
return words[0] + ''.join(x.capitalize() for x in words[1:])
# function to be used for BXML response
def create_xml_response(r):
""" Transform a Twiml Response to a Flask response object. """
xml = parseString(str(r))
result = xml.toprettyxml()
log.info('The XML looks like: {}'.format(result))
return result
class Response(object):
def __init__(self, elt=None):
self.root = elt if elt is not None else ET.Element('Response')
def __str__(self):
return ET.tostring(self.root, encoding="unicode")
def hangup(self):
elt = ET.Element('Hangup')
self.root.append(elt)
return elt
def custom_pause(self, length='2'):
elt = ET.Element(
'Pause', duration=length
)
self.root.append(elt)
return elt
def ring(self, duration='5', answer_call='true'):
elt = ET.Element(
'Ring', duration=duration, answerCall=answer_call
)
self.root.append(elt)
return elt
def play_audio(self, url):
elt = ET.Element('PlayAudio')
elt.text = url
self.root.append(elt)
return elt
def say(self, text, gender='female', locale='en_US', voice='susan'):
elt = ET.Element(
'SpeakSentence', gender=gender, locale=locale, voice=voice
)
elt.text = text
self.root.append(elt)
return elt
def tag(self, text):
elt = ET.Element(
'Tag'
)
elt.text = text
self.root.append(elt)
return elt
def bridge(self, call_id):
elt = ET.Element(
'Bridge'
)
elt.text = call_id
self.root.append(elt)
return elt
def redirect(self, redirect_url, redirect_fallback_url,**kwargs):
elt = ET.Element(
'Redirect',
redirectUrl=redirect_url,
redirectFallbackUrl=redirect_fallback_url
)
self.root.append(elt)
for key, val in kwargs.items():
if val:
elt.set(camel_case(key), str(val))
return elt
def record(self, recording_available_url, transcribe,
transcribe_available_url, terminating_digits='#', max_duration="5400", silence_timeout="60",
file_format="mp3", **kwargs):
elt = ET.Element(
'Record',
recordingAvailableUrl=recording_available_url,
transcribe=transcribe,
transcriptionAvailableUrl=transcribe_available_url,
terminatingDigits=terminating_digits,
maxDuration=max_duration,
silenceTimeout=silence_timeout,
fileFormat=file_format
)
self.root.append(elt)
for key, val in kwargs.items():
if val:
elt.set(camel_case(key), str(val))
return elt
def start_record(self, recording_available_url, transcribe, transcribe_available_url, file_format="mp3",
multi_channel="true", **kwargs):
elt = ET.Element(
'StartRecording',
recordingAvailableUrl=recording_available_url,
transcribe=transcribe,
transcriptionAvailableUrl=transcribe_available_url,
fileFormat=file_format,
multiChannel=multi_channel
)
self.root.append(elt)
for key, val in kwargs.items():
if val:
elt.set(camel_case(key), str(val))
return elt
def end_record(self):
elt = ET.Element('StopRecording')
self.root.append(elt)
return elt
def transfer(self, caller_id, call_timeout, transfer_complete_url, transfer_complete_fallback_url, **kwargs):
elt = ET.Element(
'Transfer',
transferCallerId=caller_id,
callTimeout=call_timeout,
transferCompleteUrl=transfer_complete_url,
transferCompleteFallbackUrl=transfer_complete_fallback_url,
)
self.root.append(elt)
for key, val in kwargs.items():
if val:
elt.set(camel_case(key), str(val))
return Transfer(elt)
def gather(self, gather_url, gather_fallback_url, **kwargs):
elt = ET.Element(
'Gather',
gatherUrl=gather_url,
gatherFallbackUrl=gather_fallback_url
)
self.root.append(elt)
for key, val in kwargs.items():
if val:
elt.set(camel_case(key), str(val))
return Gather(elt)
class Transfer(object):
def __init__(self, elt):
self.root = elt
self.resp = Response(self.root)
def __enter__(self):
return self
def __exit__(self, type_, value, tb):
pass
def phone_number(self, text, transfer_answer_url, transfer_answer_fallback_url,
transfer_disconnect_url, **kwargs):
elt = ET.Element(
'PhoneNumber',
transferAnswerUrl=transfer_answer_url,
transferAnswerFallbackUrl=transfer_answer_fallback_url,
transferDisconnectUrl=transfer_disconnect_url
)
self.root.append(elt)
for key, val in kwargs.items():
if val:
elt.set(camel_case(key), str(val))
elt.text = text
return elt
def sip_uri(self, text, transfer_answer_url, transfer_answer_fallback_url,
transfer_disconnect_url, **kwargs):
elt = ET.Element(
'SipUri',
transferAnswerUrl=transfer_answer_url,
transferAnswerFallbackUrl=transfer_answer_fallback_url,
transferDisconnectUrl=transfer_disconnect_url
)
self.root.append(elt)
for key, val in kwargs.items():
if val:
elt.set(camel_case(key), str(val))
elt.text = text
return elt
class Gather(object):
def __init__(self, elt):
self.root = elt
def __enter__(self):
return self
def __exit__(self, type_, value, tb):
pass
def say(self, *args, **kwargs):
return Response(self.root).say(*args, **kwargs)
def play_audio(self, url):
elt = ET.Element('PlayAudio')
elt.text = url
self.root.append(elt)
return elt