
    jJh<             
       &!   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mZmZ d dlmZm Z  d dl!m"Z" d dl#m$Z$ d dl%m&Z&m'Z' d dl!m(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 d dl2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z: d dl;m<Z< d dl=m>Z>m?Z? d dl@mAZAmBZBmCZC d dlDmEZE d dlFmGZGmHZHmIZI d dlJmKZKmLZLmMZMmNZN d dlOZOd dlPZPd dlQZQd dl2Z2d dlRZRd dlSZSd dlTZTd dlUZUd dlVmVZVmWZWmXZXmYZZ d dl[m\Z\ d dl]m^Z^ d dl_m`Z`maZambZb  eM eNd            Zc eM eNd            Zd eM eNd            Ze eM eNd            Zf eM eNd             Zg eM eNd!            Zh eM eNd"            Ziecj                  ed      Zkecj                  eg      Zlecj                  ef      Zmecj                  eh      Zn e&       Zoeoj                         Zp ej                  d#d$d%g&      d'        Zr ej                  d(      eEd)               Zs ej                  d*      d+        Zt ej                  d,      ekj                  d-.      d/               Zv ej                  d0      ecj                  d-.      d1               Zw ej                  d2      ecj                  d-.      d3               Zxd4Zy e+       j                  Z{ eUj                  d5      Z}	 dd7ee~   d8e~fd9Zd:e~fd;Zd< Zd= Zd>ee~   fd?Zd@e~fdAZddBe~fdCZdDeVj                  dEeZfdFZd>ee~   dGee~dHf   dIeeZ   dJeVj                  dKef
dLZdM ZdNe~dOedPeedHeVf      fdQZ ej                  d6d$d%g&      ecj                  d-.      dR               Z ej                  dSd$d%g&      ecj                  d-.      dT               ZdU ZdV ZdW ZdX Z ej                  dYd$d%g&      ecj                  d-.      dZ               Z ej                  d[d$d%g&      ecj                  d-.      d\               Z ej                  d]      ecj                  d-.      d^               Z ej                  d_      ecj                  d-.      d`               Z ej                  da      ecj                  d-.      db               Z ej                  dcd$d%g&      ecj                  d-.      dd               Z ej                  ded%g&      ecj                  d-.      df               Z ej                  dgd$d%g&      ecj                  d-.      dh               Z ej                  did%g&      ecj                  d-.      dj               Z ej                  dk      ecj                  d-.      dl               Z ej                  dmd%g&      ecj                  d-.      dn               Z ej                  dodpg&      ecj                  d-.      dq               Z ej                  drd%g&      ecj                  d-.      ds               Z ej                  dtd$d%g&      ecj                  d-.      du               Z ej                  dv      ecj                  d-.      dw               Z ej                  dxd%g&      ecj                  d-.      dy               Z ej                  dz      ecj                  d-.      d{               Z ej                  d|      ecj                  d-.      d}               Z ej                  d~      ecj                  d-.      d               Z ej                  dd%g&      ecj                  d-.      d               Z ej                  dd$d%g&      ecj                  d-.      d               Z ej                  dd%g&      ecj                  d-.      d               Z ej                  dd%g&      ecj                  d-.      d               Z ej                  d      ecj                  d-.      d               Z ej                  dd$d%g&      ecj                  d-.      d               Z ej                  dd%g&      ecj                  d-.      d               Z ej                  dd%g&      ecj                  d-.      d               Z ej                  d      ecj                  d-.      d               Z ej                  dd$d%g&      elj                  ei      j                  d-.      d               Zd Zd Zd Zd Zd Zd Zd Z ej                  d      ecj                  d-.      d               Z ej                  dd$d%g&      ecj                  d-.      d               Z ej                  d      ecj                  d-.      d               Z ej                  d      ecj                  d-.      d               Z ej                  dd$d%g&      ecj                  d-.      d               Z ej                  d      ecj                  d-.      d               Z ej                  d      ecj                  d-.      d               Z ej                  dd$d%g&      ecj                  d-.      d               Z ej                  dd$d%g&      ecj                  d-.      d               Z ej                  dd$d%g&      ecj                  d-.      d               Z ej                  dd$d%g&      ecj                  d-.      d               Z ej                  d      ecj                  d-.      d               Z ej                  dd$d%g&      ecj                  d-.      d               Z ej                  dd$d%g&      d        Z ej                  dd$d%g&      d        Z ej                  dd$g&      d        Z ej                  dd$d%g&      d        Z ej                  dd$d%g&      d        Z ej                  dd$d%g&      d        Z ej                  dd$d%g&      d        Z ej                  dd$d%g&      dĄ        Z ej                  dd$d%g&      ecj                  d-.      dƄ               Z ej                  dd$d%g&      emj                  ei      j                  d-.      dȄ               Z ej                  dd$d%g&      dʄ        Z ej                  dd$d%g&      eEd̄               Z ej                  dd$d%g&      ekj                  d-.      d΄               Z ej                  dd$d%g&      ekj                  d-.      dЄ               Z ej                  dd$d%g&      ecj                  d-.      d҄               Z ej                  dd$d%g&      ecj                  d-.      dԄ               Z ej                  dd$d%g&      ecj                  d-.      dք               Z ej                  dd$g&      ecj                  d-.      d؄               Z ej                  dd$d%g&      ecj                  d-.      dڄ               Z ej                  dd$d%g&      ecj                  d-.      d܄               Z ej                  dd$g&      ecj                  d-.      dބ               Z ej                  dd$g&      ecj                  d-.      d               Z ej                  dd$d%g&      ecj                  d-.      d               Z ej                  dd$d%g&      ecj                  d-.      d               Z ej                  dd$g&      d        Z ej                  dd$g&      d        Z ej                  dd$d%g&      d        Z ej                  d      d        Z ej                  d-      d        Z ej                  d      d        Z ej                  dd$d%g&      enj                  ei      j                  d-.      d               Zd Zd Zd Zd Zd Zd Zd Zd Zd Z ej                  dd$d%g&      ecj                  d-.      d               Zy)    )absolute_import)randint)db_model)queries)Timecategory)app	db_helperexotel_helper
loginutils	adminuserr   db
app_logger)PreCalculatedCampaignService)MissedCallService)CampaignCreationService)ListTupleDictOptional)config_parser
slackutils)replace_chars)AddProgramForm)get_db_connectionupload_file_to_drive)
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)islice)
joinedload	load_only)or_funcinspect)login_required)
login_userlogout_usercurrent_user)Identityidentity_changed
PermissionRoleNeedN)datetime	timedeltadatetime)zip)StringIO)EXOTEL_CALLS_PERMITTEDSERVER_TYPEDRIVE_FOLDER_IDadminchampionusersurveyor	onboarderactivity_reporterprogram_associate/loginGETPOST)methodsc                     t        j                  t        j                        } d }| j	                         r!t
        j                  j                  j                  t
        j                  j                  | j                  d   k(        j                         }|rt        j                  d|       |j                  | j                  d         rrt        |      r|t!        j"                  t%        j&                         t)        |j*                               t-        |j.                        dk(  r0|j.                  d   j0                  dk(  rt3        t5        d            S t-        |j.                        dk(  r0|j.                  d   j0                  d	k(  rt3        t5        d
            S t-        |j.                        dk(  r0|j.                  d   j0                  dk(  rt3        t5        d            S t-        |j.                        dk(  r/|j.                  d   j0                  dv rt3        t5        d            S t3        d      S t        j6                  d|       d}t9        dt:        | |      S )Nusernamez%s logging inpassword)identity   r   rF   champion_landing_pagerH   	live_callrI   	add_users)rJ   rK   activity_tracker_form	/programszInvalid password for %szIncorrect username or password.zpartials/login.html)r7   formerror)r   	LoginFormr)   rZ   validate_on_submitr   	AdminUserqueryfilterrQ   datafirstr   infoauthenticater5   r9   sendr&   _get_current_objectr8   idlenrolesnamer(   r,   warningr'   r7   )
login_formr[   rG   s      %/var/www/dostadmin/dostadmin/views.pyloginrn   _   s   %%gll3JE$$&!!''..'':??:+FF

%' 	 OOOT2  !<=d#$))#779HTWWDU 4::!+

10B0Bj0P'0G(HII4::!+

10B0Bj0P'(<==4::!+

10B0Bk0Q'(<==4::!+

10B0B G 1  (0G(HII#K00""#<dC1LzQV     z/logoutc                     t         j                  j                  j                  t         j                  j                  t        j                         k(        j                         } | r | j                          t                t        d      S )NrL   )r   r^   r_   r`   rg   r   get_current_adminuser_idrb   logoutr6   r(   )r7   s    rm   rr   rr      sj     %%++22!C!C!EEeg  MHro   /c                  t   t         j                  j                  j                  t         j                  j                  t        j                         k(        j                         } | rHt        | j                        dk(  r0| j                  d   j                  dk(  rt        t        d            S t        d      S )NrT   r   rF   rU   rY   )r   r^   r_   r`   rg   r   rq   rb   rh   ri   rj   r(   r,   )rG   s    rm   landing_pageru      s     ##**!C!C!EEeg 	 DJJ1$A););z)I 7899K  ro   z/champion_home  )http_exceptionc                      t        d      S )Nzpartials/landing.html)r'    ro   rm   rU   rU      s     233ro   /todays_campaignsc                     	 t               t        dd      z   } t        j                  j	                  ddt
              }t        j                  j                  j                  | j                         |      }t        j                  ddd|j                  |	      S # t        $ r"}t        j                   d
|        Y d }~yd }~ww xY w)N      hoursminutespagerT   type	home.html	campaigns)active_panelactive_viewr   
paginationz"Error fetching today's campaigns: )zError fetching campaigns  )r%   r=   r)   argsgetintr   Campaignr_   get_campaigns_for_dater>   flaskr'   items	Exceptionr   r[   )istnowcurrent_pageall_campaignses       rm   todays_campaignsr      s    /%')!R*HH||'''< ))//FFKKM<
 $$$##))$
 	
  /=aSAB./s   BB 	C%CCz
/campaignsc                      t         j                  j                  j                         } t	        j
                  ddd|       S )Nr   r   )r   r   r   )r   r   r_   get_campaigns_logr   r'   )r   s    rm   campaigns_panelr      s=     !!''99;I   	 ro   r   z^[A-Za-z0-9_-]+$/schedule_announcementserrorsredirect_toc                 R    | D ]  }t        |d        t        j                  |      S )Nr[   )r+   r   r(   )r   r   r   s      rm   flash_and_redirect_errorsr      s'     a >>+&&ro   rawc                    t               g }}| xs dj                         j                         D ]M  }|j                         dd  }|j                         s'||vs,|j	                  |       |j                  |       O |S N )setstrip
splitlinesisdigitaddappend)r   seenoutlinelast10s        rm   normalize_and_dedupe_phonesr      so    r#D!!#..0cd#>>d 2HHVJJv	 1
 Jro   c                  n   g } t         j                  j                  dd      j                         }t        j                  |      s| j                  t                      	 t        t         j                  d         }	 t        j                  t        t         j                  d         d      j                         }t         j                  j                  d	      xs dj                         }| ||||fS # t        $ r d}| j                  d       Y w xY w# t        $ r d}| j                  d       Y xw xY w)
zBReturn (errors, cp_name, content_id, deploy_date, deploy_time_str)cp_namer   	audio_smsNzInvalid content selected.deploy_date%m/%d/%YzInvalid deploy date.time_category)r)   rZ   r   r   VALID_CP_REmatchr   r#   r   r   r<   strptimer   r>   )r   r   
content_idr   deploy_time_strs        rm   parse_form_inputsr      s   Flly"-335GW%(*+3k23

.''',,}56


$& 	 ||''8>BEEGO7J_DD  3
123  .,-.s$    C3 =>D 3DDD43D4c                     t         j                  j                  } t        j                  j                  t         j                        xs1 t        j                  j                         xs t        t        dd      }|t        d      |j                  j                  }|dk(  rt        j                  | d      S |dv r-t        j                  | t        j                  |       dz
  d      S t        j                  | d	d      S )
z[Return a SQL expression extracting last 10 digits from Experience.phone (dialect-portable).)mapperengineNz.No SQLAlchemy engine bound to the session/app.mysql
   )
postgresqlpostgres	   r   )r   
Experiencephoner   sessionget_bindgetattrRuntimeErrordialectrj   r2   right	substringlengthsubstr)	PHONE_COLbindrj   s      rm   get_phone_last10_exprr      s    ##))I


8#6#67 	':: 	'2x& 	
 |KLL<<Dwzz)R(())~~iY)?!)CRHH;;y#r**ro   phonesc           
      B   t         j                  j                  }t               }t         j                  j                  j                  t        t         j                  j                        j                  t         j                  j                  t         j                  j                        t        t         j                  j                  t         j                  j                  t         j                  j                  t         j                  j                  t         j                  j                              j                  t!        |j#                  |       |j#                  |                   j%                         }|D ci c]  }|j                  xs ddd  | c}S c c}w r   )r   r   r   r   r_   optionsr/   r   r0   r   rg   r?   statusprovider_numbertimecategory_idr`   r1   in_all)r   r   phone_last10_exprexpsr   s        rm   load_experiences_by_last10r     s+   ##))I-/ 	!!))x**889CC%%(((*?*?*D*D ##&&##))##**##33##33		
 
IMM&)+<+@+@+HI	J	 	  /33dQWW]CD!1$d333s   >Fr   c                    | sy	 | j                  d      dk(  rdnd}t        j                  | |      j                         }t	        |j
                  |j                  |dk(  r|j                  nd      dfS # t        $ r Y yw xY w)	z Return (time_of_day, error_msg).)NN:   %H:%M:%S%H:%Mr   N)NzInvalid time category.)	countr<   r   r?   dtimehourminutesecondr   )r   fmtts      rm   parse_fixed_timer   %  s|    .+11#6!;jos388:QVVQXX3*3Dqxx!LdRR .-.s   A/A5 5	B Bfallbackc                    t        t        | dd      dd      }|sPt        | dd      rCt        j                  j                  j	                  | j
                        }|r|j                  nd}|s|}|j                  d      dk(  rdnd}t        j                  ||      j                         }t        |j                  |j                  |dk(  r|j                        S d	      S )
z2Resolve time-of-day from relationship or fallback.r   Nr?   r   r   r   r   r   r   )r   r   r   r_   r   r   r?   r   r<   r   r   r   r   r   )exp_recr   time_strtcr   r   s         rm   resolve_user_timer   1  s    ww>MH):DA""((,,W-D-DE 277d s+q0*gC(C(--/Asj/@188HHaHHro   dr   c                     t        j                  | |      }t        r;t        t        d      rt        j	                  |      S |j                  t              S |S )Nlocalize)tzinfo)r<   combineIST_TZhasattrr   replace)r   r   dts      rm   combine_date_time_tzr   >  sF    			!Q	B6:&??2&&zzz((Iro   exp_by_phonezdb_model.Experienceparsed_fixed_timer   taf_numbersc                    g }g }| D ]  }|j                  |      }|s|j                  t        |             1|j                  xs ddd  }	|j                  t
        j                  j                  j                  k(  r|	|v r|j                  t        |             |xs t        |      }
t        ||
      }|j                  ||f        ||fS r   )r   r   r    r   r   r   r   StatusPAUSEDr$   r   r   )r   r   r   r   r   exp_listr   phr   prov_last10tod	deploy_dts               rm   build_exp_listr  G  s     >@HF""2&MM-b12..4"cd;NNh1188???{*MM4R89=#4W#=(c:	),-! $ Vro   c              #   \   K   t        |       }	 t        t        ||            }|sy | wN)iterlistr.   )iterablesizeitbatchs       rm   chunkedr  f  s3     	hB
VB%&	 s   *,r   r   r   c                 D   t               }d}t        |t              D ]  }|D ]:  \  }}t        |      j                  st
        j                  j                  |       < |j                  | ||       t
        j                  j                          |t        |      z  } |S )Nr   )r   r  
BATCH_SIZEr3   detachedr   r   r   add_blast_campaigncommitrh   )r   r   r   svctotalr  r   _s           rm   schedule_in_batchesr  o  s    
 "
#CE:.JGQw((

w'   	w
E:


U / Lro   c            	         t         j                  dk(  r[t        j                  j                  j                         } t        j                  j                  }t        dddt               | |      S 	 t               \  }}}}}t        t         j                  j                  dd            }|s|j                  d       |rt!        |      S t#        t$        j&                  j                  d	g             }t)        |      }	t+        |      \  }
}|rt!        |g      S t-        ||	|
||
      \  }}|rt!        |      S t/        |||      }t1        d| d| dt2         dd       t?        j@                  d      S # t4        $ r@}t6        j8                  j;                          t1        dt=        |       d       Y d }~Yd }~ww xY w)NrM   partials/campaign_form.htmlAnnouncementsr   )titleform_actionblast_messagecontentr   r   r   z No valid phone numbers provided.TAF_EXPERIMENT_PROVIDER_NUMBERS)r   r   r   r   r   zQueued z announcements for z in batches of .successzAn unexpected error occurred: r[   )!r)   methodr   Contentr_   get_content_logr   AnnouncementTimeCategoryCHOICESr'   r"   r   r   rZ   r   r   r   r   r   configr   r   r  r  r+   r  r   r   r   rollbackstrr   r(   )r  time_choicesr   r   r   r   r   r   r   r   
fixed_timet_errr   list_errorsr  r   s                   rm   schedule_announcementsr-    s    ~~""((88:#<<DD)!1.0&
 	
#BDUDWA[/,W\\-=-=h-KLMM<=,V44#**..)JBOP1&9,_=
E,eW55 .%(##!
+ ,[99#GZBeW/y
|STU	
 >>344	  B


.s1vh7AABs,   0AE5 	AE5 E5 9'E5 5	F>>6F99F>z/manage_user_datac                     t         j                  dk(  rt        d      S t         j                  j	                  dd      j                         dd  } 	 t        |        t        |        t        |        t        dd|  d       t        j                  d|  d       t        d      S # t        $ rF}d	|  d
t        |       }t        d|       t        j                  |       Y d }~t        d      S d }~ww xY w)NrM   z/partials/manage_user_data.html
user_phoner   r   r   zUser data for phone number z deleted successfullyz0Error while deleting user data for phone number z	. Error: r[   )r)   r!  r'   rZ   r   r   delete_missed_calls_data$delete_campaigns_and_experience_datadelete_registration_datar+   r   rc   r   r(  r[   )r/  r   error_messages      rm   delete_user_datar4    s     ~~@AA!!,399;CDAJ( ,,Z8 ,4ZL@UV	
 	5j\AVWX <==  (J:,V_`cde`f_ghg}%''<==(s   A
B& &	C5/2C00C5c           	      @   t         dk7  rt        j                  d|  d       y |sy 	 t        j                  j                  | ||       t        j                  d| d|  d       y # t        $ r.}t        j                  d| dt        |              Y d }~y d }~ww xY w)	N
productionz%Skipping BigQuery record removal for z in non-production environment.zRemoved z' records from BigQuery for user phone: r  zError removing z records from BigQuery: )	rC   r   rc   r   remove_bigquery_table_recordsdelete_admidashboard_recordsr   r[   r(  )r/  
table_nameexp_idr   s       rm   remove_bigquery_recordsr;    s    l"3J<?^_	
 	Y--JJ
F	
 	zl"I*UVW	
  Y?:,6NsSTvhWXXYs   =A& &	B/$BBc                 ^    t         j                  j                  |        t        | dd        y )N
engagementr/  r9  r:  )r   MissedCallLogdelete_missed_calls_for_phoner;  r/  s    rm   r0  r0    s#    88DzlSWXro   c                 (   t         j                  j                  j                  |       }|D ]  }t         j                  j                  |j                         t        d d|j                         t         j                  j                  |j                         t         j                  j                  |j                         t        d d|j                         t         j                  j                  |       t        d d|j                          y )Ncampaignr>  experience_pause_loguser_program)r   r   r_   get_all_experience_for_phoner   "delete_campaigns_for_experience_idrg   r;  PreCalculatedUserCampaignData,delete_pre_calculated_data_for_experience_idExperiencePauseLogdelete_experience_pause_logdelete_experience)r/  experience_data
experiences      rm   r1  r1    s    ))//LLZXO%
<<Z]]K
:==	
 	..[[MM	
 	##??
N(>z}}	
 	--j9z}}	
! &ro   c                 ^    t         j                  j                  |        t        | dd        y )Nregistrationr>  )r   Registrationdelete_registration_for_phoner;  rA  s    rm   r2  r2    s%    77
C.ro   z/system_configc                     t         j                  dk(  r5t        j                  j                  j                         } t        d|       S t         j                  dk(  rt         j                  d   }t         j                  d   }t        j                         }d}	 |j                  ||       t        j                  j                  j                         } t        d| |	      S y # t        $ r d}Y Dw xY w)
NrM   z/partials/system_config.html)configurationsrN   config_nameconfig_valueFT)rT  r[   )
r)   r!  r   SystemConfigurationr_   get_all_configsr'   rZ   
set_configr   )rT  rU  rV  config_instancer[   s        rm   system_configurationr[    s     ~~!55;;KKM*>
 	
 ~~ll=1||N3"668	&&{LA "55;;KKM*>QV
 	
   	E	s   C" "C0/C0/schedule_nudgec            	      H   t         j                  dk(  rt        j                  j                  j                         } d}t        j                  |       t        j                         }t        j                  j                  }t        ddd| |t               |      S g }g }t         j                  d   }|j                  d      }t!        |      d	k7  r|j#                  t%                      t'        t         j                  d
         }t'        t         j                  d         }	t        j(                  j*                  j,                  }
t         j                  d   dk7  rt         j                  d   }
t/        j0                  t3        t         j                  d         d      j5                         }t         j                  d   }|st        j(                  |	|||
||t        j(                  j6                  j8                        }	 t:        j<                  j?                  |       t:        j<                  jA                          |j#                  d       ntE        |d       tE        |d       tG        jH                  d      S # tB        $ r}|j#                  |       Y d }~@d }~ww xY w)NrM   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\  )r  r  contentsr   nudge_messagegroupsr   r  r   r   groupr   r   r   r   repeat_frequency)group_version_idrj   deployment_datedeployment_timenudge_repeat_frequencyr   r   zNudge scheduled successfullyr[   message)%r)   r!  r   r"  r_   r#  cursorexecutefetchallr   r$  r%  r'   r   rZ   splitrh   r   r   r   r^  TimeUSER_TIME_SLOTr<   r   r   r>   r   ACTIVEr   r   r   r  r   r+   r   r(   )r_  r_   ra  r)  rh  
error_list
nudge_namesplitted_namer   rd  deploy_timer   rc  nudge_detailsr   s                  rm   schedule_nudgeru  !  s    ~~##))99;< 	
 	u"#<<DD&)&.0
 	
 GJi(J$$S)M
=Q,./W\\+./J7<<01//&&55K||O$*ll?3##gll=12J
df  ||$67 -''#3!??))00
	JJNN=)JJNN9: 	j'"	'9>>+,,  	NN1	s   AI= =	J!JJ!z/delete_campaign/<cp_id>c                 j    t         j                  j                  |        t        j                  d      S )Nrz   )r   r   delete_campaignr   r(   )cp_ids    rm   rw  rw  e  s(     %%e,>>-..ro   z/cancel_queued_campaignsc                      t         j                  j                  j                  d      } | D ]  }|j	                  d        t        j                  d      S )Nqueuedunscheduledrz   )r   r   r_   get_campaigns_with_statuschange_campaign_statusr   r(   )queued_campscs     rm   cancel_queued_campaignsr  l  sJ     $$**DDXNL	  /  >>-..ro   /contentc                     	 t         j                  j                  ddt              } t        j
                  j                  j                  |       }t        j                  j                  j                         }t        j                  ddd||      S # t        $ r)}t        j                  d|        d| dfcY d }~S d }~ww xY w)	Nr   rT   r   r   r  )r   r   content_ver	languagesz!Error fetching content versions: r   )r)   r   r   r   r   ContentVersionr_   get_all_content_versionsLanguageget_all_languagesr   r'   r   r   r[   )r   all_versionsr  r   s       rm   content_panelr  {  s    <||'''<..44MM
 %%++==?	$$"!$
 	
  <<QC@A21#6;;<s   BB 	CC :C Cz/add_contentc                     t         j                  dk(  r=t         j                  d   j                  d      } t         j                  d   j                  d      }t         j                  d   j                  d      }t         j                  d   j                  d      }t	        |       }t	        |      |k7  st	        |      |k7  st	        |      |k7  rt        d       t        d      S t        t        | |||            }t        j                  j                  |      }|st        d       t        d      S d	|z   }t        |d
       t        d      S t        d      S )NrN   r  
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: r[   zpartials/content_form.html)r)   r!  rZ   rl  rh   r+   r  r@   r   r"  add_new_contentsr'   )r  r  exotel_appidr  total_contentsc_datar   r3  s           rm   add_contentr    s0    ~~,,y)//5<<
+11$7||G,2248<<
+11$7WM^+< N28}.} ;<< #gxxHIF%%66v>F;< ;<< !;V CmW-;<<788ro   z/get-versionsc                  ~   t         j                  d   } t        j                  j                  j                  |       }d }d}|D ]r  }|r9|dz   t        |j                        z   dz   |j                  j                  z   dz   }>dt        |j                        z   dz   |j                  j                  z   dz   }t ||z   }|S )Nrg   zExisting Versions are : z<br>z( z ))
r)   rZ   r   r  r_   !get_content_version_by_content_idr(  versionr  rj   )r   content_versionsversionsrh  cvs        rm   get_versionsr    s     d#J..44VV H(G6!C

O3d:R[[=M=MMPTT  BJJ/$69I9IIDPH   GNro   z/add-content-versionc                  H   t         j                  j                  j                         } t         j                  j                  j                         }t        j                  dk(  rt        j                  d   }t        j                  d   }t        j                  d   }t        j                  d   }t        j                  d   }|||||g}t         j                  j                  |      }|st        d       nd|z   }	t        |	d	       t        d
| |      S t        d
| |      S )NrN   r  r  r  r  r  r  zGot error: r[   z"partials/content_version_form.html)r_  r  )r   r"  r_   r#  r  r  r)   r!  rZ   r  add_new_content_versionr+   r'   )
r_  r  r  r  r  r  r  r  r   r3  s
             rm   add_content_versionr    s     %%557H!!''99;I~~,,y)<<
+||G,<<
+,,y)8\8WE((@@H78)F2M-)08y
 	
 ,x9 ro   z/update-contentc                  6   t         j                  dk(  r|t         j                  d   } t         j                  d   }t         j                  d   }t         j                  d   }| |||g}t        j                  j                  |       t        d      S t        d      S )NrN   r   r  r  r  r  )r)   r!  rZ   r   r  update_contentsr(   )r   r  r  r  content_datas        rm   update_contentr    s     ~~\\,/
<<
+||G,<<
+"HlHE//=
##Jro   z/delete_contentc                  @    t        j                          t        d      S )Nr  )r	   clear_contentr(   ry   ro   rm   delete_contentr    s     Jro   z/toggle_content_statusc                     t         j                  d   } t        j                  j                  j                  |       }|j                  t        j                  j                  j                  k(  rHt        j                  j                  j                  |_        t        j                  j                          nx|j                  t        j                  j                  j                  k(  rGt        j                  j                  j                  |_        t        j                  j                          t        |j                  |       S Nrg   )r   rg   )r)   rZ   r   r  r_   get_content_version_by_idr   r   ro  INACTIVEr   r   r  r-   )content_version_idcontent_detailss     rm   toggle_content_statusr    s     !d+--33MMO !8!8!?!?!F!FF!)!8!8!?!?!H!H


			8#:#:#A#A#J#J	J!)!8!8!?!?!F!F


/005GHHro   z/delete_configDELETEc                     t         j                  d   } t        j                  j                  j                  |       }|r*t        j                         }	 |j                  |        ddiS dd|  diS # t        $ r ddicY S w xY w)Nrg   r   Tr[   z:Internal server error while trying to process the request.zConfig Id: z was not found in the records.)r)   r   r   rW  r_   get_config_by_iddelete_configr   )	config_idra   record_instances      rm   delete_system_configr  	  s     T"I''-->>yID"668	)))4t$$ ;yk1OPQQ  	U 	s   A1 1B Bz/set_configc                     t        j                  t        j                        } | d   }| d   }t	        j
                         }	 |j                  |j                         |       t        j                  j                  j                  t        j                  j                  t        j                         k(        j                         }|j                  j                    d|j"                   }|rbt%        j&                  d| d| d|        |t(        k(  r;t+        j,                  |||      }|j.                  dk(  rdd	iS d
d|j.                   iS y # t0        $ r}d
d| icY d }~S d }~ww xY w)Nrj   value zThe system configuration z was set to z by the    r   Tr[   z5Failed to initiate slack alert request. Status code: z;Internal server error while trying to process the request. )jsonloadsr)   ra   r   rW  rY  upperr^   r_   r`   rg   r   rq   rb   	__class____name__rQ   r   rk   rB   r   initiate_slack_alert_requeststatus_coder   )request_datarU  rV  r  r7   	user_inforesponser   s           rm   set_system_configr    su    ::gll+Lv&K(L224O
"";#4#4#6E))//66!!Y%G%G%II

%' 	 $--667q9N9N8OP	+K=\NRZ[dZef 44%BB +| ''3.%t,,TU]UiUiTjk    
RSTRUV
 	

s%   C;E ?E 	E+E& E+&E+z/pause_exotel_callsc                     g } 	 t         j                  dk(  r#t        j                  j	                  t
              }r%t        |j                        j                         dv rd}nd}t        d|      S 	 | r&t        j                  dd	j                  |              nt        j                  d
       t        d      S # t        $ r'}| j                  dt        |              Y d }~ud }~ww xY w)NrM   )NONEFALSEFTz!/partials/pause_exotel_calls.html)exotel_calls_permittedzError pausing calls: z'Errors occurred while pausing calls: %s, z!Successfully paused Exotel calls.)r)   r!  r   SystemConfigurationUtilparse_configrB   r(  r  r  r'   r   r   r   r[   joinrc   )r   r  r   s      rm   pause_exotel_callsr  @  s     F8>>U"%2%J%J%W%W&&" &-C-I-I)J)P)P)R W
 *
 &+"%)""3'= 	 # BDIIfDUV;<+5   8-c!fX6778s   A.B> >	C.C))C.z/nudgec                      t         j                  j                  j                         } t	        j
                  ddd|       S )Nr   nudge)r   r   nudges)r   r^  r_   get_all_nudgesr   r'   )r  s    rm   nudge_panelr  g  s8     __""113F  'wv ro   z/toggle_statusc                     t         j                  d   } t        j                  j                  j                  |       }|j                  t        j                  j                  j                  k(  rHt        j                  j                  j                  |_        t        j                  j                          nx|j                  t        j                  j                  j                  k(  rGt        j                  j                  j                  |_        t        j                  j                          t        |j                  |       S r  )r)   rZ   r   r^  r_   get_details_by_idr   r   ro  r  r   r   r  r-   )nudge_idrt  s     rm   toggle_statusr  p  s     ||D!HOO));;HEMx55<<<'55>>


			!7!7!@!@	@'55<<


-..8<<ro   /ivr-promptsc                      t         j                  j                  ddt              } t        j
                  j                  j                  |       }t        j                  ddd|      S )Nr   rT   r   r   	ivrprompt)r   r   ivr_prompts)
r)   r   r   r   events_model	IVRPromptr_   get_paginated_ivr_promptsr   r'   )r   r  s     rm   r  r    sZ     <<##FAC#8L((..HHVK   	 ro   z/download-sample-sheetc                      t               } t        j                  |       }|j                  dg       t	        | j                               }d|j                  d<   d|j                  d<   |S )Nrg   r  eventkeypress
event_typer   z)attachment; filename=sample_ivrprompt.csvContent-Dispositiontext/csvContent-type)rA   csvwriter	writerowsr*   getvalueheaders)sicwr  s      rm   download_sample_sheetr    sg     
B	BBLLUVWR[[]+H 	4  (2H^$Oro   z/download-ivr-promptc                  @   t         j                  j                  j                         } t	               }t        j                  |      }t               t        dd      z   }|j                  dg       |j                  | D cg c]F  }|j                  |j                  |j                  |j                  |j                  |j                  fH c}       t!        |j#                               }dt%        |      z   dz   |j&                  d<   d|j&                  d	<   |S c c}w )
Nr|   r}   r~   r  zattachment; filename=ivrpromptz.csvr  r  r  )r  r  r_   get_all_ivr_promptsrA   r  r  r%   r=   r  rg   r  r  r  r  r   r*   r  r(  r  )r  r  r  r   rr  s         rm   download_ivr_promptr    s     ((..BBDK	B	BB!#ia&DDFLLUVWLL !	
  TT1>>177AJJahhO 	
 R[[]+H(3v;6? *+ (2H^$O	
s   ADz/upload-promptsc                     t         j                  d   } i }t        j                  j                  j                         }|D ]  }|||j                  <    | dk7  rt        j                  t        j                  | j                  d            }g }|D ]  }	 |d   dk7  rt        |d   j                               nd }|d   dk7  rt        |d   j                               nd }|d   j                         }	|d   dk7  rt        |d   j                               nd }
|d   dk7  r|d   j                         nd }|d	   dk7  r!|d	   j                         j                         nd }|	dk7  r||j                  |      }|r|j                   |k7  s<|j"                  |	k7  s-|j$                  |
k7  s|j&                  |k7  s|j(                  |k7  r||_        |	|_        |
|_        ||_        ||_        t*        j,                  j/                          nWt        j                  |	|
|||
      }t*        j,                  j1                  |       t*        j,                  j/                           |rt;        |d       t=        d      S # t2        $ r7}t5        j6                  d|        |j9                  |d          Y d }~'d }~ww xY w)Nuploadr   utf-8rg   r  r  r  r  r   )r  r  r  r  r   z3Exception occurred while uploading prompts. Error: r[   r  )r)   filesr  r  r_   r  rg   r  
DictReadercodecs
iterdecodestreamr   r   lowerr   r  r  r  r  r   r   r   r  r   r   r   r[   r   r+   r(   )uploaded_sheetivr_prompt_dictr  prompt
csv_readererror_promptsrow	prompt_idr  r  r  r  r   
ivr_prompt
prompt_recr   s                   rm   upload_promptsr    s    ]]8,NO((..BBDK%+		"  ^^F$5$5n6K6KW$UV
C0369$i2oCD	 124	 >*b0 N+1134 
 G**,47
Or4ICJ--/0t  25\1Bb1HC%++-d  8;8}7JS]((*113PT  B; ,%4%8%8%C
% * 7 7< G#-#3#3u#<#-#6#6(#B#-#8#8J#F#-#4#4#>:F
 738
 06>
 38B
 54:
 1 "

 1 1 3%1%;%;"'%-)5'1#)&
 

z2

))+Y d -)N##  3  I!M $$S\22	3s   GI==	J=,J88J=z/add-ivr-promptsc                  X   t         j                  dk(  rt         j                  d   j                  d      } t         j                  d   j                  d      }t         j                  d   j                  d      }t	        |       }t	        |      |k7  st	        |      |k7  rt        d       t        d
      S t        t        | ||            }t        j                  j                  |      }|st        d       t        d
      S d|z   }t        |d	       t        d
      S t        d
      S )NrN   r  r  r  r  r  &Successfully added all the IVR PromptszGot error for Prompts: r[   zpartials/ivr_prompt_form.html)r)   r!  rZ   rl  rh   r+   r  r@   r  r  add_new_promptsr'   )r  r  r  r  ivr_datar   r3  s          rm   add_ivr_promptsr	    s    ~~W%++D1<<
+11$7||G,2248Ux=N*c,.?>.Q} >?? Cx>?H!++;;HEF>? >?? !:F BmW->??:;;ro   z/update-promptsc                  ^   t         j                  dk(  rt         j                  d   } t         j                  d   }t         j                  d   }t         j                  d   }t         j                  d   }| ||||g}t        j                  j                  |       t        d      S t        d      S )NrN   r  r  r  r  r  r  )r)   r!  rZ   r  r  update_promptsr(   )r  r  r  r  r  prompt_datas         rm   r  r    s     ~~LL-	W%||G,\\,/
<<
+ ,
HeL--k:''N##ro   z/toggle_prompt_statusc                  (   t         j                  d   } t        j                  j                  j                  |       }|j                  t        j                  j                  j                  k(  rHt        j                  j                  j                  |_        t        j                  j                          nGt        j                  j                  j                  |_        t        j                  j                          t        |j                  |       S r  )r)   rZ   r  r  r_   get_ivr_prompt_by_idr   r   ro  r  r   r   r  r-   )ivr_prompt_idprompt_detailss     rm   toggle_prompt_statusr     s     LL&M!++11FF}UN 6 6 = = D DD , 6 6 = = F F


 , 6 6 = = D D


.//MBBro   /ivr-prompt-mappingc                      t         j                  j                  ddt              } t        j
                  j                  j                  |       }t        j                  ddd|      S )Nr   rT   r   r   ivrpromptmapping)r   r   ivr_prompt_mapping)
r)   r   r   r   r   IvrPromptMappingr_   get_all_prompt_mappingr   r'   )r   r  s     rm   r  r  1  s`     <<##FAC#8L!2288OO   '&-	 ro   /add-ivr-prompt-mappingc                     t         j                  dk(  r6t        j                  j                  j                         } t        dd|       S d }t         j                  d   }t         j                  d   }t         j                  d   }t         j                  d   }d	| d
}t        j                  |       t        j                         d   }d| d| d
}t        j                  |       t        j                         d   }	|du r	d|z   dz   }n|	du rd|z   dz   |z   }nt        j                  t        |      |||t        j                  j                  j                        }
t         j"                  j%                  |
       t         j"                  j'                          |st)        d       nd}t)        |d       t)        |d       t+        j,                  d      S )NrM   z!partials/prompt_mapping_form.htmlr  )r  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  mapped_table_namemapped_table_column_namer  r   r  zGot error while adding promptsr[   )r)   r!  r  r  r_   r  r'   rZ   ri  rj  fetchoner   r  r   r   ro  r   r   r   r  r+   r   r(   )r  r   event_idmapped_tablemapped_columnr  
find_tabletable_existsfind_columncolumn_existsadd_mappingr3  s               rm   add_prompt_mappingr/  @  s    ~~((..BBD/1
 	
 F||G$H<<(LLL*MLL!E\]i\jjlmJ
NN:??$Q'L%&;M?"PK
NN;OO%a(MuL(+==	%	%(HH<W 	 //h-*%2,,33::
 	

{#


678mW%fg>>344ro   z/update-mappingc                     t         j                  dk(  r4t         j                  d   } t         j                  d   }t         j                  d   }t         j                  d   }d }d| d}t        j	                  |       t        j                         d   }d	| d
| d}t        j	                  |       t        j                         d   }|du r	d|z   dz   }n5|du rd|z   dz   |z   }n%| |||g}	t        j                  j                  |	       |st        d       nd}
t        |
d       t        |d       t        j                  d      S t        j                  d      S )NrN   
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 promptsr[   r  )r)   r!  rZ   ri  rj  r&  r   r  r  r+   r   r(   )r1  r(  r)  r  r   r*  r+  r,  r-  r  r3  s              rm   update_mappingr2  q  sp    ~~\\,/
||G,X.W%`am`nnpq
z"(+bcobp  qF  GT  FU  UW  X{#)!,5 ,/AAFe# 23   &|]EJK%%44[A@A>M-)&'"~~344>>/00ro   z/toggle_mapping_statusc                  (   t         j                  d   } t        j                  j                  j                  |       }|j                  t        j                  j                  j                  k(  rHt        j                  j                  j                  |_        t        j                  j                          nGt        j                  j                  j                  |_        t        j                  j                          t        |j                  |       S r  )r)   rZ   r   r  r_   	get_by_idr   r   ro  r  r   r   r  r-   )ivr_prompt_mapping_idmapping_detailss     rm   toggle_mapping_statusr7    s     $LL.//55??@UVO!:!:!A!A!H!HH!)!:!:!A!A!J!J


!)!:!:!A!A!H!H


/005JKKro   z/usersc                      t         j                  j                  ddt              } d}t        j
                  j                  j                  | |      }t        j                  ddd|j                  |      S )	Nr   rT   r   r}   )r   per_pager   users)r   r   experiencesr   )r)   r   r   r   r   r   r_   get_active_experiencesr   r'   r   )r   r9  paginated_experiencess      rm   users_panelr>    sv     <<FAC0DH$//55LLH M    )//( ro   /add_users_and_upload_consentc                  P    t         j                  dk(  r
t               S t               S )NrM   )r)   r!  handle_add_user_get_requesthandle_combined_postry   ro   rm   add_users_and_upload_consentrC    s"    
 ~~*,,!!ro   c                  ,   t         j                  j                  d      xs dj                         } t	        |       }t         j
                  j                  d      }t         j                  j                  d      xs dj                         }t	        |xr t        |dd      j                               }t	        |xr |      }|s"|s t        dd       t        t        d            S |rt        ||       |r
t               S t        t        d            S )	Nr   r   photoconsent_namefilenameu   कृपया देखभालकर्ता जोड़ने के लिए फ़ोन नंबर दें या सहमति के लिए नाम व फोटो अपलोड करें।r[   rC  )r)   rZ   r   r   boolr  r   r+   r(   r,   upload_consenthandle_add_user_post_request)
raw_phones	has_usersrE  rF  	has_photohas_consents         rm   rB  rB    s    ,,""8,299;JZ IMMg&ELL$$^4:AACLUEwuj"=CCEFI|1	2K[ k	
  >?@@ul++--G:;<<ro   c                     t         j                  j                  j                  } t        j
                  j                  }t         j                  j                  j                         xs g }t         j                  j                  j                  }|s+t        j                  j                  d       t!        dd       t#        d| |||      S )z0Handles the GET request and loads the user form.zJNo blocks found in District Block Mapping while adding new user through UIu   कृपया ब्लॉक जोड़ने के लिए इंजीनियरिंग टीम से संपर्क करें।r[   zpartials/user_form.html)experience_types
timerangesblocksprograms)r   r   TypeCHOICEr   	TimeRangeHINDI_RANGEDistrictBlockMappingr_   get_all_hindi_block_namesProgramName
HINDI_NAMEr   loggerr[   r+   r'   )rP  rQ  hindi_block_namesrS  s       rm   rA  rA    s    **//66''33J%%++EEGM2  $$//H

X	
 	 h	

 !)  ro   c            	      p   t         j                  j                  j                  t	        j
                               } t               }|t        d      S |\  }}}}}|st        dd       t        d      S |st        dd       t        d      S |st        dd       t        d      S |st        dd       t        d      S |st        dd       t        d      S t         j                  j                  j                  |      }|r|j                  nd}|r|j                  nd}	|r|j                  nd}
g }|	r,|r*t         j                  j                  j                  ||	      }|s+|	r)t         j                  j                  j!                  |	      }|s+|r)t         j                  j                  j#                  |      }|st        d	| d
d       |D ]9  }t         j$                  j                  j'                  |j(                        }|s9 n t+        |||
|||       \  }}}t-        |||       t        d      S )z?Handles the POST request, validates input, and processes users.Nr?  uS   कृपया एक फ़ोन नंबर प्रदान करें।r[   E   कृपया अनुभव प्रकार चुनें।u9   कृपया एक ब्लॉक चुनें।uF   कृपया एक समय श्रेणी चुनें।uE   कृपया एक कार्यक्रम चुनें।u   कृपया u    ब्लॉक के लिए दोस्त टोल फ्री नंबर जोड़ने के लिए इंजीनियरिंग टीम से संपर्क करें)r   r^   r_   r   r   rq   validate_user_inputr(   r+   rX  get_block_by_hindi_namestatedistrictblockPartner!get_partner_by_state_and_districtget_partner_by_districtget_partner_by_stateProviderNumber!get_provider_number_by_partner_idrg   verify_and_process_users_dataflash_messages)r7   	user_datauphonesexperience_typehindi_block	timerangeuprogramdistrict_block_mappingrc  rd  re  partnerspartnerproviderexisting_experience_phones	new_usersr   s                    rm   rJ  rJ    s1   %%++//	0R0R0TUL#%I788AJ>G_k9hcelm788UW^_788I7S788VX_`788UW^_788 	%%++CCKP  -C"((E2H%..dH,B"((EHE##))KK8
 ##))AA(K##))>>uE{m  ,x  y	

 **00RRJJ
   5R(E9h51	6 -y&A344ro   c                     t         j                  j                  dd      j                         } | st	        dd       yg }| j                  d      D ]  }|j                         j                  dd      }|s&dj                  |D cg c]  }|j                         s| c}      }t        |      dk  rt	        d	| d        y|j                  |d
d         |st	        dd       yt         j                  j                  d      }|st	        dd       yt         j                  j                  d      }|st	        dd       yt         j                  j                  d      }|st	        dd       y|t        j                  j                  k(  rt        j                  j                  }no|t        j                  j                  k(  rt        j                  j                   }n7|t        j                  j"                  k(  rt        j                  j$                  }t         j                  j                  d      }|st	        dd       y|t&        j(                  j*                  j,                  k(  r%t&        j(                  j*                  j.                  }nK|t&        j(                  j*                  j0                  k(  r$t&        j(                  j*                  j2                  }|||||fS c c}w )zPValidates form input and returns user data if valid, otherwise flashes an error.r   r   ub   कृपया कम से कम एक फ़ोन नंबर दर्ज करें।r[   Nr  r  r   u.   अमान्य फ़ोन नंबर: r   uI   मान्य फ़ोन नंबर आवश्यक हैं।rp  r`  rR  u2   कृपया ब्लॉक चुनें।rQ  u?   कृपया समय श्रेणी चुनें।programu>   कृपया कार्यक्रम चुनें।)r)   rZ   r   r   r+   rl  r   r  r   rh   r   r   rV  MORNING_TIME_RANGE_HINDIMORNING_TIME_RANGEAFTERNOON_TIME_RANGE_HINDIAFTERNOON_TIME_RANGEEVENING_TIME_RANGE_HINDIEVENING_TIME_RANGEr   rZ  r[  UK_USN_T_6_HINDI
UK_USN_T_6UK_USN_B_3_HINDI
UK_USN_B_3)	rK  ro  r   chdigits_onlyrp  re  rr  rs  s	            rm   ra  ra  ;  sd    !!(B/557Jrt{|G!!$'%%c2.ggEBEbRZZ\rEBC{b B5'JGT{34() ( Y[bc ll&&'89OUW^_ LLX&EBGL   .IOQXYL**CCC **==		l,,GG	G **??		l,,EE	E **==	 ||	*HNPWX8##((999##((33	X%%**;;	;##((33OUIx??] Cs   K(
K(
c                 f   g }g }g }	| D ]  }
|
j                         }
|
st        j                  j                  j	                  t        |
            }|r|j                  |
       \t        j                  |
|||f|||      \  }}}}}|r|	j                  |       |j                  |
        |||	fS )zSVerify and Processes users data: checks for existing experience and adds new users.)
r   r   r   r_   find_experience_with_phoner   r   r	   add_non_mvp_usersextend)ro  rp  rw  re  rr  rs  r7   rx  ry  r   r   rN  user_errorsr  s                 rm   rl  rl  {  s     "$IF((..II% 

 &--e4&/&A&A%3	'#KAq! k*  '+ . &y&88ro   c                     | r)t        t        |        ddj                  |        d       |r)t        t        |       ddj                  |       d       |r t        dd       |D ]  }t        |d        yy)	z9Displays flash messages based on user processing results.u    देखभालकर्ताओं के पास पहले से ही सक्रिय अनुभव है: r  rc   ud    नए देखभालकर्ता सफलतापूर्वक जोड़े गए: r   u   अपलोड करते समय कुछ गलतियाँ हुईं। कृपया इंजीनियरिंग टीम से संपर्क करें।r[   N)r+   rh   r  )rx  ry  r   r[   s       rm   rm  rm    s    !-./  0pyy3457	
 9~  C  DH  DM  DM  NW  DX  CY  Z	

  K	
 E%!  ro   c                 x   t        |      dz   | j                  z   }	 t        | j                  || j                  t
              }|d   }|d   }t        j                  ||d| t        j                         t        j                               }t        j                  j                  |       t        j                  j                          t!        d| dd	       t)        t+        d            S # t"        $ r@}t        j                  j%                          t!        d
t'        |       d       Y d }~Xd }~ww xY w)Nr  )	folder_idrg   	view_linkzhttps://drive.google.com/uc?id=)rj   	drive_url	image_urluploaded_byuploaded_onz	Consent 'z' uploaded successfully!r   zEError uploading file to Google Drive. Please contact support. Error: r[   rC  )r   rG  r   r  mimetyperD   r   Consentr   rq   r<   utcnowr   r   r   r  r+   r   r'  r(  r(   r,   )rE  rF  rG  
drive_filefile_id
drive_linknew_consentr   s           rm   rI  rI    s   \*S05>>AH
)LL(ENNo

 T",
&& 7yA!::< )
 	

{#


	,'?@)L G:;<<  



STWXYTZS[\	
 	

s   B?C0 0	D996D44D9	/partnersc                      t         j                  j                  ddt              } t        j
                  j                  j                  |       }t        j                  ddd|      S )Nr   rT   r   r   ru  )r   r   ru  )
r)   r   r   r   r   rf  r_   get_partners_logr   r'   )r   ru  s     rm   partners_panelr    sZ     <<##FAC#8L%%66|DH  	 ro   z/add_partnerc            	         t         j                  dk(  rt        d      S t         j                  d   j	                  d      } t         j                  d   j	                  d      }t         j                  d   j	                  d      }t         j                  d   j	                  d      }t         j                  d   j	                  d      }t        t        | ||||            }t        j                  |       t        d	      S )
NrM   zpartials/partner_form.htmlrj   r  areacitychannel_nameemailr  )
r)   r!  r'   rZ   rl  r  r@   r	   add_to_partner_tabler(   )p_namesp_areap_city	p_channelp_emailru  s         rm   add_partnerr    s     ~~(
 	
 ll6"((.G\\&!''-F\\&!''-F^,2248Ill7#))$/GCGDEH""8,K  ro   z/delete_partner/<partner_id>c                     t        |       } t        j                  j                  |        t	        j
                  d      S )Nr  )r   r   rf  delete_partnerr   r(   )
partner_ids    rm   r  r    s0     ZJ##J/>>+&&ro   	/channelsc                      t         j                  j                  j                         } t	        j
                  ddd|       S )Nr   channels)r   r   r  )r   Channelr_   get_channel_logr   r'   r  s    rm   channels_panelr     s:     %%557H  **x ro   z/add_channelsc                      t         j                  dk(  rt        d      S t         j                  d   j	                  d      } t        j                  |        t        d      S )NrM   zpartials/channel_form.htmlrj   r  r  )r)   r!  r'   rZ   rl  r	   add_to_channel_tabler(   r  s    rm   add_channelr  	  sN     ~~;<<||F#))$/H""8,K  ro   rY   c                      t         j                  j                  ddt              } t        j
                  j                  j                  |       }t        j                  ddd|      S )Nr   rT   r   r   rS  )r   r   rS  )
r)   r   r   r   r   rZ  r_   get_paginated_programs_logr   r'   )r   rS  s     rm   programs_panelr    sZ     <<##FAC#8L%%@@NH  	 ro   z/program_details/<program_id>c                     t         j                  j                  j                  |       }|rt	        j
                  ddd|      S t        d      S )Nr   program_details)r   r   r{  rY   )r   rZ  r_   get_program_detailsr   r'   r(   )
program_idr{  s     rm   r  r  #  sO     $$88DG$$*)	
 	
 K  ro   z/programseq/<program_id>c                    t         j                  dk(  r6t        j                  j                  j                  |       }t        d|      S t         j                  d   j                  d      }t         j                  d   j                  d      }t         j                  d   j                  d      }t         j                  d   j                  d      }t        t        ||||            }t        j                  | |       t        d	      S )
NrM   zpartials/programseq_form.html)r{  seq_idxr  r  weekdayrY   )r)   r!  r   rZ  r_   r  r'   rZ   rl  r  r@   r	   add_to_programr(   )r  r{  r  r  r  r  pdatas          rm   programseq_panelr  1  s     ~~""((<<ZH>PPll9%++D1Gll9%++D1G<<%%d+D
,,u

#
#D
)CWgtS12EZ/K  ro   z/add_programc            
         t        t        j                        } | j                         rt	        j
                  | j                  j                  | j                  j                  | j                  j                  | j                  j                  | j                  j                  | j                  j                  | j                  j                  | j                  j                        }t        j                   j#                  |       t        j                   j%                          t'        d       t)        d      S t+        d|       S )N)rj   r  
start_dateend_dater   r   
hindi_namedescriptionzSuccessfully added the programrY   zpartials/program_form.html)rZ   )r   r)   rZ   r]   r   rZ  rj   ra   r  r  r  r   program_typer  r  r   r   r   r  r+   r(   r'   )rZ   program_objs     rm   add_programr  A  s     ',,'D &&LL%%++]]'';;##""''++((--	
 	

{#


./$$7dCCro   /schedule_programc                  :   t         j                  dk(  r5t        j                  j                  j                         } t        d|       S t         j                  d   j                  d      }t         j                  d   j                  d      }t         j                  d   }t        t        ||            }t        j                  ||      \  }}|D ]  }t        t        |      d        |D ]  }t        t        |      d        t        d	d       t!        d
      S )NrM   z%partials/experiencepauselog_form.html)rS  r   r  pause_start_datenext_programr[   z<Program for users without errors has been queued succesfullyr  )r)   r!  r   rZ  r_   get_programs_logr'   rZ   rl  r  r@   r	   add_experience_pause_logr+   r   r!   r(   )rS  r   start_datesr  pause_log_datano_experiencepending_pause_logr   s           rm   add_pause_logr  X  s     ~~##))::<3h
 	
 \\'"((.F,,1288>K<</L#fk23N'0'I'I($M$ 2597C "$U+W5 #	
H'R'((ro   z/callsc                  @   t         j                  dk(  rt        j                  ddd      S t         j                  d   } t         j                  d   }t         j                  d   j                  d      }|D ]  }t        j                  ||d	d
|         t        d      S )NrM   r   calls)r   r   	exo_phone	exo_appidr   r     T)trialignore_checkr  rs   )	r)   r!  r   r'   rZ   rl  r
   	make_callr(   )r  r  r   ps       rm   calls_panelr  s  s     ~~$$g7
 	
 [)I[)I\\(#))$/Fy		
  C=ro   z/engagement_reportc                  ,    t        j                  d      S )Nz/home)r   r(   ry   ro   rm   engagement_reportr    s     >>'""ro   /tcrc                     t         j                  dk(  rAt        j                  j                  j                         } t        j                  d| dd      S t         j                  d   }t         j                  d   }t        j                  j                  ||      rt        d       t        d
      S t        dd	       t        d
      S )NrM   zpartials/time_change_panel.htmltime_change)timecategoriesr   r   r   r   zDSuccessfully created a request. The changes would happen by tomorrowz.There was some errors while updating the data.r[   r  )r)   r!  r   r   r_   get_timecategory_logr   r'   rZ   
ChangeReqscreate_change_requestr+   r(   )r  r   timecategorys      rm   	tcr_panelr    s     ~~!..44IIK$$-)&%	
 	
 LL!E<<0L00ETU F 	>HFro   z
/exocallinc                  l   	 t         j                  dk(  rt         j                  j                  d      } t	        j
                  d|         dt        t         j                  j                               v rPdt        t         j                  j                               v r't               j                  t         j                         t        j                  ddi      ddd	ifS # t        $ rI}t	        j                  d
|        t	        j                  t        j                                 Y d }~y d }~ww xY w)NrM   Fromz2Missed call Handling: Received a missed call from Tor   Tr  ContentTypeapplication/jsonz(Exception on exocallin function. Error: )r)   r!  r   r   r   rc   r  keysr   handle_missed_callr  dumpsr   r[   debug	traceback
format_exc)r/  r   s     rm   	exocallinr    s    1>>U" ))&1JOODZLQ gll//122tt!!#@ 8 "#66w||Dzz9d+,cMCU3VVV 1CA3GH--/001s   CC! !	D3*?D..D3z/ciffcallbackc                     g d} d}t         j                  dk(  rt        j                  dt         j                  j                  d             dt        t         j                  j                               v rwdt        t         j                  j                               v rNt         j                  j                  d      }|r-|dd  }| t        dd	         }t        j                  ||d
|       t        d      S )N)iPS iU iO iO 01140844944rM   z Received a missed call from %s: r  r  rT   r   r  T)r   r  r  r  rs   )r)   r!  r   rc   r   r   r  r  r   r
   r  r(   )content_appidsr  user_numberr  s       rm   ciffcallbackr    s    5NI~~:GLL<L<LV<TUT',,++-..44@Q@Q@S;T3T!,,**62K)!"o-gam<''%*!%'	 C=ro   z/rapidprotestc                  2   t         j                  j                  d      } t         j                  j                  d      }| r|st        j                  ddddi      dddifS t        j                  d	i d
ddd dt        j                         j                  d      dt        j                         j                  d      ddddd| dddddt        j                         j                  d      dd dd dd dddd dd d d d!d d"i      d#ddifS )$Ntor  RestExceptioni  zInvalid Call Parameters)r   Messager  r  CallSid mb33g922c5e6f79exedxz0f4y19714a1ParentCallSidDateCreatedz%Y-%m-%d %H:%M:%SDateUpdated
AccountSiddosteducationr  01140844787r  PhoneNumberSidr   zin-progress	StartTimeEndTimeDurationPrice	Directionzoutbound-api
AnsweredByForwardedFrom
CallerNamez+/v1/Accounts/dosteducation/Calls/xxxxx.json)UriRecordingUrlr  )r)   r   r   r  r  r<   nowstrftime)	to_numberapp_ids     rm   rapidprotestr    s     &I\\g&FFJJ S=V"WX ./
 	
 	

 =#T "8<<>#:#:;N#O "8<<>#:#:;N#O	
 !/ - I %m m  !8!89L!M t  T   !$  $T!" !$#$ I$('	
2 		*+7 ro   z/confirmation_callc                     t         j                  dk(  rt         j                  j                  d      } | dd  }t        j
                  j                  j                  |t        j
                  j                  j                  t        j
                  j                  j                  g      }|r6t        j                  d|       	 t        t         j                  j                  dd      j                  dd            }|dk(  r*t        j
                  j                  j"                  |_        n|dk(  r*t        j
                  j                  j&                  |_        ni|j(                  j*                  t        j,                  j                  j/                  d      k7  r)t        j
                  j                  j                  |_        t0        j2                  j5                          nt        j                  d|       t7        j8                  ddi      dddifS y # t        $ r%}d	}t        j                   d
|        Y d }~Bd }~ww xY w)NrM   r  rT   z&Updating status for user with phone %sdigitsr   "r   z?Exception occurred while scheduling confirmation calls. Error: r   callinzNo user found for the number %sr   Tr  r  r  )r)   r!  r   r   r   r   r_   !find_experience_with_phone_statusr   SIGNUPSIGNUP_UNCONFIRMEDr   rc   r   r   r   r[   SIGNUP_CONFIRMEDr   SIGNUP_REJECTEDrG   r  rf  get_by_namer   r   r  r  r  )r   r  rN  touchtone_valuer   s        rm   confirmation_callr)    s   ~~  (ABi((..PP##**11##**==

 OODkR"%gll&6&6x&C&K&KCQS&T"U !#$,$7$7$>$>$O$O
! A%$,$7$7$>$>$N$N
!??--1A1A1G1G1S1S2  )1(;(;(B(B(U(UJ%JJOO={Kzz9d+,cMCU3VVV'  "$  UVWUXY s   9H 	IH>>Iz/autocallciff/<appid>/<trial>c                      y r  ry   )r  r  s     rm   autocallciffr+    s    
ro   z/livecall/<campaign_id>c                 X   t         j                  dk(  rt        j                  dt         j                  d          t
        j                  j                  j                  t
        j                  j                  | k(        j                         }|r|j                  t
        j                  j                  j                  k7  rt         j                  d   }t         j                  d   }t        j                  d|  d|        |j                  t         j                  d   t         j                  d          |j                  |j                   t         j                  d   d}t#               j%                  |       nt        j&                  d|  d	        t)        j*                  d
      S y )NrN   zCall attempt status: %sr   CallSidz.Updating status of live call campaign with id z to )experience_idscheduled_byexotel_statuszNo incomplete campaign with id z found for the callsid r  )r)   r!  r   rc   rZ   r   r   r_   r`   rg   rb   r   r   	COMPLETEDupdate_campaign_after_callbackr.  r/  r   (update_pre_calculated_user_campaign_datark   r   r'   )campaign_idrC  r   call_sidcampaign_datas        rm   livecallr7  #  sZ   ~~17<<3IJ$$**11  K/

%' 	 8+<+<+C+C+M+MM\\(+F||I.HOO@TRXQYZ 33X&Y(? "*!7!7 ( 5 5!(h!7M
 )*SS
 1+>UV^U_` $$%BCCro   z/missedcallresponsec                     t         j                  dk(  rt         j                  j                  d      } | dd  } t        j
                  j                  j                  |       }|rZt        t         j                  j                  dd      j                  dd            }t        j
                  j                  ||       nt        j                  d|        t        j                  d	      S y )
NrM   r  rT   r  r   r  r   z"No campaign found for the phone %sr  )r)   r!  r   r   r   r   r_   r  r   r   handle_callin_feedbackr   rk   r   r'   )r  rN  r(  s      rm   missedcallresponser:  H  s    ~~ll&&v.!!"o((..II+V
!',,"2"28Q"?"G"GR"PQO66z?SC[Q$$%BCCro   z/branch_streaks_responsec                     t         j                  dk(  rt         j                  j                  d      } | dd  } t        j
                  j                  j                  | t        j
                  j                  j                        }|r!t        t         j                  j                  dd      j                  dd            }|dk(  rt        j                  j                  j                  d      }|d	k7  rt        j                  j                  j                  |j                         st        j"                  j                  j%                  |      }t'               j)                         }|j*                  j-                         t        j
                  j.                  j0                  k(  r3|t3        |j-                          d
z   d      z   }|t3        d|      z   }n2|t3        |j-                          dz
  d      z   }|t3        d|      z   }t5        j6                  d|        t	        j                  |j                   |||t        j                  j                  j8                        }t:        j<                  j?                  |       t:        j<                  jA                          nt5        jB                  d|        tE        jF                  d      S y )NrM   r  rT   r  r   r  r   STREAKSr   r   )daysweeksz'Creating new pause log for the phone %s)r.  r  pause_end_datenext_program_idr   z$No experience found for the phone %sr  )$r)   r!  r   r   r   r   r_   r"  r   ro  r   r   rZ  find_program_id_with_namerJ  pending_pause_log_existsrg   
Programseqget_program_lenr   r>   r  weekdayCohortWEEKENDr=   r   rc   PENDINGr   r   r   r  r[   r   r'   )	r  rN  r(  r  program_lentodayr  r?  	pause_logs	            rm   streaksresponserL  \  sM   ~~ll&&v.!!"o((..PP,,33::

 !',,"2"28Q"?"G"GR"PQO!#%--33MMiX
##66<<UU" '/&9&9&?&?&O&O&' !4 5 : : <&1199;'2299AAB 05y&+mmo%5%98 0, .>	%&kA .N
 05y&+mmo%5%98 0, .>	%&kA .N #E{ %-$?$?*4---=+9,6#+#>#>#E#E#M#M%	 

y1

))+C[Q$$%BCCro   /add_provider_numberc            	      $   t         j                  dk(  rt        d      S t         j                  dk(  r^t        j                  dt         j
                         t         j
                  d   j                  d      } t         j
                  d   j                  d      }t         j
                  d   j                  d      }t         j
                  d	   j                  d      }t         j
                  d
   j                  d      }t        t        | ||||            }t        j                  |      }|st        d       t        d      S t        dd       |D ]$  }t        j                  d|       t        |d       & t        d       t        d      S y )NrM   z!partials/providernumber_form.htmlrN   z#Adding provider number with data %sr   r  rj   r  r  rv  zSuccessfully added all the dataz-There were following errors while uploading: r[   z&Error while adding provider number: %sz&Please correct the data and add again.rM  )r)   r!  r'   r   rc   rZ   rl  r  r@   r	   add_provider_numberr+   r[   r(   )r   rj   r  r  rv  udatar   r[   s           rm   rO  rO    sE    ~~BCC~~=w||LW%++D1||F#))$/||N399$?<<
+11$7,,y)//5SlHgFG..u534 .// A7K  !I5QeW%   :;.//ro   z
/live_callc                     t         j                  dk(  rt        j                  j                  j                         } t         j                  j                  dd      }t        d| t        j                  |t        j                  j                  j                        S t        j                  dt         j                          t         j                   d   }t         j                   d   }t         j                   d   }t         j                   j                  d	d
      }t        j"                  j                  j%                  |      }t        j                  ||r|j&                  nd t)               t        j                  j*                  j,                  t        j                  j.                  j0                  |r|j2                  nd |||	      }t4        j6                  j9                  |       t4        j6                  j;                          t=        j>                  ||||      \  }}|rgt        dd|t        j                  j                  j                         t        j                  t        j                  j                  j                        S t        d||t        j                  j                  j                         t        j                  t        j                  j                  j                        S )NrM   r/  r   zpartials/live_call_form.html)exotel_phonesagent_phoner/  purposeszMaking live call with data: %srS  exotel_phonepurposeLC	rj   r.  deploy_datetimer   r/  user_idr   r  agent_numberT)r   r/  rR  rS  rT  )r[   r/  rR  rS  rT  ) r)   r!  r   rj  r_   get_live_call_provider_numberr   r   r'   r7   r   r   LiveCallPurposeCHOICE_ENGLISHr   rc   rZ   r   r  rg   r   r   	SCHEDULEDScheduledBy	LIVE_CALLrZ  r   r   r   r  r
   make_live_call)	provider_numbersr/  rS  rU  rV  user_experiencerC  r   r3  s	            rm   rV   rV     s+   
 ~~#2288VVX\\%%lB7
**$**!&&66EE
 	
 OO4gllCl+J,,}-K<</Llly$/G))//JJ:VO  ,;o((+-  ''11&&22<<+:''$ 
H JJNN8JJ)88KxFM *!"1177UUW$**&&66EE
 	
 &--33QQS &&""22AA ro   z/user_checkc                  B   t         j                  dk(  rt        d      S t         j                  d   } t        j
                  j                  j                  |       }t        j                  d|  d       d}|st        d||       S d	}t        d||j                  | 
      S )NrM   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)rf  r  r/  )r)   r!  r'   rZ   r   r   r_   !find_oldest_experience_with_phoner   r[   r  )r/  rd  rf  s      rm   
user_checkrh    s    ~~9::l+J))//QQO 
NzlZ[\ K-#!
 	
 K)"--	 ro   /feedback_callc                     t         j                  dk(  r-t         j                  j                  dd      } t	        d|       S t        j                  dt         j                         t        j                  d   }t        j                  }t        j                  j                  j                         d   j                  }t         j                  d   } t        j                   j                  j#                  |       }t        j$                  |rd	t'        |j(                        z   nd	|r|j*                  nd t-               t        j$                  j.                  j0                  t        j$                  j2                  j4                  |r|j(                  nd || |
	      }t6        j8                  j;                  |       t6        j8                  j=                          t?        j@                  | |||       tC        d| z          tE        d      S )NrM   r/  r   zpartials/feedback_call.htmlrA  z#Making Feedback call with data:  %sFEEDBACK_EXO_APPIDr   FBrX  z,Successfully scheduled the feedback call to ri  )#r)   r!  r   r   r'   r   rc   rZ   r   r&  r7   r   r   rj  r_   r\  r   r  r   r(  rZ  rg   r   r   r_  r`  FEEDBACK_CALLr   r   r   r  r
   schedule_feedback_callr+   r(   )r/  feedback_call_appidrS  rU  rd  rC  s         rm   feedback_callrp    s    ~~\\%%lB7
)!
 	

 OO97<<H**%9:$$K**00NNP	e  l+J))//JJ:VO  4CTC//00,;o((+-  ''11&&22@@+:''$ 
H JJNN8JJ((L"5x 

8:
EF$%%ro   z/champion_callc                     t         j                  dk(  rt         j                  j                  dd      } t         j                  j                  dd      }| rt        j
                  }t        j                  j                  j                         d   j
                  }t        j                  j                  j                  |       }t        j                  dt         j                         t        j                  ||r|j                  nd t!               t        j                  j"                  j$                  t        j                  j&                  j(                  |r|j*                  nd || |	      }t,        j.                  j1                  |       t,        j.                  j3                          t5        j6                  | |||      \  }}|rt9        d	d
| |      S t9        d	|| |      S y )NrM   r/  r   rV  CCr   zLive call data: %srX  zpartials/champion_call.htmlT)r   r/  rU  )r[   r/  rU  )r)   r!  r   r   r7   r   r   rj  r_   r\  r   r  r   rc   r   rg   r   r   r_  r`  CHAMPION_CALLrZ  r   r   r   r  r
   rb  r'   )r/  rV  rS  rU  rd  rC  r   r3  s           rm   champion_callrt  5  s    ~~\\%%lB7
,,""9d3&,,K''--KKMaPVV  '1177RRO OO0',,?((4Co00 3 5((//99%..::HH3B// ,&(
H JJNN8$JJ$1$@$@Kx%!FM &1 )!-	  #-#%)	  ro   z/champion_call_userc                     t         j                  dk(  ret        j                  j                  j                         d   j                  } t        d| t        j                  j                  j                        S t        j                  dt         j                         t         j                  d   }t         j                  d   }t         j                  d   }t         j                  j                  d	d
      }t        j                  j                  j!                  |      }t        j                  ||r|j"                  nd t%               t        j                  j&                  j(                  t        j                  j*                  j,                  |r|j.                  nd |||	      }t0        j2                  j5                  |       t0        j2                  j7                          t9        j:                  ||||      \  }}|r2t        dd||t        j                  j                  j                        S t        d|||t        j                  j                  j                        S )NrM   r   z%partials/champion_call_user_form.html)rU  rT  zChampion call data: %sr/  rS  rU  rV  rr  rX  T)r   r/  rU  rT  )r[   r/  rU  rT  )r)   r!  r   rj  r_   r\  r   r'   r   r]  CHOICE_HINDIr   rc   rZ   r   r   r  rg   r   r   r_  r`  rs  rZ  r   r   r   r  r
   rb  )	r   r/  rS  rU  rV  rd  rC  r   r3  s	            rm   champion_call_userrw  f  s    ~~"1177UUW

% 	 3(&&66CC
 	
 OO,gll;l+J,,}-K<</Llly$/G))//JJ:VO  ,;o((+-  ''11&&22@@+:''$ 
H JJNN8JJ)88KxFM 3!%&&66CC
 	
 /!""22?? ro   /dndc                      t         j                  dk(  rt        j                  d      S t         j                  d   j                  d      } t        j                  |       }t        j                  d|      S )NrM   zpartials/dnd_checker.htmlplistr  zpartials/phoneinfo.html)r   )r)   r!  r   r'   rZ   rl  r
   	check_dnd)rz  r   s     rm   dnd_checkerr|    s_     ~~$$%@AALL!''-E$$U+F  !:6JJro   z
/whitelistc                      t         j                  dk(  rWt        j                  t	        t         j
                  j                               d         } | d   }t        j                  |       t        d      S )NrN   r   r   rx  )
r)   r!  astliteral_evalr  rZ   r  r
   whitelist_numbersr(   )	phoneinfor   s     rm   	whitelistr    sZ     ~~$$T',,*;*;*=%>q%AB	8$''/Fro   z/export_dndc                  P   t         j                  dk(  rt        j                  t	        t         j
                  j                               d         } | d   }d}|dz  }|D ]  }||d   dz   |d   z   dz   |d	   z   d
z   z  }! t        |      }d|j                  d<   |S t        d      S )NrN   r   r  r   zphone,operator,status
r   ,operatorr   r  z%attachment; filename=dndinfo_list.csvr  rx  )
r)   r!  r~  r  r  rZ   r  r*   r  r(   )phoneinfo_obj
phone_infor  r  r  s        rm   
export_dndr    s     ~~((gll.?.?.A)B1)EF";/
((A1W:#a
m3c9AhKG$NNC  % 4 	!	
 Fro   z/experiment/c                      t        d      S )Nrs   )r(   ry   ro   rm   experiment_panelr    s     C=ro   z/experiment/addc                     t         j                  dk(  rt        d      S t         j                  d   } t         j                  d   }t	        j
                  t        t         j                  d         d      j                         }t	        j
                  t        t         j                  d         d      j                         }t        |       dk  rt        |      d	k  rvt        j                  | |||
      }t        j                  j                  |       t        j                  j                          t        t!        d|j"                              S t%        d       t        d      S )NrM   zpartials/experiment_form.htmlrj   r  r  r   r  d   i  )rj   r  r  r  
add_cohortexperiment_idz[Name should be less than 100 characters and description should be less than 1000 characters)r)   r!  r'   rZ   r<   r   r   r>   rh   r   
Experimentr   r   r   r  r(   r,   rg   r+   )rj   r  r  r  
experiments        rm   add_experimentr    s%    ~~+
 	
 <<D,,}-K""gll<01:
df    gll:./
df  4yCC,4((#!	

 	

z"


JMMJKK	e ' ro   z'/experiment/<experiment_id>/cohorts/addc           	         t         j                  dk(  r6t        j                  j                  j                  |       }t        d|      S t         j                  d   } t         j                  d   j                  d      }t         j                  d   j                  d      }t         j                  d   j                  d      }t         j                  d	   j                  d      }t         j                  d
   j                  d      }t        t        |||||            }t        j                  ||        t        t        d|             S )NrM   zpartials/cohort_form.html)r  r  cohort_namer  r  r  inputsoutputscohort_panelr  )r)   r!  r   r  r_   r4  r'   rZ   rl  r  r@   r	   create_cohortsr(   r,   )r  r  rj   r  r  r  r  ra   s           rm   r  r    s     ~~((..88G
:zRRLL1M<<&,,T2Dl+11$7J||J'--d3H\\(#))$/Fll9%++D1GD*h@ADT=1GN-HIIro   z$/experiment/<experiment_id>/cohorts/c                     t         j                  j                  j                  |       }|j                  }t        d||      S )Nzpartials/cohort_panel.html)r  cohorts)r   r  r_   r4  r  r'   )r  r  r  s      rm   r  r  	  s?     $$**44]CJ  G$W ro   z//experiment/<experiment_id>/cohorts/<cohort_id>c                    t         j                  j                  j                  |       }t         j                  j                  j                  |      }t         j
                  j                  j                  |      }t        d|||      S )Nz"partials/cohort_details_panel.html)r  cohortcohort_details)r   r  r_   r4  rF  CohortDetailsget_by_cohort_idr'   )r  	cohort_idr  r  r  s        rm   cohort_details_panelr  	  so     $$**44]CJ__"",,Y7F++11BB9MN,%	 ro   z@/experiment/<experiment_id>/cohorts/<cohort_id>/<user_id>/deletec                     t         j                  j                  j                  |      }t        j
                  j                  |       t        j
                  j                          t        t        d| |            S )Nr  r  r  )
r   r  r_   get_by_user_idr   r   deleter  r(   r,   )r  r  rZ  cohort_details       rm   delete_cohort_detailsr  	  s^     **00??HMJJm$JJ"-9	
 ro   z3/experiment/<experiment_id>/cohorts/<cohort_id>/addc                    t         j                  dk(  r`t        j                  j                  j                  |       }t        j                  j                  j                  |      }t        d||      S t         j                  d   j                  d      }|D cg c]  }t        |       }}t        j                  j                  j                  |      }|D cg c]  }|j                   }}t        j                  j                  j                  t        j                  j                   j#                  |            j%                         }|D ]`  }t        j&                  |j                   |      }	t(        j*                  j-                  |	       t(        j*                  j/                          b t1        t3        d| |            S c c}w c c}w )	NrM   z!partials/cohort_details_form.html)r  r  r:  r  )rZ  r  r  r  )r)   r!  r   r  r_   r4  rF  r'   rZ   rl  r   r   r  rZ  Userr`   rg   r   r   r  r   r   r   r  r(   r,   )
r  r  r  r  r:  rG   r;  rN  user_idsr  s
             rm   add_cohort_detailsr  /	  sb   
 ~~((..88G
&&00;/Jv
 	
 LL!''-E-23UT]4 UE3%%++FFuMK5@A[z
""[HAMM&&x}}'7'7';';H'EFJJLE ..tww)T


}%


  "-9	
  4As   G
Gz/public_dashboardc                  f   t         j                  d   } t         j                  d   }t        t         j                  d         t        t         j                  d         t        j                         t        d      z   d}t        j                  ||       }t        d||j                  d	      
      S )NCHARTIO_SECRETDASHBOARD_URLDASHBOARD_NUMBERORGANISATION_NUMBERr}   )seconds	dashboardorganizationexppublic_dashboard.htmlr  dashboard_urlchartio_token
r   r&  r   r<   r  r=   jwtencoder'   decoder  r  payloadtokens       rm   pubic_dashboardr  N	  s     ZZ 01NJJ/M $678CJJ'<=>||~	" 55G
 JJw/E#ll7+ ro   z/public_dashboard_mobilec                  f   t         j                  d   } t         j                  d   }t        t         j                  d         t        t         j                  d         t        j                         t        d      z   d}t        j                  ||       }t        d||j                  d	      
      S )Nr  DASHBOARD_URL_MOBILEDASHBOARD_MOBILE_NUMBERr     )r   r  r  r  r  r  r  s       rm   pubic_dashboard_mobiler  a	  s     ZZ 01NJJ56M $=>?CJJ'<=>||~	 33G
 JJw/E#ll7+ ro   z/kookoo_callbackc                      t         j                  dk(  rt        j                  ddi      dddifS t        j                  ddi      dddifS )NrM   r   Tr  r  r  )r)   r!  r  r  ry   ro   rm   get_kookoo_callbackr  t	  sR    ~~zz9d+,cMCU3VVV ::y$'(#?Q/RRRro     c                 8    t        j                  dddd      dfS )N404.htmlz/Oops!! We could not find the page you requestedrs   	Main Pageprefixredirect_url	page_namer  r   r'   r   s    rm   page_not_foundr  	  s-     	D!		
 	 ro   c                 8    t        j                  dddd      dfS )Nr  z4Sorry! You do not have permissions to visit the pagerL   z
Login Pager  rv   r  r  s    rm   permission_deniedr  	  s-     	I!"		
 	 ro     c                 8    t        j                  dddd      dfS )Nz405.htmlzOops! Method not allowedrs   r  )rh  r  redirect_button_labelr  r  r  s    rm   method_not_allowedr  	  s-     	."-		
 	 ro   z/activity_tracker_formc                  P    t         j                  dk(  r
t               S t               S )NrN   )r)   r!  $handle_activity_tracker_post_request#handle_activity_tracker_get_requestry   ro   rm   rX   rX   	  s"    
 ~~355.00ro   c                    t         j                  j                  j                  t	        j
                               }t        j                         }g d}|D ci c]  }|| j                  |       }}t        j                  | j                  d      d      |d<   |j                  |||j                  d       t        j                  di |}|S c c}w )N)&activity_levelrc  district_name
block_namesector_namecentre_namepanchayat_nameschool_namepeeo_uceeo_schoolactivity_typestakeholders_typeother_stakeholders_typechannel_typeengagement_typeother_engagement_typefollow_up_throughspdceoawsawwawhbalawwcrcbrcssadcdpocdpobeoteachernumber_of_mtnumber_of_peeo_uceeo_cbeohome_onboardingcentre_onboardingcommunity_engagement_onboardednumbers_of_centers_participatedworkshop_onboarded_caregivers&workshop_number_of_centre_participatednotesdate_of_meetingz%Y-%m-%d)
created_on
updated_on
updated_byry   )r   r^   r_   r   r   rq   r<   r  r   updaterQ   
Activities)	form_datar7   r  ACTIVITY_FIELDSfieldactivity_dataactivitys          rm   prepare_activity_datar  	  s    %%++//	0R0R0TUL
,,.C'OP ?NNoUUIMM%00oMN'/'8'8'(*(M#$ &//	
 ""3]3HO Os   Cc                 :   	 |j                         D ci c]  \  }}|j                  d      r|r|| }}}|j                  d      }|j                  d      }t        ||      }|j                         D ]  \  }}|j	                  d      d   }	dD 
ci c]  }
|
t        |
|	|||       }}
|dk(  r|n|j                  d|	 d      }t        |||      }|r)t        |||       | j                  j                  |       t        ||      }| j                  j                  |        t        j                  j                  |        t        j                  j                          t        d	d
       t!        t#        di |      S c c}}w c c}
w # t$        $ r}t        j                  j'                          t)        j*                  d|        t        d| d       t!        t#        di t,        j.                  j1                               cY d }~S d }~ww xY w)Nuser_phone_r  r  r  r   motherfatherchildr   r   zActivity submitted successfullyr   Error in POST request. -An error occurred while submitting the form. dangerrX   )r   
startswithr   get_identifier_moderl  get_role_datafind_existing_metricupdate_existing_metricfamily_metricsr   create_new_metricr   r   r   r  r+   r(   r,   r   r'  r   	exceptionr)   rZ   to_dict)r  r	  keyr  r   r  r  mode
identifierindexrole	role_datar/  existing_metric
new_metricr   s                   rm   !process_family_metrics_and_submitr*  	  s    *T (oo/
/
U~~m, J/ 	 

 "o6%MM*=>"=2CD%||~OCIIcN2&E :9D mD%JMM9   7? ]][#8"=  34JOO&	:N''..?.y*E
''..z:)  ., 	

x 


/;E9EFFG
2  T


6qc:;=aSA8LR7<<;O;O;QRSS	Ts<   F  FAF F+CF F 	HA4HHHc                 "    | dk(  r
|dv ry|dv ryy)NzCommunity Engagement)zFather meeting_bszfather meetingfather_code)zMother meeting_bszmother meetingmother_coder   ry   )r  stakeholders     rm   r  r   
  s&    ))AA AA ro   c                     t        |j                  |  d| d      xs d      }|j                  |  d| d      }|j                  |  d| d      xs ||  dk(  r|nd}|||dS )N_increment_r   _name_r   _code__code)	incrementrj   code)r   r   )r&  idxra   identr#  r4  rj   r5  s           rm   r  r  )
  s    DHHv[6:?a@I88tfF3%("-D88tfF3%("- D6'R 	 #D$??ro   c                    | dk(  rF|d   d   r>t         j                  j                  j                  |d   d         j	                         S | dk(  rF|d   d   r>t         j                  j                  j                  |d   d         j	                         S t         j                  j                  j                  |      j	                         S )	Nr,  r  r5  )r,  r-  r  )r-  rA  )r   FamilyMetricsr_   	filter_byrb   )r#  r'  r$  s      rm   r  r  2
  s    }8!4V!<%%++55!(+F3 6 

%'	 }8!4V!<%%++55!(+F3 6 

%'	 !!''11Z1HNNPPro   c           
      |   dD ]  }||   }|d   dkD  s|d   s|d   st        | | dt        | | d      xs d|d   z          t        | | d|d   xs t        | | d             t        | | d|d   xs t        | | d              |r| j                  s|| _        t        j                         | _        y )	Nr  r4  r   rj   r5  _count_namer3  )setattrr   r/  r<   r  r  )metricr'  r/  r&  ra   s        rm   r  r  >
  s    -q DLDL&D616Q${:KK
 4&V(W4&PU8W 4&V(W4&PU8W . &++& Fro   c                     |t        j                         t        j                         d}dD ]2  }| |   }|d   || d<   |d   || d<   |d   dkD  r|d   nd|| d	<   4 t        j                  d
i |S )N)r/  r  r  r  rj   r=  r5  r3  r4  r   r<  ry   )r<   r  r   r9  )r'  r/  create_kwargsr&  ra   s        rm   r  r  T
  s     llnllnM
 .(,Ven%(,Ven%!%k!2Q!6DA 	fo&	 . !!2M22ro   c            	         	 t         j                  j                         } t        |       }t	        ||       S # t
        $ r}t        j                  j                          t        j                  d|        t        d| d       t        t        di t         j                  j                               cY d }~S d }~ww xY w)Nr  r  r  r  )r)   rZ   r!  r  r*  r   r   r   r'  r   r   r+   r(   r,   )r	  r  r   s      rm   r  r  d
  s    TLL((*	(309EE T


6qc:;=aSA8LR7<<;O;O;QRSS	Ts   47 	B? A4B:4B?:B?c                     	 t         j                  j                  dd      } g }| rt        j                  j                  t        j                  j                        j                  t        j                  j                  | k(        j                         j                  t        j                  j                        j                         }|D cg c]  }|d   s	|d    }}t        j                  	 d	d|it         j                  j!                         S c c}w # t"        $ rB}t%        j&                  d|        t)        dd       t+        t-        d            cY d }~S d }~ww xY w)
Nrc  r   r   activity_typesz.Error in handle_activity_tracker_get_request: z)An error occurred while loading the form.r  rX   )z#partials/activity_tracker_form.html)r)   r   r   r   r   r_   r   ActivitiesDatar  r`   rc  distinctorder_byr   r   r'   r!  r   r   r[   r+   r(   r,   )rc  rD  r   r   s       rm   r  r  p
  s&   :  "-

  !8!8!F!FG//55>?(11??@  -;CNqadadNNC$$1
)
 ll""$
 	
 D  :I!MN98D 7899:s6   CD 
DD 5D D 	E&$7E!E&!E&z/activities_formc                     t         j                  dk(  rdg} | D cg c]$  }t         j                  j                  |      r#|& }}|r2t	        ddj                  |       d       t        t        d            S 	 t         j                  j                         }t        j                  |j                  d      |j                  d      |j                  d      |j                  d	      |j                  d
      |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      |j                  d            }t        j                  j                  |       t        j                  j                          t	        dd       t        t        d            S t)        d      S c c}w # t        $ rX}t        j                  j!                          t#        j$                  d|        t	        dt'        |       d       Y d }~d }~ww xY w)NrN   rc  zMissing required fields: r  rk   activities_formrd  re  sectorcentrer  r  r  r  r  r  r  r  r  r  )rc  rd  re  rJ  rK  r  r  r  r  r  r  r  r  r  r  z(New activity mapping added successfully!r   z"Failed to save new activity data: zError: r  zpartials/activities_form.html)r)   r!  rZ   r   r+   r  r(   r,   r!  r   rE  r   r   r   r  r   r'  r   r[   r(  r'   )required_fieldsfmissingrZ   
new_recordr   s         rm   rI  rI  
  s    ~~")-IoW\\5E5Ea5H1oI-dii.@-ABING$5677	0<<'')D!00hhw'*-hhw'xx)xx)#xx(89 HH]3#xx(89"hh7"&((+>"?(,1J(K"&((+>"?!XXn5 $): ;&*hh/F&GJ" JJNN:&JJ<iH  1233:;;E J6  	0JJ!A!EFGCF8$h//	0s%   $HH<E,H 	I-AI((I-)r   )z10:00:00)
__future__r   randomr   eventsr   r  dostadmin.servicesr   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   typingr   r   r   r   utilsr   r   utils.helpers.helpersr   dostadmin.formsr   utils.helpersr   r   r   r   r   r   r    r!   r"   r#   r$   r%   r   r&   r'   r(   r)   r*   r+   r,   r-   	itertoolsr.   sqlalchemy.ormr/   r0   
sqlalchemyr1   r2   r3   flask_securityr4   flask_loginr5   r6   r7   flask_principalr8   r9   r:   r;   r~  r  r  r  r  r  rer<   r=   r>   r?   r   	six.movesr@   iorA   r&  rB   rC   rD   admin_permissionchampion_persmissionuser_permissionsurveyor_permissiononboarder_permissionactivity_reporter_permissionprogram_associate_permissionunionadmin_champion_persmissionadmin_onboarder_permissionadmin_surveyor_permission"admin_activity_reporter_permissiondb_connectionri  routern   rr   ru   requirerU   r   r   r  r   r   compiler   r(  r   r   r   r   r   r   r   r   r   r  r  r   r  r-  r4  r;  r0  r1  r2  r[  ru  rw  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r	  r  r  r  r/  r2  r7  r>  rC  rB  rA  rJ  ra  rl  rm  rI  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r)  r+  r7  r:  rL  rO  rV   rh  rp  rt  rw  r|  r  r  r  r  r  r  r  r  r  r  r  r  errorhandlerr  r  r  rX   r  r*  r  r  r  r  r  r  r  rI  ry   ro   rm   <module>rx     sU   &  + & +	 	 	 P / . + / * A  	 	 	  0 ) ) ) = =   
   
   	 = =   G G
 hw/0 !(:"67 Xf-. *!56 !(;"78 )(3F*GH )(3F*GH -334HI -334HI ,223FG %5%;%; & " "#				 8eV_-  . F 9   3! ! ##3#74 8 4
 -/ .  /( <- .  
			%	%bjj,- +D'I'$''S E6+$4tCy 4.	.c 	.
I 
IHMM e Is112   	
 > 5.89:" $ufo>-25 . ?25p 8-> . 9>*Y(Y

. eV_5- . 6. ufo6-?- . 7?-D %&-/ . '/
 %&-/ . '/ :-< . <( >E6?3-9 . 498 ?VH-- . .$ !E6?;- . <4 vh/-  . 0  -  .  
 #fX6-I . 7I" hZ0-R . 1R  =6(+- . ,F  5&/:- . ;J 8- .  fX.-	= . /	= >- .  #$-	 . %	 !"- . #( vh/-?$ . 0?$D v7-< . 8<. vh/-$ . 0$ "VH5-	C . 6	C  !-
 . "
 $ufo>-,5 . ?,5^ vh/-!1 . 0!1H #fX6-	L . 7	L 8- .  *UFOD!!">?GG H " E"=26@5F=@@9D"0=@ ;- .  >E6?3-! . 4!  )*-' . +' ;- .  ?UFO4-! . 5! ;-	 . 	 *+-	! . ,	! %v?-! . @! >E6?3-D . 4D* 8-) . 9)2 8eV_-- . .   -# . !# 6E6?+- . ,2 <%11 21" ?UFO4 5& ?UG,( -(V %9" :"J *UFOD E $ufo> ?H  5&/: ;& %v?6 @6x !E6?;- . <: <%1  !=>FF G 3 23l =5&/2 38 eV_5!&  6!&H eV_5##3#7, 8 6,^  5&/:##3#70 8 ;0l 6E6?+-K . ,K <%1- . 2 =5&/2- . 3& >E7+- . , ufo6- . 7D 4ufoN-J . OJ  1E7C- . D <ugN-	 . O	 FFO - .	
 9E6? - .6 0 1$ %w7 8$ v7S 8S #	 	 #	 	 #	 	 #eV_=#))*FGOO P 1 >17t+Tb@	Q',3 	T:2 v7-%< . 8%<ro   