U
    ܌f                     @   s:   d dl Z d dlZd dlT d dlZG dd dejjjZdS )    N)*c                       s   e Zd ZdZdZddgZedd Zedd Zed	d
 Z	edd Z
edd Zedd Zed ddZed!ddZdd Zdd Zdd Z fddZ fddZ  ZS )"CmfDeferredJob Tmy_job_countmy_job_listc                   C   s
   d t _d S Ng_deferred_job r   r    ./cmf/models/cmf_deferred_job.pyinit_context   s    zCmfDeferredJob.init_contextc                   C   s
   t tjS r   )boolr	   r
   r   r   r   r   is_job   s    zCmfDeferredJob.is_jobc                 C   s
   | t _d S r   r   )jobr   r   r   set_current_deferred_job!   s    z'CmfDeferredJob.set_current_deferred_jobc                 C   s&   t j}|r"| o| j|_|jdd d S NT)Z	only_data)r	   r
   idZresult_attachment_idsave)Z
attachmentr   r   r   r   set_result_attachment%   s    z$CmfDeferredJob.set_result_attachmentc                 C   s    t j}|r| |_|jdd d S r   )r	   r
   estimate_durationr   )r   r   r   r   r   set_estimate_duration/   s    z$CmfDeferredJob.set_estimate_durationc                 C   s    t j}|r| |_|jdd d S r   )r	   r
   progress_pctr   )r   r   r   r   r   set_progress_pct8   s    zCmfDeferredJob.set_progress_pctNc           	   
   K   s   ddddddddd	d
h
}|d kr$g }| d |D ]}||kr2td| dq2|rh|d |d  dkrrtd||szg }|ddtjgdddgg}| j||||d}t|d |S )Nr   namecmf_author_idZcmf_created_atstatusstart_datetimeend_datetimedurationdescriptionr   zRequested field name z is not allowed   r   d   zYou must use slice(<=100)=show_bg_progressbarT)fieldsfiltersliceorder_byread)appendZCmfPermissionError
ValueErrorr	   current_userZslistcmfutilZacl_set_policy)	clsr%   r&   r'   r(   _kwargsZallowed_fieldsZ
field_nameresultr   r   r   r   A   s2            

zCmfDeferredJob.my_job_listc                 K   s0   |sg }|ddt jgdddgg}| j|d}|S )Nr   r#   r$   T)r&   )r	   r,   count)r.   r&   r/   r0   r   r   r   r   Y   s
    zCmfDeferredJob.my_job_countc                 C   sn   | j pd}|ds|d7 }tj d}|| d|  | _ t| d| j d| j d| tj	dd	 d S )
Nr   
z%Y-%m-%d %H:%M:%Sz: z: JOB (z): T)fileflush)

error_textendswithdatetimenow
__format__printr   r   sysstderr)selftextZold_textZnow_strr   r   r   	error_logc   s    

zCmfDeferredJob.error_logc              	   C   s   d| _ d| _| j  t| j| j  | _zt	| W n0 t
tfk
rj   td| j| t|}Y nX || _| d |   d S )Nsuccessr"   z!Unserializable Job Result(%s): %szjob success)r   r   r   set_nowintr   total_secondsr   Zjsondumps	TypeErrorr+   loggingerrorr   strresult_jsonr@   r   )r>   r0   r   r   r   
on_successk   s    

zCmfDeferredJob.on_successc                 C   s  d| _ | j  t| j| j  | _d | _d }| jsBd| _d}n:| jdkrRd}n*| jdkrbd}n| jdkrrd	}n
| 	d
 | 	d| j d|  |r| j
rtjj| j
ddr| 	d d }|r|  jd7  _tjj jtj|d | _d| _ d | _d | _d | _| 	d|  |   |sz:td| j d td| j d| j d| j  W n  tk
r~   t !d Y nX d S )Nfailr      r!   i,     i     ip  z job failed, max retries reached.zjob error(retry=z)
open)only_once_keyr   z;job failed, reschedule skip, due new only_once task exists.)Zsecondszjob reschedule, delay: zJob z fail, notify adminsu   Фоновая задача r3   u+   ) завершилась с ошибкой
zAdmin notify failed)"r   r   rB   rC   r   rD   r   rJ   Zretry_countr@   rQ   Zmodelsr   r1   cmfr%   ZCmfDateTimer9   valuer8   Z	timedeltaZplan_start_datetimeZ	worker_idr   r	   debugr   r-   Zadmin_alertr    r6   	ExceptionrG   Z	exception)r>   r6   Zreschedule_delayr   r   r   on_errorz   sL    






zCmfDeferredJob.on_errorc                    s   t   ddg S )N	person_idr   )supersave_preload_fields)r>   	__class__r   r   rY      s    z"CmfDeferredJob.save_preload_fieldsc                    sN   | j r@| jjr@tjd| j | jj| jj| jdkd| j jd t jf |S )Nzcmf-deferred-job-)rA   rL   cancel)r   r   Zis_done)Zroom)	rW   r   Z
is_changedZsocketioemitr   rS   rX   r   )r>   kwargsrZ   r   r   r      s    
zCmfDeferredJob.save)NNNN)N)__name__
__module____qualname____doc__Z	api_allowZapi_methodsstaticmethodr   r   r   r   r   r   classmethodr   r   r@   rK   rV   rY   r   __classcell__r   r   rZ   r   r      s4   



	

	/r   )r8   r<   Zcmf.includeZcmf.fields.cmf_deferred_jobrR   r%   Zcmf_deferred_jobr   r   r   r   r   <module>   s   