B
    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 )N)boolr   r   r	   r	   r	   r
   is_job   s    zCmfDeferredJob.is_jobc             C   s
   | t _d S )N)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)	only_data)r   r   id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 )NT)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 )NT)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
ddh}|d kr(g }| d x$|D ]}||kr8td| dq8W |rp|d |d  dkrztd||sg }|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   r   r   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   s"    




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.   r/   r	   r	   r
   r   Z   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_logd   s    

zCmfDeferredJob.error_logc          	   C   s   d| _ d| _| j  t| j| j  | _y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=   r/   r	   r	   r
   
on_successl   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|  |   |sy: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   Фоновая задача r2   u+   ) завершилась с ошибкой
zAdmin notify failed)"r   r   rA   rB   r   rC   r   rI   Zretry_countr?   rP   Zmodelsr   r0   cmfr$   ZCmfDateTimer8   valuer7   Z	timedeltaZplan_start_datetimeZ	worker_idr   r   debugr   r,   Zadmin_alertr   r5   	ExceptionrF   Z	exception)r=   r5   Zreschedule_delayr	   r	   r
   on_error{   sH    






"zCmfDeferredJob.on_errorc                s   t   ddg S )N	person_idr   )supersave_preload_fields)r=   )	__class__r	   r
   rX      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-)r@   rK   Zcancel)r   r   Zis_done)Zroom)	rV   r   Z
is_changedZsocketioemitr   rR   rW   r   )r=   kwargs)rY   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?   rJ   rU   rX   r   __classcell__r	   r	   )rY   r
   r      s&   	
			/r   )r7   r;   Zcmf.includeZcmf.fields.cmf_deferred_jobrQ   r$   Zcmf_deferred_jobr   r	   r	   r	   r
   <module>   s   