U
    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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 Nc           	   
   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 )Nidnamecmf_author_idZcmf_created_atstatusstart_datetimeend_datetimedurationdescriptionprogress_pctz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
ValueErrorgcurrent_userZslistcmfutilZacl_set_policy)	clsr   r   r   r   _kwargsZallowed_fieldsZ
field_nameresult r    ./cmf/models/cmf_deferred_job.pymy_job_list   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   r   r   r   r    my_job_count'   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_log1   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_jsonr2   save)r0   r   r   r   r    
on_success9   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   Фоновая задача r%   u+   ) завершилась с ошибкой
zAdmin notify failed)"r   r
   r4   r5   r	   r6   r   r<   Zretry_countr2   rD   Zmodelsr   r"   cmfr   ZCmfDateTimer+   valuer*   Z	timedeltaZplan_start_datetimeZ	worker_idr=   r   debugr   r   Zadmin_alertr   r(   	Exceptionr9   Z	exception)r0   r(   Zreschedule_delayr   r   r    on_errorH   sL    






zCmfDeferredJob.on_errorc                    s   t   ddg S )N	person_idr   )supersave_preload_fields)r0   	__class__r   r    rL   w   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-)r3   r?   cancel)r   r   Zis_done)Zroom)	rJ   r   Z
is_changedZsocketioemitr   rF   rK   r=   )r0   kwargsrM   r   r    r=   z   s    
zCmfDeferredJob.save)NNNN)N)__name__
__module____qualname____doc__classmethodr!   r#   r2   r>   rI   rL   r=   __classcell__r   r   rM   r    r      s   	/r   )r*   r.   Zcmf.includeZcmf.fields.cmf_deferred_jobrE   r   Zcmf_deferred_jobr   r   r   r   r    <module>   s   