U
    gyd0B                     @   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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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dBddZdd ZdCddZ dDd!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(d0d1 Z)G d2d3 d3Z*dEd4d5Z+dFd6d7Z,d8d9 Z-e"e"d:d;d<Z.e"e"d:d=d>Z/dGe"d?d@dAZ0dS )H    N)urlparseparse_qs)datetimetimezone)Linker)g)Path)timeitProfilerDataCtxprofiler_data_log)*)AESc                   @   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   1   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   4   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   :   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_nameE   s    r8   c                 C   s   t | }tt| S r   )get_class_name_by_idr5   r6   idr7   r   r   r   get_model_by_idI   s    r<   c                 C   s   t | dd }|S )N:r   )strsplitr:   r   r   r   r9   N   s    r9   F)simplec                O   sH   t | tjjr| j }n|  }t|}|r0|jn|j}||d|i|S )Nr;   )
isinstancecmfr6   	CmfEntityr;   r<   sgetget)r;   r@   argskwargsZtuuidmodelrE   r   r   r   get_obj_by_idS   s    
rI   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   r6   )BaseModelMetaN)
cmf.includer6   cmf.models.base_modelrK   sorted__dict__keysgetattrrA   Zabstract)Zmodel_filterr6   rK   Z
model_namerH   r   r   r   iter_models]   s    
rR   c                 C   s>   ddl m} ddlm} | D ]}|j| kr |j  S q d S )Nr   rJ   )rC   )rL   r6   rM   rC   Ziter_subclassesui_namer7   )rS   r6   rC   rH   r   r   r   get_class_name_by_ui_namej   s    
rT   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>   r8   rE   r?   isdigitlen)rX   rH   rF   rG   resZcode_numberr   r   r   get_obj_by_codes   s     rb   _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 )rZ   N)isalnumlower).0csepr   r   	<genexpr>   s     z!translit_strip.<locals>.<genexpr>)transliterateZtranslitjoin)textrl   ra   r   rk   r   translit_strip   s    rq   )rp   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controlsrX   ZaudioZvideopbrZinsdelZfigureZ
figcaption)rp   tags
attributes)bleachZALLOWED_ATTRIBUTESZALLOWED_TAGSappendZclean)rp   ry   rx   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)rE   r   )Zattrsnewru   r   r   r   
set_target   s    
zlinkify.<locals>.set_target)Z	callbacks)F)r   linkify)rp   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dumpsrN   items)rF   rG   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()TrU   FuR   DEV: FATAL Попытка lock_ping() на отсутствующую записьi  	locked_byuJ   DEV: FATAL Попытка lock_ping() на чужую блокировку	ping_time)APPREDIS_DBredislockacquirerB   includer]   r,   releaser   debugr   loadsrE   current_personr;   r   r0   r   r1   setr   )keyrG   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   rE   )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   TrU   Fr   r   )r;   u[   Редактирование временно невозможно.
Редактирует u`   DEV: WARNING lock() попытка захватить свою блокировку дважды)r   r   r   r   r   r   r;   r   r   r0   r   r1   r   rB   r   r]   r,   r   r   rE   total_secondsr   r6   Z	CmfPersonnamer   r   )r   Zlock_timeoutr   r   r   r   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()TrU   Fus   DEV: WARNING unlock() попытка разблокировать несуществующую блокировкуr   r   r   )r   r   r   r   r   rB   r   r]   r,   r   r   r   rE   r   r0   r   r1   r   r   r   r;   delete)r   rG   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)rL   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   0  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: 
rU   )configZBZPYTHON_ENABLEDrQ   r   r   Zrelaxed_bz_python_moder   r   r   r   dictglobalsrB   r   r]   updatereplaceexec	ExceptionrA   Z
base_errorZCmfAbortError	traceback
format_exc)rX   objZcode_src_objrG   Zprev_disable_raise_lazyloadr   r   r   r   ler   Ztracer   r   r   exec_bzpython4  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   rf   r   r[   r=   )maxsplitrZ   )docZDOCCmfDocument)ZflZFLZIN_WORK	CmfFolder)CmfListZEPIZsharelink_hashr;   rX   )r   pathr?   r   ZqueryrE   rsplitr6   r   r   r   rI   r7   rb   )
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_objj  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)rc   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 )N 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   strip)r   r   r   r   r   r     s    r   )r   c              	   C   sZ   t j }|j D ]@}|r:t jj||jjd| | dd qt jj|jjd| | dd qd S )Nu   Ошибкаr   )r   	person_idr   msgrp   priority)r   r   r   rp   r   )	r6   ZCmfPersonGroupZadmin_groupZ
rg_membersZ
all_nestedZ	CmfNotifyZplace_notifyr;   r   )r   r   Z	admin_grpr   r   r   r   admin_alert  s$    
r   )N)N)rc   )N)F)N)1r   Zurllib.parser   r   rB   rz   rn   r   r   r   Zflaskr   pathlibr   Zcmf.cmf_profiler	   r
   r   rL   ZCrypto.Cipherr   r   r   r   r%   r'   r8   r<   r9   rI   rR   rT   rb   rq   r>   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sL   

	


'"
6
5