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/buyercall/blueprints/phonenumbers/__pycache__/tasks.cpython-310.pyc
o

�we�}�@s�ddlZddlZddlZddlZddlZddlZddlZddlm	Z	ddl
mZddlZddl
mZmZddlZddlmZddlmZddlmZddlmZdd	lmZdd
lmZmZm Z!ddl"m#Z#ddl$m%Z%dd
l&m'Z'ddl(m)Z)ddl*m+Z+ddl,m-Z-ddl.m/Z/ddl0m1Z1m2Z2ddl3m4Z4m5Z5m6Z6m7Z7dZ8dZ9dZ:ee�Z;e#�Z<e;j=dd��Z>e;j=dd��Z?e;j=dd��Z@e;j=dd��ZAe;j=dd ��ZBe;j=d!d"��ZCe;j=d#d$��ZDe;j=d%d&��ZEe;j=d'd(��ZFe;j=d)d*��ZGdS)+�N)�BytesIO)�	AESCipher)�url_for�current_app)�lazy_gettext)�	load_only)�create_celery_app)�_try_renderer_template)�send_ses_email)�CallStorage�subaccount_client�InboundCallState)�WebhookUtil)�db)�Phone)�Lead��Agent)�User)�Contact)�PartnershipAccount�Partnership)�get_available_agents�get_routing_agents�schedule_callback�get_agent_numberii�Q�cKs�tjtjdtjdd�}t�d�tj�tj	��t
j��tj
|k���}t
j�t
j
|jk���}tj�tj
|jk���}t|dd�}|sUt�d�|��d|_tj��t||�}	t�d	�t|���d}
|j	j}|sq|j	jj}d
|	_t|j|j
�}|D]�}
z�t |
|�\}}|r�d�|�nd}|	�!��p|	j"t#j$t#j%t#j&fvr�|j'j(||j)j*t+d||
j
dd
d�t+dt,|d�|
j
|dd
d�gd�|t-d�}
|	�.|
j
|
j/�|
r�|r�t0j�t0j
|j1k���}|r�|j2|
j
kr�|
j
|_2|
j3|_4tj��ddl5m6}||�Wd�n	1�swYWq}t7�y1}zt�t8�9��t�d�|
j
��WYd}~q}d}~ww|
du�rAd|_tj��dSdS)N�REDIS_CONFIG_URL�REDIS_CONFIG_PORT��host�portzParallel call task started.T)�
expand_groupsz+No agents are available to service lead {}.�missed�Calling {} agents...F�wwww{}z!twilio_inbound.agent_digit_prompt�https��lead_id�agent_id�	_external�_schemez(twilio_inbound.agent_inbound_call_status�	dialDigit��
dial_digitr)r(r*r+)�ringing�answered�	completed��to�from_�url�status_callback�status_callback_event�send_digits�timeoutr)�send_agent_push_notification�Error calling agent {}...):�redis�StrictRedis�celery�conf�log�debugr�query�join�partnership_accountr�partnership�filter�id�one�partnership_account_id�firstr�partnership_idr�warning�format�statusr�session�commitr�len�subscription�is_groupr�twilio_subaccount_sidr�lock�state�State�NEW�LEAD_ONHOLD�CALLBACK_PROMPT�calls�create�inbound�phonenumberr�str�
AGENT_TIMEOUT�push_agent_call�sidr�
contact_idr)�	full_name�agent_assigned�!buyercall.blueprints.mobile.utilsr:�	Exception�	traceback�
format_exc)�	agent_idsr(�routing�kwargs�redis_db�lead�partner_account�partner�agents�storage�callrR�
twilio_client�agent�agent_number�	extension�digits�contactr:�e�r{�I/home/arjun/projects/buyercall/buyercall/blueprints/phonenumbers/tasks.py�call_simultaneous,s�
���



��
��
���%���
�r}c		Kstjtjdtjdd�}tj�tj��tj	��
tj|k���}tj�
tj|j
k���}tj�
tj|jk���}|jj}|sC|jj	j}t|j|j�}t||�}|���*|jtjkru|jj|jtd|ddd�d�tj|_Wd	�d	SWd	�d	S1s�wYd	S)
z�
    If nobody has picked up in 30 seconds, redirect lead to a callback
    prompt. See https://trello.com/c/Gbwmo0Ox/ for discussion.
    rrrz#twilio_inbound.lead_callback_promptTr&)r(r*r+)r5N)r<r=r>r?rrBrCrDrrErFrGrJrIrrKrRrrTrrUrVrWrYr[�route�call_sidrrZ)	r(rlrmrnrorprRrtrrr{r{r|�redirect_to_callback_prompt�s6���



�
�"�r�cKs�tjtjdtjdd�}tj�tj��tj	��tj
��tj|k��
�}|s(dStj�tj|jk��
�}tj�tj|jk��
�}t||�}|j}|sQt�d�dS|jtjkrbt�d�|j��dSd|d<||_|jj}|st|jj	j}t|j|j�}	|��t|�}
|
s�t�d	�|��t|�dStj|_d
|_ t�!d�t"|
���d}t#�$d|j�|
D]�}z[t%||�\}
}|r�d
�|�nd}|�&��<|jtjkr�|	j'j(|
|j
j)t*d||jddd�t*dt+|d�|j|ddd�ddg|t,d�}|�-|j|j.�Wd�n	1�swYWq�t/�y/}zt�t0�1��t�d�|j��WYd}~q�d}~ww|du�rCd|_2t3j4�5�t|�dSdS)�; Scheduled callbacks for missed leads (1, 6, 12 hours)
    rrrNz,Callback routing missing; canceling callbackz1Lead state {} instead of CALL_ME_BACK; canceling.�simultaneous�	callOrder�%No available agents to serve lead {}!Fr$�operational_start_callr%�"twilio_inbound.agent_callback_leadTr&r'�)twilio_inbound.agent_callback_call_statusr,r-r0r1r2r;r#)6r<r=r>r?rrBrCrDrrEr]rFrGrJrIrrKrrkr@rLrVrW�CALL_ME_BACKrMrRrrT�inc_callback_cntrr�CALLBACKrSrArQ�	webhooker�trigger_generic_webhookrrUr[r\r^rr_r`rarbrgrhrirNrrOrP)r(rlrmrnrorprrrkrRrtrqrsrurvrwrxrzr{r{r|�
callback_lead�s����

�

�
��������

�r�cKs0tjtjdtjdd�}ddlm}tj�tj	��t
j��tj��
tj|k���}|s.dSt
j�
t
j|jk���}tj�
tj|jk���}t||�}	||	_d|	_i|	_|j	j}
|
s_|j	jj}
t|
j|j�}|j�
|j|k���}|s}t�d�|��dStj|	_d	|	_ t�!d
�|��d}
zUt"||�\}}|r�d�|�nd}|	�#��7|	jtjkr�|j$j%||jj&t'd||jd
dd�t'd|j|d
dd�ddg|t(d�}
|	�)|j|
j*�Wd�n1s�wYWn#t+�y}zt�,t-�.��t�,d�|j��WYd}~nd}~ww|
du�rd|_/t0j1�2�dSdS)r�rrr�rN�TruezCannot find agent with ID {}!FzCalling agent with ID {}...r%r�Tr&r'r�)r)r(r*r+r0r1r2r;r#)3r<r=r>r?�
agents.modelsrrrBrCrDrrEr]rFrGrJrIrrKrrk�manual_call�routing_configrRrrTr@�errorrMrWr�rVrSrArrUr[r\r^rr`rarbrgrLrhrirNrrOrP)r(r)�
call_settingsrlrmrrnrorprrrRrtrursrvrwrxrzr{r{r|�connect_lead_to_agents����


���������
�r�cKsttjtjdtjdd�}|�d�D�]$}t|�d|��}t��|dtkr7t	�
d�||��|�d|�qt
j�t
j��tj��t
j��t
j|k���}|s_t	�d�|��|�d|�qtj�tj|jk���}tj�tj|jk���}|jj}|s�|jjj}t|j|j�}t||�}	tj |	_!d|	_"|	j#}
t$|
�}|s�t	�d	�|��qt	�%d
�t&|���d}|D]�}
z\t'|
|
�\}}|r�d�|�nd}|	�(��=|	j!tj k�r|j)j*||jj+t,d
||
jddd�t,dt-|
d�|
j|ddd�ddg|t.d�}|	�/|
j|j0�Wd�n	1�s
wYWq�t1�y6}zt	�t2�3��t	�d�|
j��WYd}~q�d}~wwqdS)zu
    Task which executes every minute, and tries to call back leads which
    have asked to be called back soon.
    rrrr�r�zQLead {}, added at {}, is probably not waiting for our callback anymore. Removing.z0Lead {} not found - removing from callback list.Fr�r$Nr%r�Tr&r'r�r,r-r0r1r2r;)4r<r=r>r?�hkeys�float�hget�time�HOURSr@�inforM�hdelrrBrCrDrrEr]rFrGrJrLrIrrKrRrrTrrWr�rVrSrkrrArQrrUr[r\r^rr_r`rarbrgrhri)rlrmr(�
time_addedrnrorprRrtrrrkrqrsrurvrwrxrzr{r{r|�call_me_backbs�������

�
�
����������r�c
Ksptj�tj|k���}tj�tj|jk���}|j}|j}|||d�}t	dddi|��}	t
|g|jd|	d�dS)N)r^�company�partner_logo�mail/new_number�ext�htmlzNew Phone Number Notification��
recipients�p_id�subjectr�)r�)rrBrFrGrJrrK�name�logor	r
)
r^�emailrIrlrorp�partnership_name�partnership_logo�ctx�tn_email_templater{r{r|�send_phonenumber_email�s
�r�c	Ks`tj�tj|k���}|}d�|�}t�|�}t�	d�|��|dkr.t�
d�|j��dSt��j
}zd�||j|jd|�}	t�	d�|	��Wt�	d	�nt�	d	�wtjd
tjdtjdd
�}
|
jt|j�tjd|	ddidd�t�d�|	��tj�tdd���tj|k���}d�tjd|	�|_tj��t�d�|j|j��t�d|j�dS)za After the call, grab the first recording from Twilio, if any, and
        upload to S3.
        z{}.wavzThe recording url is {}rz No recordings found for lead {}!Nz{}_{}/{}_{}_{}�	recordingzThe recording key is {}z#Could not set key for recording url�s3�AMAZON_ACCESS_KEY�AMAZON_SECRET_KEY)�aws_access_key_id�aws_secret_access_key�RECORDING_BUCKETzContent-Typez	audio/wav�private)�Body�Bucket�Key�Metadata�ACLzUploaded file {}rG�
recording_urlz{}::{}z/Lead {} have been updated with recording url {}�operational_end_call)rrBrFrGrJrM�requests�getr@rArL�uuid�uuid4�hexrI�boto3�clientr>r?�
put_objectr�contentr��optionsrr�rrOrPr�r�)r(�r_url�partner_namerlrn�r�f�fr�	hex_value�keyr�r{r{r|�tw_upload_recording�sH


�����
r�c	Kstj�tj|k��tj�����}t�	d�
|��tj�tj|jk��tj
|k���}|rLt�	d�
|j��|j|_||_t�	d�
|j��tj��nt||||d|d�}tj�|�tj��t�	d�tj�tj|jk��tj
|k���}|r�|j|_tj��dSt�	d�dS)Nzlatest lead: {}za lead exist with number {}zThe updated date is: {}�)�	firstname�lastname�	caller_id�
phonenumber_1r�rIzThe contact has been addedzno lead contact exist)rrBrFr^�order_by�
created_on�descrJr@r�rMrr�rI�
updated_onr�rrOrP�addrGrc)	r^r�r��
callernamerIrl�latest_leadry�new_contactr{r{r|�add_tw_contactsB"
���


��r�c#
Ks$tjtjdtjdd�}ddlm}tj�tj	|k��
�}t||j	�}|jr/t
j�d�dStj�tj	|jktj|jk��
�}|sDdS|j}|j}|r\d|vsZd|vr\|ddkr\dSg}	g}
d}tj�tj|jktjtj�d	�tjd
k��
�}|r~|j}dd�|jd
dD�}
dd�tj�td���tj|jktj	�|
����D�}t j�t j	|jk��
�}t!j�t!j	|j"k��
�}|ddkr�|j#dkr�|	�$||d��|dr�|	�$|�|dr�|r�|	�%|�|ddk�r|	�$||d��|dr�|	�$|�|d�r|�r|	�%|�|	�st
j�&d�'|j#��dSt(|�}t)�*d�}|j+�,|��-d�|d<|j.�,|��-d�|d<|j/|d<|j0|d<|j1|d <|j2�rY|j2d!t3|j4�|d"<nt5d#|j4d$d%d&�|d"<|j6�rxd'|d(<d)�7|j6d*|j8f�|d+<|j9�r�d,|d-<|j9|d.<t:�;d/�'|j<��|j<�r�d0|d1<nd|d1<|j=�r�|j=|d2<|j>�r�|j>j�?d3d)�|d4<�z�t
j�d5�'|	��|�?d6��r�|d7du�r�|d7d)u�r�||d7�}|du�r�|
�$|�n|
�%|d7�d8|j#|d9<d)|d:<|j@}|j=}|j>jA}|j1}|�r	||d;<nd)|d;<|j	}|�r||d<<nd)|d<<|du�r7|d)u�r7tB|�dk�r7|d9d=||d9<|du�rO|d)u�rO|d9d>||d9<||d:<|du�rc|d)u�rc|d9d?||d9<d)|d@<d	|dA<dBdClCmD}mE}|j�|j	|j4k|j|jk��
�}|�r�|jF�r�|j�|j	|jFk��
�}|�r�d$|dA<|jG|d@<|
du�r�tB|
�dBk�r�tHdTdEdFi|��}tI|
|j	|j1dG|dH�|j#dk�r�|jJtKjLk�r�tHdUdEdJi|��}tI|	|j	|j1dK|dL�WdS|j#dk�r|jJtKjMk�rtHdUdEdJi|��}tI|	|j	|j1dK|dL�WdS|j#dMk�s!|j#dk�r9|jJtKjNk�r9tHdVdEdJi|��}tI|	|j	|j1dO|dL�WdS|j#dPk�r^|jJtKjOk�r^tHdWdEdJi|��} tI|	|j	|j1dR| dL�WdStHdWdEdJi|��}!tI|	|j	|j1dS|!dL�WdStP�y�}"zt
j�QtR�S��WYd}"~"dSd}"~"ww)XNrrrr�)�split_emailszNotification email suppressed.�notifyLeads�noneF�admincSsg|]}|d�qS)rGr{��.0�ar{r{r|�
<listcomp>Ts�zsend_email.<locals>.<listcomp>�defaultRoutingrqcSsg|]}|j�qSr{)r�r�r{r{r|r�Ws��r�r#�notifyMissedCustom�notifyMissedAgents�notifyMissedMe�all�notifyAllCustom�notifyAllAgents�notifyAllMez%Nowhere to send {} lead notification!z
US/Easternz%cr�r��adf_updated_onr�r�z/contacts/contact/�lead_contact_urlzcontacts.contact_lead_pageTr&)rGr*r+zCaller Name:�caller_name_labelr�� �caller_namez
Caller Id:�caller_id_labelr�zThe lead recording url is {}�block�vm_div_style�call_source�hiddenInformation�	referencezThe email list are {}�	notifyAdf�notifyAdfCustomz
Call status: �
lead_comments�receiver�vendor_name�call_lead_idz, Agent name: z, Call source: z, Phonenumber: �
campaign_name�campaign_existsr)r�	Campaigns�
mail/adf_leadr��txtz - ADF lead notification�r�r�r��text�mail/missed_leadr�z - Missed lead notificationr�z
retry-pending�mail/call_backz% - Missed Call-back lead notificationr1�mail/captured_leadz - Answered lead notificationz - New lead notification)r)r)r)r	)Tr<r=r>r?�widgets.modelsr�rrBrFrGrJrr��app�loggerrAr�
inbound_idrI�
notificationsr�r�active�is_deactivated�is_�roler�rr�r�in_r�rrrKrN�extend�appendrLrM�vars�pytz�timezoner��
astimezone�strftimer��interaction_timer�r��partner_urlr_rcrr�rCr�r�r@r�r��sourcer]r��
agent_namer^rQ�$buyercall.blueprints.contacts.modelsrr�campaign_id�display_namer	r
rVrW�MISSEDr�r��CAPTUREDrgr�rhri)#r(rlrmr�rnrrr]r�routings�emails�
adf_emails�
user_email�userrj�agent_emailsrorpr��eastern�multi_adf_emailsr�
friendly_namer^�
dealershipr�rrry�campaign�adf_lead_email_template�missed_lead_email_template�callback_lead_email_template�completed_lead_email_template�captured_lead_email_templaterzr{r{r|�
send_email)sh

��

���

��




�






�


"

��
��
���&�����r4c
Ks6|dd}|dd}|dd}|dd}|dd}|ddd}||||||d	�}d
dlm}	m}
m}|j�td���|j|k��	�}|	j�|	j
|jk��	�}
tj
d
}|
�|j�}t|�}|�|j�}ztdddi|��}t|g|
j
d|d�WdSty�}zt�t���WYd}~dSd}~ww)N�Notification�SubscriptionId�Status�Message�OrderId�	OrderType�CompletedTelephoneNumbers�TelephoneNumber)�sub_idrN�message�order_id�
order_type�numberr�)r�PartnershipCpaasProviders�(PartnershipCpaasPhoneNumberSubscriptionsrK�CRYPTO_SECRET_KEY�mail/subscription_webhook_emailr�rz'Bandwidth Subscription Webhook Responser)rE)�partnership.modelsrrBrCrBr�rrF�subscription_idrJrGrKr>r?�!partnership_bandwidth_credentialsr�decrypt�cpaas_api_usernamer	r
rgr@r�rhri)�datarlr=rNr>r?r@rAr�rrB�SubscriptionTable�subrp�encrypt_key�
partner_cpaas�cipher�decrypted_email�subscription_email_templaterzr{r{r|�send_callback_emails@���
���rS)Hrh�loggingr@r��botor�r�r��ior�buyercall.lib.util_cryptorr<�flaskrrrr�flask_babelr�_�sqlalchemy.ormr�
buyercall.appr�buyercall.lib.flask_mailplusr	�buyercall.lib.util_ses_emailr
�buyercall.lib.util_twiliorrr
rW�buyercall.lib.util_webhooksr�buyercall.extensionsr�(buyercall.blueprints.phonenumbers.modelsr�!buyercall.blueprints.leads.modelsr�"buyercall.blueprints.agents.modelsr� buyercall.blueprints.user.modelsrrr�'buyercall.blueprints.partnership.modelsrr�)buyercall.blueprints.phonenumbers.routingrrrrr��DAYSr`r>r��taskr}r�r�r�r�r�r�r�r4rSr{r{r{r|�<module>sj
^
$
`
P
Z

/
'
X