1
0
forked from test/crm
jcrm/crm/twilio/api.py

61 lines
1.8 KiB
Python

from werkzeug.wrappers import Response
import frappe
from twilio.rest import Client
from .twilio_handler import Twilio, IncomingCall
@frappe.whitelist()
def generate_access_token():
"""Returns access token that is required to authenticate Twilio Client SDK.
"""
twilio = Twilio.connect()
if not twilio:
return {}
from_number = frappe.db.get_value('Twilio Agents', frappe.session.user, 'twilio_number')
if not from_number:
return {
"ok": False,
"error": "caller_phone_identity_missing",
"detail": "Phone number is not mapped to the caller"
}
token=twilio.generate_voice_access_token(identity=frappe.session.user)
return {
'token': frappe.safe_decode(token)
}
@frappe.whitelist(allow_guest=True)
def voice(**kwargs):
"""This is a webhook called by twilio to get instructions when the voice call request comes to twilio server.
"""
def _get_caller_number(caller):
identity = caller.replace('client:', '').strip()
user = Twilio.emailid_from_identity(identity)
return frappe.db.get_value('Twilio Agents', user, 'twilio_number')
args = frappe._dict(kwargs)
twilio = Twilio.connect()
if not twilio:
return
assert args.AccountSid == twilio.account_sid
assert args.ApplicationSid == twilio.application_sid
# Generate TwiML instructions to make a call
from_number = _get_caller_number(args.Caller)
resp = twilio.generate_twilio_dial_response(from_number, args.To)
# call_details = TwilioCallDetails(args, call_from=from_number)
# create_call_log(call_details)
return Response(resp.to_xml(), mimetype='text/xml')
@frappe.whitelist(allow_guest=True)
def twilio_incoming_call_handler(**kwargs):
args = frappe._dict(kwargs)
# call_details = TwilioCallDetails(args)
# create_call_log(call_details)
resp = IncomingCall(args.From, args.To).process()
return Response(resp.to_xml(), mimetype='text/xml')