HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
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