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

�we@y�@s&ddlZddlZddlZddlZddlmZddlmZmZddlm	Z	ddl
mZddlm
Z
mZmZmZmZmZmZmZmZddlmZmZddlmZmZmZmZmZm Z dd	l!m"Z"dd
l#m$Z$ddl%m&Z&ddl'm(Z(dd
l)m*Z*m+Z+ddl,m-Z-ddl.m/Z/e
de0dd�Z1e�2e0�Z3dZ4dd�Z5dd�Z6e1�7d�ee&dd�dd����Z8e1j7dddgd �ed!d"���Z9e1j7d#dgd �e*j:d7d$d%���Z;e1j7d&dgd �ee$e&dd'd(d)�d*d+�����Z<e1j7d,dgd �e*j:ed-d.����Z=e1�7d/�e*j:ed0d1����Z>e1j7d2dgd �ed3d4���Z?d5d6�Z@dS)8�N)�closing)�date�datetime)�StringIO)�path)	�	Blueprint�request�flash�current_app�url_for�jsonify�redirect�
make_response�render_template)�login_required�current_user)�extract�or_�and_�desc�func�text)�contains_eager)�subscription_required)�
role_required)�format_phone_number)�csrf�db)�Message)�Contact�sms�	templates)�template_folderi@cCs&t�|d�}t�|d�}t||j�S)N�%m%d%Y)r�strptime�abs�days)�d1�d2�r)�@/home/arjun/projects/buyercall/buyercall/blueprints/sms/views.py�days_between&sr+cCs|dks|dkr
dSdS)N�true�TrueTFr))�paramr)r)r*�
getboolean,sr/z/sms�admin�agentcCsXtj}tj}tj}|r|rtj}n
|s|rttd��Stj�	tj|k��
�}td|d�S)N�partnership.company_accountszsms/sms.jinja2)�total_messages)r�partnership_account_id�is_admin_user_with_groups�is_viewing_partnership�'get_user_viewing_partnership_account_idr
rr�query�filter�countr)r4�is_admin_in_group�viewing_partnership_accountr3r)r)r*�	sms_leads3s�r=z/sms/edit/<int:id>�GET�POST)�methodscCs$tj}tj}tj}|r|rtj}n
|s|rttd��Stj�	tj
��	tj��t
tj
��dd�t
tj��dd���ttj|ktj|k����}d}|r�|jro|jdd�dkrot|j��dd��d	d��d
d�}|�d�}|}n_|jr�|jdd�dkr�t|j��dd��d
d��d
d�}|�d�}	g}
|	D](}|�dd�d�d�d�dd
�}tjd}
ddlm}|||
�}|
�|�q�|
}n
td�|��ttd��S|j}d}d}|du�r�tj�tj|ktj|k�}|��}|� t!d���"d��#�}g}|D]�}|j�r*|jdd�dk�r*t|j��dd��d	d��d
d�}|�d�}||_|�|�q�|j�rW|jdd�dk�rWt|j��dd��d
d��d
d�}|�d�}||_|�|�q�|j�r�|jdd�dv�r�t|j��d�}g}|D]}|�|��qq||_|�|�q�|�|�q�t$d||||d�S)Nr2�	firstname�lastname�id�
friendly_name��[��]� �,�{�}�/�����?rz%20�
MMS_BUCKET)�generate_presigned_aws_urlzMessage with ID {} not found.z
sms.sms_leadszmessages.created_on desc�d)rFrKzsms/edit.jinja2)�message_info�multiple_media�message_log_count�message_log)%rr4r5r6r7r
rrr8�	outerjoin�contact�inbound�optionsr�	load_onlyr9rrC�first�	media_url�str�replace�split�app�config�buyercall.lib.util_boto3_s3rR�appendr	�format�
contact_idr:�order_byr�limit�allr)rCr4r;r<�messagerU�bracket_message_list�bracket_message_list_split�replace_single_message_str�media_links�new_media_link_list�i�	media_key�bucketrRrg�message_total_list�message_total_count�messages�message_total_raw_list�msg�bracket_msg_list�bracket_msg_list_split�replace_msg_str�media_str_links�single_link�single_link_list�sr)r)r*�	lead_editGs�
��"
"
"

�
�"
"
�r�z"/outbound/message/<int:inbound_id>c
Cst�d�|��ddlm}|j�|j|k���}|rSt	j�t
t	jt|�kt	j
|j
k����}t�d�t|���|rSt�d�|j|��|jrSt�d�|j��dSz�|r�g}|rd|dkrd|�|�n"tjr�dd	lm}	|	j�|	jtjk|	j
tj
k���}
|
r�|�|
j�|jd
kr�|r�ddlm}||||||�WdSddlm}|||||�WdS|jd
kr�ddlm}
|r�|
j|||||gdd�WdS|
j||||gdd�WdSt�d�WdSt�d�WdSty�}zt�d�WYd}~dSd}~ww)z� This function is used to send text message. First it will check which provider the phonenumber is and then
        decide on which celery text message sending function to use.
    z%the media on send text message is: {}�)�Phonez-The to number after formatting looks like: {}z>A message is being sent to contact id: {} using inbound id: {}zDThe contact unsubscribed. The message was not sent to contact id: {}rGr)�Agent�twilio)�tw_send_mms)�tw_send_sms�	bandwidth)�bw_send_smsrE)�args�	countdownz The phone number has no providerz:There is no phone number in the db matching the inbound idzKNo data was returned with the inbound id when trying to send a text messageN)�log�inforf�phonenumbers.modelsr�r8r9rCr]rr�
phonenumber_1rr4�is_unsubscriberer�is_authenticated�"buyercall.blueprints.agents.modelsr��user_id�provider�sms.tw_sms_tasksr�r��sms.bw_sms_tasksr��apply_async�	Exception�error)�
inbound_id�to�text_�media�agent_idr�rZrY�
agent_listr�r1r�r�r��er)r)r*�send_text_message�s`
��
��

��r�z/inbound/sms-attachment�partner�sysadmin�
limitsysadmincCsdd�}tjd}t�|j���d}|stdd�S||�s%td|d�S|jr2|jtkr2tdd�St	t
���}t�t
jd	|�}|�|�tj}tj}|rQtj}t�|�tkr]tdd�Sd
dlm}|j�|j|k���}|j}	ddlm}
|
|	||j|�}t�d
� |��t!|j|d�S)NcSs|dvS)N)z.jpegz.jpgz.pngz.gifz.wavz.mp4z.mpegz.bmpz.csvz.pdfz.mp3r))�file_extr)r)r*�allowed_file�sz+upload_sms_attachment.<locals>.allowed_file�filerEzError uploading file.i�zFile extension not allowed: zFile too large.�
UPLOAD_FOLDERr)�PartnershipAccount)�upload_mms_imagezThe mms url is {})�filename�	image_url)"r�filesr�splitextr��lowerr�content_length�
MAX_FILE_SIZEr_�uuid�uuid4�joinrbrc�saverr4r6r7�getsize�'buyercall.blueprints.partnership.modelsr�r8r9rCr]�name�tasksr�r�r�rfr)r�r�r�r��	file_pathr4r<r�r��partner_namer�r�r)r)r*�upload_sms_attachment�s2




r�z/sms/filteroptionscCs2i}i}tj}tj}|rtj}tj|k}tj�tj��t	tj���
ddd��|���}t
j�tj��|����tj�}|D]2}|duro|duro|dduro|ddurot|d�}t|d�}	t|d�}
|	d|
d	||<q=|D] }|dur�|dur�|ddur�t|d�}t|d�}	|	||<qrt||d
�S)Nzphonenumbers.idzphonenumbers.friendly_namezphonenumbers.phonenumberrGrr�rEz (�))�status_data�source_data)rr4r6r7rr8rXrZr[r�
with_entitiesr9�distinctr�session�statusrhr_r)�
status_result�
source_resultr4r<�	filter_byr�r�rqrCr�rDr)r)r*�
filteroptionssJ

�
����r�z	/sms/datacMs(	tj�dd��ttj�dd��}tj�dd�}ttj�dd��}ttj�d	d
��}ttj�d��}ttj�d��}ttj�d
��}ttj�d��}ttj�d��}ttj�d��}	t||�}
td�}td�}td�}
td�}t�|d��	�}t�|d��	�}t
j}t
j}|r�t
j
}tt�	tj�|kt�	tj�|k�}ttj|ktt
jdkt
jdk��}tjtjtjtjtjtjtjtjtjtjg
}tjtjtjtjtjtjtjtjtjtjtjtjg}|dkr�|r�|dur�td� |��}
|dk�r|�r|du�r|dk�rtd�}n	|dk�rtd�}|	dk�r$|	�r$|	du�r$t�!tj�t�!|	�k}|dk�r6|�r6|du�r6tj"|k}tjg}tj#�$tj%��$tj&��'t(tj%��)dd�t(tj&��)dd���*|��*|��*|��*|
��*|��*|�}|}��r�|j+|��,�}�fdd �|D�}d!d �|D�}tj#�$tj%��$tj&��'t(tj%��)dd�t(tj&��)dd���*tj�-|��}|j+|�}|t.t/|��v�r�||}|d"k�r�t0|�}|�1|�}|�2|��3|�}d#d �|�,�D�}|j+|�} t4�}!| �,�D]
}"|!�5|"d��q�t/|!�}#dd$l6m7}$|D]#}%|%d%d&u�rz
|$jd'v�rd(|%d%<W�q�t8�yY�q�w�q�t9d)t�	tj��}&t9d*t�	tj��}'d+}(d,})|
d-k�rOt9d)t�	tj��}&t9d*t�	tj��}'nCd.|
k�r[d/k�rynnt9d*t�	tj��}&t9d0t�	tj��}'|j:|j:k�rxd1})n|
d/k�r�t9d0t�	tj��}&t9d0t�	tj��}'d2}(t;j<�#|&�=d,�|'�=d1�t�>tj��=d3���*|��*|��*tj�-|!���?d,d1��1|)�}*t4�}+t4�},t4�}-|*D]=}.t|.j@��Ad4�}/t|.jB��Ad4�}0|.j@|-v�r�|-�5|.j@�|(�r�|,�5|/d�n
|,�5|/dd5|0d�|+�5|.jC��q�|*�*|�}1t4�}2t4�}3|1D]}4|2�5|4j@�|3�5|4jC��qt4�}5d}6|-D]!}7|7|2v�rC|6t/|3�k�rA|5�5|3|6�|6d6}6�q(|5�5d��q(|*�*ttjdktjd7k��}8t4�}9t4�}:|8D]}4|9�5|4j@�|:�5|4jC��q`t4�};d}<|-D]!}7|7|9v�r�|<t/|:�k�r�|;�5|:|<�|<d6}<�qw|;�5d��qw|1�*ttjdktjd8k��}=t4�}>t4�}?|=D]}4|>�5|4j@�|?�5|4jC��q�t4�}@d}A|-D]!}7|7|>v�r�|At/|?�k�r�|@�5|?|A�|Ad6}A�q�|@�5d��q�t4�}B|5D]}C|B�5|C��q�t4�}D|;D]}C|D�5|C��q�t4�}E|@D]
}C|E�5t|C���q	t4�}F|,D]
}C|F�5t|C���q|�>�}G|�*t|���Dtj��>�}H|�*ttjdktjd7k���>�}I|Gd&u�sO|Gdk�rRd}Jnt|Id9|G�}J|�*ttjdktjd8k���>�}K|Gd&u�st|Gdk�rwd}Lnt|Kd9|G�}LtEtjd:|#|#||G|H|I|J|K|L|B|D|E|Fd;�S)<�Return server side data.�
search[value]rGzorder[0][column]z-1z
order[0][dir]�asc�startr�length�c�df�dt�dn�so�st�tpr#r0r1�null�---�messages.status = '{}'�inz=(messages.direction = 'in' or messages.direction = 'inbound')�outz?(messages.direction = 'out' or messages.direction = 'outbound')rArBrCrDc�Pg|]�}|j��d|j�����ks�|j�����ks�|j�����ks�|j�dd��dd��dd��dd��dd���dd��dd��dd��dd��dd�ks�|j�dd��dd��dd��dd��dd���dd��dd��dd��dd��dd�ks�|j�����ks�|j�����ks�|j�����ks�|j	�����kr|�qS�rIz+1rG�(r��-�
rAr�rBr�r`�from_�typer��source�	direction��.0�x��searchr)r*�
<listcomp>��$ $"�$"��
zdata.<locals>.<listcomp>cS�g|]}|j�qSr)�rCr�r)r)r*r���rcs&g|]��fdd�tt���D��qS)csi|]}|�|�qSr)r))r�rq��rowr)r*�
<dictcomp>�sz#data.<locals>.<listcomp>.<dictcomp>)�range�len)r�r)r�r*r��s��)�current_supervisor_user�N)r�r��
Restricted�day�monthF�parent�� in�year�childT�total�.rMrErZ�outboundrS�draw)r��recordsFiltered�recordsTotal�datarv�unique_messages�inbound_messages�inbound_percentage�outbound_messages�outbound_percentage�
graphTotal�graphInbound�
graphOutbound�graphPoints)Frr��get�intr_r+rrr$rrr4r6r7rrr�
created_onr�rolerCr�r�r�r�r�r�rrArgrB�	body_textrfr�r�r8rXrYrZr[rr\r9r�rj�in_r�r�rrh�offsetri�listre� buyercall.lib.supervisor_managerr��AttributeErrorrr�rr��labelr:�group_byr�rar�r�r�r)M�orderr�rri�	date_from�date_to�message_direction�message_source�message_status�message_type�date_difference�filter_by_type�filter_by_direction�filter_by_message_status�filter_by_message_source�converted_dateFrom�converted_dateTor4r<�filter_by_dater��columns_search�columns_window�
columns_totalr��filtered�
total_list�searched_result_list�searched_result_ids�sorted_�
order_predr�filtered_total�message_id_list�m�total_msg_leadsr��lp_data�parent_type_filter�child_type_filter�
year_selector�
order_by_year�labels�filter_data_points�
filter_labels�filter_dater�split_filter_date�split_filter_child�
labels_totals�labels_total_date�labels_total_valuer��total_data_points�complete_pointr��	labels_in�labels_in_date�labels_in_value�in_data_points�in_point�
labels_out�labels_out_date�labels_out_value�out_data_points�	out_point�all_messagesrqrr�pointsr3�total_unique_messages�total_inbound_messages�total_inbound_percentage�total_outbound_messages�total_outbound_percentager)r�r*r;s�
�
���



�
��
��


�
���
�
��


�
�
�
�  �rz/sms/csvcs�ttj�d��}ttj�d��}ttj�d��}ttj�d��}ttj�d��}ttj�d��}td�}td�}td�}td�}	t�|d���}
t�|d���}tj	}tj
}
|
r[tj}tt
�tj�|
kt
�tj�|k�}ttj	|ktjd	k�}tj�d
d��gd�}|dkr�|r�|d
ur�td�|��}|dkr�|r�|d
ur�td�|��}|dkr�|r�|d
ur�t
�tj�t
�|�k}|dkr�|r�|d
ur�tj|k}	tj�tj��tj��ttj��dd�ttj��dd���|��|��|��|��|	��|�}|}tjtjtjtjtj tj!tj"t#j$tj%t#j&g
}��rM|j'|��(�}�fdd�|D�}dd�|D�}tj�tj��tj��ttj��dd�ttj��dd���tj�)|��}|�*tj�}d}t+t,���y}t-�.|�}|�/|�|�(�D]C}|d7}||j|j|j|j|j0|j1|j"|j |j�r�|jj2�p�|j�r�|jj3�p�d|j�r�|jj4�p�d|j5g}|�/dd�|D���qid�t�6��7d��}t8|�9��}d|j:d<d�|�|j:d<|Wd �S1�s�wYd S)!r�r�r�r�r�r�r�rGr#r0r�)�Noz
Created On�Type�To�Fromrz	Media URL�Status�	Direction�LeadzLead Sourcer�r�r�r�zmessages.direction = '{}}'rArBrCrDcr�r�r�r�r�r)r*r��r�zdata_csv.<locals>.<listcomp>cSr�r)r�r�r)r)r*r��r�rrEcSsg|]}|�qSr)r)r�r)r)r*r��szBuyercall Messages - {}.csvz%Y-%m-%dztext/csvzContent-Typezattachment; filename="{}"zContent-DispositionN);r_rr�r
rrr$rrr4r6r7rrrrr
rfr�r�r�r8rXrYrZr[rr\r9rCr�r�r�r�r�rrArgrBr�rjrrhrr�csv�writer�writerowrr^r�r�rD�
message_agent�today�strftimer�getvalue�headers)rrrrrrrrr r!r"r#r4r<r$r��headerr�r(r%r)r*r+r8�row_nor�r[rx�csv_rowr��respr)r�r*�data_csvps��

���
��


&��
�&�rfcCs|sdS|�d�S)z2 Format a local date for consumption by Excel
    rGz%Y-%m-%d %H:%M:%S)r_)�date_stringr)r)r*�format_date�s
rh)N)ArZ�json�loggingr��
contextlibrrr�ior�osr�flaskrrr	r
rbrrr
rr�flask_loginrr�
sqlalchemyrrrrrr�sqlalchemy.ormr�'buyercall.blueprints.billing.decoratorsr�$buyercall.blueprints.user.decoratorsr�buyercall.blueprints.filtersr�buyercall.extensionsrr�buyercall.blueprints.sms.modelsr�$buyercall.blueprints.contacts.modelsr�__name__r �	getLoggerr�r�r+r/�router=r��exemptr�r�r�rrfrhr)r)r)r*�<module>sh,
 
O?*14