U
    eK                     @   s  d dl Z d dlmZmZ d dlZd dlZd dlZd dlZd dlmZm	Z	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZmZmZ d dlT d d	lmZ d dlZd dlZd dlZd dlZd d
lmZ d dlZd dlZd dl Z d dl!Z!d dl"m#Z# d dl$m%Z% dZ&G dd dZ'G dd dZ(G dd dZ)dd Z*dd Z+dd Z,dd Z-dd Z.dd Z/d d!d"d#Z0d$d% Z1dad&d'Z2d(d) Z3dbd*d+Z4dcd-d.Z5e6e6d/d0d1Z7e6e6d/d2d3Z8d4d5 Z9d6d7 Z:d8d9 Z;d:d; Z<d<d= Z=G d>d? d?Z>ddd@dAZ?dedBdCZ@dDdE ZAe6e6dFdGdHZBe6e6dFdIdJZCdfe6e6dKdLdMZDdNdO ZEdgdQdRdSdTZFdUdV ZGdWdX ZHdYdZ ZId[d\ ZJG d]d^ d^ZKd_d` ZLdS )h    N)urlparseparse_qs)datetimetimezonedate)Linker)g)Path)timeitProfilerDataCtxprofiler_data_log)*)AES)is_dataclass)OrderedDict)deepcopyz******c                   @   s.   e Zd ZdZddddZdd Zdd	 ZdS )
disable_aclt   Отключение проверки прав доступа в ORM для системных частей кодаNreturnc                 C   s
   d | _ d S N)save_acl_flagself r   ./cmf/util/cmfutil.py__init__   s    zdisable_acl.__init__c                 C   s   dt krt j| _dt _d S )Ndisable_permissionsT)r   r   r   r   r   r   r   	__enter__    s    zdisable_acl.__enter__c                 C   s   | j t_d S r   )r   r   r   r   excvaluetbr   r   r   __exit__%   s    zdisable_acl.__exit____name__
__module____qualname____doc__r   r   r#   r   r   r   r   r      s   r   c                   @   s.   e Zd ZdZddddZdd Zdd	 ZdS )
disable_notifyr   Nr   c                 C   s
   d | _ d S r   )save_notify_flagr   r   r   r   r   +   s    zdisable_notify.__init__c                 C   s   dt krt j| _dt _d S )Nr)   T)r   r)   r*   r   r   r   r   r   .   s    zdisable_notify.__enter__c                 C   s   | j t_d S r   )r*   r   r)   r   r   r   r   r#   3   s    zdisable_notify.__exit__r$   r   r   r   r   r)   )   s   r)   c                   @   sJ   e Zd ZedZddddZdd Zdd	 Zed
d Z	edd Z
dS )enable_import_modez/tmp/eva_app_import.lockNr   c                 C   s   d | _ d | _d S r   )save_import_flagsave_cache_flagr   r   r   r   r   :   s    zenable_import_mode.__init__c                 C   sD   dd l }|jdd| _dtkr(tj| _dt_d|jd< |   d S )Nr   NO_CACHE import_modeT1)osenvirongetr-   r   r0   r,   import_heartbeat)r   r2   r   r   r   r   >   s    
zenable_import_mode.__enter__c                 C   s4   dd l }| jt_| j|jd< | j r0| j  d S )Nr   r.   )	r2   r,   r   r0   r-   r3   	LOCK_PATHexistsunlink)r   r    r!   r"   r2   r   r   r   r#   G   s
    
zenable_import_mode.__exit__c              	   C   s6   t | jd }|tjtjdd W 5 Q R X d S )Nzw+Ztzz%Y-%m-%d %H:%M:%S %Z%z)openr6   writer   nowr   utcstrftime)clsfr   r   r   r5   Q   s    z#enable_import_mode.import_heartbeatc              	   C   s`   dd l }tj| jsdS t| jd}|j| }W 5 Q R X t	j
tjd|  d dk S )Nr   Frr9   <      )Zdateutil.parserr2   pathr7   r6   r:   parserparsereadr   r<   r   r=   total_seconds)r?   Zdateutilr@   	lock_timer   r   r   import_is_runningV   s    z$enable_import_mode.import_is_running)r%   r&   r'   r	   r6   r   r   r#   classmethodr5   rJ   r   r   r   r   r+   7   s   	

r+   c                 C   s   t tdsd S d|  }|tjkr&d S t }tjjj|dd}|jddd t | }|dkrzt	d|d	d
|  |dkrt
jd|d	d
|  |dkrt tdddkrt
jd|d	d
|  |tj|< t tj|< d S )Nacquired_lockszCmfCacheObjLock:   timeoutT)blockingblocking_timeout皙?zcache_obj_lock_get long time: 0.3zsec    z,DEV: cache_obj_lock_get long time CRITICAL: rC   i  z#DEV: cache_obj_lock_get long time: )hasattrr   rL   timeAPPREDIS_DBredislockacquiredebugcmfinclude	cmf_alertr   Ztodayacquired_lock_timigns)obj_idZlock_keyst_timerZ   Zacquire_timer   r   r   cache_obj_lock_getf   s$    



rc   c                  C   s   t tdsd S t } tj D ]H}z|  W q  tjjk
rf } zt	d|  W 5 d }~X Y q X q t |  }|dkrt	d|ddtj
   tj D ]6\}}t | }|dkrt	d| d|dd	 qd S )
NrL   z*cache_obj_lock_release_all release error: rR   z%cache_obj_lock_release_all too slow: rS   zsec. Locks:z(cache_obj_lock_release_all lock >100ms:  Zsec)rU   r   rV   rL   valuesreleaserY   
exceptionsZ	LockErrorr\   keysr`   items)rb   rZ   eZunlock_timeZ	lock_nameZlock_strI   r   r   r   cache_obj_lock_release_all|   s    
$rk   c                  C   s4   t tdr0tjr0tjD ]} tjjj|   qg t_d S )Ndelayed_redis_events)rU   r   rl   rW   rX   rY   Zpublish)Zeventr   r   r   emit_delayed_events   s    
rm   c                 C   s   t t|  S r   )varsmodels)
class_namer   r   r   get_model_by_name   s    rq   c                 C   s   t | }tt| S r   )get_class_name_by_idrn   ro   idrp   r   r   r   get_model_by_id   s    ru   c                 C   s   t | dd }|S )N:r   )strsplitrs   r   r   r   rr      s    rr   F)simplec                O   sH   t | tjjr| j }n|  }t|}|r0|jn|j}||d|i|S )Nrt   )
isinstancer]   ro   	CmfEntityrt   ru   sgetr4   )rt   ry   argskwargsZtuuidmodelr4   r   r   r   get_obj_by_id   s    
r   c                 C   s   t |trtt| }n|}t | tjjr@t | tjjs@t| } t | tr| |j	 dr`| S |j
| ddgd}|r||jS |j
| ddgd}|r|jS dS t| jS )u  
    Находим id объекта. Функция для использования в API и bzPython ручек, которые используют клиенты.
    Реализуем максимально универсальную логику, чтобы клиент мог получить объект по:
    - id
    - code
    - name
    - передать сам объект
    - передать field модели со ссылкой наобъект
    Если передается id - функция отрабатывает максимально быстро, т.к. используется в кешах
    Если передается code или name - будут доп.запросы в БД.
    Сначала ищем по code и только если не находим - по name
    В class_name можно передать имя модели или саму модель
    rv   z--rt   )codefields)namer   N)rz   rw   rn   ro   r]   r   CmfType
CmfRelBase
startswithrp   r|   rt   )objrp   r   Z
loaded_objr   r   r   get_obj_id_by_any   s     

r   c                 c   s^   ddl m} ddlm} t|j D ]2}t||}t||r&|j	rFq&| rR| |r&|V  q&dS )u`   Последовательность моделей, с возможно фильтрацией.r   ro   )BaseModelMetaN)
cmf.includero   cmf.models.base_modelr   sorted__dict__rh   getattrrz   Zabstract)Zmodel_filterro   r   Z
model_namer   r   r   r   iter_models   s    
r   c                 C   s>   ddl m} ddlm} | D ]}|j| kr |j  S q d S )Nr   r   )r{   )r   ro   r   r{   Ziter_subclassesui_namerp   )r   ro   r{   r   r   r   r   get_class_name_by_ui_name   s    
r   c                 O   s   |st ddd t|tkr$t|}|j|ddd| gi|}|s| d k	rd| kr| dd }| rt|d	kr|j|ddd
d| gi|}|S )Nu|   TODO: сделать автоматическое обнаружение моделей и объекта как в bzPythonTabortfilterr   =-   ZLIKEz%-)r_   typerw   rq   r4   rx   isdigitlen)r   r   r}   r~   resZcode_numberr   r   r   get_obj_by_code   s     r   _c                    s(   t j| ddd}d fdd|D S )NruT)Zlanguage_codereversedr/   c                 3   s*   | ]"}|  s|d kr| n V  qdS )r   N)isalnumlower).0csepr   r   	<genexpr>   s     z!translit_strip.<locals>.<genexpr>)transliterateZtranslitjoin)textr   r   r   r   r   translit_strip   s    r   )r   r   c                 C   s   t j}dddg|d< dg|d< dddg|d	< dddg|d
< t j}|d |d |d |d |d |d |d	 |d
 |d |d t j| t j|dS )NsrcwidthZheightZimgr   rV   Zcontrolsr   ZaudioZvideopbrZinsdelZfigureZ
figcaption)r   tags
attributes)bleachZALLOWED_ATTRIBUTESZALLOWED_TAGSappendZclean)r   r   r   r   r   r   
clean_text  s"    










r   c                 C   s    ddd}t |gd}|| S )NFc                 S   s.   |  ds| S t| d }d| d< d| d< | S )N)NZhrefZ_blank)NtargetZexternal)Nclass)r4   r   )Zattrsnewr   r   r   r   
set_target  s    
zlinkify.<locals>.set_target)Z	callbacks)F)r   linkify)r   r   Zlinkerr   r   r   r     s    
r   c                    s   i  fdd}|S )Nc                     s4   t | t| f}|kr, | ||< | S r   )pickledumpsr   ri   )r}   r~   hashfuncZmemoryr   r   memo&  s    zmemoized.<locals>.memor   )r   r   r   r   r   memoized$  s    r   c                 K   s   t jj}d|  }|jddd}| s<tjjddd dS ||sb|	  t
d	 t| d
S t||}t
jj|d kr|	  tjjddd dS ttj|d< ||t| |	  dS )N	obj_lock-obj_lock.lock
   rN   (DEV: FATAL lock(): if not lock.acquire()Tr   FuR   DEV: FATAL Попытка lock_ping() на отсутствующую записьi  	locked_byuJ   DEV: FATAL Попытка lock_ping() на чужую блокировку	ping_time)rW   rX   rY   rZ   r[   r]   r^   r_   r7   rf   r   r\   r   loadsr4   current_personrt   r   r<   r   r=   setr   )keyr~   redis_db_key_lock	lock_infor   r   r   	lock_ping.  s&    



r   c                 C   sD   | st dtjj}d|  }||r@t||}|r@|S dS )uh   
    Из редиса заберём структуру, где есть данные
    :return:
    uL   Блокировка объектов без key не реализованаr   N)
ValueErrorrW   rX   rY   r7   r   r   r4   )r   r   r   r   r   r   r   r   G  s    

r   c                 C   s  t jj}d|  }|jddd}tjjjt	t
jt	t
j|d}| s`tjjddd d	S ||rt||}t	t
j|d
   |k rtjj|d kr|  tjj|d d}tjd|j  d	S tjd |  dS ||t| |  dS )uT   
    Захват объекта на редактирование
    :return:
    r   r   r   rN   )r   Z
lock_startr   lock_timoutr   Tr   Fr   r   )rt   u[   Редактирование временно невозможно.
Редактирует u`   DEV: WARNING lock() попытка захватить свою блокировку дважды)rW   rX   rY   rZ   r   r   rt   r!   r   r<   r   r=   r[   r]   r^   r_   r7   r   r   r4   rH   rf   ro   Z	CmfPersonr   r   r   )r   Zlock_timeoutr   r   rZ   r   personr   r   r   rZ   X  s2    



rZ   c                 K   s   t jj}d|  }|jddd}| s<tjjddd dS ||s^tjd	 |	  dS t
||}ttj|d
   |d k rtjj|d kr|	  dS || |	  dS n|| |	  dS dS )u2   
    Снятие захвата
    :return:
    r   r   r   rN   z*DEV: FATAL unlock(): if not lock.acquire()Tr   Fus   DEV: WARNING unlock() попытка разблокировать несуществующую блокировкуr   r   r   )rW   rX   rY   rZ   r[   r]   r^   r_   r7   rf   r   r   r4   r   r<   r   r=   rH   r   r   rt   delete)r   r~   r   r   rZ   r   r   r   r   unlock  s,    

 

r   c                   @   s0   e Zd ZdZdddddZdd Zd	d
 ZdS )CmfLockuJ   Глобальная блокировка аппа на основе redis  Nr   c                 C   s$   ddl m} |jj|||d| _d S )Nr   )rX   )rO   rQ   )r   rX   rY   rZ   
redis_lock)r   r   rO   rQ   rX   r   r   r   r     s    zCmfLock.__init__c                 C   s    | j  std| j j d S )NzCannot lock )r   r[   ZCmfGetLockErrorr   r   r   r   r   r     s    
zCmfLock.__enter__c                 C   s   | j   d S r   )r   rf   r   r   r   r   r#     s    zCmfLock.__exit__)r   Nr$   r   r   r   r   r     s   r   c                 K   s  t js
dS | s|sdS ttdd }dt_dt_ddlm}m}m}m	}	 t
t }
||
d< ||
d< ||
d< ||
d< |	|
d	< tjj|
d
< |r|
| zd|rt|}|dr|dd  }|dr|dd  }td| d}| } W 5 Q R X t| |d}t||
 |
d |}n| rtj| dd}d}|jD ]$}t|tjr4|jdkr4d}q4|s|jtjtjddddddd tjd|jtjg tj ddddgg d g d g dddg d}|g|_t|dd}t||
 |
d |}ntddd W nv t!k
rn } zV|t_dt_t|tj"j#r,|dd l$}|% }tjjd| d| d| dd W 5 d }~X Y nX |t_dt_|S )NTdisable_raise_lazyloadr   )r   r   	timedeltar   r   r   r   r   r   r_   z/opt/eva-app/   /rC   rA   execrun)modeF)r!   lineno
col_offset)r   r   )Zposonlyargsr}   defaultsZvarargZ
kwonlyargsZkwargZkw_defaults)r   bodyr}   r   r   Zdecorator_listz<string>uC   Попытка вызова несуществующего bzPythonr   uT   Произошла ошибка при выполнении bzPython объекта z: 
)&configZBZPYTHON_ENABLEDr   r   r   Zrelaxed_bz_python_moder   r   r   r   dictglobalsr]   r^   r_   updaterw   r   r:   rG   compiler   astrF   r   rz   ZFunctionDefr   r   ZReturnZConstantZ	argumentsarg	ExceptionZ
base_errorZCmfAbortError	traceback
format_exc)r   r   Zcode_src_objZeval_file_pathr~   Zprev_disable_raise_lazyloadr   r   r   r   lr@   Z
code_blockresultZcode_astZhave_fnstfnrj   r   Ztracer   r   r   exec_bzpython  s    





 
     
r   c           
      C   s  t | }|jd}|r$|d dkr(d S t|jddgd }|rL|sLd S |d }|s\d S d|krx|jddd	\}}n d
|kr|jd
dd	\}}nd S |dkrtj}n&|dkrtj	}n|dkrtj
}ntj}i }	|r||	d< d
|krtf d|j d| i|	S tf d| i|	S )Nr   rC   )ZshareZdocsr   r/   r   r   rv   )maxsplitr   )docZDOCCmfDocument)ZflZFLZIN_WORK	CmfFolder)CmfListZEPIZsharelink_hashrt   r   )r   rD   rx   r   Zqueryr4   rsplitro   r   r   r   r   rp   r   )
Zurl_strZcheck_sharelinkZurl
path_partsZ
hash_paramZobj_keyZobj_typeZobj_codeZ	obj_modelZ
get_kwargsr   r   r   get_url_path_obj  s8    
r   c                  C   s6   t jd\} }}t|}t|}t|tj|S )Nrv   )r   ZEVA_INSTANCE_KEYrx   binasciiZ	unhexlifyr   r   ZMODE_CBC)r   Ziv_hexZkey_hexr   Zivr   r   r   
get_cipherF  s    

r   )messager   c                 C   s@   t  }| dtjt| tj    }|| }t|dS )Nrd   zutf-8)	r   r   Z
block_sizer   Zencryptencodebase64Z	b64encodedecode)r   cipherZpadded_messageZencrypted_messager   r   r   cryptM  s    r  c                 C   s   t  }|t|   S r   )r   decryptr  Z	b64decoder  strip)r   r  r   r   r   r  T  s    r  )r   r   c              	   C   sZ   t j }|j D ]@}|r:t jj||d| |p0| dd qt jj|d| |pL| dd qd S )Nu   ОшибкаrC   )r   r   r   msgr   priority)r   r   r  r   r  )ro   ZCmfPersonGroupZadmin_groupZ
rg_membersZ
all_nestedZ	CmfNotifyZplace_notify)r   r   r   Z	admin_grpr   r   r   r   admin_alertX  s$    
r	  c                  C   st   dd l } |  }tjrpd }tj}d|kr6|d\}}d| d| d|_|rp|d\}}| j|||_|S )Nr   @zhttp://)ZhttpZhttpsrv   )requestsZSessionr   ZEGRESS_PROXYrx   ZproxiesZauthZHTTPProxyAuth)r  requests_sessionZ
auth_proxyZproxy_settingsZusernameZpasswordr   r   r   r  l  s    r  r;   zlist|CmfModel|SimpleModel)r!   c                 C   s2   t | tr"| D ]}t||d qnt| d| dS )u   
    Маркируем объект проверенный бизнес логикой политикой по умолчанию.
    Сейчас маркировка проверяется только в api(eva-app)
    )policy_acl_policyN)rz   listacl_set_policysetattr)r!   r  r   r   r   r   r    s    
r  c                 C   s@   ddl m} t| ddd}t| |jjr2|  n|  |jS )Nr   baseT)no_metano_acl)	cmf.data_providersr  CmfResultSplitterrz   SimpleMapperSimpleModelsplit_simplerx   r   )r   r  Zsplitterr   r   r   
dumps_dict  s    
r  c                 C   s8   ddl m} t| }t| |jjr*t|S t|S d S )Nr   r  )	r  r  r  rz   r  r  	cmf_dumpsujsonr   )r   r  Zres_dictr   r   r   
dumps_json  s
    r  c                 C   s   t | tjrt| S t | tjr(t| S t | tjjrdd | j	
 D }| j	
 D ]&\}}t |tjrT|jrT| ||< qT| j|d< |S t| | jd S )Nc                 S   s0   i | ](\}}t |tjjr|jd k	r||jqS ).)rz   r]   r   r   _value)r   attrfieldr   r   r   
<dictcomp>  s
    
 z%cmf_dumps_default.<locals>.<dictcomp>rp   )rz   	ipaddressIPv4Addressrw   decimalDecimalr]   ro   	BaseModelr   ri   ZfieldsCmfTypeZvirtualZvirtual_getterrp   	TypeError	__class__)r   r   r   r!  r   r   r   cmf_dumps_default  s    
r*  c              
   C   sV   zt j| tt jdW S  tk
rP } ztd| d|   |W 5 d }~X Y nX d S )N)defaultoptionzorjson.dumps error e=z, obj=)orjsonr   r*  ZOPT_NON_STR_KEYSr(  r   r\   )r   rj   r   r   r   r    s
    r  c                   @   s   e Zd Zd%ddZdd Zdd Zd&d	d
Zd'ddZd(ddZdd Z	ed)e
jjdddZdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ ZdS )*r  NFc                 C   sP   || _ i | _t | _d | _d | _d | _d| _t | _d| _	|| _
i | _|| _d S )Nr   )_objmetar   meta_fields_keepr   startendnumber_of_objectsm2m_id_cachedepthr  3_CmfResultSplitter__project_perm_add_comments_cacher  )r   r   r  r  r   r   r   r     s    zCmfResultSplitter.__init__c                    s    fdd}|S )Nc                    sL   |  j d7  _ | j dkrd S  | f||}|  j d8  _ | j dksHt|S )NrC   r   r   )r5  AssertionError)r   r}   r~   retr   r   r   wrap  s    
z,CmfResultSplitter._check_depth.<locals>.wrapr   )r   r:  r   r9  r   _check_depth  s    zCmfResultSplitter._check_depthc                 C   s"   |j | jkrt|j| j|j < d S r   )rp   r/  r   Zui_metar   or   r   r   _add_class_to_meta  s    z$CmfResultSplitter._add_class_to_metac                 C   sP  | d}| d}| d}| d}| d}| d}| d}	tt|}
i }d}d}|
jst|D ]}|d	krxqj||= qjd
|d< |S tjj|||d||||	|d	pt }t|
t	jj
rH|
jrH|rH|dd }tt|d}|j |
j}| d}| d}|r|jsHtjj||||
j|||d|d	}t|t|@ }|dkrx| drxtj||sxd}t }| ddrt|}d|kr|d t|}d|krd|krdnd
}t| }tjdstjdrd|
jkrd|kr|d |D ]}|tjkr.||= q|d	kr<q|
j |}|r|jrZq|jst||= d
||< qt|t	jjrt||< d}tjj||||||||	d|d
pt }|dkr|rt }|dkr|r|dr|| jkr | j| sd|krt|}|d nt|}t|ddgdd }|jjpJ|j j}|szd|krnt|}|d d| j|< nH|j!d!|dd"dkrd|krt|}|d d| j|< n
d| j|< |d#kr|d$krt|}|"d d|krd|kr dnd
}|r|||< |d
kr||kr||= q|r>||d%< |rL||d< |S )&u;  
        Чтобы код не дблировать для модели, простой модели и дикта, можно проверять итоговый json
        Правда в таком случае, мы обходим все данные, даже если они не доступны.
        Zperm_effective_acl_idZcmf_owner_idrt   	parent_idrp   perm_parent_id%perm_security_level_allowed_ids_cacheNrs   ZdenyZ_acl_objF)	initial_acl_keyobject_modelobject_owner_idraise_error	object_idobject_parent_idobject_dictperm_security_level_allowed_idschecked_policyrv   r   perm_inherit_acl_idperm_parent_owner_id)	rB  rC  rD  object_fieldrF  rG  rH  rE  rJ  
CmfCommentZprivateTZcmf_deletedr;   rG   readonlyz.getz.ui_getZcomments)
rB  rC  rM  rD  rF  rH  rG  rI  rE  rJ  zCmfProject:root_parent_id)r   Zinclude_deletedzPPP-COM-ADD)r   rE  r   Z
CmfProjectZ_acl_fields)#r4   r   ro   Z	api_allowr  ZCmfAccessListZcheck_accessr   
issubclassr]   r{   Zacl_parent_field	partitionr   r  rN  Zcheck_visibilityremovetuplerh   r   Z
api_methodendswithr   Zapi_hack_fieldsZCmfPassword_PASSWORD_MASKr   r6  r   rP  r!   r?  Zcheck_project_role_accessadd)r   Zobj_dict
acl_policyrB  Zobj_owner_idra   Zobj_parent_idrp   r@  rA  r   Z
acl_fieldsZacl_objZcomment_deny
field_nameZaccess_levelsZparent_class_nameZparent_modelZparent_fieldrK  rL  Zparent_access_levelsZ_tmpZobj_keysr!  Z	acl_fieldZfield_access_levelsZproject_Zobj_Zproject_id_r   r   r   _acl_obj_dict  s   







     

     





     







zCmfResultSplitter._acl_obj_dictr   c                 C   s   |  j d7  _ | js| | d|ji}|jddD ]$}|js@q4| j||d d||j< q4| js|jdkr| j	|t
|dd d}|S )	NrC   rp   T)
is_definedr5  Zpublic_readr  rX  )r3  r  r>  rp   re   r[  _process_cmf_typer  Zacl_typerZ  r   )r   r=  r5  r   vr   r   r   _process_cmf_model  s    

z$CmfResultSplitter._process_cmf_modelc                 C   s   |  j d7  _ | js*tt|j}| | i }|j D ].\}}| jsX| j	|j|f | 
|||< q8| js| j|t|dd d}|S )NrC   r  r]  )r3  r  r   ro   rp   r>  r   ri   r0  rW  _processr  rZ  )r   r   r5  r   r   r   r!   r   r   r   _process_simple_model  s    
z'CmfResultSplitter._process_simple_modelc                    s    fdd  |S )Nc                    s   t | tr fdd| D S t | tr| d} fdd|  D }t |trd|krĈ jd7  _tjj	
|}js| | D ]}j|j|f q|j|d< jsĈj|| d	d
}|S | S )Nc                    s   g | ]} |qS r   r   )r   elproccess_jsonr   r   
<listcomp>  s     zSCmfResultSplitter._process_json_as_model.<locals>.proccess_json.<locals>.<listcomp>rt   c                    s   i | ]\}}| |qS r   r   )r   kr_  rd  r   r   r"    s      zSCmfResultSplitter._process_json_as_model.<locals>.proccess_json.<locals>.<dictcomp>rv   rC   rp   r  r]  )rz   r  r   r4   ri   rw   r3  r]   r   ZCmfTUUIDZget_cls_by_tuuid_strr  r>  r0  rW  rp   r  rZ  )r   ra   datar   rY  re  r   r   r   re    s"    




z?CmfResultSplitter._process_json_as_model.<locals>.proccess_jsonr   r<  r   ri  r   _process_json_as_model  s    z(CmfResultSplitter._process_json_as_model)r=  c                 C   sb  |  j d7  _ | js*| j|jj|jf t|tjj	rD| 
|jS t|tjjr^| |jS t|tjjrx| |jS t|tjjrt|| jkrd S | jt| |jrd S | j|j|d d}| jt| |S t|tjjrFt|| jkrg S | jt| g }|jD ]}| |}|| q| jt| |S |j}|dkr\|jS |jS )NrC   r\  .)r3  r  r0  rW  instancerp   rz   r]   r   ZCmfObjectJsonrj  r!   ZCmfObjectList_process_listZ	CmfObjectr`  ZCmfRelationBasert   r4  Zis_nullrS  r   r   Zjsonr+  )r   r=  r5  r   r   ir   r   r   r   r^    s@    


z#CmfResultSplitter._process_cmf_typec                    s$     j d7  _  fdd|D }|S )NrC   c                    s   g | ]}  |qS r   )ra  )r   rj   r   r   r   rf    s     z3CmfResultSplitter._process_list.<locals>.<listcomp>)r3  )r   r=  r   r   r   r   rl    s    zCmfResultSplitter._process_listc                 C   s   |  j d7  _ t }| D ]v\}}| |||< | js|dkr|rt|trtt|	dd d }|r| 
| | D ]}| j|j|f qzq|dr|dr| js| j||dd}|S )NrC   rt   rv   r   rp   r  r]  )r3  r   ri   ra  r  rz   rw   r   ro   rx   r>  rh   r0  rW  rp   r4   r  rZ  )r   r=  r   rg  r_  mrY  r   r   r   _process_dict  s    
zCmfResultSplitter._process_dictc                 C   s   |  j d7  _ t|tr"| |S t|tjjr:| |S t|tjj	rR| 
|S t|rd| |S t|trx| |S t|tjtjfrt|S t|ttfr| S |S )NrC   )r3  rz   r  rl  r]   r   r   r^  ro   r'  r`  r   rb  r   ro  r#  r$  r%  r&  rw   r   r   Z	isoformat)r   r   r   r   r   ra    s     






zCmfResultSplitter._processc                 C   sB   | j  D ]2\}}t|d D ]}||f| jkr|d |= qq
d S )Nr   )r/  ri   r  r0  r   rp   Zclass_valuerY  r   r   r   _process_meta  s    zCmfResultSplitter._process_metac                    s\   d fdd	  j  j D ]2\}}t|d D ]}||fjkr8|d |= q8q$d S )Nr   c           	         s   j d7  _ t| rdtt| j}| | j D ](\}}j	|j|f  ||d  q6n t
| tjjrtt| j}| | j D ]>\}}t
|tr|jdk	rj	|j|f  |j|d  qnt
| tr| D ]} ||d  qnt
| trd }| d}|rJt
|trJtt|dd d  }rJ| |  D ]0\}}|rrj	|j|f  ||d  qRd S )NrC   .rt   rv   r   )r3  r   r   ro   rp   r>  r   ri   r0  rW  rz   r]   r'  r   r  r  r   r4   rw   rR  )	r   r5  r   Zsub_attrZ	sub_valueZ	sub_fieldsubra   Zsub_keyprocess_jsonr   r   r   rt    s6    




z<CmfResultSplitter._process_simple_meta.<locals>.process_jsonr   )r   )r.  r/  ri   r  r0  rp  r   rs  r   _process_simple_meta  s    
z&CmfResultSplitter._process_simple_metac                 C   s$   | j r| jsd S t| j| j  d S )Ni  )r1  r2  intr   r   r   r   ms?  s    zCmfResultSplitter.msc                 C   s4   t   | _| | j| _| js&|   t   | _d S r   )rV   r1  ra  r.  r   r/  rq  r2  r   r   r   r   rx   E  s
    
zCmfResultSplitter.splitc                 C   s4   t   | _| | j| _| js&|   t   | _d S r   )rV   r1  ra  r.  r   r  ru  r2  r   r   r   r   r  L  s
    
zCmfResultSplitter.split_simple)NF)N)r   )r   )r   )r%   r&   r'   r   r;  r>  rZ  r`  rb  rj  r]   r   r   r^  rl  ro  ra  rq  ru  rw  rx   r  r   r   r   r   r    s$   

  

0&r  c                 C   s:   dd l }z|| }| W S  |jk
r4   Y dS X d S )Nr   F)psutilZProcessZ
is_runningZNoSuchProcess)pidrx  Zprocessr   r   r   check_process_runningW  s    

rz  )N)N)r   )NN)F)NN)r;   )Mr   Zurllib.parser   r   r   r]   r   r   r   r   r   r   Zflaskr   pathlibr	   Zcmf.cmf_profiler
   r   r   r   ZCrypto.Cipherr   r   r  Zredis.exceptionsrY   rV   Zdataclassesr   r%  r#  r-  r  collectionsr   copyr   rV  r   r)   r+   rc   rk   rm   rq   ru   rr   r   r   r   r   r   r   rw   r   r   r   r   r   rZ   r   r   r   r   r   r  r  r	  r  r  r  r  r*  r  r  rz  r   r   r   r   <module>   sz    /	
&
	


'#
`
5	   