U
    Bf/                     @   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
   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 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
ddh}|d kr(g }| d |D ]}||kr6td| dq6|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   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   s6             

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'   r0   r1   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  | _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_jsonrA   r   )r?   r1   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|  |   |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   Фоновая задача r4   u+   ) завершилась с ошибкой
zAdmin notify failed)"r   r   rC   rD   r   rE   r    rK   Zretry_countrA   rR   Zmodelsr   r2   cmfr&   ZCmfDateTimer:   valuer9   Z	timedeltaZplan_start_datetimeZ	worker_idr   r	   debugr   r.   Zadmin_alertr!   r7   	ExceptionrH   	exception)r?   r7   Zreschedule_delayr   r   r   on_error{   sL    






zCmfDeferredJob.on_errorc                    s   t   ddg S )N	person_idr   )supersave_preload_fields)r?   	__class__r   r   r[      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-)rB   rM   cancel)r   r   Zis_done)Zroom)	rY   r   Z
is_changedZsocketioemitr   rT   rZ   r   )r?   kwargsr\   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   rA   rL   rX   r[   r   __classcell__r   r   r\   r   r      s4   



	

	/r   )r9   r=   Zcmf.includeZcmf.fields.cmf_deferred_jobrS   r&   Zcmf_deferred_jobr   r   r   r   r   <module>   s   