
    a.i	                     *    d dl  d dlZ G d d      Zy)    )*Nc                   "    e Zd ZdZd Zd Zd Zy)EvaTestCodeMixinu0  
    Миксин для генерации кодов EvaTest-объектов:
    <task_code_prefix>-<code_prefix модели>-<номер без нулей>, с нумерацией по проекту.
    Ожидается, что у модели есть поля project_id и code_prefix.
    c                     | j                  g ddd| j                  ggdgd      }d}|r't        |j                  j	                  d      d	         }|S )
u  
        Возвращает максимальный числовой суффикс кода объекта в рамках проекта.
        Нумерация ведётся по проекту, формат кода: <PRJ_PREFIX>-XXX-<N>.
        )codez
SIMILAR TOz
%-[0-9]+\Zproject=z-cmf_created_atT)filterorder_byinclude_deletedr   -)sget
project_idintr   split)selflast
max_numbers      2./modules/evatest/models/cmf_evatest_code_mixin.py _get_current_code_number_from_dbz1EvaTestCodeMixin._get_current_code_number_from_db   sd    
 yy5C1 ((   
 
TYY__S1"56J    c                 J   t         j                  }| j                  j                  }d| j                   d| }| j                   d| d}|j
                  j                  |d      }|j                          	 |j                  |      r|j                  |      }n%| j                         dz   }|j                  ||       	 |j                          | S # t
        j                  j                  $ r>}t        j!                  d| d|j"                   d	|j$                          Y d
}~| S d
}~ww xY w# 	 |j                          w # t
        j                  j                  $ r<}t        j!                  d| d|j"                   d	|j$                          Y d
}~w d
}~ww xY wxY w)u   
        Высчитывает следующий номер для кода объекта.
        Нумерация ведётся по проекту, без ведущих нулей.
        znext_code_number-r   z.lock   )timeout   zlock release error z, lock_name z
, timeout N)APPREDIS_DBr   value
class_nameredislockacquireexistsincrr   setrelease
exceptions	LockErrorgdebugnamer   )r   redis_dbsuffixkeylock_keyr"   next_code_numberes           r   r1   z!EvaTestCodeMixin.next_code_number   sy   
 <<&&!$//!2!F8<oo&axu5~~""8R"8	s##+==#5 #'#H#H#JQ#N S"23 ##$ ##-- )!L:dll^\  ##$##-- )!L:dll^\ sO   9AD3 C D022D++D03F"5EF"F#2FF"FF"c                     t         j                  | j                        }|j                  j                   d| j
                   S )u   
        Формирует префикс кода объекта:
        <префикс задач проекта>-<code_prefix модели>, например TEM-TC.
        r   )r   get_cache_projectr   task_code_prefixr   code_prefix)r   r   s     r   get_code_prefixz EvaTestCodeMixin.get_code_prefix9   s=    
 ''8**00143C3C2DEEr   N)__name__
__module____qualname____doc__r   r1   r7    r   r   r   r      s    $%6Fr   r   )cmf.includer!   r   r<   r   r   <module>r>      s     :F :Fr   