U
    Vc@                     @   sF   d dl Z 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                       s  e Zd Zed@ 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.d/ Zd0d1 Zd2d3 Zg fd4d5Zd6d7 Zd8d9 Zd:d; Z d<d= Z!d>d? Z"  Z#S )ACmfTransNc                    sR   |dkr6|sg }d }|r$| dd }|r6|dd|gg}t j|f|||d|S )N)status_from	status_toworkflow_idworkflow=)filtermodels_listobject_fields)getsuperfield_options_list)clsrelation_field_namer   r   r   kwargsr   	__class__ #/opt/crm/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   )cmfutilget_model_by_name
class_nameastliteral_evalr   boolr   )selfbql_strobj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}|r4d}|jd	ksD|jsH|S | S d S ] }t|t j	rptj|k}nt|t j
r|tjjk}nt|t jrtj|jk}nt|t jrPt|j }t }|rj| }|| t|t jrtj|jk}|rLqjqt|t jr:|j D ]}	|	|kr||	 qqtd
| dd qntd| d|j dd |rR qvqR|jd	ks|js|S | S d S )NFr   r   r
   wz_value_objINr   T)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   gcurrent_personwz_conditionr&   
isinstance	CmfPersonCmfPersonGrouprg_member_ofCmfRoleperson
CmfOrgUnitset
tree_nodesloadpopadd	cmf_alertr   )
r!   r   r#   resZ
search_objZ	value_objnodesZchecked_nodesnode_noder   r   r   _trans_filter_ok_current_user    sX    


z&CmfTrans._trans_filter_ok_current_userc              
   C   s`  t ||jj j}|jjdd }|dkr:||jjkS |dkrN||jjkS |dkrb||jjkS |dkrv||jjk S |dkr||jjkS |dkr||jjkS |d	kr||jjkS |d
kr||jjkS |dkr|jj|kS |dk r|jj|kS |dkrdzt|jj}W nH tj	k
rT } z&t
d| d|jj d| dd W 5 d }~X Y nX t||S |dkrzt|jj}W nH tj	k
r } z&t
d| d|jj d| dd W 5 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rJ||jjkoF||jjk S t
d| dd d S )Nr*      r
   !=><>=<=r'   NOT INLIKENOT LIKEREGEXP   Ошибка в условии uC   : некорректное регулярное выражение : Tr(   
NOT REGEXPIS_NULLNOT_NULLBETWEENNOT_BETWEENz@DEV: FATAL _trans_field_compare_text unknown clean_wz_condition=)getattrwz_field_namevaluer9   r/   	partitionwz_value_textrecompileerrorr<   r    searchwz_start_valuewz_end_value)r!   
trans_metar#   obj_valclean_wz_conditionregexper   r   r   _trans_field_compare_textX   sV    

4
4




z"CmfTrans._trans_field_compare_textc                 C   s"  t ||jjj}z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 )N!   Ошибка в Действии 4   : значние должно быть числом Tr(   r*   rB   r
   rC   rD   rE   rF   rG   r'   rL   rM   uE    не поддерживается для цифровых полейrH   rI   rJ   rK   rN   rO   rP   rQ   rR   zCDEV: FATAL _trans_field_compare_numeric unknown clean_wz_condition=)
rS   rT   rU   r   rW   
ValueErrorr<   r/   rV   r    )r!   r^   r#   r_   valr`   r   r   r   _trans_field_compare_numeric   sT    










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   даTrd   Q   : значние должно быть Boolean (0, 1, true, false, да, нет) r(   r*   rB   r
   rC   rD   rL   rM   u<    не поддерживается для Boolean полейrE   rF   rG   r'   rH   rI   rJ   rK   rN   rO   rP   rQ   rR   zCDEV: FATAL _trans_field_compare_boolean unknown clean_wz_condition=)	rS   rT   rU   r    rW   lowerr<   r/   rV   )r!   r^   r#   r_   Zobj_val_boolrg   r`   r   r   r   _trans_field_compare_boolean   s\    











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   rU   .0or   r   r   
<listcomp>   s     z5CmfTrans._trans_field_compare_m2m.<locals>.<listcomp>c                 S   s   g | ]}|j jqS r   rr   rs   r   r   r   rv      s     r*   rB   r
   rC   rD   rE   rF   rG   r'   rH   rI   rL   rM   u8    не поддерживается для m2m полейTr(   rJ   rK   rN   rO   rP   rQ   rR   z?DEV: FATAL _trans_field_compare_m2m unknown clean_wz_condition=)
rS   rT   rU   r9   r&   r7   r/   rV   r<   r    )r!   r^   r#   r_   val_listZobj_val_id_setval_list_id_setr`   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   rr   rs   r   r   r   rv   !  s     z4CmfTrans._trans_field_compare_fk.<locals>.<listcomp>c                      s(   t dkr$td  d dd d S )N   rL   :    должен быть только один объект Tr(   )lenr<   r   r^   rw   r   r   Z__check_one_item#  s
    z:CmfTrans._trans_field_compare_fk.<locals>.__check_one_itemr*   rB   r
   r   rC   rD   rL   rM   u7    не поддерживается для fk полейTr(   rE   rF   rG   r'   rH   rI   rJ   rK   rN   rO   rP   rQ   rR   z#DEV: FATAL _trans_field_compare_fk z unknown clean_wz_condition=)rS   rT   rU   r9   r&   r7   r/   rV   r<   r   r    )r!   r^   r#   r_   rx   Z_CmfTrans__check_one_itemr`   r   r}   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*   Tr(   uH   DEV: FATAL _trans_field_compare Неизвестный тип поля: )r   cmf_model_namer/   rS   rT   rU   r0   cmffields
CmfM2MBasery   
CmfRelBaser~   CmfStrrc   CmfIntrh   
CmfNumericCmfDateTimer<   typeCmfDateCmfBoolrq   )r!   r^   r#   fieldr   r   r   _trans_field_compareQ  s,    zCmfTrans._trans_field_comparec                 C   s   |  ||S Nr   r!   r   r#   r   r   r   _trans_filter_ok_fieldo  s    zCmfTrans._trans_filter_ok_fieldc                 C   s   dS )NFr   r   r   r   r   _trans_filter_ok_always_falser  s    z&CmfTrans._trans_filter_ok_always_falsec                 C   s$   |j jdtjjj }| ||S )NCURRENT_USER)bqlrU   replacer-   r.   r   r%   )r!   r   r#   r"   r   r   r   _trans_filter_ok_bqlu  s    zCmfTrans._trans_filter_ok_bqlc                 C   s(   t  }d|d< t|jjt | |d S NFresultlocalsexec	eval_coderU   globals)r!   r   r#   lr   r   r   _trans_filter_ok_evaly  s    zCmfTrans._trans_filter_ok_evalc                 C   s   t ddd d S )Nz,DEV: Not supported _trans_filter_ok_union_orTr(   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_andTr(   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}tjj| dgddgdD ]}|js:q.|jjdd }|d	krb| 	||}n|d
krx| 
||}n|dkr| ||}n|dkr| ||}nl|dkr| ||}nV|dkr| ||}n@|dkr| ||}n*|dkr| ||}ntd|j dd |s.|  S q.|t_|S )Ndisable_raise_lazyloadTordernor   r&   
transitionorderbyr   r*   rB   current_userr   Zalways_falseprev_statusr   evalZunion_orZ	union_andz5DEV: FATAL trans_filter_ok unknown filter.logic_type=r(   )rS   r-   r   r+   r,   list
logic_typerU   rV   rA   r   r   _trans_prev_statusr   r   r   r   r<   )r!   r#   prev_disable_raise_lazyloadr=   r   clean_logic_typer   r   r   trans_filter_ok  s8    
zCmfTrans.trans_filter_okc                 C   s   |  ||S r   r   r!   	validatorr#   r   r   r   _trans_validator_field  s    zCmfTrans._trans_validator_fieldc                 C   sV   |j  }|sdS d}|D ]6}tjjdd|gddd|jj d ggdsd	} qRq|S )
NTparentr
   
audit_dataz
SIMILAR TOz%{"status":{[^}]*"z"%r   F)r&   r9   r+   CmfAuditr   r   rU   )r!   r^   r#   Zstatus_listr=   statusr   r   r   r     s    
zCmfTrans._trans_prev_statusc                 C   s   t ddd dS )Nz4DEV: Not supported _trans_validator_trans_form_fieldTr(   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 d S )NTr(   u   Переход "u.   " запрещен BQL-Валидатором     у объекта )	r%   r   rU   error_messager<   r   r9   namecode)r!   r   r#   r=   r   r   r   _trans_validator_bql  s    
zCmfTrans._trans_validator_bqlc                 C   s(   t  }d|d< t|jjt | |d S r   r   )r!   r   r#   r   r   r   r   _trans_validator_eval  s    zCmfTrans._trans_validator_evalc              	   C   s"  t tdd }dt_d}tjj| dgdgdD ]}|js8q,|jjdd }|dkr`| 	||}nl|d	krv| 
||}nV|d
kr| ||}n@|dkr| ||}n*|dkr| ||}ntd|j dd |s, qq,|t_|rd S |j  td|j d|jj d|jj d|j dd d S )Nr   Tr   r   r   r*   rB   r   r   Ztrans_form_fieldr   r   z;DEV: FATAL trans_validator_ok unknown validator.logic_type=r(   u9   Ошибка выполенения Валидатора u    для перехода r   rM   )rS   r-   r   r+   CmfTransValidr   r   rU   rV   r   r   r   r   r   r<   r   r9   r   r   )r!   r#   r   validr   r   r   r   r   trans_validator_ok  s2    
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 }|D ]}||kr|| d}q|S |dkrt||jj }|j }|D ]}||kr|	| d}q|S t
d	|j d
| dd d S )NFr*   rB   clearT:=)addItemr;   )delItemdeluX   DEV: FATAL _trans_action_field_m2m неподдерживаемое действие в  wz_operate=r(   )
wz_operaterU   rV   setattrrT   r&   r9   rS   appendremover<   r   )r!   actionr#   has_changesclean_wz_operaterg   r   rw   r   r   r   _trans_action_field_m2m  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	 t||jj|d
  dS |dkrt	||jj }|j
rdS |j }t|dkrtd| d| dd	 t||jj|d
  dS |dkr>t	||jj }|j }|D ](}||jkrt||jjd   dS qdS td|j d| dd	 d S )Nr*   rB   r   Tr   rz   rd   r{   r(   r   r;   Fr   uW   DEV: FATAL _trans_action_field_fk неподдерживаемое действие в r   )r   rU   rV   r   rT   r&   r9   r|   r<   rS   is_not_nullr   )r!   r   r#   r   rg   r   rw   r   r   r   _trans_action_field_fk  sD    




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*   rB   r   Tr   r;   Fr    uY   DEV: FATAL _trans_action_field_text неподдерживаемое действие в r   r(   )
r   rU   rV   r   rT   rW   rS   r   r<   r   )r!   r   r#   r   r   rg   new_valr   r   r   _trans_action_field_text2  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 z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*   rB   r   r   Trd   re   r(   r   )incr;   c                    s   |  kS r   r   xr   r   r   <lambda>      z6CmfTrans._trans_action_field_numeric.<locals>.<lambda>u5   Действие пыталось выставить uC    в недопустимое значение для выбора: u<   . Выставили ближайшее доступное: )decr   c                    s   |  kS r   r   r   r   r   r   r     r   u\   DEV: FATAL _trans_action_field_numeric неподдерживаемое действие в r   )r   rU   rV   rS   rT   r   r   rW   rf   r<   sortedr   r   r   )	r!   r   r#   choice_limitr   Z
prev_valuerg   Zbad_valZnew_val_tmpr   r   r   _trans_action_field_numerick  sT    



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*   rB   Fri   rl   Trd   ro   r(   r   r   u\   DEV: FATAL _trans_action_field_boolean неподдерживаемое действие в r   )	r   rU   rV   rW   rp   r<   r   rT   r   )r!   r   r#   r   rg   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*   Tr(   u3   DEV: FATAL Неизвестный тип поля: )r   r   r   rS   rT   rU   r0   r   r   r   r   r   r   r   r   CmfChoiceIntr   choiceskeysr   r   r   r<   r   r   r   r   )r!   r   r#   r   r   r   r   _trans_action_field  s0    zCmfTrans._trans_action_fieldc                 C   s   t |jjt t  dS )NT)r   r   rU   r   r   )r!   r   r#   r   r   r   _trans_action_eval  s    zCmfTrans._trans_action_evalc                 C   s   d}t ddd |S )NFz(DEV: Not supported _trans_action_webhookTr(   r   )r!   r   r#   r   r   r   r   _trans_action_webhook  s    zCmfTrans._trans_action_webhookc                 C   s   t tdd }dt_d}tjj| dgdgdD ]v}|jdkrL|| ||O }q,|jdkrh|| ||O }q,|jd	kr|| 	||O }q,|jsq,q,t
d
|j dd q,|t_|S )Nr   TFr   r   r   r   r   webhookz7DEV: FATAL trans_run_actions unknown action.logic_type=r(   )rS   r-   r   r+   CmfTransActionr   r   r   r   r   r<   )r!   r#   r   r   r   r   r   r   trans_run_actions  s    


zCmfTrans.trans_run_actions)NNN)$__name__
__module____qualname__classmethodr   r%   rA   rc   rh   rq   ry   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__r   r   r   r   r      s@   88.4,3	#%96r   )r   rX   decimalr   cmf.includeZcommon.fieldsr   r   r   r   r   r   <module>   s
   