U
    XHgC                     @   sn   d dl mZmZmZ d dlmZmZmZmZ d dl	m
Z
 d dlmZmZmZ d dlmZmZ G dd dZdS )	    )dbapp
app_logger)
ExperienceCampaignProviderNumberContentVersion)PreCalculatedCampaignService)datetime	timedeltadate)get_current_isttimereplace_charsc                   @   sl   e Zd ZdddZejjejj	fddZ
dd Zdd	 Zd
d Zdd Zdd Zdd Zdd Zdd ZdS )CampaignCreationServiceFc                 C   s  g }|s(t jt jD ]}||j q|ttjd  |ttjd  |ttjd  |ttjd  |ttjd  |ttjd  |ttjd  |ttjd  |ttjd	  |ttjd
  |ttjd  |ttjd  |ttjd  |ttjd  |ttjd  |ttjd  |ttjd  |ttjd  |S )NCALLBACK_2_CONTENT_IDCALLBACK_3_CONTENT_IDUNSUBSCRIBE_CALLBACK_CONTENT_IDASSAM_CALLBACK_2_CONTENT_IDASSAM_CALLBACK_3_CONTENT_IDBHOJHPURI_CALLBACK_2_CONTENT_IDBHOJHPURI_CALLBACK_3_CONTENT_IDBIHAR_CALLBACK_2_CONTENT_IDBIHAR_CALLBACK_3_CONTENT_IDMP_CALLBACK_2_CONTENT_IDMP_CALLBACK_3_CONTENT_IDBHOJPUR_CALLBACK_2_CONTENT_IDBHOJPUR_CALLBACK_3_CONTENT_IDNAWADA_CALLBACK_2_CONTENT_IDNAWADA_CALLBACK_3_CONTENT_ID)UNSUBSCRIBE_CALLBACK_CONTENT_ID_FOR_ASSAMJHARKHAND_CALLBACK_2_CONTENT_IDJHARKHAND_CALLBACK_3_CONTENT_ID)r   querydistinct
content_idappendintr   config)selfZ&exclude_provider_number_table_contentsspecial_content_idsprovider_number r+   M/var/www/dostadmin/dostadmin/services/scheduling/campaign_creation_service.pyget_special_content_ids   s6    z/CampaignCreationService.get_special_content_idsc                 C   s@  |t jjkr|rdS |tjjk}|tjd k}t }	|		 }
|rPt
tjd }nt
tjd }|t jjkr|r~t
tjd }qt
tjd }n6|t jjkrt
tjd }n|t jjkrt
tjd }t|d		 }tt |
tt | }|t jjkr| d
 }|s&|d7 }n| }d|  k o:|k S   S )NF)EXPERIMENT_REDUCED_RETRY_PROVIDER_NUMBERS$EXPERIMENT_REDUCED_RETRY_TIME_WINDOWCAMPAIGN_RETRY_TIME_WINDOW6EXPERIMENT_REDUCED_MISSED_CALL_RETRY_WINDOW_IN_SECONDS#MISSED_CALL_RETRY_WINDOW_IN_SECONDS"NUDGE_RETRY_TIME_WINDOW_IN_SECONDS"BLAST_RETRY_TIME_WINDOW_IN_SECONDSz%H:%Mi     r   )r   Status	SCHEDULEDr   TypeSELFPACEDPCr   r'   r   timer&   ScheduledByCRON_MISSED_CALL
CRON_NUDGE	UI_MANUALr
   strptimecombiner   todayCRON_REGULARtotal_seconds)r(   Zscheduled_timeZprevious_call_statusZis_previous_call_dialed_todayr*   experience_typescheduled_byZis_self_pacedZis_reduced_retry_provideristnownow_hmZretry_windowdiffZtime_differencer+   r+   r,   	can_retry+   sD    

 
z!CampaignCreationService.can_retryc              !   C   s  d}|j rd|j d|j d|j dt|jd d|j d|j d|j	 d|j
 d|j d|j d|j d|j  dtt d dtt d d|jr|jnd d|jr|jnd d	!}nd
|j d|j d|j dt|jd d|j d|j d|j	 d|j
 d|j d|j d|j dtt d dtt d d|jrV|jnd d|jrj|jnd d	}zN|| | d }||j|jt|jd|j|j
|jd}t | W nD tk
r } z$|d td| d|  W 5 d }~X Y nX |S )Na  INSERT INTO campaign(name, content_id, experience_id, deploy_datetime, status, scheduled_by, timecategory_id, content_version_id, program_id, user_id, provider_number, programseq_id, created_on, updated_on, parent_campaign_deploy_time, parent_campaign_id) VALUES('', '%Y-%m-%d %H:%M:%S%Y-%m-%d %H:%M:%S.%f', null, ) RETURNING idzINSERT INTO campaign(name, content_id, experience_id, deploy_datetime, status, scheduled_by, timecategory_id, content_version_id, program_id, user_id, provider_number, created_on, updated_on, parent_campaign_deploy_time, parent_campaign_id) VALUES('r   campaign_idcampaign_nameexperience_iddeploy_datetimer$   content_version_idrE   ROLLBACKzNCampaign Creator Job: Unable to write add new campaign query to the database: . Error message: )programseq_idnamer$   rU   r
   strftimerV   statusrE   timecategory_idrW   
program_iduser_idr*   utcnowparent_campaign_deploy_timeparent_campaign_idexecutefetchoner	   (update_pre_calculated_user_campaign_data	Exceptionr   errorr(   cursornew_campaignnew_campaign_id
insert_sqlcampaign_datarh   r+   r+   r,   add_new_campaignc   s:    
 
z(CampaignCreationService.add_new_campaignc                 C   s2  d}d|j  d|j d|j d|j d|j d|j d|j d|j d|j dt	
t	 d dt	
t	 d d|jr~|jnd d|jr|jnd d}zN|| | d	 }||j |jt	
|jd
|j|j|jd}t | W nD tk
r, } z$|d td| d|  W 5 d }~X Y nX |S )NrJ   zINSERT INTO campaign(name, content_id, experience_id, deploy_datetime, status, scheduled_by, user_id, content_version_id, provider_number, created_on, updated_on, parent_campaign_id, parent_campaign_deploy_time) VALUES('rK   rM   rN   rO   rP   rQ   r   rL   rR   rX   zTCampaign Creator Job: Unable to write add new blast campaign query to the database: rY   )r[   r$   rU   rV   r]   rE   r`   rW   r*   r
   r\   ra   rc   rb   rd   re   r	   rf   rg   r   rh   ri   r+   r+   r,   add_new_blast_campaign   s4    
 
z.CampaignCreationService.add_new_blast_campaignc           
      C   s  d}d|j  d|j d|j dtt d d|j d|j d|j d|j	 d|j
 d|j d|j dtt d dtt d d|jr|jnd d|jr|jnd d}zN|| | d	 }||j |jt|jd
|j|j|jd}t | W nL tk
rL } z,|d td| d|  | W Y S d }~X Y nX zFd| d| d| dt d dt d d}	||	 W nD tk
r } z$|d td| d|  W 5 d }~X Y nX |S )NrJ   zINSERT INTO campaign(name, content_id, experience_id, deploy_datetime, status, scheduled_by, user_id, user_number, timecategory_id, content_version_id, provider_number, created_on, updated_on, parent_campaign_deploy_time, parent_campaign_id) VALUES('rK   rM   rN   rO   rP   rQ   r   rL   rR   rX   zQCampaign Creator Job: Unable to write add nudge reattempt query to the database: rY   z
                INSERT INTO campaign_nudge_mapping(nudge_id, campaign_id, group_version_id,
                created_on, updated_on)
                VALUES(z,
                'z',
                'z,')
                RETURNING id
            zSCampaign Creator Job: Unable to write nudge_campaign_mapping query to the database:)r[   r$   rU   r
   r\   r   r]   rE   r`   user_numberr^   rW   r*   ra   rb   rc   rd   re   rV   r	   rf   rg   r   rh   )
r(   rj   rk   nudge_idgroup_version_idrl   Znudge_insert_sqlrn   rh   Z#nudge_campaign_mapping_insert_queryr+   r+   r,   add_nudge_reattempt_campaign   sZ    
 
	
z4CampaignCreationService.add_nudge_reattempt_campaignc                 C   s^   t   }|jdks | dk r&|}nd|  }|t|d }t|dd | d dS )	zFor first week, call can be scheduled any of the day (weekdays + weekend)
        For second week onwards, the calls should go out till thursday.
        r5         )daysz%Y-%m-%d z:00rL   )r   r   weekweekdayr   r
   r?   r\   )r(   Z	prev_datedeploy_timeZ	next_pseqrA   deploy_dateZdays_for_next_mondayr+   r+   r,   get_deploydate_for_selfpaced,  s    
z4CampaignCreationService.get_deploydate_for_selfpacedc                 C   sJ   | d}t|dkr |d }n&t|d d }t||d< d|}|S )N_   Z_1rJ   r5   )splitlenr&   strjoin)r(   old_nameZname_sequencenew_nameZnext_sequencer+   r+   r,   get_campaign_name=  s    


z)CampaignCreationService.get_campaign_namec                 C   s4   | ddkrd| S | ddkr0d| S d S )NW0D0_rJ   ZW0D1_ZW1DZW0D2_)find)r(   previous_campaign_namer`   r+   r+   r,   !get_campaign_name_for_intro_callsH  s
    

z9CampaignCreationService.get_campaign_name_for_intro_callsc                 C   s"   |j }|j}d| d| d| S )NWDr~   )ry   day)r(   program_sequencer`   week_numberZ
day_numberr+   r+   r,   3get_campaign_name_from_program_sequence_and_user_idO  s    zKCampaignCreationService.get_campaign_name_from_program_sequence_and_user_idc           
      C   s   |D ]}|d j }tj||}t|}t|||j|d tjj|d jtj	j
|d j|d j|d jd
}tj| tj  |d jtj	j
||j|d tjj|d}	t |	 qtj  d S )Nr   r5   )
r[   r$   rW   rV   r]   rU   rE   r`   r*   rq   )rU   rE   r$   rW   rV   campaign_statusrT   )language_idr   r"   .get_content_version_by_content_and_language_idr   r   idr6   r7   r;   r>   r`   r*   phoner   sessionaddflushr	   rf   commit)
r(   cp_namer$   exp_listexp_recr   content_versionrT   Zcampaign_recrn   r+   r+   r,   add_blast_campaignW  sD    
 
	z*CampaignCreationService.add_blast_campaignN)F)__name__
__module____qualname__r-   r   r8   r9   r   r;   rB   rI   ro   rp   rt   r}   r   r   r   r   r+   r+   r+   r,   r   
   s   
&
8O2Hr   N)	dostadminr   r   r   dostadmin.db_modelr   r   r   r   =dostadmin.services.scheduling.pre_calculated_campaign_servicer	   r
   r   r   utils.helpers.helpersr   r   r   r+   r+   r+   r,   <module>   s
   