U
    rRd<                     @   sd  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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 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ddZd7ddZdd Zd8ddZd9d d!Zeed"d#d$Zeed"d%d&Z d'd( Z!d)d* Z"d+d, Z#d-d. Z$d/d0 Z%G d1d2 d2Z&d:d3d4Z'd;d5d6Z(dS )<    N)urlparseparse_qs)datetimetimezone)Linker)g)Path)timeitProfilerDataCtxprofiler_data_log)*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   ./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   (   s    zdisable_notify.__exit__r   r   r   r   r   r$      s   r$   c                   @   s>   e Zd ZedZddddZdd Zdd	 Zed
d Z	dS )enable_import_modez/tmp/eva_app_import.lockNr   c                 C   s
   d | _ d S r   )save_import_flagr   r   r   r   r   /   s    zenable_import_mode.__init__c                 C   s"   dt krt j| _dt _|   d S )Nimport_modeT)r   r(   r'   import_heartbeatr   r   r   r   r   2   s    zenable_import_mode.__enter__c                 C   s    | j t_| j r| j  d S r   )r'   r   r(   	LOCK_PATHexistsunlinkr   r   r   r   r   8   s    
zenable_import_mode.__exit__c              	   C   s4   t | jd}|tjtjd  W 5 Q R X d S )Nzw+)Ztz)openr*   writer   nowr   utcZ	isoformat)clsfr   r   r   r)   =   s    z#enable_import_mode.import_heartbeat)
r    r!   r"   r   r*   r   r   r   classmethodr)   r   r   r   r   r&   ,   s   r&   c                 C   s   t t|  S r   )varsmodels)
class_namer   r   r   get_model_by_nameC   s    r7   c                 C   s   t | }tt| S r   )get_class_name_by_idr4   r5   idr6   r   r   r   get_model_by_idG   s    r;   c                 C   s   t | dd }|S )N:r   )strsplitr9   r   r   r   r8   L   s    r8   F)simplec                O   sH   t | tjjr| j }n|  }t|}|r0|jn|j}||d|i|S )Nr:   )
isinstancecmfr5   	CmfEntityr:   r;   sgetget)r:   r?   argskwargsZtuuidmodelrD   r   r   r   get_obj_by_idQ   s    
rH   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   r5   )BaseModelMetaN)
cmf.includer5   cmf.models.base_modelrJ   sorted__dict__keysgetattrr@   Zabstract)Zmodel_filterr5   rJ   Z
model_namerG   r   r   r   iter_models[   s    
rQ   c                 C   s>   ddl m} ddlm} | D ]}|j| kr |j  S q d S )Nr   rI   )rB   )rK   r5   rL   rB   Ziter_subclassesui_namer6   )rR   r5   rB   rG   r   r   r   get_class_name_by_ui_nameh   s    
rS   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filtercode=-   ZLIKEz%-)	cmf_alerttyper=   r7   rD   r>   isdigitlen)rW   rG   rE   rF   resZcode_numberr   r   r   get_obj_by_codeq   s     ra   _c                    s(   t j| ddd}d fdd|D S )NruT)Zlanguage_codereversed c                 3   s*   | ]"}|  s|d kr| n V  qdS )rY   N)isalnumlower).0csepr   r   	<genexpr>   s     z!translit_strip.<locals>.<genexpr>)transliterateZtranslitjoin)textrk   r`   r   rj   r   translit_strip   s    rp   )ro   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   timeZcontrolsrW   ZaudioZvideopbrZinsdelZfigureZ
figcaption)ro   tags
attributes)bleachZALLOWED_ATTRIBUTESZALLOWED_TAGSappendZclean)ro   rx   rw   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)rD   r   )Zattrsnewrt   r   r   r   
set_target   s    
zlinkify.<locals>.set_target)Z	callbacks)F)r   linkify)ro   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dumpsrM   items)rE   rF   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
   timeout(DEV: FATAL lock(): if not lock.acquire()TrT   FuR   DEV: FATAL Попытка lock_ping() на отсутствующую записьi  	locked_byuJ   DEV: FATAL Попытка lock_ping() на чужую блокировку	ping_time)APPREDIS_DBredislockacquirerA   includer\   r+   releaser   debugr   loadsrD   current_personr:   r   r/   r   r0   setr   )keyrF   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)
ValueErrorr   r   r   r+   r   r   rD   )r   r   r   r   r   r   r   r      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   r   )r   Z
lock_startr   lock_timoutr   TrT   Fr   r   )r:   u[   Редактирование временно невозможно.
Редактирует u`   DEV: WARNING lock() попытка захватить свою блокировку дважды)r   r   r   r   r   r   r:   r   r   r/   r   r0   r   rA   r   r\   r+   r   r   rD   total_secondsr   r5   Z	CmfPersonnamer   r   )r   Zlock_timeoutr   r   r   r   Zpersonr   r   r   r      s2    



r   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   r   z*DEV: FATAL unlock(): if not lock.acquire()TrT   Fus   DEV: WARNING unlock() попытка разблокировать несуществующую блокировкуr   r   r   )r   r   r   r   r   rA   r   r\   r+   r   r   r   rD   r   r/   r   r0   r   r   r   r:   delete)r   rF   r   r   r   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   )r   )r   blocking_timeout)rK   r   r   r   
redis_lock)r   r   r   r   r   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CmfErrorr   r   r   r   r   r   *  s    
zCmfLock.__enter__c                 C   s   | j   d S r   )r   r   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d S ttdd }dt_dt_ddlm}m}m}m	} t
t }	d|	d< ||	d< ||	d< ||	d< ||	d	< ||	d
< tjj|	d< |r|	| | dd} zt| |	 W nt tk
r$ }
 zT|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_|	d S )Ndisable_raise_lazyloadTr   )r   date	timedeltar   resultr   r   r   r   r   r\   zreturn z	result = FuT   Произошла ошибка при выполнении bzPython объекта z: 
rT   )ZconfigZBZPYTHON_ENABLEDrP   r   r   Zrelaxed_bz_python_moder   r   r   r   dictglobalsrA   r   r\   updatereplaceexec	Exceptionr@   Z
base_errorZCmfAbortError	traceback
format_exc)rW   objZcode_src_objrF   Zprev_disable_raise_lazyloadr   r   r   r   ler   Ztracer   r   r   exec_bzpython2  sF    

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 )N/   )ZshareZdocsr   re   r   rZ   r<   )maxsplitrY   )docZDOCCmfDocument)ZflZFLZIN_WORK	CmfFolder)CmfListZEPIZsharelink_hashr:   rW   )r   pathr>   r   ZqueryrD   rsplitr5   r   r   r   rH   r6   ra   )
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_objh  s8    
r   )N)N)rb   )N)F))r   Zurllib.parser   r   rA   ry   rm   r   r   r   Zflaskr   pathlibr   Zcmf.cmf_profiler	   r
   r   rK   r   r$   r&   r7   r;   r8   rH   rQ   rS   ra   rp   r=   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s>   

	


'"
6