U
    [c"                     @   s  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 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 Zd)ddZdd ZeedddZdd Zdd  Zd!d" Zd#d$ Zd%d& ZG d'd( d(Z dS )*    N)urlparse)datetimetimezone)Linker)g)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dZddddZdd Zdd	 ZdS )
enable_import_modeu   Режим импортаNr   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%   r   r   r   r   r   1   s    zenable_import_mode.__enter__c                 C   s   | j t_d S r   )r%   r   r&   r   r   r   r   r   6   s    zenable_import_mode.__exit__r   r   r   r   r   r$   ,   s   r$   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_idr'   r(   idr)   r   r   r   get_model_by_id>   s    r.   c                 C   s   t | dd }|S )N:r   )strsplitr,   r   r   r   r+   C   s    r+   c                 O   s:   t | tjjr| j }n|  }t|}|j|d|i|S )Nr-   )
isinstancecmfr(   Z	CmfEntityr-   r.   get)r-   argskwargsZtuuidmodelr   r   r   get_obj_by_idH   s
    
r8   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   )r(   )BaseModelMetaN)
cmf.includer(   Zcmf.models.base_modelr9   sorted__dict__keysgetattrr2   Zabstract)Zmodel_filterr(   r9   Z
model_namer7   r   r   r   iter_modelsQ   s    
r?   c                 C   s$   t j| ddd}ddd |D S )NruT)Zlanguage_codereversed c                 s   s"   | ]}|  r| nd V  qdS )_N)isalnumlower).0cr   r   r   	<genexpr>`   s     z!translit_strip.<locals>.<genexpr>)transliterateZtranslitjoin)textresr   r   r   translit_strip^   s    rM   )rK   r   c                 C   s   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 t j| t j|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newpr   r   r   
set_targetd   s    
zclean_text.<locals>.set_targetsrcwidthZheightZimgr   timeZcontrolscodeZaudioZvideorQ   brZinsdelZfigureZ
figcaption)rK   tags
attributes)Z	callbacks)F)bleachZALLOWED_ATTRIBUTESZALLOWED_TAGSappendZcleanr   Zlinkify)rK   rR   rZ   rY   Zlinkerr   r   r   
clean_textc   s(    











r]   c                    s   i  fdd}|S )Nc                     s4   t | t| f}|kr, | ||< | S r   )pickledumpsr;   items)r5   r6   hashfuncZmemoryr   r   memo   s    zmemoized.<locals>.memor   )rc   rd   r   rb   r   memoized   s    re   c                 K   s   t jj}d|  }|jddd}| s<tjjddd dS ||sb|	  tjjd	dd 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()TabortFuP   DEV: FATAL Попытка lock_ping() на отсутсвующую запись	locked_byuJ   DEV: FATAL Попытка lock_ping() на чужую блокировку	ping_time)APPREDIS_DBredislockacquirer3   include	cmf_alertexistsreleaser^   loadsr4   r   current_personr-   r   nowr   utcsetr_   keyr6   redis_db_keyrs   	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 не реализованаrf   N)
ValueErrorrp   rq   rr   rw   r^   ry   r4   )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:
    rf   rg   rh   ri   )rn   Z
lock_startro   lock_timoutrk   Trl   Fro   rn   )r-   u[   Редактирование временно невозможно.
Редактирует u`   DEV: WARNING lock() попытка захватить свою блокировку дважды)rp   rq   rr   rs   r   rz   r-   r   r   r{   r   r|   rt   r3   ru   rv   rw   r^   ry   r4   total_secondsrx   r(   Z	CmfPersonnamer}   r_   )r   Zlock_timeoutr   r   rs   r   Zpersonr   r   r   rs      s2    



rs   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:
    rf   rg   rh   ri   z*DEV: FATAL unlock(): if not lock.acquire()Trl   Fus   DEV: WARNING unlock() попытка разблокировать несуществующую блокировкуro   r   rn   )rp   rq   rr   rs   rt   r3   ru   rv   rw   rx   r^   ry   r4   r   r{   r   r|   r   r   rz   r-   deleter~   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   )rq   ri   )r:   rq   rr   rs   
redis_lock)r   r   rj   rq   r   r   r   r      s    zCmfLock.__init__c                 C   s    | j  std| j j d S )NzCannot lock )r   rt   ZCmfErrorr   r   r   r   r   r     s    
zCmfLock.__enter__c                 C   s   | j   d S r   )r   rx   r   r   r   r   r     s    zCmfLock.__exit__)r   r   r   r   r   r   r      s   r   )N)!r^   Zurllib.parser   r3   r[   rI   r   r   r   Zflaskr   Zcmf.cmf_profiler   r   r	   r:   r   r"   r$   r*   r.   r+   r8   r?   rM   r0   r]   re   r   r   rs   r   r   r   r   r   r   <module>   s2   	
	&"