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_new/buyercall/buyercall/lib/__pycache__/util_twilio.cpython-38.pyc
U

y�Tf16�@s�ddlZddlZddlZddlZddlmZddlmZddl	m
Z
ddlmZe�
e�ZdZdZdd	�Zd
d�Zdd
�Zdd�Zdd�Zdd�Zdd�ZGdd�de�ZGdd�de�ZGdd�de�ZGdd�de�ZGdd�de�ZGd d!�d!e�ZdS)"�N)�current_app)�Client)�	AESCipher)�dbii�Qc	Cslddlm}|}tjd}|�|�}t|�}|�|j�}|�|j�}tj�	dd�r^t
||�}n
t
||�}|S)Nr��PartnershipCpaasProviders�CRYPTO_SECRET_KEYZUSE_TEST_APIF)�'buyercall.blueprints.partnership.modelsr�app�config�partnership_twilio_credentialsr�decrypt�cpaas_account_id�cpaas_api_token�getr)	�partnership_idr�partner�encrypt_key�
partner_cpaas�cipher�decrypted_user_id�decrypted_token�
twilio_client�r�I/home/arjun/projects/buyercall_new/buyercall/buyercall/lib/util_twilio.py�account_clients"

��rc
CsVddlm}|}tjd}|�|�}t|�}|�|j�}|�|j�}t	|||d�}	|	S)Nrrr)Zaccount_sid)
r	rr
rrrr
rrr)
�subaccount_sidrrrrrrrrrrrr�subaccount_client-s

�rcCslddlm}ddlm}tjd}|}|�|�}t|�}|�|j	�}|�|j
�}|�|j�}	||||	�}
|
S)Nr��	Bandwidthrr)Zbuyercall.lib.bandwidthrr	rr
r�!partnership_bandwidth_credentialsrr
rZcpaas_api_secretZ
cpaas_user_id)rrrr�partnershiprrrZdecrypted_secretr�clientrrr�	bw_clientBs

�r#c
Cs||}ddlm}ddlm}tjd}|�|�}t|�}|�|j	�}|�|j
�}|�|j�}	|j}
|j
}|||	||
|�}|S)Nrrrr)r	rZbuyercall.lib.bandwidth_api_v2rr
rr rr
rZcpaas_api_usernameZcpaas_api_passwordZ
cpaas_site_idZcpaas_location_id)
rr!rrrrrZdecrypted_account_idZdecrypted_api_usernameZdecrypted_api_passwordZsite_idZlocation_idr"rrr�bw_dashboard_clientXs&

�r$cCs(d}|dkrd\}}nd\}}|||fS)NZfemale�es)�es_mxZ	esperanza)�en_USZsusanr)�languageZgender�locale�voicerrr�select_voiceqs

r+cCs�ddlm}d�||�}|dkrFt��}|�||�|�|dt�nR|dkr�t��}t|�|�pdd�}|r�|j	�
|j|k��|j
||i�tj��dS)Nr)�Leadz
TIME_{}_{}�ringing�zin-progress)�!buyercall.blueprints.leads.modelsr,�format�time�setnx�expire�DAYS�floatr�query�filter�id�update�response_time_secondsr�session�commit)�call_status�agent_id�lead_id�redis_dbr,Ztime_keyZ
timestamp_nowZtimestamp_thenrrr�update_response_time{s�rAcCs2|pd}|d}}d|kr*|�dd�\}}||fS)z6 Split a name into (first name, last name) tuple.
    �Unknown�� ���split)�name�	full_nameZ
first_name�	last_namerrr�
split_name�s

rKc@s4eZdZdZedd��Zedd��Zedd��ZdS)	�
BusyAgentszE Track the agents that are currently busy in a call with a user.
    cs,tjtjdtjdd���fdd�|D�S)zv Return only those agents from `all_agents` who are not busy.

        :param all_agents: a list of agent ids
        �REDIS_CONFIG_URL�REDIS_CONFIG_PORT��host�portcs g|]}��d�|��s|�qS)�BUSY_{})rr0)�.0r>�r@rr�
<listcomp>�s�z*BusyAgents.filter_from.<locals>.<listcomp>)�redis�StrictRedisr
r)�
all_agentsrrTr�filter_from�s
�zBusyAgents.filter_fromcCs2tjtjdtjdd�}|�d�|�dd�dS)z Mark an agent as busy.rMrNrOrRiXrEN)rVrWr
r�setexr0�r>r@rrr�add�szBusyAgents.addcCs.tjtjdtjdd�}|�d�|��dS)z Mark an agent as available.rMrNrOrRN)rVrWr
r�deleter0r[rrr�remove�szBusyAgents.removeN)�__name__�
__module__�__qualname__�__doc__�staticmethodrYr\r^rrrrrL�s

	rLc@s$eZdZdd�Zdd�Zdd�ZdS)�	RedisAttrcCs
||_dS�N)�_RedisAttr__name��selfrHrrr�__init__�szRedisAttr.__init__cCsHt�d�|j|��|dkr0|j�|j|j�n|j�|j|j|�dS)Nz{} -> {})�log�debugr0rfr@�hdel�	_lead_key�hset)rh�instance�valuerrr�__set__�szRedisAttr.__set__cCs|j�|j|j�Sre)r@�hgetrmrf)rhro�ownerrrr�__get__�szRedisAttr.__get__N)r_r`rarirqrtrrrrrd�srdcs(eZdZ�fdd�Z�fdd�Z�ZS)�BoolAttrcs&t|�rdnd}tt|��||�dS)N�xrC)�bool�superrurq)rhrorp�redis_value��	__class__rrrq�szBoolAttr.__set__cstt|��||�}t|�Sre)rxrurtrw)rhrorsryrzrrrt�szBoolAttr.__get__)r_r`rarqrt�
__classcell__rrrzrru�srucs4eZdZ�fdd�Z�fdd�Z�fdd�Z�ZS)�JsonAttrcstt|��|�dSre)rxr}rirgrzrrri�szJsonAttr.__init__cs t�|�}tt|��||�dSre)�json�dumpsrxr}rq)rhro�dict_rprzrrrq�s
zJsonAttr.__set__cs6tt|��||�}|sdSt|t�r,|��}t�|�Sre)rxr}rt�
isinstance�bytes�decoder~�loads)rhrorsrprzrrrt�s
zJsonAttr.__get__)r_r`rarirqrtr|rrrzrr}�sr}c@s�eZdZdZed�Zed�Zed�Zed�Z	ed�Z
ed�Zed�Zed	�Z
ed
�Zed�Zed�Zed
�Zed�Zed�Zed�Zed�Zed�Zed�Zed�Zed�Zed�Zed�Zed�Zed�Zed�Zed�Ze d�Z!e d�Z"ed�Z#ed�Z$d d!�Z%d"d#�Z&e'd$d%��Z(e'd&d'��Z)d(d)�Z*d*d+�Z+d,d-�Z,d.d/�Z-d?d1d2�Z.d3d4�Z/e'd5d6��Z0d7d8�Z1d9d:�Z2d;d<�Z3d=d>�Z4d0S)@�CallStoragezK A wrapper over a Redis database for storing call-related information.
    �state�
call_order�agent_outbound_call�
agent_call_id�call_sid�bridge_call_sid_a�bridge_call_sid_b�caller_name�
caller_numberr�prompt_taskr>�manual_call�agent_disconnect_webhook_sent�routing_config�routing�
bw_conf_id�bw_conf_member_id�inbound�
start_time�connect_time�first_call_agent_id�
call_cause�cause_description�
agent_list�
pressed_digit�is_group�
is_call_retry�sip_endpoint_id�sip_call_directioncCsd||_||_d�|j�|_d�|j�|_d�|j�|_d�|j�|_d�|j�|_d�|j�|_dS)NzLEAD:{}zCALLBACK_CNT_{}zRETRY_{}zLOCK_{}z	AGENTS_{}zCALLS_{})	r@r?r0rm�_callback_cnt_key�
_retry_key�	_lock_key�_agents_key�_agent_calls_key)rhr@r?rrrri>szCallStorage.__init__cCs,|j�|jd|j�|j�|jdt�dS)Nr?�)r@rnrmr?r3r4�rhrrr�initIszCallStorage.initcCsdd�|j�|jdd�D�S)NcSsg|]}t|��qSr��int�rSrvrrrrUOsz.CallStorage.agents_to_call.<locals>.<listcomp>r���)r@�lranger�r�rrr�agents_to_callMszCallStorage.agents_to_callcs$dd���fdd�|j�|j�D�S)NcSs|�d�}t|d�|dfS)N�_rrE)rGr�)�itemZtplrrr�to_agent_call_tupleSs
z<CallStorage.current_agent_calls.<locals>.to_agent_call_tuplecsg|]}�|��qSrrr��r�rrrUVs�z3CallStorage.current_agent_calls.<locals>.<listcomp>)r@�smembersr�r�rr�r�current_agent_callsQs
�zCallStorage.current_agent_callscCs |r|jj|jft|���dSre)r@�lpushr��reversed)rh�	agent_idsrrr�set_agents_to_call[szCallStorage.set_agents_to_callcCs|j�|j�}|rt|�SdSre)r@�lpopr�r�)rhrprrr�next_agent_to_call_szCallStorage.next_agent_to_callcCs4d�||�}|j�|j|�|j�|jdt�dS)N�{}_{}r�)r0r@�saddr�r3r4�rhr>r�rprrr�push_agent_callcszCallStorage.push_agent_callc
CsJd�||�}|���,|j�|j|�|j�|j�W5QR�SQRXdS)Nr�)r0�lockr@�sremr��scardr�rrr�remove_agent_callhs
zCallStorage.remove_agent_callNc	sr|���`|j�|j�}dd�|D�}�fdd�dd�|D�D�}|rd|jj|jfdd�|D���W5QRX|S)z� Delete from Redis, and return a list of (agent_id, call_sid) pairs,
        representing the in-progress agent call attempts for the current lead.
        css$|]}t|t�r|��n|VqdSre)r�r�r�)rSrprrr�	<genexpr>tsz0CallStorage.clear_agent_calls.<locals>.<genexpr>cs:g|]2}�r"�t|d�|d�rt|d�|df�qS)rrEr�)rS�lst��	predicaterrrUus�z1CallStorage.clear_agent_calls.<locals>.<listcomp>css|]}|�d�VqdS)r�NrFr�rrrr�wscSsg|]\}}d�||��qS)r�)r0)rSr>r�rrrrU{s�)r�r@r�r�r�)rhr��valuesZ
agent_sidsrr�r�clear_agent_callsns

��zCallStorage.clear_agent_callscCs|j�|jdtd�dS)Nr�r)r@rZr�r4r�rrr�clear_callback_cnt�szCallStorage.clear_callback_cntcCst|j�|j��Sre)r�r@rr�r�rrr�callback_cnt�szCallStorage.callback_cntcCs|j�|j�Sre)r@�incrr�r�rrr�inc_callback_cnt�szCallStorage.inc_callback_cntcCs|j�|jdtd�dS)Nr.r)r@rZr��HOURSr�rrr�clear_retry_cnt�szCallStorage.clear_retry_cntcCs|j�|j�Sre)r@r�r�r�rrr�
inc_retry_cnt�szCallStorage.inc_retry_cntcCs|jj|jdd�S)N�
)�timeout)r@r�r�r�rrrr��szCallStorage.lock)N)5r_r`rarbr}r�rdr�r�r�r�r�r�r�r�rr�r>r�r�r�r�r�r�r�r�r�r�r�r�r�r�rur�r�r�r�rir��propertyr�r�r�r�r�r�r�r�r�r�r�r�r�rrrrr��sb

	

r�c@sDeZdZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZ
dZd
ZdZdS)�InboundCallState�NEW�CALLBACK�LEAD_ONHOLD�AGENT_ONHOLD�CALLBACK_PROMPT�ANSWERED�ONGOING�MISSED�BLOCKED�ERROR�MACHINE�CAPTURED�CALL_ME_BACK�DIGIT_MISSEDN)r_r`rar�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrr��sr�) r~�loggingr1rV�flaskrr
Ztwilio.restrZbuyercall.lib.util_cryptor�buyercall.extensionsr�	getLoggerr_rjr�r4rrr#r$r+rArK�objectrLrdrur}r�r�rrrr�<module>s0


$
1