U
    7[SeJ                     @   sJ   d dl mZ d dlmZ d dlZd dlZd dlZd dlZdd Z	e	 Z
dS )    N)Celeryc                  C   s  t jd d} | d kr*t jd d d } t jd drZdt jd d  d| d  }nd}d	t jd kr~|t jd d	 7 }d
t jd kr|dt jd d
  d7 }|t jd d 7 }|dt jd dd 7 }|d|  7 }td||d}|jt j G dd d|j}||_|S )NdefaultZ	celery_dbdb   Zunix_socket_pathzredis+socket://z?virtual_host=zredis://ZusernameZpassword:@ZhostZportZ6379/Zcrm)ZbackendZbrokerc                       s8   e Zd Z fddZd	 fdd	ZddddZ  ZS )
z$make_celery_app.<locals>.ContextTaskc                    s.   t  j|| d| j | _d| j | _dS )uy   Фабрика все опции прописывает в классе, вызов конструктора пустойZcmf_task_only_once_queue__Zcmf_task_only_once_lock__N)super__init__nameonly_once_queue_flag_nameonly_once_lock_name)selfargskwargs	__class__ ./cmf/cmf_celery.pyr
      s    z-make_celery_app.<locals>.ContextTask.__init__Nc                    s   ddl m}m}m} t| dd r`|jj| jd| jp4dd d dd}|s`|	d	| j
 d
 d S |pfi }t| dd rxd n|jjj|d< t j||f|}	|	j|jjj||| j
d}
t|
 |d|
 |	S )Nr   )gsocketioREDIS_DB	only_oncer      <   T)exZnxzSkip create task z - already startedZsystem_taskcmf_current_person_id)Ztask_idZ	person_idr   r   funczcmf-background-task-queued)cmf.includer   r   r   getattrredissetr   soft_time_limitdebugr   Zcurrent_personidvaluer	   apply_asyncjsondumpsemit)r   r   r   Z_my_custom_paramoptionsr   r   r   Zneed_createresZevent_paramsr   r   r   r&   %   s.          
z0make_celery_app.<locals>.ContextTask.apply_async)r   c                _   s&  ddl m}m}m}m}m} ddlm}	 dd l}
|
	d |	dd |j
j| j| jpZdd d}| jjr|d	| jj  t| d
d r|  |j
| j td| j ddd zz>|r|jj||jd|_| j||}td| j ddd W nx t k
rp } zXt!"d| jj  td| j d| dd | jjr^|d| jj t#|  W 5 d }~X Y nX W 5 t| d
d rz|  W nJ t
jjk
r } z&td| d|j d|j dd W 5 d }~X Y nX X | jjr|d| jj t#| t$j%&  |W  5 Q R  S Q R X d S )Nr   )r   r   modelsAPPr   )cmf_context   F)Zinit_views_and_dsr   )timeoutzcmf-background-task-start-r   zContextTask z startT)flushzlock release error z, lock_name z
, timeout )Zfieldsz successzcelery task error z error zcmf-background-task-error-zcmf-background-task-result-)'r   r   r   r,   r-   r   Zcmf.appr.   timesleepr    lockr   r"   Zrequestr$   r)   r   acquiredeleter   printr   release
exceptionsZ	LockErrorr0   Z	CmfPersongetZcurrent_person_fieldsZ_current_personrun	ExceptionloggingZ	exceptionstrsysstdoutr1   )r   r   r   r   r   r   r,   r-   r   r.   r2   Z
redis_lockeresulterrorr   r   r   __call__<   sL    
 


z-make_celery_app.<locals>.ContextTask.__call__)NNN)__name__
__module____qualname__r
   r&   rD   __classcell__r   r   r   r   ContextTask   s   rI   )configZcache_settingsr:   r   ZconfupdateceleryZTask)r   Z	redis_url
celery_apprI   r   r   r   make_celery_app   s,     IrN   )Zcmf.config_loadZconfig_loadrJ   rL   r   r?   r'   r=   r    rN   rM   r   r   r   r   <module>   s   c