U
    gN                    @   s@  d dl mZ d dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZmZmZmZmZmZmZmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZ d dlmZ d dlmZ d dl m!Z! d dlm"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+ d dl,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4 d dl5m6Z6 d dl7m8Z8m9Z9m:Z: d dl;m<Z<m=Z=m>Z>m?Z? d dl@Z@d dlAZAd dlBZBd dl,Z,d dlCZCd dlDZDd dlEZEd dlFmFZFmGZG d dlHmIZI d dlJmKZK d dlLmMZM e>e?dZNe>e?dZOe>e?dZPe>e?dZQeNReQZSe! ZTeTU ZUejVdddgdd d! ZWeVd"e6d#d$ ZXeVd%d&d' ZYeVd(eOjZd)d*d+d, Z[eVd-eNjZd)d*d.d/ Z\eVd0eNjZd)d*d1d2 Z]ejVd3ddgdeNjZd)d*d4d5 Z^ejVd6ddgdeNjZd)d*d7d8 Z_d9d: Z`d;d< Zad=d> ZbejVd?ddgdeNjZd)d*d@dA ZcejVdBddgdeNjZd)d*dCdD ZdeVdEeNjZd)d*dFdG ZeeVdHeNjZd)d*dIdJ ZfeVdKeNjZd)d*dLdM ZgejVdNddgdeNjZd)d*dOdP ZhejVdQdgdeNjZd)d*dRdS ZiejVdTddgdeNjZd)d*dUdV ZjejVdWdgdeNjZd)d*dXdY ZkeVdZeNjZd)d*d[d\ ZlejVd]dgdeNjZd)d*d^d_ ZmejVd`dagdeNjZd)d*dbdc ZnejVdddgdeNjZd)d*dedf ZoeVdgeNjZd)d*dhdi ZpejVdjdgdeNjZd)d*dkdl ZqeVdmeNjZd)d*dndo ZreVdpeNjZd)d*dqdr ZseVdseNjZd)d*dtdu ZtejVdvdgdeNjZd)d*dwdx ZuejVdyddgdeNjZd)d*dzd{ ZvejVd|dgdeNjZd)d*d}d~ ZwejVddgdeNjZd)d*dd ZxeVdeNjZd)d*dd ZyejVdddgdeNjZd)d*dd ZzejVddgdeNjZd)d*dd Z{ejVddgdeNjZd)d*dd Z|eVdeNjZd)d*dd Z}ejVdddgdeNjZd)d*dd Z~eVdeNjZd)d*dd ZejVdddgdeNjZd)d*dd ZeVdeNjZd)d*dd ZeVdeNjZd)d*dd ZejVdddgdeNjZd)d*dd ZeVdeNjZd)d*dd ZeVdeNjZd)d*dd ZejVdddgdeNjZd)d*dd ZejVdddgdeNjZd)d*dd ZejVdddgdeNjZd)d*dd ZejVdddgdeNjZd)d*dd ZeVdeNjZd)d*dd ZejVdddgdeNjZd)d*dd ZejVdddgddd ZejVdddgddd ZejVddgdddÄ ZejVdddgdddƄ ZejVdddgdddɄ ZejVdddgddd̄ ZejVdddgdddτ ZejVdddgddd҄ ZejVdddgdeNjZd)d*ddՄ ZejVdddgdeSjZd)d*dd؄ ZejVdddgdddۄ ZejVdddgde6ddބ ZejVdddgdeOjZd)d*dd ZejVdddgdeOjZd)d*dd ZejVdddgdeNjZd)d*dd ZejVdddgdeNjZd)d*dd ZejVdddgdeNjZd)d*dd ZejVddgdeNjZd)d*dd ZejVdddgdeNjZd)d*dd ZejVdddgdeNjZd)d*dd ZejVddgdeNjZd)d*dd ZejVddgdeNjZd)d*dd ZejVdddgdeNjZd)d*dd ZejVd ddgdeNjZd)d*dd ZejVddgddd ZejVddgddd ZejVd	ddgdd
d Zeddd Zed)dd Zeddd ZdS (      )absolute_import)randint)db_model)queries)Timecategory)app	db_helperexotel_helper
loginutils	adminuserr   db
app_logger)PreCalculatedCampaignService)MissedCallService)CampaignCreationService)config_parser
slackutilsreplace_chars)AddProgramForm)get_db_connection)
invalid_nudge_namenudge_format_message$user_does_not_have_active_experienceget_current_isttimeuser_does_not_existuser_pending_pause_logblast_format_messageinvalid_blast_nameuser_paused_for_experimentget_current_utc_time)current_apprender_templateredirectrequestmake_responseflashurl_forjsonify)login_required)
login_userlogout_usercurrent_user)Identityidentity_changed
PermissionRoleNeedN)datetime	timedelta)zip)StringIO)EXOTEL_CALLS_PERMITTEDZadminchampionuserZsurveyor/loginGETPOST)methodsc                  C   s   t tj} d }|  rtjjtjj	| j
d k }|rtd| || j
d rt|rtjt t|jd t|jdkr|jd jdkrttdS td	S ntd
| d}td| |dS )Nusernamez%s logging inpassword)identity   r   r6   champion_landing_page	/programszInvalid password for %szIncorrect username or password.zpartials/login.html)formerror)r
   Z	LoginFormr$   rB   validate_on_submitr   	AdminUserqueryfilterr<   datafirstr   infoZauthenticater*   r.   sendr!   _get_current_objectr-   idlenrolesnamer#   r'   warningr"   )Z
login_formrC   r7    rR   %/var/www/dostadmin/dostadmin/views.pyloginR   s(     
rT   z/logoutc                  C   s8   t jjt jjt k } | r*|   t	  t
dS )Nr8   )r   rE   rF   rG   rM   r   get_current_adminuser_idrI   logoutr+   r#   )r,   rR   rR   rS   rV   k   s    rV   /c                  C   sT   t jjt jjt k } | rLt| j	dkrL| j	d j
dkrLttdS tdS )Nr?   r   r6   r@   rA   )r   rE   rF   rG   rM   r   rU   rI   rN   rO   rP   r#   r'   )r7   rR   rR   rS   landing_pagez   s    "rX   z/champion_home  )http_exceptionc                   C   s   t dS )Nzpartials/landing.html)r"   rR   rR   rR   rS   r@      s    r@   /todays_campaignsc                  C   sB   t dd} t tddd } tjj|  }t	j
ddd|dS )	Nz2017-09-14 10:00z%Y-%m-%d %H:%M      hoursminutes	home.html	campaignsactive_panelactive_viewrb   )r1   strptimer    r2   r   CampaignrF   Zget_campaigns_for_datedateflaskr"   )istnowrb   rR   rR   rS   todays_campaigns   s    rk   z
/campaignsc                  C   s   t jj } tjddd| dS )Nra   rb   rc   )r   rg   rF   Zget_campaigns_logri   r"   )rb   rR   rR   rS   campaigns_panel   s    rl   /schedule_announcementsc                  C   s  t jdkr6tjj } tjjj}t	dddt
 | |dS g }g }t jd }|d}t|dkrj|t  tt jd	 }t jd
 }ttt jd d }t jd  d}	|	D ]}
tjj|
}|s|t|
 q|jtjjjkr|jdd  tjd kr|t|
 q|r8t| dd | d}n"t| dd |j!j" d d}|||f q|st# $||| n|D ]}t%|d qt&'dS )Nr9   partials/campaign_form.htmlZAnnouncementsrm   )titleform_actionZblast_messagecontenttime_categorycp_name_   	audio_smsrr   deploy_date%m/%d/%Yphones
iTAF_EXPERIMENT_PROVIDER_NUMBERSz%Y-%m-%d %Y-%m-%d %H:%M:%Sz:00rC   )(r$   methodr   ContentrF   get_content_logr   AnnouncementTimeCategoryCHOICESr"   r   rB   splitrN   appendr   intr1   rf   r   rh   strip
Experiencefind_experience_with_phoner   statusStatusZPAUSEDprovider_numberr   configr   strftimetimecategorytimer   Zadd_blast_campaignr&   ri   r#   )rq   time_choices
error_listZexp_listrs   splitted_name
content_iddeploy_timerw   uphonesphoneZexp_recdeploy_datetimerC   rR   rR   rS   schedule_announcements   sp    

	


 r   z/manage_user_datac               
   C   s   t jdkrtdS t jdd} z@t|  t|  t|  tdd|  d t	
d|  d W nJ tk
r } z,d|  d	t| }td
| t	| W 5 d }~X Y nX tdS )Nr9   z/partials/manage_user_data.html
user_phone successzUser data for phone number z deleted successfullyz0Error while deleting user data for phone number z	. Error: rC   )r$   r~   r"   rB   getdelete_missed_calls_data$delete_campaigns_and_experience_datadelete_registration_datar&   r   rJ   	ExceptionstrrC   )r   eerror_messagerR   rR   rS   delete_user_data   s"    
 

r   c                 C   s@   t j| }dtt|}tjd| t	
d|  d d S )N, Z
engagementz:Removed missed call logs from bigquery for the user phone .)r   ZMissedCallLogZdelete_missed_calls_for_phonejoinmapr   r   remove_bigquery_table_recordsdelete_admidashboard_recordsr   rJ   )r   Zmissed_call_id_dataZmissed_call_idsrR   rR   rS   r     s     
r   c                 C   s   t jj| }|D ]}t j|j}dtt	|}t
jd| td|   t j|j t j| t
jd|j td|  d|j  qd S )Nr   campaignz7Removed campaign logs from bigquery for the user phone Zuser_programz9Removed experience data from bigquery for the user phone z and experience id )r   r   rF   Zget_all_experience_for_phonerg   Z"delete_campaigns_for_experience_idrM   r   r   r   r   r   r   r   rJ   PreCalculatedUserCampaignDataZ,delete_pre_calculated_data_for_experience_idZdelete_experience)r   Zexperience_data
experienceZcampaign_id_dataZcampaign_idsrR   rR   rS   r     s0      r   c                 C   s4   t j| }tjd| td|  d|  d S )NZregistrationz;Removed registration data from bigquery for the user phone z and registration id )r   ZRegistrationZdelete_registration_for_phoner   r   r   r   rJ   )r   Zregistration_idrR   rR   rS   r   (  s     r   z/system_configc                  C   s   t jdkr"tjj } td| dS t jdkrt jd }t jd }t }d}z||| W n t	k
rt   d}Y nX tjj } td| |d	S d S )
Nr9   z/partials/system_config.html)configurationsr:   config_nameconfig_valueFT)r   rC   )
r$   r~   r   SystemConfigurationrF   Zget_all_configsr"   rB   
set_configr   )r   r   r   Zconfig_instancerC   rR   rR   rS   system_configuration2  s,    
 



  r   /schedule_nudgec               
   C   sz  t jdkrLtjj } d}t| t }t	j
j}tddd| |t |dS g }g }t jd }|d}t|d	kr|t  tt jd
 }tt jd }	tjjj}
t jd dkrt jd }
ttt jd d }t jd }|s\tj|	|||
||tjjjd}z$tj| tj   |d W n. t!k
rX } z|| W 5 d }~X Y nX n
t"|d t"|d t#$dS )Nr9   zselect group_version.id as id, conditions, version_number, is_active_version, name FROM groups RIGHT JOIN group_version ON group_version.group_id = groups.id WHERE group_version.is_active_version = 'yes'zpartials/nudge_form.htmlNudgesr   )ro   rp   contentsrr   Znudge_messagegroupsrs   rt   ru   rv   grouprr   r   rw   rx   repeat_frequency)group_version_idrP   Zdeployment_dateZdeployment_timeZnudge_repeat_frequencyr   r   zNudge scheduled successfullyrC   message)%r$   r~   r   r   rF   r   cursorexecutefetchallr   r   r   r"   r   rB   r   rN   r   r   r   r   TimeZUSER_TIME_SLOTr1   rf   r   rh   r   ACTIVEr   sessionaddcommitr   r&   ri   r#   )r   rF   r   r   r   r   Z
nudge_namer   r   r   r   rw   r   nudge_detailsr   rR   rR   rS   schedule_nudgeK  sf    






 




r   z/delete_campaign/<cp_id>c                 C   s   t j|  tdS )Nr[   )r   rg   delete_campaignri   r#   )Zcp_idrR   rR   rS   r     s    r   z/cancel_queued_campaignsc                  C   s,   t jjd} | D ]}|d qtdS )NZqueuedZunscheduledr[   )r   rg   rF   Zget_campaigns_with_statusZchange_campaign_statusri   r#   )Zqueued_campscrR   rR   rS   cancel_queued_campaigns  s    r   /contentc                  C   s,   t jj } t jj }tjddd| |dS )Nra   rq   )rd   re   content_ver	languages)r   ContentVersionrF   Zget_all_content_versionsLanguageget_all_languagesri   r"   )r   r   rR   rR   rS   content_panel  s    r   z/add_contentc                  C   s   t jdkrt jd d} t jd d}t jd d}t jd d}t| }t||ksvt||ksvt||krtd n>tt| |||}tj	
|}|std nd	| }t|d
 tdS tdS )Nr:   rq   rz   durationappidlanguagekValues in all fields are required for each record. Please check if all the fields have equal number of data#Successfully added all the contentszGot error for contents: rC   zpartials/content_form.html)r$   r~   rB   r   rN   r&   listr3   r   r   Zadd_new_contentsr"   )rq   r   exotel_appidr   total_contentsc_dataerrorsr   rR   rR   rS   add_content  s.    





r   z/get-versionsc                  C   s|   t jd } tjj| }d }d}|D ]J}|rP|d t|j d |jj	 d }q$dt|j d |jj	 d }q$|| }|S )NrM   zExisting Versions are : z<br>z( z ))
r$   rB   r   r   rF   Z!get_content_version_by_content_idr   versionr   rP   )r   Zcontent_versionsZversionsr   cvrR   rR   rS   get_versions  s    
  r   z/add-content-versionc            
      C   s   t jj } t jj }tjdkrtjd }tjd }tjd }tjd }tjd }|||||g}t j	
|}|s|td nd| }	t|	d	 td
| |dS td
| |dS )Nr:   rq   r   r   r   r   r   zGot error: rC   z"partials/content_version_form.html)r   r   )r   r   rF   r   r   r   r$   r~   rB   r   Zadd_new_content_versionr&   r"   )
r   r   rq   r   r   r   r   r   r   r   rR   rR   rS   add_content_version  s0    







    r   z/update-contentc                  C   sZ   t jdkrRt jd } t jd }t jd }t jd }| |||g}tj| tdS tdS )Nr:   r   r   r   r   r   )r$   r~   rB   r   r   Zupdate_contentsr#   )r   r   r   r   Zcontent_datarR   rR   rS   update_content  s    




r   z/delete_contentc                   C   s   t   tdS )Nr   )r   clear_contentr#   rR   rR   rR   rS   delete_content  s    r   z/toggle_content_statusc                  C   st   t jd } tjj| }|jtjjjkr@tjjj	|_t
j  n&|jtjjj	krftjjj|_t
j  t|j| dS NrM   )r   rM   )r$   rB   r   r   rF   Zget_content_version_by_idr   r   r   INACTIVEr   r   r   r(   )content_version_idZcontent_detailsrR   rR   rS   toggle_content_status  s    

r   z/delete_configDELETEc                  C   sl   t jd } tjj| }|rXt }z||  ddiW S  tk
rT   ddi Y S X ndd|  diS d S )NrM   r   TrC   z:Internal server error while trying to process the request.zConfig Id: z was not found in the records.)r$   argsr   r   rF   Zget_config_by_idZdelete_configr   )Z	config_idrH   record_instancerR   rR   rS   delete_system_config+  s    


 r   z/set_configc               
   C   s   t tj} | d }| d }t }z|| | tjj	
tjjt k }|jj d|j }|rtd| d| d|  |tkrt|||}|jdkrdd	iW S d
d|j iW S W n4 tk
r } zd
d| i W Y S d }~X Y nX d S )NrP   valuer|   zThe system configuration z was set to z by the    r   TrC   z5Failed to initiate slack alert request. Status code: z;Internal server error while trying to process the request. )jsonloadsr$   rH   r   r   r   upperrE   rF   rG   rM   r   rU   rI   	__class____name__r<   r   rQ   r5   r   Zinitiate_slack_alert_requeststatus_coder   )Zrequest_datar   r   r   r,   Z	user_inforesponser   rR   rR   rS   set_system_config=  s<      

 

 r   z/nudgec                  C   s   t jj } tjddd| dS )Nra   Znudge)rd   re   nudges)r   r   rF   Zget_all_nudgesri   r"   )r   rR   rR   rS   nudge_panelb  s       r   z/toggle_statusc                  C   st   t jd } tjj| }|jtjjjkr@tjjj	|_t
j  n&|jtjjj	krftjjj|_t
j  t|j| dS r   )r$   rB   r   r   rF   Zget_details_by_idr   r   r   r   r   r   r   r(   )Znudge_idr   rR   rR   rS   toggle_statusk  s    

r   /ivr-promptsc                  C   s   t jj } tjddd| dS )Nra   Z	ivrprompt)rd   re   ivr_prompts)events_model	IVRPromptrF   get_all_ivr_promptsri   r"   )r   rR   rR   rS   r   |  s    r   z/download-sample-sheetc                  C   s@   t  } t| }|dg t|  }d|jd< d|jd< |S )NrM   r   eventkeypress
event_typer   z)attachment; filename=sample_ivrprompt.csvContent-Dispositiontext/csvContent-type)r4   csvwriter	writerowsr%   getvalueheaders)sicwr   rR   rR   rS   download_sample_sheet  s    

r
  z/download-ivr-promptc                  C   s~   t jj } t }t|}t tddd }|	dg |	dd | D  t
| }dt| d |jd	< d
|jd< |S )Nr\   r]   r^   r   c                 S   s(   g | ] }|j |j|j|j|j|jfqS rR   r   ).0rrR   rR   rS   
<listcomp>  s   z'download_ivr_prompt.<locals>.<listcomp>zattachment; filename=ivrpromptz.csvr   r  r  )r   r   rF   r   r4   r  r  r    r2   r  r%   r  r   r  )r   r  r	  rj   r   rR   rR   rS   download_ivr_prompt  s    

r  z/upload-promptsc                  C   s  t jd } i }tjj }|D ]}|||j< q| dkrtt	
| jd}g }|D ]}zb|d dkrzt|d  nd }|d dkrt|d  nd }|d  }	|d dkrt|d  nd }
|d dkr|d  nd }|d	 dkr|d	   nd }|	dkr|d k	r||}|r|j|ksh|j|	ksh|j|
ksh|j|ksh|j|kr||_|	|_|
|_||_||_tj  n*tj|	|
|||d
}tj| tj  W qT tk
r  } z"td|  ||d  W 5 d }~X Y qTX qT|rt|d tdS )NZuploadr   utf-8rM   r   r   r   r   r   )r   r   r   r   r   z3Exception occurred while uploading prompts. Error: rC   r   )r$   filesr   r   rF   r   rM   r  
DictReadercodecs
iterdecodestreamr   r   lowerr   r   r   r   r   r   r   r   r   r   r   r   rC   r   r&   r#   )Zuploaded_sheetZivr_prompt_dictr   promptZ
csv_readerZerror_promptsrow	prompt_idr   r   r   r   r   Z
ivr_promptZ
prompt_recr   rR   rR   rS   upload_prompts  sv    


 
 


"
r  z/add-ivr-promptsc                  C   s   t jdkrt jd d} t jd d}t jd d}t| }t||ksZt||krdtd n<tt| ||}tj	
|}|std nd| }t|d	 td
S td
S )Nr:   r   rz   r   r   r   &Successfully added all the IVR PromptszGot error for Prompts: rC   zpartials/ivr_prompt_form.html)r$   r~   rB   r   rN   r&   r   r3   r   r   Zadd_new_promptsr"   )r   r   r   r   Zivr_datar   r   rR   rR   rS   add_ivr_prompts  s"    


r  z/update-promptsc                  C   sf   t jdkr^t jd } t jd }t jd }t jd }t jd }| ||||g}tj| tdS tdS )Nr:   r  r   r   r   r   r   )r$   r~   rB   r   r   update_promptsr#   )r  r   r   r   r   prompt_datarR   rR   rS   r  	  s    





r  z/toggle_prompt_statusc                  C   sd   t jd } tjj| }|jtjjjkr@tjjj	|_t
j  ntjjj|_t
j  t|j| dS r   )r$   rB   r   r   rF   Zget_ivr_prompt_by_idr   r   r   r   r   r   r   r(   )ivr_prompt_idZprompt_detailsrR   rR   rS   toggle_prompt_status  s    

r  /ivr-prompt-mappingc                  C   s   t jj } tjddd| dS )Nra   Zivrpromptmapping)rd   re   ivr_prompt_mapping)r   IvrPromptMappingrF   Zget_all_prompt_mappingri   r"   )r!  rR   rR   rS   r!  +  s    r!  /add-ivr-prompt-mappingc                  C   s0  t jdkr$tjj } tdd| dS d }t jd }t jd }t jd }t jd }d	| d
}t	| t
 d }d| d| d
}t	| t
 d }	|dkrd| d }nN|	dkrd| d | }n4tjt||||tjjjd}
tj|
 tj  |std nd}t|d t|d tdS )Nr9   z!partials/prompt_mapping_form.htmlr#  )rp   promptsr   tablecolumnr   ISELECT EXISTS (SELECT FROM information_schema.tables WHERE table_name = '')r   zNSELECT EXISTS (SELECT FROM information_schema.columns
    WHERE table_name = '' and column_name = 'FTable  does not existsColumn  does not exists in the table )r  Zmapped_table_nameZmapped_table_column_namer   r   r  zGot error while adding promptsrC   )r$   r~   r   r   rF   r   r"   rB   r   r   fetchoner   r"  r   r   r   r   r   r   r   r&   ri   r#   )r$  r   Zevent_idmapped_tablemapped_columnr   
find_tabletable_existsfind_columncolumn_existsZadd_mappingr   rR   rR   rS   add_prompt_mapping7  sT    










r5  z/update-mappingc                  C   s  t jdkrt jd } t jd }t jd }t jd }d }d| d}t| t d }d	| d
| d}t| t d }|dkrd| d }n2|dkrd| d | }n| |||g}	tj|	 |st	d nd}
t	|
d t	|d t
dS t
dS )Nr:   
mapping_idr%  r&  r   r'  r(  r   zJSELECT EXISTS (SELECT FROM information_schema.columns WHERE table_name = 'r)  Fr*  r+  r,  r-  z,Successfully updated the IVR Prompts Mappingz Got error while updating promptsrC   r   )r$   r~   rB   r   r   r.  r   r"  r  r&   ri   r#   )r6  r/  r0  r   r   r1  r2  r3  r4  r  r   rR   rR   rS   update_mappingh  s@    










r7  z/toggle_mapping_statusc                  C   sd   t jd } tjj| }|jtjjjkr@tjjj	|_t
j  ntjjj|_t
j  t|j| dS r   )r$   rB   r   r"  rF   	get_by_idr   r   r   r   r   r   r   r(   )Zivr_prompt_mapping_idZmapping_detailsrR   rR   rS   toggle_mapping_status  s    

r9  z/usersc                  C   s   t jj } tjddd| dS )Nra   users)rd   re   experiences)r   r   rF   get_active_experiencesri   r"   )r;  rR   rR   rS   users_panel  s       r=  
/add_usersc                  C   sV  t jdkr.tjj } tjjj}t	d| |dS t jdkrRg }t
dt j t jd d}t jd d}t jd	 d}t jd
 d}t jd d}t jd }t jd }	|tjjjkrt jd d}
tt||||||
}n&t jd d}tt||||||}t|||	}|s*td n tdd |D ]}t|d q8tdS d S )Nr9   zpartials/user_form.html)provider_numbersexperience_typesr:   zAdding user %srP   rz   partnerry   batch
start_dateexperience_typer   Z	wa_phonesprogramz Successfully added all the users-There were following errors while uploading: rC   r>  )r$   r~   r   ProviderNumberrF   Zget_all_phone_namesr   TypeZCHOICEr"   r   rJ   rB   r   ZWHATSAPPr   r3   r   Zadd_non_mvp_usersr&   r#   )r?  r@  udataunameZupartnerr   ZubatchZudaterD  r   Z	uwaphonesZuprogramr   rC   rR   rR   rS   	add_users  s>    





rK  	/partnersc                  C   s   t jj } tjddd| dS )Nra   partners)rd   re   rM  )r   PartnerrF   Zget_partners_logri   r"   )rM  rR   rR   rS   partners_panel  s       rO  z/add_partnerc                  C   s   t jdkrtdS t jd d} t jd d}t jd d}t jd d}t jd d}tt| ||||}t| t	d	S )
Nr9   zpartials/partner_form.htmlrP   rz   ZareaZcityZchannel_nameemailrL  )
r$   r~   r"   rB   r   r   r3   r   Zadd_to_partner_tabler#   )Zp_namesZp_areaZp_cityZ	p_channelZp_emailrM  rR   rR   rS   add_partner  s    

rQ  z/delete_partner/<partner_id>c                 C   s   t | } tj|  tdS )NrL  )r   r   rN  delete_partnerri   r#   )
partner_idrR   rR   rS   rR    s    rR  	/channelsc                  C   s   t jj } tjddd| dS )Nra   channels)rd   re   rU  )r   ChannelrF   Zget_channel_logri   r"   rU  rR   rR   rS   channels_panel  s       rX  z/add_channelsc                  C   s4   t jdkrtdS t jd d} t|  tdS )Nr9   zpartials/channel_form.htmlrP   rz   rT  )r$   r~   r"   rB   r   r   Zadd_to_channel_tabler#   rW  rR   rR   rS   add_channel  s
    

rY  rA   c                  C   sL   t jj } tjt}|r.t|j	
 dkr4d}nd}tjddd| |dS )N)NONEFALSEFTra   programs)rd   re   r\  exotel_calls_permitted)r   ProgramrF   get_programs_logr   ZSystemConfigurationUtilZparse_configr5   r   r   r   ri   r"   )r\  r]  rR   rR   rS   programs_panel  s    r`  z/program_details/<program_id>c                 C   s,   t jj| }|r$tjddd|dS tdS )Nra   program_details)rd   re   rE  rA   )r   r^  rF   get_program_detailsri   r"   r#   )
program_idrE  rR   rR   rS   ra  '  s    ra  z/programseq/<program_id>c                 C   s   t jdkr$tjj| }td|dS t jd d}t jd d}t jd d}t jd d}t	t
||||}t| | td	S )
Nr9   zpartials/programseq_form.html)rE  seq_idxrz   rq   weekdayrA   )r$   r~   r   r^  rF   rb  r"   rB   r   r   r3   r   Zadd_to_programr#   )rc  rE  rd  rq   re  rf  ZpdatarR   rR   rS   programseq_panel5  s    
rg  z/add_programc               
   C   s~   t tj} |  rrtj| jj| jj| j	j| j
j| jj| jj| jj| jjd}tj| tj  td tdS td| dS )N)rP   r   rC  end_dater   type
hindi_namedescriptionzSuccessfully added the programrA   zpartials/program_form.html)rB   )r   r$   rB   rD   r   r^  rP   rH   r   rC  rh  r   Zprogram_typerj  rk  r   r   r   r   r&   r#   r"   )rB   Zprogram_objrR   rR   rS   add_programE  s"    


rl  /schedule_programc                  C   s   t jdkr"tjj } td| dS t jd d}t jd d}t jd }t	t
||}t||\}}|D ]}tt|d qn|D ]}tt|d qtd	d td
S )Nr9   z%partials/experiencepauselog_form.html)r\  r   rz   pause_start_datenext_programrC   z<Program for users without errors has been queued succesfullyrm  )r$   r~   r   r^  rF   r_  r"   rB   r   r   r3   r   Zadd_experience_pause_logr&   r   r   r#   )r\  ry   Zstart_datesro  Zpause_log_dataZno_experienceZpending_pause_logr   rR   rR   rS   add_pause_log\  s(    
 
 
rp  z/callsc                  C   sd   t jdkrtjddddS t jd } t jd }t jd d}|D ]}tj||d	d
| d qBtdS )Nr9   ra   calls)rd   re   	exo_phone	exo_appidry   rz      T)trialignore_checkrr  rW   )	r$   r~   ri   r"   rB   r   r	   	make_callr#   )rr  rs  ry   prR   rR   rS   calls_panelw  s$    
  

    ry  z/engagement_reportc                   C   s
   t dS )Nz/home)ri   r#   rR   rR   rR   rS   engagement_report  s    rz  /tcrc                  C   sf   t jdkr(tjj } tjd| dddS t jd }t jd }tj	
||rTtd n
tdd	 td
S )Nr9   zpartials/time_change_panel.htmlZtime_change)timecategoriesrd   re   r   rr   zDSuccessfully created a request. The changes would happen by tomorrowz.There was some errors while updating the data.rC   r{  )r$   r~   r   r   rF   Zget_timecategory_logri   r"   rB   Z
ChangeReqsZcreate_change_requestr&   r#   )r|  r   r   rR   rR   rS   	tcr_panel  s    




r}  z
/exocallinc               
   C   s   zrt jdkrZt jd} td|   dtt j krZdtt j krZt 	t j t
ddiddd	ifW S  tk
r } z"td
|  tt  W 5 d }~X Y nX d S )Nr9   Fromz2Missed call Handling: Received a missed call from Tor   Tr   ContentTypeapplication/jsonz(Exception on exocallin function. Error: )r$   r~   r   r   r   rJ   r   keysr   Zhandle_missed_callr   dumpsr   rC   debug	traceback
format_exc)r   r   rR   rR   rS   	exocallin  s    
r  z/ciffcallbackc                  C   s   ddddg} d}t jdkrtdt jd dtt j krd	tt j krt jd}|r|d
d  }| tdd }t	j
||d|d tdS )NiPS iU iO iO Z01140844944r9   z Received a missed call from %s: r~  r  r?   r   rt  T)r   rs  rv  rr  rW   )r$   r~   r   rJ   r   r   r   r  r   r	   rw  r#   )Zcontent_appidsrr  user_numberr   rR   rR   rS   ciffcallback  s     
$r  z/rapidprotestc                  C   s   t jd} t jd}| r |s>tddddidddifS td	d
d t dt ddd| ddt dd d d dd d d dd didddifS )Ntor   ZRestExceptioni  zInvalid Call Parameters)r   Messager  r  CallZ mb33g922c5e6f79exedxz0f4y19714a1r}   ZdosteducationZ01140844787zin-progresszoutbound-apiz+/v1/Accounts/dosteducation/Calls/xxxxx.json)ZSidZParentCallSidZDateCreatedZDateUpdatedZ
AccountSidr  r~  ZPhoneNumberSidr   Z	StartTimeZEndTimeDurationZPriceZ	DirectionZ
AnsweredByZForwardedFromZ
CallerNameZUriZRecordingUrlr   )r$   r   r   r   r  r1   nowr   )Z	to_numberapp_idrR   rR   rS   rapidprotest  sH    	r  z/confirmation_callc               
   C   s.  t jdkr*t jd} | dd  }tjj|tjjj	tjjj
g}|rtd| ztt jdddd}W n6 tk
r } zd	}td
|  W 5 d }~X Y nX |dkrtjjj|_n8|dkrtjjj|_n"|jjtjjdkrtjjj
|_tj  ntd| tddidddifS d S )Nr9   r~  r?   z&Updating status for user with phone %sdigitsr   "r   z?Exception occurred while scheduling confirmation calls. Error: 	   ZcallinzNo user found for the number %sr   Tr   r  r  )r$   r~   r   r   r   r   rF   !find_experience_with_phone_statusr   ZSIGNUPZSIGNUP_UNCONFIRMEDr   rJ   r   replacer   rC   ZSIGNUP_CONFIRMEDr   ZSIGNUP_REJECTEDr7   rS  rN  Zget_by_namer   r   r   r   r  )r   r  r   touchtone_valuer   rR   rR   rS   confirmation_call  s<    r  z/autocallciff/<appid>/<trial>c                 C   s   d S )NrR   )r  ru  rR   rR   rS   autocallciff"  s    r  z/livecall/<campaign_id>c                 C   s   t jdkrtdt jd  tjjtjj	| k
 }|r|jtjjjkrt jd }t jd }td|  d|  |t jd t jd  |j|jt jd d}t | ntd|  d	|  td
S d S )Nr:   zCall attempt status: %sr   ZCallSidz.Updating status of live call campaign with id z to )experience_idscheduled_byZexotel_statuszNo incomplete campaign with id z found for the callsid rn   )r$   r~   r   rJ   rB   r   rg   rF   rG   rM   rI   r   r   	COMPLETEDZupdate_campaign_after_callbackr  r  r   Z(update_pre_calculated_user_campaign_datarQ   ri   r"   )Zcampaign_idr   r   Zcall_sidZcampaign_datarR   rR   rS   livecall'  s6    



 
r  z/missedcallresponsec                  C   sx   t jdkrtt jd} | dd  } tjj| }|r^tt jdd	dd}tj
|| ntd|  td	S d S )
Nr9   r~  r?   r  r   r  r   z"No campaign found for the phone %srn   )r$   r~   r   r   r   r   rF   r   r   r  Zhandle_callin_feedbackr   rQ   ri   r"   )r  r   r  rR   rR   rS   missedcallresponseL  s    

r  z/branch_streaks_responsec            	      C   sj  t jdkrft jd} | dd  } tjj| tjjj	}|rPt
t jdddd}|dkr\tjjd}|d	kr\tjj|js\tjj|}t  }|j tjjjkr|t|  d
 dd }|td|d }n*|t|  d dd }|td|d }td|  tj|j|||tjjjd}tj| tj   nt!d|  t"#dS d S )Nr9   r~  r?   r  r   r  r   ZSTREAKSr  ru   )daysweeksz'Creating new pause log for the phone %s)r  rn  pause_end_dateZnext_program_idr   z$No experience found for the phone %srn   )$r$   r~   r   r   r   r   rF   r  r   r   r   r  r^  Zfind_program_id_with_nameZExperiencePauseLogZpending_pause_log_existsrM   Z
ProgramseqZget_program_lenr   rh   rC  weekdayCohortZWEEKENDr2   r   rJ   PENDINGr   r   r   r   rC   ri   r"   )	r  r   r  rc  Zprogram_lentodayrn  r  Z	pause_logrR   rR   rS   streaksresponse`  sn     


  
   
r  /add_provider_numberc                  C   s   t jdkrtdS t jdkrtdt j t jd d} t jd d}t jd d}t jd	 d}t jd
 d}tt| ||||}t	
|}|std n2tdd |D ]}td| t|d qtd tdS d S )Nr9   z!partials/providernumber_form.htmlr:   z#Adding provider number with data %sr   rz   rP   r   r   rA  zSuccessfully added all the datarF  rC   z&Error while adding provider number: %sz&Please correct the data and add again.r  )r$   r~   r"   r   rJ   rB   r   r   r3   r   add_provider_numberr&   rC   r#   )r   rP   r   r   rA  rI  r   rC   rR   rR   rS   r    s(    




r  z
/live_callc            	      C   s<  t jdkr>tjj } t jdd}td| t	j
|tjjjdS tdt j t jd }t jd }t jd }t jd	d
}tjj|}tj||r|jnd t tjjjtjjj|r|jnd |||d	}tj| tj  t||||\}}|rtdd|tjj t	j
tjjjdS td||tjj t	j
tjjjdS )Nr9   r   r   zpartials/live_call_form.html)exotel_phonesagent_phoner   purposeszMaking live call with data: %sr  exotel_phonepurposeZLC	rP   r  r   r   r  user_idr   r  Zagent_numberT)r   r   r  r  r  )rC   r   r  r  r  ) r$   r~   r   rG  rF   get_live_call_provider_numberr   r   r"   r,   r   rg   LiveCallPurposeZCHOICE_ENGLISHr   rJ   rB   r   r   rM   r   r   	SCHEDULEDScheduledByZ	LIVE_CALLr  r   r   r   r   r	   make_live_call)	r?  r   r  r  r  user_experiencer   r   r   rR   rR   rS   	live_call  sh    




   
	
r  z/user_checkc                  C   sh   t jdkrtdS t jd } tjj| }t	d|  d d}|sRtd|| dS d	}td||j
| d
S )Nr9   zpartials/user_check.htmlr   zDError occurred while adding user from dostadmin having phone number r   Fzpartials/user_check_result.html)user_existsr   T)r  rC  r   )r$   r~   r"   rB   r   r   rF   Z!find_oldest_experience_with_phoner   rC   rC  )r   r  r  rR   rR   rS   
user_check  s.    


r  /feedback_callc                  C   s   t jdkr$t jdd} td| dS tdt j tj	d }t
j}tjj d j}t jd } tjj| }tj|rd	t|j nd	|r|jnd t tjjjtjjj|r|jnd || |d
	}tj| tj  t | ||| t!d|   t"dS )Nr9   r   r   zpartials/feedback_call.html)r   z#Making Feedback call with data:  %sFEEDBACK_EXO_APPIDr   ZFBr  z,Successfully scheduled the feedback call to r  )#r$   r~   r   r   r"   r   rJ   rB   r   r   r,   r   r   rG  rF   r  r   r   rg   r   r  rM   r   r   r  r  ZFEEDBACK_CALLr   r   r   r   r	   Zschedule_feedback_callr&   r#   )r   Zfeedback_call_appidr  r  r  r   rR   rR   rS   feedback_call  sF    




   r  z/champion_callc                  C   s   t jdkrt jdd} t jdd}| rtj}tjj	 d j}tj
j| }tdt j tj||rn|jnd t tjjjtjjj|r|jnd || |d	}tj| tj  t| |||\}}|rtd	d
| |dS td	|| |dS d S )Nr9   r   r   r  CCr   zLive call data: %sr  zpartials/champion_call.htmlT)r   r   r  )rC   r   r  )r$   r~   r   r   r,   r   r   rG  rF   r  r   r   r   rJ   rg   rM   r   r   r  r  CHAMPION_CALLr  r   r   r   r   r	   r  r"   )r   r  r  r  r  r   r   r   rR   rR   rS   champion_call7  sX    

   r  z/champion_call_userc            	      C   s  t jdkr0tjj d j} td| tjj	j
dS tdt j t jd }t jd }t jd }t jd	d
}tjj|}tj||r|jnd t tjjjtjjj|r|jnd |||d	}tj| tj  t||||\}}|rtdd||tjj	j
dS td|||tjj	j
dS )Nr9   r   z%partials/champion_call_user_form.html)r  r  zChampion call data: %sr   r  r  r  r  r  T)r   r   r  r  )rC   r   r  r  )r$   r~   r   rG  rF   r  r   r"   rg   r  ZCHOICE_HINDIr   rJ   rB   r   r   r   rM   r   r   r  r  r  r  r   r   r   r   r	   r  )	r   r   r  r  r  r  r   r   r   rR   rR   rS   champion_call_userh  sb    





   r  /dndc                  C   s<   t jdkrtdS t jd d} t| }tjd|dS )Nr9   zpartials/dnd_checker.htmlplistrz   zpartials/phoneinfo.html)ry   )r$   r~   ri   r"   rB   r   r	   Z	check_dnd)r  ry   rR   rR   rS   dnd_checker  s
    


r  z
/whitelistc                  C   s<   t jdkr4ttt j d } | d }t| t	dS )Nr:   r   ry   r  )
r$   r~   astliteral_evalr   rB   r  r	   Zwhitelist_numbersr#   )	phoneinfory   rR   rR   rS   	whitelist  s
    

r  z/export_dndc                  C   s   t jdkr~ttt j d } | d }d}|d7 }|D ],}||d d |d  d |d	  d
 7 }q:t|}d|jd< |S t	dS )Nr:   r   r  r   zphone,operator,status
r   ,operatorr   rz   z%attachment; filename=dndinfo_list.csvr   r  )
r$   r~   r  r  r   rB   r  r%   r  r#   )Zphoneinfo_objZ
phone_infor  rx  r   rR   rR   rS   
export_dnd  s    
*r  z/experiment/c                   C   s   t dS )NrW   )r#   rR   rR   rR   rS   experiment_panel  s    r  z/experiment/addc                  C   s   t jdkrtdS t jd } t jd }ttt jd d }ttt jd d }t| dkrt|d	krt	j
| |||d
}tj| tj  ttd|jdS td tdS )Nr9   zpartials/experiment_form.htmlrP   rk  rC  rx   rh  d   i  )rP   rk  rC  rh  
add_cohortexperiment_idz[Name should be less than 100 characters and description should be less than 1000 characters)r$   r~   r"   rB   r1   rf   r   rh   rN   r   
Experimentr   r   r   r   r#   r'   rM   r&   )rP   rk  rC  rh  
experimentrR   rR   rS   add_experiment  s<    


  
r  z'/experiment/<experiment_id>/cohorts/addc                 C   s   t jdkr$tjj| }td|dS t jd } t jd d}t jd d}t jd d}t jd	 d}t jd
 d}t	t
|||||}t||  ttd| dS )Nr9   zpartials/cohort_form.html)r  r  Zcohort_namerz   rC  rh  inputsoutputscohort_panelr  )r$   r~   r   r  rF   r8  r"   rB   r   r   r3   r   Zcreate_cohortsr#   r'   )r  r  rP   rC  rh  r  r  rH   rR   rR   rS   r    s    

r  z$/experiment/<experiment_id>/cohorts/c                 C   s"   t jj| }|j}td||dS )Nzpartials/cohort_panel.html)r  cohorts)r   r  rF   r8  r  r"   )r  r  r  rR   rR   rS   r  	  s      r  z//experiment/<experiment_id>/cohorts/<cohort_id>c                 C   s:   t jj| }t jj|}t jj|}td|||dS )Nz"partials/cohort_details_panel.html)r  cohortcohort_details)r   r  rF   r8  r  CohortDetailsZget_by_cohort_idr"   )r  	cohort_idr  r  r  rR   rR   rS   cohort_details_panel  s    r  z@/experiment/<experiment_id>/cohorts/<cohort_id>/<user_id>/deletec                 C   s6   t jj|}tj| tj  tt	d| |dS )Nr  r  r  )
r   r  rF   Zget_by_user_idr   r   deleter   r#   r'   )r  r  r  cohort_detailrR   rR   rS   delete_cohort_details!  s    
  r  z3/experiment/<experiment_id>/cohorts/<cohort_id>/addc           	      C   s   t jdkr4tjj| }tjj|}td||dS t jd 	d}dd |D }tj
j|}dd |D }tjjtjj| }|D ]*}tj|j|d	}tj| tj  qttd
| |dS )Nr9   z!partials/cohort_details_form.html)r  r  r:  rz   c                 S   s   g | ]}t |qS rR   r   )r  r7   rR   rR   rS   r  >  s     z&add_cohort_details.<locals>.<listcomp>c                 S   s   g | ]
}|j qS rR   )r  )r  r   rR   rR   rS   r  @  s     )r  r  r  r  )r$   r~   r   r  rF   r8  r  r"   rB   r   r   r   ZUserrG   rM   in_allr  r   r   r   r   r#   r'   )	r  r  r  r  r:  r;  Zuser_idsr7   r  rR   rR   rS   add_cohort_details1  s0    
    r  z/public_dashboardc                  C   sb   t jd } t jd }tt jd tt jd t tdd d}t|| }td||	d	d
S )NCHARTIO_SECRETDASHBOARD_URLDASHBOARD_NUMBERORGANISATION_NUMBERr]   )secondsZ	dashboardorganizationexppublic_dashboard.htmlr  Zdashboard_urlZchartio_token
r   r   r   r1   r  r2   jwtencoder"   decoder  r  payloadtokenrR   rR   rS   pubic_dashboardP  s    

r  z/public_dashboard_mobilec                  C   sb   t jd } t jd }tt jd tt jd t tdd d}t|| }td||	d	d
S )Nr  DASHBOARD_URL_MOBILEDASHBOARD_MOBILE_NUMBERr     )r_   r  r  r  r  r  r  rR   rR   rS   pubic_dashboard_mobilec  s    

r  z/kookoo_callbackc                   C   s:   t jdkr"tddidddifS tddidddifS )Nr9   r   Tr   r  r  )r$   r~   r   r  rR   rR   rR   rS   get_kookoo_callbackv  s    
r    c                 C   s   t jddddddfS )N404.htmlz/Oops!! We could not find the page you requestedrW   	Main Pageprefixredirect_urlZ	page_namer  ri   r"   r   rR   rR   rS   page_not_found  s    r  c                 C   s   t jddddddfS )Nr  z4Sorry! You do not have permissions to visit the pager8   z
Login Pager  rY   r  r   rR   rR   rS   permission_denied  s    r    c                 C   s   t jddddddfS )Nz405.htmlzOops! Method not allowedrW   r  )r   r  Zredirect_button_labelr  r  r   rR   rR   rS   method_not_allowed  s    r  )
__future__r   randomr   eventsr   r   Zdostadmin.servicesr   Zdostadmin.db_modelr   	dostadminr   r   r	   r
   r   r   r   =dostadmin.services.scheduling.pre_calculated_campaign_servicer   1dostadmin.services.scheduling.missed_call_servicer   7dostadmin.services.scheduling.campaign_creation_servicer   utilsr   r   Zutils.helpers.helpersr   Zdostadmin.formsr   utils.helpersr   r   r   r   r   r   r   r   r   r   r    ri   r!   r"   r#   r$   r%   r&   r'   r(   Zflask_securityr)   flask_loginr*   r+   r,   flask_principalr-   r.   r/   r0   r  r  r  r  r   r  r1   r2   	six.movesr3   ior4   r   r5   Zadmin_permissionZchampion_persmissionZuser_permissionZsurveyor_permissionunionZadmin_surveyor_permissiondb_connectionr   routerT   rV   rX   requirer@   rk   rl   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r
  r  r  r  r  r  r!  r5  r7  r9  r=  rK  rO  rQ  rR  rX  rY  r`  ra  rg  rl  rp  ry  rz  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  errorhandlerr  r  r  rR   rR   rR   rS   <module>   s  (
0(



	



@



B










#






B





/
$


(

















+
%

$

<

6
$
/
6
	



"



 


