U
    k/i	                     @   s"   d dl T d dlZG dd dZdS )    )*Nc                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	EvaTestCodeMixinu0  
    Миксин для генерации кодов EvaTest-объектов:
    <task_code_prefix>-<code_prefix модели>-<номер без нулей>, с нумерацией по проекту.
    Ожидается, что у модели есть поля project_id и code_prefix.
    c                 C   sD   | j dddgdd| jggdgdd}d	}|r@t|jd
d }|S )u  
        Возвращает максимальный числовой суффикс кода объекта в рамках проекта.
        Нумерация ведётся по проекту, формат кода: <PRJ_PREFIX>-XXX-<N>.
        codez
SIMILAR TOz
%-[0-9]+\Zproject=z-cmf_created_atT)filterZorder_byZinclude_deletedr   -)sget
project_idintr   split)selflastZ
max_number r   2./modules/evatest/models/cmf_evatest_code_mixin.py _get_current_code_number_from_db   s    
z1EvaTestCodeMixin._get_current_code_number_from_dbc                 C   s   t j}| jj}d| j d| }| j d| d}|jj|dd}|  z2||rb||}n|  d
 }||| W 5 z|  W nF tj	j
k
r } z$td| d|j d|j  W 5 d	}~X Y nX X | S )u   
        Высчитывает следующий номер для кода объекта.
        Нумерация ведётся по проекту, без ведущих нулей.
        znext_code_number-r   z.lock   )timeoutzlock release error z, lock_name z
, timeout N   )APPZREDIS_DBr   value
class_nameredislockacquirerelease
exceptionsZ	LockErrorgdebugnamer   existsZincrr   set)r   Zredis_dbsuffixkeyZlock_keyr   enext_code_numberr   r   r   r&      s$    
z!EvaTestCodeMixin.next_code_numberc                 C   s    t | j}|jj d| j S )u   
        Формирует префикс кода объекта:
        <префикс задач проекта>-<code_prefix модели>, например TEM-TC.
        r   )r   Zget_cache_projectr   Ztask_code_prefixr   Zcode_prefix)r   r   r   r   r   get_code_prefix9   s    z EvaTestCodeMixin.get_code_prefixN)__name__
__module____qualname____doc__r   r&   r'   r   r   r   r   r      s   r   )Zcmf.includer   r   r   r   r   r   <module>   s   