U
    j*gw                  
   @   s  d dl Z d dlZd dlmZm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mZ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 dl)m*Z* d dl+m,Z, d dl-Z-dZ.G dd dZ/G dd dZ0G dd dZ1G dd dZ2dd Z3dd Z4dd Z5dd  Z6d!d" Z7d#d$ Z8d%d&d'd(Z9d)d* Z:dsd+d,Z;d-d. Z<dtd/d0Z=dud2d3Z>dve?e*e? e*e? e?d4d5d6Z@e?e?d7d8d9ZAd:d; ZBd<d= ZCd>d? ZDd@dA ZEdBdC ZFG dDdE dEZGdwdFdGZHdHdI ZIdJdK ZJdLdM ZKdxdNdOZLdPdQ ZMe?e?dRdSdTZNe?e?dRdUdVZOdye?e?dWdXdYZPdZd[ ZQdzd]d^d_d`ZRdadb ZSdcdd ZTdedf ZUdgdh ZVG didj djZWdkdl ZXd{dodpZYe,dqdr ZZdS )|    N)urlparseparse_qs)LockNotOwnedError)datetimedate	timedeltatimezone)Linker)g)Path)timeitProfilerDataCtxprofiler_data_log)*)AES)is_dataclass)OrderedDict)deepcopy)List)contextmanagerz******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 )

run_systemr   Nr   c                 C   s   d | _ d | _d S r   )current_usercurrent_acl_admin_moder   r   r   r   r    4   s    zrun_system.__init__c                 C   s(   t j| _tjt j t j| _dt _d S )NT)r
   r.   cmfappset_current_personZsystem_useracl_admin_moder/   r   r   r   r   r"   8   s    zrun_system.__enter__c                 C   s   t j| j | jt_d S r   )r0   r1   r2   r.   r/   r
   r3   r#   r   r   r   r'   @   s    zrun_system.__exit__r(   r   r   r   r   r-   1   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    G   s    zdisable_notify.__init__c                 C   s   dt krt j| _dt _d S )Nr4   T)r
   r4   r5   r   r   r   r   r"   J   s    zdisable_notify.__enter__c                 C   s   | j t_d S r   )r5   r
   r4   r#   r   r   r   r'   O   s    zdisable_notify.__exit__r(   r   r   r   r   r4   E   s   r4   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    V   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getr8   r
   r;   r7   import_heartbeat)r   r=   r   r   r   r"   Z   s    
zenable_import_mode.__enter__c                 C   s4   dd l }| jt_| j|jd< | j r0| j  d S )Nr   r9   )	r=   r7   r
   r;   r8   r>   	LOCK_PATHexistsunlink)r   r$   r%   r&   r=   r   r   r   r'   c   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)openrA   writer   nowr   utcstrftime)clsfr   r   r   r@   m   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rrD   <      )Zdateutil.parserr=   pathrB   rA   rE   parserparsereadr   rG   r   rH   total_seconds)rJ   ZdateutilrK   	lock_timer   r   r   import_is_runningr   s    z$enable_import_mode.import_is_running)r)   r*   r+   r   rA   r    r"   r'   classmethodr@   rU   r   r   r   r   r6   S   s   	

r6   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: rN   i  z#DEV: cache_obj_lock_get long time: )hasattrr
   rW   timeAPPREDIS_DBredislockacquiredebugr0   include	cmf_alertr   Ztodayacquired_lock_timigns)obj_idZlock_keyst_timere   Zacquire_timer   r   r   cache_obj_lock_get   s$    



rm   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 )
NrW   z*cache_obj_lock_release_all release error: r]   z%cache_obj_lock_release_all too slow: r^   zsec. Locks:z(cache_obj_lock_release_all lock >100ms:  Zsec)r`   r
   ra   rW   valuesreleaserd   
exceptionsZ	LockErrorrg   keysrj   items)rl   re   eZunlock_timeZ	lock_nameZlock_strT   r   r   r   cache_obj_lock_release_all   s    
$ru   c                  C   s4   t tdr0tjr0tjD ]} tjjj|   qg t_d S )Ndelayed_redis_events)r`   r
   rv   rb   rc   rd   Zpublish)Zeventr   r   r   emit_delayed_events   s    
rw   c                 C   s   t t|  S r   )varsmodels)
class_namer   r   r   get_model_by_name   s    r{   c                 C   s   t | }tt| S r   )get_class_name_by_idrx   ry   idrz   r   r   r   get_model_by_id   s    r   c                 C   s   t | dd }|S )N:r   )strsplitr}   r   r   r   r|      s    r|   F)simplec                O   sH   t | tjjr| j }n|  }t|}|r0|jn|j}||d|i|S )Nr~   )
isinstancer0   ry   	CmfEntityr~   r   sgetr?   )r~   r   argskwargsZtuuidmodelr?   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 можно передать имя модели или саму модель
    r   z--r~   )codefields)namer   N)r   r   rx   ry   r0   r   CmfType
CmfRelBase
startswithrz   r   r~   )objrz   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   ry   )BaseModelMetaN)
cmf.includery   cmf.models.base_modelr   sorted__dict__rr   getattrr   Zabstract)Zmodel_filterry   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   ry   r   r   Ziter_subclassesui_namerz   )r   ry   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%-)ri   typer   r{   r?   r   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   tags_extendprotocols_extendr   c                 C   s   |r d|kr |  dd dd} 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 |r|| tj}|r|| tj| tj||ddS )NZdivz<div>z<p>z</div>z</p>srcwidthZheightZimgr   ra   Zcontrolsr   ZaudioZvideopbrZinsdelZfigureZ
figcaptionT)r   tags
attributes	protocolsstrip)replacebleachZALLOWED_ATTRIBUTESZALLOWED_TAGSappendextendZALLOWED_PROTOCOLSZclean)r   r   r   r   r   r   r   r   r   
html_clean  s0    












r   )r   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)r?   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   rs   )r   r   hashfuncZmemoryr   r   memoN  s    zmemoized.<locals>.memor   )r   r   r   r   r   memoizedL  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
   rY   (DEV: FATAL lock(): if not lock.acquire()Tr   FuR   DEV: FATAL Попытка lock_ping() на отсутствующую записьi  	locked_byuJ   DEV: FATAL Попытка lock_ping() на чужую блокировку	ping_time)rb   rc   rd   re   rf   r0   rh   ri   rB   rp   r
   rg   r   loadsr?   current_personr~   r   rG   r   rH   setr   )keyr   redis_db_key_lock	lock_infor   r   r   	lock_pingV  s&    



r   c                 C   sD   | st dtjj}d|  }||r@t||}|r@|S dS )uh   
    Из редиса заберём структуру, где есть данные
    :return:
    uL   Блокировка объектов без key не реализованаr   N)
ValueErrorrb   rc   rd   rB   r   r   r?   )r   r   r   r   r   r   r   r   o  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   rY   )r   Z
lock_startr   lock_timoutr   Tr   Fr   r   )r~   u[   Редактирование временно невозможно.
Редактирует u`   DEV: WARNING lock() попытка захватить свою блокировку дважды)rb   rc   rd   re   r
   r   r~   r%   r   rG   r   rH   rf   r0   rh   ri   rB   r   r   r?   rS   rp   ry   Z	CmfPersonr   r   r   )r   Zlock_timeoutr   r   re   r   personr   r   r   re     s2    



re   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   rY   z*DEV: FATAL unlock(): if not lock.acquire()Tr   Fus   DEV: WARNING unlock() попытка разблокировать несуществующую блокировкуr   r   r   )rb   rc   rd   re   rf   r0   rh   ri   rB   rp   r   r   r?   r   rG   r   rH   rS   r
   r   r~   delete)r   r   r   r   re   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   )rc   )rZ   r\   )r   rc   rd   re   
redis_lock)r   r   rZ   r\   rc   r   r   r   r      s    zCmfLock.__init__c                 C   s    | j  std| j j d S )NzCannot lock )r   rf   ZCmfGetLockErrorr   r   r   r   r   r"     s    
zCmfLock.__enter__c                 C   s>   z| j   W n* tk
r8   tdd| j j  Y nX d S )N%szUnlock CmfLock error: key = )r   rp   r   loggingwarningr   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_|r<t  nt }t	j
j|d< ||d< t|d< t|d< t|d< t|d< t|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r:|jdkr:d}q:|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
rt } zV|t_dt_t|t	j%j&r2|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_lazyloadcmfutilr   r   r   r   r   requestsri   z/opt/eva-app/   /rN   rL   execrun)modeFr   )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_modeglobalscopy_build_safe_bzpython_globalsr0   rh   r   r   r   r   r   r   ri   updater   r   rE   rR   compiler   astrQ   r   r   ZFunctionDefr   r   ZReturnZConstantZ	argumentsarg	ExceptionZ
base_errorZCmfAbortError	traceback
format_exc)r   r   Zcode_src_objZeval_file_pathZeval_unsafer   prev_disable_raise_lazyloadlrK   Z
code_blockresultZcode_astZhave_fnstfnrt   r  Ztracer   r   r   exec_bzpython  s    




 
     
r
  c                    s    fdd}|S )Nc                     s   t jjd j ddd d S )Nu   Вызов функции "up   " запрещен, требуется разрешить расширенные возможности BzPythonTr   )r0   rh   ri   r)   )r   r   rK   r   r   wrapperB  s    z_restrict_func.<locals>.wrapperr   )rK   r  r   r  r   _restrict_funcA  s    r  c                 O   sP   t | tst| f||S | dr<d| kr<t| f||S tjjddd d S )Nz/tmpz..u   Неверный путь к файлу или несуществующий файл, требуется разрешить расширенные возможности BzPythonTr   )r   r   rE   r   r0   rh   ri   )rK   r   r   r   r   r   _safe_bzpython_openJ  s    
r  c                  C   sN   i } t  }tt|d< tt|d< t|d< tddd}||d< || d< | S )	Nevalr   rE   )r   c                 _   s@   |  dd }|tjkr0tjjd| ddd t| f||S )N.r   u   Пакет "u)   " нельзя импортироватьTr   )r   r   ZBZPYTHON_ALLOWED_LIBSr0   rh   ri   
__import__)r   r   r   Zname_to_checkr   r   r   _bzpython_import`  s    
z6_build_safe_bzpython_globals.<locals>._bzpython_importr  __builtins__)r  r   r  r  r   r  r   )Zbzpython_globalsbuiltinsr  r   r   r   r   X  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   rN   )ZshareZdocsr   r:   r   r   r   )maxsplitr   )docZDOCCmfDocument)ZflZFLZIN_WORK	CmfFolder)CmfListZEPIZsharelink_hashr~   r   )r   rO   r   r   queryr?   rsplitry   r  r  r  r   rz   r   )
Zurl_strZcheck_sharelinkurl
path_partsZ
hash_paramZobj_keyZobj_typeZobj_codeZ	obj_modelZ
get_kwargsr   r   r   get_url_path_objp  s8    
r  c                  C   s6   t jd\} }}t|}t|}t|tj|S )Nr   )r   ZEVA_INSTANCE_KEYr   binasciiZ	unhexlifyr   r   ZMODE_CBC)r   Ziv_hexZkey_hexr   Zivr   r   r   
get_cipher  s    

r   )messager   c                 C   s@   t  }| dtjt| tj    }|| }t|dS )Nrn   zutf-8)	r   r   Z
block_sizer   Zencryptencodebase64Z	b64encodedecode)r!  cipherZpadded_messageZencrypted_messager   r   r   crypt  s    r&  c                 C   s   t  }|t|   S r   )r   decryptr#  Z	b64decoder$  r   )r!  r%  r   r   r   r'    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   ОшибкаrN   )r   r   r   msgr   priority)r   r   r(  r   r)  )ry   ZCmfPersonGroupZadmin_groupZ
rg_membersZ
all_nestedZ	CmfNotifyZplace_notify)r!  r   r   Z	admin_grpr   r   r   r   admin_alert  s$    
r*  c                  C   sl   t  } tjrhd }tj}d|kr.|d\}}d| d| d| _|rh|d\}}t j||| _| S )N@zhttp://)httphttpsr   )r   ZSessionr   ZEGRESS_PROXYr   ZproxiesZauthZHTTPProxyAuth)requests_sessionZ
auth_proxyZproxy_settingsusernamepasswordr   r   r   r.    s    r.  rF   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)r   listacl_set_policysetattr)r%   r1  r   r   r   r   r4    s    
r4  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_providersr7  CmfResultSplitterr   SimpleMapperSimpleModelsplit_simpler   r  )r   r7  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   r6  )	r:  r7  r?  r   r<  r=  	cmf_dumpsujsonr   )r   r7  Zres_dictr   r   r   
dumps_json  s
    rB  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 ).)r   r0   r   r   _value)r   attrfieldr   r   r   
<dictcomp>  s
    
 z%cmf_dumps_default.<locals>.<dictcomp>rz   )r   	ipaddressIPv4Addressr   decimalDecimalr0   ry   	BaseModelr   rs   ZfieldsCmfTypeZvirtualZvirtual_getterrz   	TypeError	__class__)r   r  rD  rE  r   r   r   cmf_dumps_default  s    
rN  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   rN  ZOPT_NON_STR_KEYSrL  r
   rg   )r   rt   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depthr8  3_CmfResultSplitter__project_perm_add_comments_cacher9  )r   r   r8  r9  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 )NrN   r   r   )rY  AssertionError)r   r   r   retr	  r   r   wrap8  s    
z,CmfResultSplitter._check_depth.<locals>.wrapr   )r	  r^  r   r]  r   _check_depth7  s    zCmfResultSplitter._check_depthc                 C   s"   |j | jkrt|j| j|j < d S r   )rz   rS  r   Zui_metar   or   r   r   _add_class_to_metaB  s    z$CmfResultSplitter._add_class_to_metac                 C   s  | d}| d}| d}| d}| d}| d}| d}	tt|}
i }d}d}d}|
jst|D ]}|d	kr|qn||= qnd
|d< |S tjj|||d||||	|d	pt }t|
t	jj
rL|
jrL|rL|dd }tt|d}|j |
j}| d}| d}|r|jsLtjj||||
j|||d|d	}t|t|@ }|dkr|| dr|tj||s|d}t }|dkr| drtj||sd}t }| ddrt|}d|kr|d t|}d|krd|krdnd
}t| }tjds"tjdrBd|
jkrBd|krB|d |D ]0}|tjkrb||= qF|d	krpqF|
j |}|r|jrqF|js||= d
||< qFt|t	jjrt||< d}tjj||||||||	d|d
pt }|dkr|rt }|dkr|rt }|dkr|r|dr|| jkrj| j| sd|krt|}|d nt|}t|d dgdd!}|jj p|j!j }|sd|krt|}|d d| j|< nH|j"d"|dd#dkrd|krt|}|d d| j|< n
d| j|< |d$kr2|d%kr2t|}|#d d|krNd|krJdnd
}|r\|||< |d
krF||krF||= qF|r||d&< |r||d< |S )'u;  
        Чтобы код не дблировать для модели, простой модели и дикта, можно проверять итоговый json
        Правда в таком случае, мы обходим все данные, даже если они не доступны.
        Zperm_effective_acl_idZcmf_owner_idr~   	parent_idrz   perm_parent_id%perm_security_level_allowed_ids_cacheNr}   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_policyr   r   perm_inherit_acl_idperm_parent_owner_id)	rf  rg  rh  object_fieldrj  rk  rl  ri  rn  
CmfCommentZprivateTCmfAttachmentZcmf_deletedrF   rR   readonlyz.getz.ui_getZcomments)
rf  rg  rq  rh  rj  rl  rk  rm  ri  rn  zCmfProject:
project_id)r   Zinclude_deletedzPPP-COM-ADD)r   ri  r   Z
CmfProjectZ_acl_fields)$r?   r   ry   Z	api_allowr3  ZCmfAccessListZcheck_accessr   
issubclassr0   r   Zacl_parent_field	partitionr   r9  rr  Zcheck_visibilityrs  removetuplerr   r
   Z
api_methodendswithr   Zapi_hack_fieldsZCmfPassword_PASSWORD_MASKr   rZ  r   ru  r%   rc  Zcheck_project_role_accessadd)r   Zobj_dict
acl_policyrf  Zobj_owner_idrk   Zobj_parent_idrz   rd  re  r   Z
acl_fieldsZacl_objZcomment_denyZattachment_deny
field_nameZaccess_levelsZparent_class_nameZparent_modelZparent_fieldro  rp  Zparent_access_levelsZ_tmpZobj_keysrE  Z	acl_fieldZfield_access_levelsZproject_Zobj_Zproject_id_r   r   r   _acl_obj_dictF  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 )	NrN   rz   T)
is_definedrY  Zpublic_readr2  r}  )rW  r8  rb  rz   ro   r  _process_cmf_typer9  Zacl_typer  r   )r   ra  rY  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 )NrN   r2  r  )rW  r8  r   ry   rz   rb  r   rs   rT  r|  _processr9  r  )r   r   rY  r   r  rD  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>r~   c                    s   i | ]\}}| |qS r   r   )r   kr  r  r   r   rF    s      zSCmfResultSplitter._process_json_as_model.<locals>.proccess_json.<locals>.<dictcomp>r   rN   rz   r2  r  )r   r3  dictr?   rs   r   rW  r0   r   ZCmfTUUIDZget_cls_by_tuuid_strr8  rb  rT  r|  rz   r9  r  )r   rk   datar   r~  r  r   r   r   r    s"    




z?CmfResultSplitter._process_json_as_model.<locals>.proccess_jsonr   r`  r   r  r   _process_json_as_model  s    z(CmfResultSplitter._process_json_as_model)ra  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 )NrN   r  .)rW  r8  rT  r|  instancerz   r   r0   r   ZCmfObjectJsonr  r%   ZCmfObjectList_process_listZ	CmfObjectr  ZCmfRelationBaser~   rX  Zis_nullrx  r   r   ZjsonrO  )r   ra  rY  r   r  ir   r   r   r   r  #  s@    


z#CmfResultSplitter._process_cmf_typec                    s$     j d7  _  fdd|D }|S )NrN   c                    s   g | ]}  |qS r   )r  )r   rt   r   r   r   r  V  s     z3CmfResultSplitter._process_list.<locals>.<listcomp>)rW  )r   ra  r  r   r   r   r  T  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 )NrN   r~   r   r   rz   r2  r  )rW  r   rs   r  r8  r   r   r   ry   r   rb  rr   rT  r|  rz   r?   r9  r  )r   ra  r  r  r  mr~  r   r   r   _process_dictY  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 )NrN   )rW  r   r3  r  r0   r   r   r  ry   rK  r  r   r  r  r  rG  rH  rI  rJ  r   r   r   Z	isoformat)r   r   r   r   r   r  i  s     






zCmfResultSplitter._processc                 C   sB   | j  D ]2\}}t|d D ]}||f| jkr|d |= qq
d S )Nr   )rS  rs   r3  rT  r   rz   Zclass_valuer~  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 )NrN   .r~   r   r   )rW  r   r   ry   rz   rb  r   rs   rT  r|  r   r0   rK  r   rC  r3  r  r?   r   rw  )	r   rY  r   Zsub_attrZ	sub_valueZ	sub_fieldsubrk   Zsub_keyprocess_jsonr   r   r   r    s6    




z<CmfResultSplitter._process_simple_meta.<locals>.process_jsonr   )r   )rR  rS  rs   r3  rT  r  r   r  r   _process_simple_meta  s    
z&CmfResultSplitter._process_simple_metac                 C   s$   | j r| jsd S t| j| j  d S )Ni  )rU  rV  intr   r   r   r   ms  s    zCmfResultSplitter.msc                 C   s4   t   | _| | j| _| js&|   t   | _d S r   )ra   rU  r  rR  r  rS  r  rV  r   r   r   r   r     s
    
zCmfResultSplitter.splitc                 C   s4   t   | _| | j| _| js&|   t   | _d S r   )ra   rU  r  rR  r  r8  r  rV  r   r   r   r   r>    s
    
zCmfResultSplitter.split_simple)NF)N)r   )r   )r   )r)   r*   r+   r    r_  rb  r  r  r  r  r0   r   r   r  r  r  r  r  r  r  r   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)pidr  Zprocessr   r   r   check_process_running  s    

r  r   avscanc              
   C   sL  |s(t tjjd\}}}|r(t|}|r4t|nd}ddt | dt |dt |d|dg
}|r|d	 |r|d
 || |	r|d |r|d || |r|d |t | n|d |t | tj|ddddd}d|j	krdS d|p| d| d|d|d|j	 
}t
d| |
rHt||dS )u{  
    !!! import icapclient - похоже ломает gevent
        Либа читает файл только с диска (


    Используем cli клиент:
    /usr/bin/c-icap-client [-V ] [-VV ]
     [-i icap_servername] [-p port] [-s service] [-tls ] [-tls-method tls_method] [-tls-no-verify ]
     [-f filename] [-o filename] [-method method] [-req url] [-resp url]
     [-d level] [-noreshdr ] [-nopreview ] [-no204 ] [-206 ]
     [-x xheader] [-hx xheader] [-rhx xheader] [-w preview] [-v ]

    -V                      : Print version and exits
    -VV                     : Print version and build informations and exits
    -i icap_servername              : The icap server name
    -p port         : The server port
    -s service              : The service name
    -tls                    : Use TLS
    -tls-method tls_method          : Use TLS method
    -tls-no-verify                  : Disable server certificate verify
    -f filename             : Send this file to the icap server.
    Default is to send an options request
    -o filename             : Save output to this file.
    Default is to send to stdout
    -method method          : Use 'method' as method of the request modification
    -req url                : Send a request modification instead of response modification
    -resp url               : Send a responce modification request with request url the 'url'
    -d level                : debug level info to stdout
    -noreshdr                       : Do not send reshdr headers
    -nopreview                      : Do not send preview data
    -no204                  : Do not allow204 outside preview
    -206                    : Support allow206
    -x xheader              : Include xheader in icap request headers
    -hx xheader             : Include xheader in http request headers
    -rhx xheader            : Include xheader in http response headers
    -w preview              : Sets the maximum preview data size
    -v                      : Print response headers

    Valid:
    root@crm:/opt/eva-app# c-icap-client -f uwsgi.ini -req / -i 10.50.17.68 -s avscan -method POST -v >/dev/null
    ICAP server:10.50.17.68, ip:192.168.0.33, port:1344

    No modification needed (Allow 204 response)

    ICAP HEADERS:
            ICAP/1.0 204 Unmodified
            Server: C-ICAP/0.5.6
            Connection: keep-alive
            ISTag: CI0001-B5sZ3i1I3+P4H3at/XZ4mQAA

    REQMOD HEADERS:
            POST / HTTP/1.0
            Last-Modified: Tue Apr  9 10:46:16 2024
            Content-Length: 1426
            Content-Length: 1426
            User-Agent: C-ICAP-Client/x.xx

    Virus:
    root@crm:/opt/eva-app# c-icap-client -f xf-mccs6.exe -req / -i 10.50.17.68 -s avscan -method POST -v >/dev/null
    ICAP server:10.50.17.68, ip:192.168.0.33, port:1344


    ICAP HEADERS:
            ICAP/1.0 200 OK
            Server: C-ICAP/0.5.6
            Connection: keep-alive
            ISTag: CI0001-B5sZ3i1I3+P4H3at/XZ4mQAA
            X-Infection-Found: Type=0; Resolution=2; Threat=Win.Tool.Genkryptik-9939783-0;
            X-Violations-Found: 1
            -
            Win.Tool.Genkryptik-9939783-0
            0
            0
            Encapsulated: res-hdr=0, res-body=108

    RESPMOD HEADERS:
            HTTP/1.0 403 Forbidden
            Server: C-ICAP
            Connection: close
            Content-Type: text/html
            Content-Language: en

    r   i@  z/usr/bin/c-icap-clientz-fz-iz-pz-sz-vz-tlsz-tls-methodz-tls-no-verifyz-methodz-reqz-respT   )Zcapture_outputrZ   checkr   zNo modification neededzicap_check(): failed, url=z, file_path=z
, service=z	, method=z
, result:
r   F)r   r
   Zglobal_settingsZicap_serverrw  r  r   
subprocessr   stderrr   r   ZCmfIcapCheckError)Z	file_pathZresp_urlZreq_urlmethodZservicehostportZtlsZ
tls_methodZtls_no_verifyri  r   r   procr!  r   r   r   
icap_check  sZ    Y         







   *
r  c                  c   s*   t tdd} zdt_d V  W 5 | t_X d S )Nr   FT)r   r
   r   )r  r   r   r   allow_lazyloadf  s
    
r  )N)N)r   )NN)NNF)F)NN)rF   )
r   NNr  NNNNNF)[r   r  urllib.parser   r   r   Zredis.exceptionsr   r0   r   r   r   r   r   r   r	   Zflaskr
   pathlibr   Zcmf.cmf_profiler   r   r   r   ZCrypto.Cipherr   r  r#  rd   ra   Zdataclassesr   rI  rG  rQ  rA  collectionsr   r   r   typingr   
contextlibr   r   r{  r   r-   r4   r6   rm   ru   rw   r{   r   r|   r   r   r   r   r   r   r   r   r   r   r   r   re   r   r   r
  r  r  r   r  r   r&  r'  r*  r.  r4  r?  rB  rN  r@  r;  r  r  r  r   r   r   r   <module>   s    /	
&
	

!
'#
b	
5	   
                 
 