B
    f                 @   s>   d dl Z d dlmZ d dlT d dlmZ G dd dejZdS )    N)Decimal)*)	cmf_transc                   sJ  e Zd Zejjdg ZedH fdd	Zdd Zdd Z	d	d
 Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Z d7d8 Z!g fd9d:Z"d;d< Z#d=d> Z$d?d@ Z%dAdB Z&dCdD Z'e(ddddEdFdGZ)  Z*S )ICmfTranstrans_ui_form_getNc                sR   |dkr6|sg }d }|r$| dd }|r6|dd|gg}t j|f|||d|S )N)status_fromZ	status_toworkflow_idZworkflow=)filtermodels_listobject_fields)getsuperfield_options_list)clsZrelation_field_namer
   r   r   kwargsr   )	__class__ ./common/models/cmf_trans.pyr      s    zCmfTrans.field_options_listc             C   s8   t |j}t|}ddd|jg|g}t|j|dS )NANDidr	   )r
   )cmfutilZget_model_by_name
class_nameZjsonloadsr   boolr   )selfZbql_strobjZmodelZ
filter_bqlr   r   r   _trans_ok_bql   s    
zCmfTrans._trans_ok_bqlc       
      C   s  d}t jjddd|jgddtjjgggdd}|r6d}|jd	ksF|jsJ|S | S d S ]$}t|t j	rttj|k}n t|t j
r|tjjk}nt|t jrtj|jk}nt|t jrZt|j }t }x|rV| }|| t|t jrtj|jk}|rTP qt|t jrBx<|j D ]}	|	|kr"||	 q"W qtd
| dd qW ntd| d|j dd |rTP qTW |jd	ks|js|S | S d S )NFr   r   r	   wz_value_objINT)r
   cache_inmemory)z1 =z5 >=z6 <=z7 INz9 LIKEz	11 REGEXPz:DEV: FATAL _trans_filter_ok_current_user Unsupported obj: )abortz@DEV: FATAL _trans_filter_ok_current_user Unsopported obj_class:  )modelsCmfTransFilterr   r   gZcurrent_personwz_conditionr   
isinstanceZ	CmfPersonZCmfPersonGroupZrg_member_ofZCmfRoleZpersonZ
CmfOrgUnitsetZ
tree_nodesloadpopadd	cmf_alertr   )
r   r
   r   resZ
search_objZ	value_objZnodesZchecked_nodesZnodeZ_noder   r   r   _trans_filter_ok_current_user$   sT    


z&CmfTrans._trans_filter_ok_current_userc          
   C   sf  t ||jj j}|d kr d}|jjdd }|jj}|d krFd}|dkrd|s\t| S ||kS |dkr|sxt|S ||kS |dkr||kS |dkr||k S |dkr||kS |d	kr||kS |d
kr||kS |dk r||kS |dk r||kS |dkr||kS |dkrryt	|}W nD tj
k
rb } z"td| d| d| dd W d d }~X Y nX t||S |dkryt	|}W nD tj
k
r } z"td| d| d| dd W d d }~X Y nX t|| S |dkrt| S |dkrt|S |dkr*||jjko(||jjkS |dkrP||jjkoL||jjk S td| dd d S )N r"      r	   z!=><z>=z<=r   zNOT INLIKEzNOT LIKEREGEXPu   Ошибка в условии uC   : некорректное регулярное выражение z: T)r!   z
NOT REGEXPIS_NULLNOT_NULLBETWEENNOT_BETWEENz@DEV: FATAL _trans_field_compare_text unknown clean_wz_condition=)getattrwz_field_namevaluer)   r&   	partitionwz_value_textr   recompileerrorr,   searchZwz_start_valueZwz_end_value)r   
trans_metar   obj_valclean_wz_conditionZvalidator_valZregexper   r   r   _trans_field_compare_text\   sh    




0
0




z"CmfTrans._trans_field_compare_textc             C   s"  t ||jjj}yt|jj}W n0 tk
rP   td| d|jj dd Y nX |jjdd }|dkrt||kS |dkr||kS |d	kr||kS |d
kr||k S |dkr||kS |dkr||kS |dk rtd| d| ddd n2|dkrtd| d| ddd n
|dkr:td| d| ddd n|dkr`td| d| ddd n|dkrtd| d| ddd n|dkrtd| d| ddd nr|dkrt	| S |dkrt	|S |dkr||ko||kS |dkr||ko||k S td| dd d S )Nu!   Ошибка в Действии u4   : значние должно быть числом T)r!   r"   r0   r	   z!=r1   r2   z>=z<=r   u   Ошибка в условии z: uE    не поддерживается для цифровых полейzNOT INr3   zNOT LIKEr4   z
NOT REGEXPr5   r6   r7   r8   zCDEV: FATAL _trans_field_compare_numeric unknown clean_wz_condition=)
r9   r:   r;   r   r=   
ValueErrorr,   r&   r<   r   )r   rB   r   rC   valrD   r   r   r   _trans_field_compare_numeric   sR    










z%CmfTrans._trans_field_compare_numericc             C   s  t ||jjj}t|}|jjs&d}nH|jj dkr<d}n2|jj dkrRd}ntd| d|jj dd |jjdd	 }|d
kr||kS |dkr||kS |dkrtd| d| ddd n|dkrtd| d| ddd n|dkrtd| d| ddd n|dkr<td| d| ddd nj|dkrdtd| d| ddd nB|dkrtd| d| ddd n|dkrtd| d| ddd n|dkrtd| d| ddd n|dkrtd| d| ddd n|dkr$td| d| ddd n|dkr6|d kS |dkrH|d k	S |dkrntd| d| ddd n8|dkrtd| d| ddd ntd| dd d S )NF)0falseu   нет)1trueu   даTu!   Ошибка в Действии uQ   : значние должно быть Boolean (0, 1, true, false, да, нет) )r!   r"   r0   r	   z!=r1   u   Ошибка в условии z: u<    не поддерживается для Boolean полейr2   z>=z<=r   zNOT INr3   zNOT LIKEr4   z
NOT REGEXPr5   r6   r7   r8   zCDEV: FATAL _trans_field_compare_boolean unknown clean_wz_condition=)	r9   r:   r;   r   r=   lowerr,   r&   r<   )r   rB   r   rC   Zobj_val_boolrH   rD   r   r   r   _trans_field_compare_boolean   sZ    











z%CmfTrans._trans_field_compare_booleanc             C   s  t ||jj j}|j }tdd |D }tdd |D }|jjdd }|dkrd||kS |dkrt||kS |dkr||kS |d	kr||k S |d
kr||kS |dkr||kS |dkr||kS |dkr||kS |dk rtd| d| ddd n|dkr td| d| ddd n|dkrFtd| d| ddd n|dkrltd| d| ddd n|dkrt	| S |dkrt	|S |dkrtd| d| ddd n8|dkrtd| d| ddd ntd| dd d S )Nc             S   s   g | ]}|j jqS r   )r   r;   ).0or   r   r   
<listcomp>  s    z5CmfTrans._trans_field_compare_m2m.<locals>.<listcomp>c             S   s   g | ]}|j jqS r   )r   r;   )rP   rQ   r   r   r   rR     s    r"   r0   r	   z!=r1   r2   z>=z<=r   zNOT INr3   u   Ошибка в условии z: u8    не поддерживается для m2m полейT)r!   zNOT LIKEr4   z
NOT REGEXPr5   r6   r7   r8   z?DEV: FATAL _trans_field_compare_m2m unknown clean_wz_condition=)
r9   r:   r;   r)   r   r(   r&   r<   r,   r   )r   rB   r   rC   val_listZobj_val_id_setval_list_id_setrD   r   r   r   _trans_field_compare_m2m   sL    









z!CmfTrans._trans_field_compare_m2mc                sr  t | jj j} j tdd D } fdd} jjdd }|dkrj|  |d kS |d	kr|  |d kS |d
krtd  d| ddd n|dkrtd  d| ddd n|dkrtd  d| ddd nx|dkrtd  d| ddd nP|dkr4|j	j|kS |dkrJ|j	j|kS |dkrrtd  d| ddd  n|dkrtd  d| ddd n|dkrtd  d| ddd n|dkrtd  d| ddd n|dkrt
| S |dkr
t
|S |dkr0td  d| ddd n>|dkrVtd  d| ddd ntd  d| dd d S )Nc             S   s   g | ]}|j jqS r   )r   r;   )rP   rQ   r   r   r   rR   .  s    z4CmfTrans._trans_field_compare_fk.<locals>.<listcomp>c                  s(   t dkr$td  d dd d S )N   u   Ошибка в условии u:    должен быть только один объект T)r!   )lenr,   r   )rB   rS   r   r   Z__check_one_item0  s    z:CmfTrans._trans_field_compare_fk.<locals>.__check_one_itemr"   r0   r	   r   z!=r1   u   Ошибка в условии z: u7    не поддерживается для fk полейT)r!   r2   z>=z<=r   zNOT INr3   zNOT LIKEr4   z
NOT REGEXPr5   r6   r7   r8   z#DEV: FATAL _trans_field_compare_fk z unknown clean_wz_condition=)r9   r:   r;   r)   r   r(   r&   r<   r,   r   r   )r   rB   r   rC   rT   Z_CmfTrans__check_one_itemrD   r   )rB   rS   r   _trans_field_compare_fk+  sP    












z CmfTrans._trans_field_compare_fkc             C   s@  |j |jkrdS |jsdS t||jj}t|tjj	rB| 
||S t|tjjr\| ||S t|tjjrv| ||S t|tjjr| ||S t|tjjr| ||S t|tjjrtd| dt| dd nJt|tjjrtd| dt| dd nt|tjjr | ||S td| dt| dd d S )NFz0DEV: FATAL _trans_field_compare NotImplemented: r"   T)r!   uH   DEV: FATAL _trans_field_compare Неизвестный тип поля: )r   cmf_model_namer&   r9   r:   r;   r'   cmffields
CmfM2MBaserU   
CmfRelBaserX   CmfStrrF   CmfIntrI   
CmfNumericCmfDateTimer,   typeCmfDateCmfBoolrO   )r   rB   r   fieldr   r   r   _trans_field_compare^  s,    zCmfTrans._trans_field_comparec             C   s6   | j d j sdS tjj|ddgd}|o4|jdkS )Nr   T
resolution)r   is_cur_approver[   approved)r   need_approver)   r#   
CmfApprover   rg   )r   r
   r   aggreg_fullr   r   r   _trans_filter_approved{  s    zCmfTrans._trans_filter_approvedc             C   s6   | j d j sdS tjj|ddgd}|o4|jdkS )Nr   Trg   )r   rh   r[   rejected)r   rj   r)   r#   rk   r   rg   )r   r
   r   rl   r   r   r   _trans_filter_rejected  s    zCmfTrans._trans_filter_rejectedc             C   s   |  ||S )N)rf   )r   r
   r   r   r   r   _trans_filter_ok_field  s    zCmfTrans._trans_filter_ok_fieldc             C   s   dS )NFr   )r   r
   r   r   r   r   _trans_filter_ok_always_false  s    z&CmfTrans._trans_filter_ok_always_falsec             C   s   |  |jj|S )N)r   bqlr;   )r   r
   r   r   r   r   _trans_filter_ok_bql  s    zCmfTrans._trans_filter_ok_bqlc             C   s@   t jr<||}| }|r8tjs*|t_nttj|t_|S dS )NF)configBZPYTHON_ENABLEDeval_bzpythonZget_bzpython_jscache_timelifer%   jscache_timelifemin)r   r
   r   r-   rw   r   r   r   _trans_filter_ok_eval  s    
zCmfTrans._trans_filter_ok_evalc             C   s   t ddd d S )Nz,DEV: Not supported _trans_filter_ok_union_orT)r!   )r,   )r   r
   r   r   r   r   _trans_filter_ok_union_or  s    z"CmfTrans._trans_filter_ok_union_orc             C   s   t ddd d S )Nz-DEV: Not supported _trans_filter_ok_union_andT)r!   )r,   )r   r
   r   r   r   r   _trans_filter_ok_union_and  s    z#CmfTrans._trans_filter_ok_union_andc             C   s  t tdd }dt_d}xptjj| dgddgddD ]P}|jsBq4|jjdd }|d	krl| 	||}n|d
kr| 
||}n|dkr| ||}n|dkr| ||}n|dkr| ||}n|dkr
|jjr|jj}|jj|_| ||}||_n| ||}nt|dkr"| ||}n\|dkr:| ||}nD|dkrR| ||}n,|dkrj| ||}ntd|j dd |s4|S q4W |t_|S )Ndisable_raise_lazyloadTordernor   r   )
transitionorderbyr[   r    r"   r0   Zcurrent_userre   Zalways_falseprev_statusrr   evalZunion_orZ	union_andri   rn   z5DEV: FATAL trans_filter_ok unknown filter.logic_type=)r!   )r9   r%   r|   r#   r$   list
logic_typer;   r<   r.   rp   rq   _trans_prev_statusrs   status
is_changedoldry   rz   r{   rm   ro   r,   )r   r   prev_disable_raise_lazyloadr-   r
   clean_logic_typeZ
new_statusr   r   r   trans_filter_ok  sL    





zCmfTrans.trans_filter_okc             C   s   |  ||S )N)rf   )r   	validatorr   r   r   r   _trans_validator_field  s    zCmfTrans._trans_validator_fieldc             C   s  |j  }|sdS |j j}|s&i }|dd}|dd}|dd}d}|jjrZd}d}	|r|jj|krrd}	|r||	 S |	S x|D ]}
ddd|
jj d	 g}|sddd
|
jj d	 g}|r|st	j
jdd|g|gd}|dkrd}	P qt	j
jdd|g|gdsd}	P qW |r|	 S |	S )NTinclude_current_statusFreverse_rulemost_recent_status_onlyZ
audit_dataz
SIMILAR TOz%{"status":{[^}]*"z"%z%{"status":{[^}]*old":"parentr	   )r
   rV   )r   r)   wz_prev_status_optionsr;   r   r   r   r   r   r#   ZCmfAuditcount)r   rB   r   Zstatus_listr   r   r   r   Z
audit_doner-   r   Zstatus_filterr   r   r   r   r     sL    



zCmfTrans._trans_prev_statusc             C   s   t ddd dS )Nz4DEV: Not supported _trans_validator_trans_form_fieldT)r!   )r,   )r   r   r   r   r   r   !_trans_validator_trans_form_field  s    z*CmfTrans._trans_validator_trans_form_fieldc             C   s\   |  |jj|}|sX|jr(t|jdd |j  td|jj d|j d|j dd |S )NT)r!   u   Переход "u/   " запрещен UBQL-Валидатором u    у объекта )	r   rr   r;   error_messager,   r~   r)   namecode)r   r   r   r-   r   r   r   _trans_validator_bql  s    
&zCmfTrans._trans_validator_bqlc             C   s   t jr||S dS )NF)rt   ru   rv   )r   r   r   r   r   r   _trans_validator_eval"  s    
zCmfTrans._trans_validator_evalc          	   C   s:  t tdd }dt_d}xtjj| dgdgddD ]}|js<q0|jjdd }|dkrd| 	||}nl|d	krz| 
||}nV|d
kr| ||}n@|dkr| ||}n*|dkr| ||}ntd|j dd |s0P q0W |t_|rd S |jrt|jdd |j  td|j d|jj d|jj d|j dd d S )Nr|   Tr}   r   )r~   r   r[   r    r"   r0   re   r   Ztrans_form_fieldrr   r   z;DEV: FATAL trans_validator_ok unknown validator.logic_type=)r!   u7   Ошибка выполнения Валидатора u    для перехода u    у объекта z: )r9   r%   r|   r#   ZCmfTransValidr   r   r;   r<   r   r   r   r   r   r,   r   r~   r)   r   r   )r   r   r   Zvalidr   r   r   r   r   trans_validator_ok'  s6    
zCmfTrans.trans_validator_okc             C   s  d}|j jdd }|dkr2t||jjg  dS |dkrX|j }t||jj| dS |dkrt||jj }|j }x"|D ]}||kr|| d}qW |S |dkrt||jj }|j }x"|D ]}||kr|	| d}qW |S t
d	|j d
| dd d S )NFr"   r0   clearTz:=)ZaddItemr+   )ZdelItemdeluX   DEV: FATAL _trans_action_field_m2m неподдерживаемое действие в z wz_operate=)r!   )
wz_operater;   r<   setattrr:   r   r)   r9   appendremover,   r   )r   actionr   has_changesclean_wz_operaterH   re   rS   r   r   r   _trans_action_field_m2mH  s4    






z CmfTrans._trans_action_field_m2mc             C   s  |j jdd }|dkr.t||jjd  dS |dkr|j }t|dkrdtd| d| dd	 |std| d
| dd	 t||jj|d  dS |dkr"t	||jj }|j
rdS |j }t|dkrtd| d| dd	 |s
td| d
| dd	 t||jj|d  dS |dkr|t	||jj }|j }x.|D ]&}||jkrNt||jjd  dS qNW dS td|j d| dd	 d S )Nr"   r0   r   Tz:=rV   u!   Ошибка в Действии u:    должен быть только один объект )r!   u8    не указан обьект для значения r   r+   Fr   uW   DEV: FATAL _trans_action_field_fk неподдерживаемое действие в z wz_operate=)r   r;   r<   r   r:   r   r)   rW   r,   r9   Zis_not_nullr   )r   r   r   r   rH   re   rS   r   r   r   _trans_action_field_fke  sP    






zCmfTrans._trans_action_field_fkc             C   s  |j jdd }|dkr.t||jjd  dS |dkrLt||jj|j dS |dkrt||jj}|jj}|srdS |jd | }t||jj| dS |dkrt||jj}|jj}|sdS ||jkr|j|d	}t||jj| dS dS td
|j	 d| dd d S )Nr"   r0   r   Tz:=r+   Fr   r/   uY   DEV: FATAL _trans_action_field_text неподдерживаемое действие в z wz_operate=)r!   )
r   r;   r<   r   r:   r=   r9   replacer,   r   )r   r   r   r   re   rH   new_valr   r   r   _trans_action_field_text  s4    
z!CmfTrans._trans_action_field_textc       	         s  |j jdd }t||jjj}|s*d}|dkrFt||jjd  dS yt|jj}W n0 tk
r   t	d| d|jj dd Y nX |d	krt||jj| dS |d
kr0||  |r |kr }t
|}tt fdd|}|r|d  n|d  t	d|jj d| d   t||jj  dS |dkr||  |r |kr }t
|}tt fdd|}|r|d  n|d  t	d|jj d| d   t||jj  dS t	d|j d| dd d S )Nr"   r0   r   r   Tu!   Ошибка в Действии u4   : значние должно быть числом )r!   z:=)Zincr+   c                s   |  kS )Nr   )x)r   r   r   <lambda>      z6CmfTrans._trans_action_field_numeric.<locals>.<lambda>u5   Действие пыталось выставить uC    в недопустимое значение для выбора: u<   . Выставили ближайшее доступное: )Zdecr   c                s   |  kS )Nr   )r   )r   r   r   r     r   u\   DEV: FATAL _trans_action_field_numeric неподдерживаемое действие в z wz_operate=)r   r;   r<   r9   r:   r   r   r=   rG   r,   sortedr   r
   r   )	r   r   r   choice_limitr   Z
prev_valuerH   Zbad_valZnew_val_tmpr   )r   r   _trans_action_field_numeric  sR    



z$CmfTrans._trans_action_field_numericc             C   s   |j jdd }|jjs d}nH|jj dkr6d}n2|jj dkrLd}ntd| d|jj dd	 |d
krt||jjd  dS |dkrt||jj| dS td|j d| dd	 d S )Nr"   r0   F)rJ   rK   u   нет)rL   rM   u   даTu!   Ошибка в Действии uQ   : значние должно быть Boolean (0, 1, true, false, да, нет) )r!   r   z:=u\   DEV: FATAL _trans_action_field_boolean неподдерживаемое действие в z wz_operate=)	r   r;   r<   r=   rN   r,   r   r:   r   )r   r   r   r   rH   r   r   r   _trans_action_field_boolean  s"    z$CmfTrans._trans_action_field_booleanc             C   sf  |j |jkrdS |jsdS t||jj}t|tjj	rB| 
||S t|tjjr\| ||S t|tjjrv| ||S t|tjjr| j|||j dS t|tjjr| ||S t|tjjr| ||S t|tjj rtd| dt| dd nJt|tjjr*td| dt| dd nt|tjjrF| ||S td| dt| dd d S )NF)r   zDEV: FATAL NotImplemented: r"   T)r!   u3   DEV: FATAL Неизвестный тип поля: )r   rY   r   r9   r:   r;   r'   rZ   r[   r\   r   r]   r   r^   r   ZCmfChoiceIntr   choiceskeysr_   r`   ra   r,   rb   rc   rd   r   )r   r   r   re   r   r   r   _trans_action_field  s0    zCmfTrans._trans_action_fieldc             C   s   t jr|| dS dS )NTF)rt   ru   rv   )r   r   r   r   r   r   _trans_action_eval7  s    
zCmfTrans._trans_action_evalc             C   s   d}t ddd |S )NFz(DEV: Not supported _trans_action_webhookT)r!   )r,   )r   r   r   r   r   r   r   _trans_action_webhookB  s    zCmfTrans._trans_action_webhookc             C   s   t tdd }dt_d}xtjj| dgdgddD ]v}|jdkrP|| ||O }q0|jdkrl|| ||O }q0|jd	kr|| 	||O }q0|jsq0q0t
d
|j dd q0W |t_|S )Nr|   TFr}   r   )r~   r   r[   r    re   r   Zwebhookz7DEV: FATAL trans_run_actions unknown action.logic_type=)r!   )r9   r%   r|   r#   ZCmfTransActionr   r   r   r   r   r,   )r   r   r   r   r   r   r   r   trans_run_actionsG  s    


zCmfTrans.trans_run_actions)obj_id
obj_fieldsuser_form_inputc       
         sf  t jj|ddi|}|jrb| rbxHt jt|jjD ]0}d|kr:x"|d D ]}||krP|| qPW q:W |d t	j
d| |d}tt |j j||jd|_|r8x| D ]\ }	 fdd|D t|	trd	|	krt	j
d|	d	 d}	n2|	r(t|	tr(d	|	d
 kr(fdd|	D }	t| |	 qW tt drXt jj|||jd |j|j_|S )Nr    Tr[   Zis_dummy)simpler   r[   )Zui_formc                s2   g | ]*}|   d r|t  d d qS ).N)
startswithrW   )rP   f)kr   r   rR   v  s    z.CmfTrans.trans_ui_form_get.<locals>.<listcomp>r   r   c                s    g | ]}t jd |d  dqS )Tr   )r   r   r[   )r   get_obj_by_id)rP   i)relation_fieldsr   r   rR   z  s    CmfAutomationUiForm)r~   cmf_ui_form)r#   r   r   r   Z	CmfUiFormZget_ui_group_fieldsstrr   r   r   r   varsr   Z_build_ui_formZui_form_jsonitemsr'   dictr   r   hasattrr   Zui_get_hook)
r   r   r   argsr   Z	trans_objZ	gr_fieldsZ
field_namer   vr   )r   r   r   r   [  s,    
 
zCmfTrans.trans_ui_form_get)NNN)+__name__
__module____qualname__r   r   Zapi_methodsclassmethodr   r   r.   rF   rI   rO   rU   rX   rf   rm   ro   rp   rq   rs   ry   rz   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   staticmethodr   __classcell__r   r   )r   r   r      sL   8A.4,318	!-96r   )r>   decimalr   Zcmf.includeZcommon.fieldsr   r   r   r   r   r   <module>   s   