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

�wey��@svddlZddlZddlZddlZddlZddlmZddlm	Z	ddl
mZddlmZddlmZddl
mZddlmZmZmZmZmZmZmZmZdd	lmZmZmZdd
lmZmZddlm Z ddl!m"Z"dd
l!m#Z#ddl$m%Z%ddl&m'Z(ddl)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1ddl2m3Z3m4Z4ddl5m6Z6ddl7m8Z8ddl5m9Z9ddl:m;Z;ddl:m<Z<ede=dd�Z>e�?e=�Zdd�Z@dd�ZAe>jBddd gd!�e;jCed"d#����ZDe>�Bd$�ee9d%d&�d'd(����ZEe>�Bd)�ee9d%d&�d*d+����ZFe>�Bd,�ed-d.���ZGe>�Bd/�ee9d%d&�d0d1����ZHe>�Bd2�e;jCed3d4����ZIe>jBd5dd gd!�e8ee9d%�d6d7�����ZJe>jBd8d9gd!�e8ee9d%�d:d;�����ZKe>jBd<dd gd!�e9d%d&�e8ed=d>�����ZLe>jBd?d gd!�e8ee9d%d@�dAdB�����ZMe>jBdCdd gd!�e6�dPdDdE���ZNe>jBdFdd gd!�e8ee9d%d@�dGdH�����ZOe>jBdIdd gd!�e8edJdK����ZPdLdM�ZQdNdO�ZRdS)Q�N)�closing)�StringIO)�reduce)�date)�datetime)�parser)�	Blueprint�request�flash�url_for�jsonify�redirect�
make_response�render_template)�login_required�current_user�
login_user)�	AgentForm�	GroupForm)�	FlaskForm)�
AgentSchedule)�Agent)�Lead)�gettext)�func�or_�and_�extract�text�desc�cast�String)�contains_eager�	load_only)�anonymous_required)�subscription_required)�
role_required)�csrf)�db�agents�	templates)�template_foldercCs|dks|dkr
dSdS)N�true�TrueTF���paramr.r.�C/home/arjun/projects/buyercall/buyercall/blueprints/agents/views.py�
getboolean,sr2cCs<|dks|dks|dks|dks|dks|dkrdSt|�S)N�None�none�null�Null�-1���r��intr/r.r.r1�	getintkey3s0r;z/agents_onboarding�GET�POST)�methodscCsBtjdkr
dt_tj��tjrttd�d�t	t
d��Std�S)Nr=Tz�Great, you are ready to get started with the My Agents page. Remember to checkout the support section or FAQ if you have any additional agents questions.�success�agents.call_agentszagents/agents_onboarding.jinja2)r	�methodr�agents_onboardr(�session�commitr
�_r
rrr.r.r.r1�onboarding_agents;s

��rFz/agents�admin�agentcCstj}tj}tj}|r|rtj}n
|s|rttd��Stjdur&ttd��St�}tj	r0tj	j
nd}|r@ttj|ktj
dk�}n|tjkttj|ktj
dk�B}t���d�}tj�tdtj�|k��t|����}|r~ttj|kttj
dktj
dk��}ntj
tjkttj|kttj
dktj
dk��B}tj�|��tj�d��}	t�}
t�}t�}g}
tj�tdd	d
���tj|k���}|D]}t |j
|j|j!d�}|
�"|�q�|	D]7}d�#|j$|j%�}|
�"|�d
}|
D]}|j
|d	k�r|d}|d�r|�"t&|d��q�|�"t&|��q�tj�tj|k��tj'dk��tjdk��(�}tj�|��(�}|�r>t)t*dd�|�t+|�d�}nd}|�rqt*dd�|�t+|�}t&|d�}t&t)|d��}|dk�rfd|��}|dk�rpd|��}nd
}d}d}t,d||||
|||||	||d�S)N�partnership.company_accountsFzagents.onboarding_agentsrGz%m�month�partner�id�agent_id�response_time_seconds��Lead_idrM�
response_time�{} {}r�rQ�Yes�0cS�||S�Nr.��x�yr.r.r1�<lambda>��zcall_agents.<locals>.<lambda>�cSrVrWr.rXr.r.r1r[�r\�<�
�00zagents/agents.jinja2)�form�
monthly_calls�available_agents�agent_labels�agent_leads�avg_calls_agent�total_agents�avg_response_agent�account_agents�avg_response_agent_min�avg_response_agent_sec)-r�partnership_account_id�is_admin_user_with_groups�is_viewing_partnership�'get_user_viewing_partnership_account_idr
rrBrrHrLrr�rolerMr�now�strftime�query�filterr�
created_onr�firstr�user_id�is_deactivated�is_�list�optionsr#�all�dictrN�append�format�	firstname�lastnamer:�
available_now�count�roundr�lenr)rl�is_admin_in_group�viewing_partnership_accountrarM�	filter_byrJrb�filter_by_userrirdrerQ�leads_by_agent�leads_by_pa�lpa�lead_pa_dict�row�
agent_name�l_a_c�leadrcrgrfrhrjrkr.r.r1�call_agentsNs�

��
��
���

�.�



��r�z/agents/agent_datac
Cs�tj}tj}|rtj}tj�dd�}ttj�dd��}tj�dd�}ttj�dd��}ttj�d	d
��}t�}	t	j
t	jt	jt	j
t	jg}|rWtt	j|ktjdkt	j�d��}	ntj
t	jktt	j|ktjdkt	j�d��B}	t	j�|	��t	j�d��}
|
}|r�d
�|�}|
�tt	j�|�t	j�|�t	j�|�t	j�|�t	j
�|�t	j�|�tt	jt ��|�t	j!�|���}|}
|t"t#|��vr�||}|dkr�t$|�}|
�%|�}
|
�&|��'|�}
|
D]}|j
|j|j|j
|j|j(d�}|�)|�q�t*|tjd|�+�|�+�d�S)N�
search[value]�zorder[0][column]r7z
order[0][dir]�asc�startr�length�crGF�%{}%r)rrSr]����draw)�datar��recordsFiltered�recordsTotal),rrlrnror	�args�getr:rzrrL�	full_name�description�phonenumber�typerrprxryrwrsrtrrr��iliker��title�email�mobiler �	extensionr!�
department�ranger�r�order_by�offset�limitr�r~rr�)rlr��search�order�	directionr�r�r��columnsr��total�filtered�pattern�sorted_�
order_predr��data_rowr.r.r1r��sp�
��







�
��r�z/agents/csvc'Csgd�}d}d}tj}tj}|rtj}ttj�d��}ttj�d��}t�	|d��
�}t�	|d��
�}tjdkrCtj
�tjtjk�}	n	tj
�|tjk�}	|	�tj�d��}	tj�d	d
�}
|
r�d�|
�}|	�ttj�|�tj�|�tj�|�tj�|�tj�|�tj�|�ttjt��|�tj�|���}	|	� tj��!�}dd
�|D�}
t"t#�
t$j%�|kt#�
t$j%�|k�}t$j
�|�}tjdkr�tj
�tjtjk��&�}|r�|�t$j'|jk�}n
|�t$j|kt$j'�(|
��}dd
�|�!�D�}dt|�dt|�dt|�d}dt|�dt|�dt|�d}t)j*�+|�}t)j*�+|�}i}i}|D]}|d||d<�q'|D]}|d||d<�q5d}t,t-����}t.�/|�}|�0|�|D]�}|d7}g}g}d} d}!g}"|D]5}#|#j'|jk�r�|#j1|k�r�|#j|v�r�|�2|#j�|#j1|k�r�|#j|v�r�|�2|#j��qg|"�2|#��qg|"}|j|v�r�||j}!|j|v�r�||j} ||j|j|j|j|j|j|j|jt3|�t3|�| |!g
}$|�0|$��qUd�t
�4��5d��}%t6|�7��}&d|&j8d<d�|%�|&j8d<|&Wd�S1�swYdS)zReturn server side data.)
�Noz
First Namez	Last Name�Title�EmailzPhone Number�Mobile�	Extension�
DepartmentzUnique Inbound CallszUnique Outbound CallszUnique Inbound MessageszUnique Outbound Messages�inbound�outbound�df�dt�%m%d%YrHFr�r�r�cSsg|]}|j�qSr.)rL)�.0�rr.r.r1�
<listcomp>Cszdata_csv.<locals>.<listcomp>cSsg|]}|�qSr.r.)r��lr.r.r1r�Tsaxselect agents.id, count(distinct agents_with_messages.to) from agents inner join (select messages.to, direction, created_on, agent_id_msg from messages, lateral json_array_elements(agent_id) as agent_id_msg) agents_with_messages on agents.id = agents_with_messages.agent_id_msg::text::int where agents_with_messages.direction = 'outbound' and agents.partnership_account_id = 'z)'and agents_with_messages.created_on >= 'z3 00:00:00' and agents_with_messages.created_on <= 'z 23:59:59' group by agents.ida}select agents.id, count(distinct agents_with_messages.from_) from agents inner join (select messages.from_, direction, created_on, agent_id_msg from messages, lateral json_array_elements(agent_id) as agent_id_msg) agents_with_messages on agents.id = agents_with_messages.agent_id_msg::text::int where agents_with_messages.direction = 'inbound' and agents.partnership_account_id = 'rSrzBuyercall Agents - {}.csvz%Y-%m-%dztext/csvzContent-Typezattachment; filename="{}"zContent-DispositionN)9rrlrnro�strr	r�r�r�strptimerrprrsrtrLrwrxryrrr�r�r�r�r�r�r�r r�r!r�r�r|rrrrurvrM�in_r(rC�executerr�csv�writer�writerow�	call_typer~r��todayrrr�getvalue�headers)'�headerr�r�rlr��	date_from�date_to�converted_date_from�converted_date_to�agent_queryr�r��agent_query_result�	agent_ids�filter_lead_by_date�
lead_query�agent_user_query�lead_query_result�outbound_message_stmt�inbound_message_stmt�outbound_message_result�inbound_message_result�
outbound_dict�inbound_dict�om�im�row_no�outr��a�unique_inbound_calls�unique_outbound_calls�unique_inbound_messages�unique_outbound_messages�unused_leadsr��csv_row�filename�respr.r.r1�data_csvs�








�
�
��

��������
������


�

��
�&�r�z/agents/data_chartc
Csxttj�d��}ttj�d��}ttj�d��}ttj�d��}td�}t�|d���}t�|d���}tt	�t
j�|kt	�t
j�|k�}tj
}tj}	|	rPtj}|	r^ttj
|ktjdk�}
ntjtjkttj
|ktjdk�B}
tj�|
��tj�d��}d	}|D]	}
|
jr�|d
}q�|��}|dkr�|dur�|dks�|dur�d|vr�td
�|��}nGtd�|��}n?|dks�|dur�|dkr�|dur�td�|��}n'|dkr�|dur�|dkr�|dur�d|vr�td
�|�d�|��}ntd�|��}t�}t�}t�}g}t
j�tddd���t
j
|k��|��|���}|D]}t|j|j |j!d�}|�"|��q|D]9}d�|j#|j$�}|�"|�d	}|D]}|j|dk�rZ|d
}|d�rZ|�"t%|d���q>|�"t%|���q+|�rwt&t'dd�|�t(|�d�}nd}|�r�t'dd�|�t(|�}t%|d�}t%t&|d��}|dk�r�d|��}|dk�r�d|��}nd	}d}d}t)||||||||d�S)Nr�r��fn�pnz1=1r�rGFrrSr5�-zleads.widget_guid = '{}'zleads.inbound_id = {}rLrMrNrOrRrQcSrVrWr.rXr.r.r1r[r\zdata_chart.<locals>.<lambda>r]rUcSrVrWr.rXr.r.r1r[r\r^r_r`)rdre�	available�
average_callsrhrjrkrg)*r�r	r�r�rrr�rrrrrurrlrnrorrprLrwrsrtrxryr�r�rrzr{r#r|r}rMrNr~r�r�r:r�rr�r)r�r��
friendly_name�phone_number�filter_by_type�converted_dateFrom�converted_dateTo�filter_by_daterlr�r�ri�total_available_agentsrHrgrdrerQr�r�r�r�r�r�r�r�rfrhrjrkr.r.r1�
data_chart�s�����  �
���

�



��rz/agents/filteroptionscCs�tjrtjjnd}tj}tj}|rtj}|r"ttj|ktjdk�}n|tj	kttj|ktjdk�B}tj
�tj��
ttj���ddd��|���}tj
�tj��
ttj���dd��|���}i}i}|D]&}|dur�|dur�|ddur�|d	dur�t|d�}	t|d	�}
|
||	<qe|D]'}|dur�|dur�|ddur�|d
dur�t|d�}	d�|d
�}
|
||	<q�|D]'}|dur�|dur�|ddur�|d
dur�t|d�}	d�|d
�}
|
||	<q�t||d
�S)NrGzphonenumbers.idzphonenumbers.friendly_namezphonenumbers.phonenumberzwidgets.guidzwidgets.namer�rr]rSzInbound - {}z
Outbound - {})�tool_name_data�phonenumber_data)rrHrLrlrnrorrrprMrs�	outerjoinr�r{r"�
with_entitiesrt�distinct�widgetr�rr)rMrlr�r��inbound_data�
outbound_data�tool_name_result�phonenumber_result�irL�namer.r.r1�
filteroptions(sh
����������rz/agents/newc"Cs
t�}tdddddd�}tdddddd�}tdddddd�}td	ddddd�}td
ddddd�}tdddddd�}tdddddd�}d|_|j�|�|j�|�|j�|�|j�|�|j�|�|j�|�|j�|�tj�tjtj	k��
�}tj}	tj}
tj
}|
r�|r�tj}	n
|s�|
r�ttd
��St|d�}|���r`|tjjkr�ttd�d�ttd��S|jj|_d|_	|jj|_|jj|_|jj��|_|jj|_|jj|_z|jjr�t |jj�nd|_Wnt!y�d|_Ynw|j"j|_"d|_#|j$j|_$t%|j&j�|_t'||j(j�d|j|j|j|j|j|j|j|j"|j#|j$|	|jd�
}
t�)|
�}|dk�r`t*}t+|j,j�}d}t-|�dk�rLt.�/|�0|��}|d}t |d�t+|d�t+|d�t%t+|d��t |	�t |�d�}|d}t |d�t+|d�t+|d�t%t+|d��t |	�t |�d�}|d}t |d�t+|d�t+|d�t%t+|d��t |	�t |�d�}|d	}t |d�t+|d�t+|d�t%t+|d��t |	�t |�d�}|d
}t |d�t+|d�t+|d�t%t+|d��t |	�t |�d�}|d}t |d�t+|d�t+|d�t%t+|d��t |	�t |�d�}|d}t |d�t+|d�t+|d�t%t+|d��t |	�t |�d�} t�)||||||| �}nd}|dk�r`ttd�d�ttd��Sd�1dd�|j2D��|j(_tj�tj|	ktj3dk��4�}!t5d||||!d �S)!Nrz08:00 AMz17:00 PMFr7rSTr]r�r�r��rI��objz�You need to <strong>upgrade your account</strong> to add more agents. <a href=/subscription/update style=color:#ffffff><strong>Change your plan</strong></a>�dangerzagents.agent_newr4)
rwr�r�r�r�r�r�r�r�r��timezonerl�	all_hoursrLr��stop�active��day�available_from�available_to�	is_activerlrMz)Your agent has been created successfully.r?r@�,cs��|]}t|j�VqdSrW�r�rL�r��gr.r.r1�	<genexpr>��zagent_new.<locals>.<genexpr>zagents/new.jinja2)rarHrg�groups)6rrr�	schedulesr~rsrtrrLrwr�rlrmrnror
rr�validate_on_submit�subscription�agent_limitr
rEr�r�r�r�r��lowerr�r�r�r:�
ValueErrorr�r�rr2�allhours_str�load_groups�
groups_str�createrr��
schedules_strr��json�loads�unescape�joinr#�is_groupr|r)"rH�sunday�monday�tuesday�	wednesday�thursday�friday�saturdayrgrlr�r�ra�params�result�h�
schedulequery�
day_result�scheduleobj�day1obj�	day1param�day2obj�	day2param�day3obj�	day3param�day4obj�	day4param�day5obj�	day5param�day6obj�	day6param�day7obj�	day7paramr#r.r.r1�	agent_newjs 

��





�

�




�	


�	


�	


�	


�	


�	


�	�
��
�rOz/agents/delete/<int:id>�DELETEcCsrtj}tj}|rtj}tj�|�}t�||�tj�	|j
tjk���}|dkr4tj�	tj|k�}|�
�tdd�S)NrT)r?)rrlrnrorrsr��
deactivaterrtrLrMr��deleter)rLrlr�rH�schedules_exist�agentscheduleslistr.r.r1�agent_deletes
rUz/agents/edit/<int:id>cs�tj�tj}tj}|r|rtj�n
|s|rttd��Stj�	tj
|ktj�k�����s9td�
|��ttd��S�jdurNttd�
|��d�ttd��S�j
tjk}tj�	�j
tjk���}tj�t�tj���	|���}tj�t�tj���	|���}|dur�d}n	|dur�d}n	|dkr�d}d}ntt|�t|�d�}tt|�t|�d�}|dkr�d}	d}
ntt|�t|�d�}	tt|�t|�d�}
tj�	�j
tjk���}|dks�jdur�d�_t�d	�}|���r0�z|j j!�_ |j"j!�_"|j#j!�_#|j$j!�%��_$|j&j!�_&|j'j!�_'z|j(j!�r t|j(j!�nd�_(Wn
t)�y1d�_(Ynw|j*j!�_*d
�_+|j,j!�_,t-|j.j!��_t/�|j0j!��j1�rb�j$�%��j2_$�j&�j2_&�j(�j2_(tj�	�j
tjk���}
t3|j4j!�}t5�}t6|�dk�r�t7}t8�9|�:|��}|
dk�r�|D] }t�;t|d�t3|d�t3|d
�t-t3|d��t����q�ttd�d�ttd��WS|�r��fdd�|D�}tj�	tj�j
k��<�tj=|�}|�r�ttd�d�ttd��WSnd�_��>�tj�?�ttd�d�ttd��WSWn&t@�y/}ztA�BtC�D��tj�E�ttd�d�WYd}~nd}~wwd�Fdd��jGD��|j0_!tj�	tj�ktjHdk��I�}tJd�||||||	|
d�	S)NrIzAgent with ID {} not found.r@Tz>Agent with ID {} has been deactivated and no longer available.rrr^rr4�scheidr�rrz(The agent has been updated successfully.r?c	sLg|]"}t|d�t|d�t|d�tt|d��t��t�j�d��qS)rLr�rrr)r:r�r2rL)r��dayobj�rHrlr.r1r��s
�


�zagent_edit.<locals>.<listcomp>z]Error saving agent. The email address is used by another user. Try a different email address.rcsrrWrrr.r.r1r!�r"zagent_edit.<locals>.<genexpr>zagents/edit.jinja2)rHrar#�lead_count_agent�average_call_duration�average_call_duration_sec�average_call_response�average_call_response_sec)Krrlrmrnror
rrrsrtrLrvr
rrxrErrMr�r(rCr�sum�duration�scalarrNr:�floatrrrr%r�r�r�r�r�r(r�r�r�r)r�r�rr2r*r+r,rw�userr�r.rzr�rr/r0r1�updaterRr-�saverD�	Exception�log�error�	traceback�
format_exc�rollbackr2r#r3r|r)rLr�r��filter_by_agentrY�agent_call_duration�agent_call_responserZr[r\r]�schedules_edit_existrarSr>r@r=�day_obj�
day_paramsr?�er#r.rXr1�
agent_edit2s���







 
�







��	
�
�

�����rrz/agents/convertrKc
Cs�tj�tj�d��}tj}tj}tj}|r|rtj	}n
|s%|r%t
td��S|dur5tt
d��t
td��S|j|krFtt
d��t
td��Sddlm}d}|jdur�z\d	|j|j|jtj|jpad
|jped
|j|jtj||d�}|di|��}|��|j|_tj�|�tj��|� �}ddl!m"}	|	�#|j||j$j%|j$j&|j$j'�tt
d
|jd�d�Wn�t(y�}
zt)�*t+�,��tj�-�tt
d�d�WYd}
~
nkd}
~
ww|j�.|j|jk|j/dkt0�1|j�t0�1|j�k��2�}|�r1tj|_||_tj|_d|_/d	|_3d|_4tj��|� �}ddl5m"}	|	�#|j||j$j%|j$j&|j$j'�tt
d
|jd�d�n
tt
d�d�|j6}t
td��S)N�a_to_u_agent_idrIzSuch Account does not existr@z%You don't have access to this accountr��UserTrHr�)rpr�r�r��companyr�r�r�r��partnership_idrl�
tos_agreement)�send_agent_invitation_emailz$An email has been sent to %(email)s.)r�r?zpError converting the agent to an user. The email address is used by another user. Try a different email address.rFr�zThe agent is already an user.�warningr.)7rrsr�r	rarrlrmrnror
rr
rE� buyercall.blueprints.user.modelsrurwr�r�r�rvr�r�r�r�rwrdrLr(rC�addrD�serialize_token�buyercall.blueprints.user.tasksry�delay�partnershipr
�logo�partner_urlrerfrgrhrirjrtrxrr(rvrp�deactivated_on�blueprints.user.tasksrb)rHrlr�r�ru�tosr;rb�reset_tokenryrqr.r.r1�convert_to_user�s�

�
 ��
���6
 ��r�z/account/agent_invitecCs�ddlm}ddlm}|tj�d�d�}|��rX|�tj	�d��}|dur3t
td�d�tt
d��S|�|�|�tj	�d	d��|_|��t|�rXt
td
�d�tt
d��Std
|d�S)Nrrt)�PasswordResetFormr�)r�z2Your reset token has expired or was tampered with.rz
user.login�passwordzYour password has been reset.r?z
user.settingsz agents/create_credentials.jinja2)ra)r{ru�buyercall.blueprints.user.formsr�r	r�r�r%�deserialize_tokenrar
rEr
r�populate_obj�encrypt_passwordr�rdrr)r�rur�ra�ur.r.r1�agent_invite,s"�
r�z/groups/newcCs�t�}tj}|��rRtj}tj}|r|rtj}n
|s"|r"ttd��St	�}||_|j
j|_d|_
d|_d|_d|_|jj|_d|_t||jj�|��ttd��St	j�t	j|kt	jdk���}td||d�S)NrIr�Tr@Fzagents/new_group.jinja2)rar))rrrlr%rmrnror
rrr
r�r�r�r�r�r�r�r3�load_agents�group_agentsrdrsrtr|r)rarlr�r�r r)r.r.r1�	group_newHs8

��r�z/groups/edit/<int:id>cs,t�}tj}tj}tj}|r|rtj}n
|s|rttd��Stj	�
tj|ktjdk��
���dur7ttd��S|��rV|jj�_|jj�_t�|jj����ttd��S�j|j_�j|j_d�dd��jD��|j_tj	�tdd	d
���
tj|ktjdk���}�fdd
�|D�}td|�|�jd�S)NrITzagents.group_newr@rcsrrWr)r�r�r.r.r1r!�r"zgroup_edit.<locals>.<genexpr>rLr�r�Fcsg|]	}|�jvr|�qSr.)r)�r�rY�r r.r1r��szgroup_edit.<locals>.<listcomp>zagents/edit_group.jinja2)ra�groupr)r�)rrrlrmrnror
rrrsrtrLr3rvr%r
r�r�r�r�r�rdr2r)r{r#r|r)rLrarlr�r��
all_agentsrcr.r�r1�
group_editosN��




����r�cCs�tj}tj}|rtj}dd�|�d�D�}tj�tj|ktjdktj	�
|����}t|j
�D]}|j
�|�q.|D]}|j
�|�q9dS)zc Parses a comma-separated string, containing the agent IDs, and assigns
    them to the group.
    cS�g|]}|rt|��qSr.r9)r�rLr.r.r1r���zload_agents.<locals>.<listcomp>rFN)rrlrnro�splitrrsrtr3rLr�r|rzr)�remover~)r��agent_stringrlr��idsr)rHr.r.r1r��s"
���r�cCs�tj}tj}|rtj}dd�|�d�D�}tj�tj|ktjdktj	�
|��}|jD]}|j�|�q*|D]}|j�
|�q5dS)zc Parses a comma-separated string, containing the group IDs, and assigns
    them to the agent.
    cSr�r.r9r�r.r.r1r��r�zload_groups.<locals>.<listcomp>rTN)rrlrnror�rrsrtr3rLr�r#r�r~)rH�group_stringrlr�r��
new_groupsr r.r.r1r+�s
�
�r+rW)Sr�r/r�loggingrfrh�
contextlibr�ior�	functoolsrr�htmlr�flaskrr	r
rrr
rr�flask_loginrrr�!buyercall.blueprints.agents.formsrr�	flask_wtfr�"buyercall.blueprints.agents.modelsrr�!buyercall.blueprints.leads.modelsr�flask_babelrrE�
sqlalchemyrrrrrrr r!�sqlalchemy.ormr"r#�$buyercall.blueprints.user.decoratorsr$�'buyercall.blueprints.billing.decoratorsr%r&�buyercall.extensionsr'r(�__name__r)�	getLoggerr2r;�route�exemptrFr�r�r�rrrOrUrrr�r�r�r�r�r+r.r.r.r1�<module>s�(	(
qM{?- S#-