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   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 )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
h
}|d kr$g }| d x$|D ]}||kr4td| dq4W |rl|d |d  dkrvtd||s~g }|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   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   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  | _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_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|  |   |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   Фоновая задача r1   u+   ) завершилась с ошибкой
zAdmin notify failed)"r   r   r@   rA   r   rB   r   rH   Zretry_countr>   rO   Zmodelsr   r/   cmfr#   ZCmfDateTimer7   valuer6   Z	timedeltaZplan_start_datetimeZ	worker_idr   r   debugr   r+   Zadmin_alertr   r4   	ExceptionrE   Z	exception)r<   r4   Zreschedule_delayr	   r	   r
   on_errorz   sH    






"zCmfDeferredJob.on_errorc                s   t   ddg S )N	person_idr   )supersave_preload_fields)r<   )	__class__r	   r
   rW      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?   rJ   Zcancel)r   r   Zis_done)Zroom)	rU   r   Z
is_changedZsocketioemitr   rQ   rV   r   )r<   kwargs)rX   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>   rI   rT   rW   r   __classcell__r	   r	   )rX   r
   r      s&   	
			/r   )r6   r:   Zcmf.includeZcmf.fields.cmf_deferred_jobrP   r#   Zcmf_deferred_jobr   r	   r	   r	   r
   <module>   s   