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__/views.cpython-310.pyc
o

�we���@s�ddlZddlZddlZddlZddlZddlmZddlmZddl	m
Z
ddlZddl
Z
ddlZddlmZmZddlmZmZmZmZmZmZmZmZmZmZddlmZmZddl m!Z!m"Z"ddl#m$Z$dd	l%m&Z&m'Z'dd
l(m)Z)ddl*m+Z+m,Z,ddl-m.Z.m/Z/dd
l0m1Z1ddl2m3Z3ddl4m5Z6ddl7m8Z8m9Z9ddl:m;Z;ddl<m=Z=ddl>m?Z?ddl>m@Z@ddlAmBZBmCZCddlDmEZEmFZFmGZGddlHmEZIddlJmKZKddlLmMZMddlNmOZOddl*mPZQedeRdd�ZSdZTGd d!�d!eU�ZVeSjWd"d#d$gd%�ee3d&d'd(�d)d*����ZXeSjWd+d#gd%�ee3d&�d,d-����ZYeSjWd.d$gd%�ee3d&�d/d0����ZZeS�Wd1�ee3d&�d2d3����Z[eS�Wd4�e?j\ee3d&�d5d6�����Z]eS�Wd7�ee3d&�d8d9����Z^eSjWd:d#gd%�ee;e3d&�d;d<�����Z_eSjWd=d#gd%�ee;e3d&�d>d?�����Z`eSjWd@d$gd%�ee;e3d&d'd(�dAdB�����ZaeSjWdCd#gd%�dDdE��ZbeSjWdFd#gd%�ee;e3d&d'd(�dGdH�����ZceSjWdFd$gd%�ee;e3d&�dIdJ�����ZddKdL�ZedrdNdO�ZfdsdPdQ�ZgdrdRdS�ZheSjWdTd#gd%�dUdV��ZieSjWdWdXgd%�ee;e3d&d'd(�dYdZ�����ZjeSjWdWd[gd%�ee;e3d&d'd(�d\d]�����Zkd^d_�Zld`da�ZmeSjWdbd#gd%�ee;e3d&d'd(�dcdd�����Zndtdedf�Zodudhdi�Zpdjdk�ZqeSjWdld#d$gd%�e;e3d&�edmdn�����ZreSjWdod#d$gd%�e?j\dpdq���ZsdS)v�N)�closing)�StringIO)�date�datetime)
�	Blueprint�request�flash�url_for�jsonify�redirect�current_app�send_from_directory�
make_response�render_template)�login_required�current_user)�or_�and_)�text)�func�case)�	PhoneForm)�PartnershipAccount�Partnership)�	HoldMusic�Phone��Endpoint)�
role_required)�gettext)�
DataTables�ColumnDT)�subscription_required)�format_phone_number)�csrf)�db)�	AESCipher�
AESCipherDome)�	bw_client�account_client�subaccount_client)r()�BandwidthException)�TwilioRestException)�Lead)�(PartnershipCpaasPhoneNumberSubscriptions�phonenumbers�	templates)�template_folderi@c@seZdZdd�ZdS)�ClientErrorcCs
||_dS�N)�message)�selfr4�r6�I/home/arjun/projects/buyercall/buyercall/blueprints/phonenumbers/views.py�__init__>s
zClientError.__init__N)�__name__�
__module__�__qualname__r8r6r6r6r7r2=sr2z/inbound_onboarding�GET�POST)�methods�admin�partner�sysadmincCsBtjdkr
dt_tj��tjrttd�d�t	t
d��Std�S)Nr=Tz�Great, you are ready to get started with the Inbound Routing Wizard feature. Remember to checkout the support section or FAQ if you have any additional inbound routing questions.�success�phonenumbers.inbound_listz&phonenumbers/inbound_onboarding.jinja2)r�methodr�inbound_onboardr%�session�commitr�_rr	rr6r6r6r7�onboarding_inboundCs

�rIz&/inbound/install-instructions/<int:id>c
Cs"tj}tj}tj}|r|rtj}n
|s|rttd��Stj�	tj
|ktj|k���}|dur4ttd��S|j�
dd�dkr?dnd}gd�|jd	d
}|j�
d�}|dkrYd
}n	|dkr`d}nd}|j�
d�dkrldnd}	|j�
d�rvdnd}
|j�
d�r�dnd}|dkr�d�dd�|j�
d�|j�
d�|j�
d�fD��}nd}t	d3id|�d|j�d|j�d |j�d!|j�d"|j�d#|j�d$|j�d%|j�d&|�d'|�d(|�d)d�|j��d*|	�d+|
�d,|j�
d,�r�dnd�d-|j�
d.�r�dnd�d/|j�
d0�r�dn
d�d1|�d2|��S�d1|�d2|��S)4N�partnership.company_accounts�
.inbound_list�whisperMessageType��audiozCustom audio filezText to speech)�Never�Once�Twice�defaultRouting�retryRouting�notifyLeads�missedzMissed calls only�allz	All calls�Disabled�routingType�digits�Enabled�recordCalls�callBackz, css�|]
}|rd�|�VqdS)z{} minN)�format��.0�xr6r6r7�	<genexpr>�s��z'install_instructions.<locals>.<genexpr>�
firstCallBack�secondCallBack�
thirdCallBack�(phonenumbers/inbound_instructions.jinja2�id�phonenumber�friendlyname�source�type�status�agents_list�mobile_agent_email�mobile_agent_id�greeting_messages�retry_count�
notifications�notification_recipients�auto_attendance�call_recording�	voicemail�
hold_music�
playHoldMusic�custom_hold_music�customHoldMusic�
call_backs�call_back_intervals)re)r�partnership_account_id�is_admin_user_with_groups�is_viewing_partnership�'get_user_viewing_partnership_account_idrr	r�query�filterrf�first�routing_config�getrq�joinrrg�
friendly_namerirj�activerlrmrnrr)
rfr|�is_admin_in_group�viewing_partnership_account�inboundrorp�notify_leadsrqrsrtrzr{r6r6r7�install_instructionsUs�������
��
��



����������	�
���
�������������r�z$/inbound/email-instructions/<int:id>cCsddlm}tj}tj}tj}|r|rtj}n
|s!|r!ttd��Sz\z2t	j
�t	j|kt	j|k��
�}|sEttd��WWttd|d��Stjd}|�|j||j�Wntykt�t���ttd�d	�Yn
wWttd|d��SWttd|d��Sttd|d��YS)
N�)�send_phonenumber_emailrJrKz.install_instructions)rf�emailz(Sorry, we were unable to send the email.�danger)�tasksr�rr|r}r~rrr	rr�r�rfr�r�form�delayrg�	Exception�log�error�	traceback�
format_excrrH)rfr�r|r�r�r�r�r6r6r7�email_instructions�s:��	
�����,r�z/inboundcCs�tj}tj}tj}|r|rtj}n
|s|rttd��Stjdur&ttd��S|tjk}tj	�
|���}tj}|duo>|j
dk}td||d�S)NrJFzphonenumbers.onboarding_inboundr�z phonenumbers/phonenumbers.jinja2)r/�
subscribed)rr|r}r~rrr	rErr�r��count�subscriptionrkr)r|r�r��	filter_by�paginated_phoner��
subscripedr6r6r7�inbound_list�s"

�r�z/phone-datac
Cs�tj�dd�}ttj�dd��}tj�dd�}ttj�dd��}ttj�d	d
��}gd�}tj}tj}|r8tj}tj	�
tj|ktj�d��}t
j	�
t
j|k��t
jt�d
��d���t
j���}	|}
|r~d�|�}|�
ttj�|�tj�|�tj�|���}
|
�|	tj|	jjkf��tjtjtjtj�d�t|	jj �d�dfg|	jj d��d�tj!tj"�}
|
}d|kr�t#|�kr�nnd�|||�}
|�$t%|
��}|�&|��'|�}dd�|�(�D�}t)tjd|
�*�|�*�|d�S)�Return server side data.z
search[value]rMzorder[0][column]z-1z
order[0][dir]�asc�startr�length�c�rfr�rgrj�
lead_count�
created_on�
updated_onFr�r�z%{}%rjN)�else_z{} {}cSsg|]}dd�t|�D��qS)cSsi|]\}}||�qSr6r6)r_�i�colr6r6r7�
<dictcomp>"sz#data.<locals>.<listcomp>.<dictcomp>)�	enumerate)r_�rowr6r6r7�
<listcomp>!s�zdata.<locals>.<listcomp>�draw)r��recordsFiltered�recordsTotal�data)+r�argsr��intrr|r~rrr�r��is_deactivated�is_r-�
with_entities�
inbound_idr�sum�label�group_by�subqueryr]rr��ilikerg�like�	toll_type�	outerjoinrf�crr�r�r��len�order_byr�offset�limitrVr
r�)�search�order�	directionr�r��columnsr|r��total�leads�filtered�pattern�sorted_�
order_predr�r6r6r7r��s|
����



��
�����r�z/inbound/csvcsbgd�}gd�}ttj�ttj�ttj�ttj�ttj�ttj�ttj�g}t	j
}t	j}|r1t	j}t
j���t��tj��|tj
k�}ttj||�}|��}d}tt���R}	t�|	�}
|
�|�|dD]��fdd�t����D�}|d7}||d<|
�|�qdd�t� ��!d	��}t"|	�#��}
d
|
j$d<d�|�|
j$d
<|
Wd�S1s�wYdS)r�)�Noz
Friendly NamezPhone Number�Typez
Lead Countz
Created Onz
Updated Onr�rr�csg|]}�|�qSr6r6)r_�key�r�r6r7r�Yszdata_csv.<locals>.<listcomp>r�z#Buyercall Inbound Routings - {}.csvz%Y-%m-%dztext/csvzContent-Typezattachment; filename="{}"zContent-DispositionN)%r!rrfr�rgrjr�r�r�rr|r~rr%rFr��select_fromr�r�r rr��
output_resultrr�csv�writer�writerow�sorted�keysr]r�today�strftimer�getvalue�headers)�header�fieldsr�r|r�r��	row_table�result�row_no�outr��csv_row�filename�respr6r�r7�data_csv.sJ�	�

�
�$�r�z/inbound/newc
Cs�t�}t|d�}tj}tj}tj}|r|rtj}n
|s#|r#ttd��Stj	�
|tjk���}tj	�
|tjk��
tjdk���}ddl
m}|j	�
|j|k���}t|j�}	tjj}
|
j}||kr�t�d�|��t�d�|��tjjdkr�ttd	�d
�ttd��Sttd�d
�ttd��St�d�|��t�d�|��tj	�
|tjk��
tjdk��
tjdk���}|
j}
t�d�|��t�d�|
��td|||||
||	d�S)N��objrJ�0r��Agentz)the subscription phone number limit is {}z$the current phone number total is {}�partnershipsinglez�You have reached your plans phone number limit. Please <a href=/support style=color:#ffffff><strong>contact BuyerCall support</strong></a> if you are interested in more phone number and call features. �warningrCz�You have reached your plans phone number limit. Please <a href=/subscription/update style=color:#ffffff><strong>Upgrade your plan</strong></a> to active more phone numbers r��priorityz'the user has {} active priority numbers�phonenumbers/wizard.jinja2)r��phone�total_phonenumbers�total_active_priority_numbers�plan_priority_limit�agent�agent_phone)rrrr|r}r~rrr	r�r�r�r��"buyercall.blueprints.agents.modelsr�r�r#rg�partnership_accountr��phonenumber_limitr��infor]�planrrHrj�priority_number_limitr)r�r�r|r�r�r��total_active_phonenumbersr��
partner_agent�partner_agent_phoner��plan_number_limitr�r�r6r6r7�inbound_newjsx
�����
�������rz/inbound/<int:id>cCs�tj}tj}tj}|r|rtj}n
|s|rttd��Stj�	tj|ktj
|k���}|s9td�
|��ttd��S|j}ddlm}|j�	|j|k���}t|j�}|��}	t�d�
|	��|	d�dd	�r�|	d�d
d	�r�|	d�dd	�r�|	d�dd	�}
|
�dd
�d�d�d�dd�}tjd}ddlm}
|
||�}||	dd<t�d�
|	��t�|	��dd�}td|||||d�S)NrJz%Inbound routing with ID {} not found.rCrr�zThe pre-routing data is: {}�
routingConfig�configSMSSetuprM�SMSAutoReply�SMSAutoReplyImageUrl�/�����?z%20� �
MMS_BUCKET)�generate_presigned_aws_urlzThe post-routing data is: {}z</z<\/r�)�
model_datar��caller_whisperr�r�) rr|r}r~rrr	rr�r�rfr�rr]�	caller_idr�r�r#rg�as_dictr�r�r��split�replace�app�config�buyercall.lib.util_boto3_s3r�json�dumpsr)rfr|r�r��routingrr�rr�routing_data�mms_url�	media_key�bucketr�presigned_mms_url�json_routing_datar6r6r7�phonenumber_edit�sX���
��"

�r"z/inbound/hold-musicc	Csdd�}tjd}t�|j���d}|stdd�S||�s&td�|�d�S|jr3|jt	kr3tdd�St
t���}t�
tjd	|�}|�|�t�|�t	krXt�|�tdd�Stj}tj}|rctj}t|||jd
�}tj�|�tj��ddlm}|tj|j|�t ||jd�S)
NcSs|dvS)N)z.mp3z.wavr6)�file_extr6r6r7�allowed_file�sz'upload_hold_music.<locals>.allowed_file�filer�zError uploading file.�zFile extension not allowed: {}zFile too large.�
UPLOAD_FOLDER)r|�uuidr�)�bw_upload_holdmusic)�guidr�)!r�files�path�splitextr��lowerrr]�content_length�
MAX_FILE_SIZE�strr(�uuid4r�rr�save�getsize�os�removerr|r~rrr%rF�addrG�bw_tasksr)rfr
)	r$r%r#�	file_guid�	file_pathr|r�rvr)r6r6r7�upload_hold_music�s:





�
r;z/inbound/hold-music/<file_guid>cCs t�tjdd�}t||dd�S)Nr'rvz
audio/mpeg)�mimetype)r,r�rrr
)r9�file_dirr6r6r7rv srvz/api/inbound/routingscCs
tgd�S)N�r�)r
r6r6r6r7�get_routings&s
r?c
Cs�tj}tj}|rtj}tj}t|d�}|d|_|d|_|d|_	|d|_
|d|_|d|_|d|_
|d	|_|d
dk|_|d
dk|_|d	d
vrQdnd}||_zct�d�|��|dkr�|d	dkr�|j�d�d}t��jdd�}d�|||j�}t��jdd����dd��dd��dd�}|}	t|||	�n
t|�n|dkr�t|�|��t |�!��WSt"y�t�#t$�%��t&j'�(�YdSw)N)r|�phoneNumber�friendlyNameri�channel�callerIdr�notificationConfigrj�typePn�local�tollfree��tracking�mobile�	bandwidth�twiliozPurchasing number from {}rJ�@r�z{}{}_{}�r��X�o�Y�e�E)z#Error while purchasing phone numberi�))rr|r~rrrrrgr�rirBrr�rqrjrFrG�providerr�r�r]rmrr(r2�hexr.r�purchase_bw_mobile�purchase_bw�purchase_twilio�connect_audio_filesr
rr�r�r�r�r%rF�rollback)
�current_partnership_account_idr��modelrrU�username�username_hex�sip_username�
random_pwd�sip_passwordr6r6r7�create_routing.sP�







.

�rcc
Cs�d}t|�}ddlm}|j�t|jdk|j|k����}|durK|j	j
|jd�}|durK|D]}d|vrJ|d}d|vrJ|d}	|	|krJd}|Sq/|S)NF���Domain)�	domain_id�credentialsr^T)r(�
mobile.modelsrfr�r�rr��partnership_idr��domains�
get_endpointsrg)
rjr`�exists�clientrf�domain�found_endpoints�endpoint�credr^r6r6r7�endpoint_exists_check_bwis*��rsFcCs|r|durt�d�|j}nt�d�tj}ddlm}m}m}|j	�
|j|k���}t|j
�}tj	�
tjdk���}	|	sud�tj�d�td��}
|jjd|
d	d
�}|�dd�d
}td|j
d||
d�}
tj�|
�tj��t�d�tj�dd�r�t�d�tjd}tjd}|j�|�}|dkr�|}ttjd�|_ n\t!t"d�d�t�d�dS|j }|�#dd�}t�d�|��|j$j%t&|�d�||j|j'|j(�|d�}|�dd�d
}|j)�dd�r�d}nd }dd!l*m+}|j,t&|�|j
|d"|gd#d$�||_-tj�|�tj��dS)%N�1Purchasing via API call. Using API token details.�4Purchasing via frontend. Using current_user details.r�rr�PartnershipCpaasProviders�orders�https://{}{}�
SERVER_DOMAIN�"phonenumbers.subscription_callback�
3153600000��
order_type�callback_url�expiryr	r�rrK��cpaas_provider_namerjr~�subscription_idr�9A new subscription has been added for phone number orders�DEBUGF�,DEBUG is enabled; not purchasing the number.�BANDWIDTH_CALLER_ID�BANDWIDTH_ORDER_ID���CThe bandwidth test number does not exist. A 404 error was received.r�rM�+1z<The phone number passed to the BW Dashboard Order API is: {}�{}:{} - ({}) - {}��partner_account_id�namergr�on�off��	update_tnrI��r��	countdown).r�r�rfrr|�'buyercall.blueprints.partnership.modelsrrrwr�r�r��bw_dashboard_clientrj�NumberSubscriptionr~r]rrr�r	�
subscriptions�	subscribe�rsplitr%rFr7rGr��in_service_number�validater#rgrrHr�
phone_numbersr�r1rjr�r�r8r��apply_async�twilio_number_sid)r�api_callr�r|rrrw�partner_account�dashboard_client�current_subscription�
call_back_url�create_subscriptionr�r��test_number�
test_order_id�valid_test_number�bw_number_id�unformatted_phone_number�bw_pn_formatted�order_bw_number�sms_enabledr�r6r6r7rX�s�

�
�
���





����rXc+Cs$|r|durt�d�|j}nt�d�tj}ddlm}m}m}	|j	�
|j|k���}
|j	�
|j|
jk���}t
|jdd�}tj	�
tjdk���}
|
s�d�tj�d	�td
��}|jjd|dd�}|�d
d�d}td|jd||d�}tj�|�tj��t�d�tj�dd�r�t�d�tjd}tjd}|j�|�}|dkr�|}ttjd�|_ nRt!t"d�d�t�d�dS|j }|�#dd�}t�d�|��|j$j%t&|�d�||j|j'|j(�|d�}|�d
d�d}d }dd!l)m*}|j+t&|�|
j|d|gd"d#�||_,tj�|�tj��dd$l-m.}|j	�
t/|j0�1d�|j|jk����}|�r7|du�r7|du�r7|}nd%�|j2�}|j3j4|j5|j6||d&�}t�d'�|j7�8���t9|j:�d(|j:k�rt;�<|j7�8��}t=�>t=�?|��} | d)d*d+d,}!d-|d.|j6}"| d)d*d+d/}#| d)d*d+d0}$| d)d*d+d1}%t�d2�|!��|j@�d3��d4�}&|&d�d5�}'tAjB||jC|!|"||d6|j|'||jd|$|%d7�tAj	�
t/tAjD|#ktAj0�1d�����}(t�d8�|
j2��dd9lEmF})|)|(jD|(jG|
j|
j2|jH�}*|*|(_Itj��dSt�d:�||
j��dS);NrtrurrvrJ��tn_typerxryrzr{r|r}r	r�rrKr�r�r�Fr��BANDWIDTH_CALLER_ID_MOBILEr�r�r�r�rMr�z=The mobile number passed to the BW Dashboard Order API is: {}r�r�r�r�r�r�rez-{} sip domain endpoint for mobile account use)�realm_id�realmr`rbzThe sip response is: {}i,�SipCredentialsResponse�ValidSipCredentials�
SipCredential�Idzsip:rM�UserName�Hash1�Hash1bzThe endpoint id is: {}rR�agentsrfT)�hash_1�hash_1_bzThe partner name is {})�qr_codez<Unable to create endpoint for sip username {} and account {})Jr�r�rfrr|r�rrrwr�r�r�rjr�r�r~r]rrr�r	r�r�r�r%rFr7rGr�r�r�r#rgrrHrr�r�r1rjr�r8r�r�r��"buyercall.blueprints.mobile.modelsrfrr�r�r��realms�create_sip_credentialsrg�	sip_realm�content�decode�print�status_code�	xmltodict�parser�loadsrr�r�createrUr`�!buyercall.blueprints.mobile.tasksr�rb�cloud_id�qr_url)+rr`rbr��api_sip_descriptionr�r|rrrwr�r@r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rfr��sip_descriptionrq�endpoint_content�json_endpoint_content�endpoint_id�endpoint_uri�endpoint_username�endpoint_hash_1�endpoint_hash_1_br��agent_id�sip_endpointr��qrr6r6r7rW�s�

��
���





��
��
 ��	
�
���
�
�rWc	Csr|r#|dur#|j}t�d�|jdur|jj}n|jjdur"|jj}nt�d�tjj}tj}ddlm	}m
}|j�|j|k��
�}|j�|j|jk��
�}t||j�}	tj�dd�rht�d�|	j��d}
n|jru|	jjj|jd�}
n	|	jjj|jd	�}
|
j|_|
j|_|	jj|
jd�}tj�|�tj� �|dj!t"d
|jddd
�t"dddd�t"d|jddd
�dd�dS)Nrtrur�rrr�Fr���phone_number)rgz twilio_inbound.lead_inbound_callT�https)r��	_external�_schemez#twilio_inbound.call_result_callback)r�r�z#tw_sms_inbound.lead_inbound_message)�	voice_url�status_callback�sms_url�voice_caller_id_lookup)#rfr�r�r��twilio_subaccount_sid�partnershiprr|r�rrr�r�r�rjr*rrr�r��incoming_phone_numbers�listrFr�rg�	toll_free�sidr�r�r%rFr7rG�updater	)rr�r�r|r�rrr�r@rn�
twilio_number�numbersr6r6r7rYysl


�
�
���
���
�rYz/api/inbound/routings/<int:id>cCs@tj}tj}|rtj}tj�tj|ktj|k���}t	|�
��Sr3)rr|r~rrr�r�rf�oner
r)rfr|r�rr6r6r7�get_routing�s��r�z/api/inbound/routings/<int:id_>�PUTc
CsHtj}tj}|rtj}tj}t�d|���tj	�
tj|ktj|k���}|d|_
|d|_|d|_|d|_|d|_tj��|��tj	�
tj|k���}tj�d�s�|j�d�sc|jd	krfd
}nd}|jdkr�|j
}|�d
d�}|jd	kr�t|jd	d�}	|	j j!t"|�||d�nt|j�}	|	j j!t"|�||d�t#|�$��S)Nzrequest data is:r@rArrCrDr�rrJr�r�rKr�rMr�)r�rg�
sms_option)%rr|r~rrrr�r�rr�r�rfr�rgr�r�rrqr%rFrGrZrr�rrr�rjrUrr�rj�phone_numbers_optionsr�r1r
r)
�id_r|r�r]rr�r�r�r�r�r6r6r7�update_routing�sR��





�

�
�r��DELETEc
Csbtj�tj|k���}|stdd�S|j}tj}|rtj	}ddl
m}m}|j�|j|k���}|j�|j|j
k���}tj�d�sU|jdkrLt|�n	|jdkrUt|�d|_t��|_tj��|jdkr�dd	lm}|j�|j|k���}	d
dlm }
|	r�|
j�|
j|	j!k���}|�"|	jtj�|jdkr�|r�t#|jdd�}|j$j%|j!|	j&d
�tdd�S)NT)rBrr�r�rKrLrJrrdrer�)r�r�)'rr�r�rfr�r
r|rr~rr�rrrjrrr�rU�	delete_bw�
delete_twilior�r�now�deactivated_onr%rFrGrjr�rr�rirfrg�
deactivater�r��delete_sip_credentials�provider_id)
r�rr|r�rrr�r@rrqrfr�r�r6r6r7�delete_routing	sD
�





�
r�c
Csddlm}m}|j�|j|jk���}|j�|j|jk���}|j	dkr-t
|jdd�}nt
|j�}tj�tjdk���}|durxdt
j�d�td�}|jjd|d	d
�}|�dd�d
}	td|jd|	|d�}
tj�|
�tj��t�d�|j}|�dd�}|j�|j|�dS)Nrdr�rJr��disconnectszhttps://rzr{r|r}r	r�rrKr�z>A new subscription has been added for phone number disconnectsr�rM)�partnership.modelsrrr�r�rfr|r�rjrjr�r�r~rrr�r	r�r�r�r%rFr7rGr�r�rgrr��
disconnectr�)
rrrr�r@r�r�r�r�r�r�r�r�r6r6r7r�@s>�

���

r�cCsdddlm}m}|j�|j|jk���}|j�|j|jk���}t	t
jj|j�}|�
|j���dS)Nrdr�)r�rrr�r�rfr|r�rjr*rr�r�r�r��delete)rrrr�r@�sub_twilio_clientr6r6r7r�gs�
�r�z/api/inbound/searchc
Cs�tj�d�dk}tjd}tj�d�}tj�d�}tj�d�}tj�d�}|r,d�|�nd	}tj}|d
vr7dnd}z|dkrJt|||||||d
�}n	t||||||�}t|d�WSt	yv}	zt
�t�
��|	jdfWYd	}	~	Sd	}	~	wty�}	zt
�t�
��|	jdfWYd	}	~	Sd	}	~	wty�}	zt
�t�
��|	dfWYd	}	~	Sd	}	~	wty�}	z$t
�t�
��d	}
|
d	ur�t|
�dkr�|
d}nd}|dfWYd	}	~	Sd	}	~	ww)a4 
    Used for updating phone number search results. Arguments:
     * tollfree - true if we're searching for a toll-free or local number
     * prefix - local prefix (e.g. '312')
     * phrase - a string of letters/numbers to search for, e.g. 'CARS'
     * type - either tracking or priority or mobile.
    rG�truerj�prefix�phrase�city�statez*{}*NrHrKrLr�r>r&rdr�z!An unexpected error has occurred.)rr�r�r]rr|�bandwidth_search�
twilio_searchr
r2r�r�r�r�r4r+r,r�r�)rGrjrrrrr|rU�numbers_listrS�
error_details�
error_messager6r6r7�phonenumber_searchtsF
���
��r
c
Cs�tj�tj|k���}tj�tj|jk���}|r%|dkr%t|jdd�}	nt|j�}	g}
|s�i}d}|durL|durLt|�dkrDt	d��||d<|d}|dur\|dur\||d	<|d}|durl|durl||d
<|d}|dur||dur|||d<|d}|dkr�t	d��d
|d<|	j
jdi|��}
t�
|
�}|ddur�z#|ddd}g}
|D]}d|}|
�|�q�t�d�|
��W|
Sty�}zt�d�|��WYd}~|
Sd}~ww|
Si}|dur�|dur�|dd�p�dd}||d<n
|p�dd}||d<d
|d<|	j
jdi|��}
t�d�|
��t�
|
�}|ddu�rbz$|ddd}g}
|D]}d|}|
�|��q.t�d�|
��W|
St�ya}zt�d�|��WYd}~|
Sd}~ww|
S)NrJr�rrMr
zAn area code must be 3 digits.�areaCoder��localVanityrr�No search parameters provided.�18�quantity�SearchResult�TelephoneNumberList�TelephoneNumberr��the numbers are: {}�The exception is: {}r�*�tollFreeWildCardPattern�tollFreeVanityr6)rr�r�rfr�rrjr�r�r2�available_numbersr�rr��appendr�r�r]r+r�)rGrrrrr|r�r�r@rn�updated_number_list�kwargsr�r��no_jsonr
�numberrSr�r6r6r7r�s��

!��� �

���r�20c
Cst|�}i}d}	d}
g}|s�i}d}
|r't|�dkrd}	d}
n||d<|
d}
|r<t|�d	kr4d
}	d}
n||d<|
d}
|rF||d<|
d}
|rP||d
<|
d}
|
dkr\|	sXd}	d}
�n%||d<d}z|jjd"i|��}Wnty�}zt|�}	d}
WYd}~nd}~wwt�|�}|�dd�r�z|ddd}g}|D]}d|}|�	|�q�Wn�t
y�}zt|�}	d}
WYd}~n�d}~wwn�i}|s�|s�d}	d}
n/|r�t|�dkr�d}	d}
n"|dd�p�dd}||d<nt|�dkr�d}	d}
n|�dd�|d<|
�r�||d<d}z|jjd"i|��}Wnt�y,}zt|�}	d}
WYd}~nd}~ww|�r�t�
d�|��t�|�}|�dd��r�z|ddd}g}|D]}d|}|�	|��qQWn!t
�y�}zt�d�|��t|�}	d}
WYd}~nd}~ww||d<|	|d <|
|d!<|S)#a
Function for getting phone numbers from bandwidth api

    Args:
        tollfree (bool): Is the number tollfree or not 
        prefix (str): Area code in which phone number should be searched
        phrase (str): The requested vanity number. Valid range is from 4 to 7 alphanumeric characters 
        city (str): The name of the city.
        state (str): The state the RateCenter is in.
        partnership_id (int): The id of the partnership

    Returns:
        dict: numbers (list), message (str), success(bool)
    rMTrr
z An area code should be 3 digits.Frr�rNz:The phrase value should contain 3 or more digits or chars.rrrrrz{}Nrrrr�z)An area code or search phrase is requiredrrr�z=The phrase value should contain 4 or more alphanumeric chars.rrrr�r4rBr6)r�r�rr�r�r1rr�r�rr+rr�r�r]r�)rGrrrrrjrrn�responser4rBrrr�r�rSrr
r r�r6r6r7�bandwidth_search_api�s���
����
��
���r$cCs�ddlm}m}|j�|j|k���}|j�|j|jk���}	t|	j�}
t	j
�dd�}|s:|
�|�j
j|||d�}n|
�|�jj||d�}dd�|D�}
|
S)	Nrdr��COUNTRY�US)�	area_code�contains�	in_region)r'r(cSsg|]}|j�qSr6r�r^r6r6r7r��sz!twilio_search.<locals>.<listcomp>)r�rrr�r�rfr�rjr)rrr��available_phone_numbersrFr�r�)rGrrrrr|rrr�r@�
twilio_client�countryr�r
r6r6r7r	{s&�
��r	z/inbound/edit/<int:id>cCsXtj�|�}t|d�}|��r%|�|�|��ttd�d�t	t
d��Std||d�S)Nr�z/The phone number has been updated successfully.rBrCzphonenumbers/edit.jinja2)r�r�)rr�r�r�validate_on_submit�populate_objr3rrHrr	r)rfr�r�r6r6r7�
phone_edit�s

�r/z)/inbound/phonenumberSubscriptionCallback/cCsJt�tj�}t�|�}t�|�}ddlm}|�	|�t
�d�|��dS)Nr�)�send_callback_emailz5The phone number subscription callback content is: {}rM)
r�r�rr�rrr�r�r0r�r�r�r])r��	json_data�load_json_datar0r6r6r7�subscription_callback�s


r3)FN)FNNr3)r!)tr5r�rr(�time�os.pathr,�
contextlibr�ior�loggingr�r�r�rr�flaskrrrr	r
rrrr
rr�flask_loginrr�
sqlalchemyrr�sqlalchemy.sqlr�sqlalchemy.sql.expressionrr�'buyercall.blueprints.phonenumbers.formsrr�rr�(buyercall.blueprints.phonenumbers.modelsrrr�r�$buyercall.blueprints.user.decoratorsr�flask_babelrrH�
datatablesr r!�'buyercall.blueprints.billing.decoratorsr"�buyercall.blueprints.filtersr#�buyercall.extensionsr$r%�buyercall.lib.util_cryptor&r'�buyercall.lib.util_twilior(r)r*�buyercall.lib.util_bandwidthr��buyercall.lib.bandwidthr+�twilio.base.exceptionsr,�!buyercall.blueprints.leads.modelsr-r.r�r9r/r0r�r2�routerIr�r�r��exemptr�r�rr"r;rvr?rcrsrXrWrYr�r�r�r�r�r
rr$r	r/r3r6r6r6r7�<module>s�0
KJ9I4
-

7

X
F

6
3'


0
T