U
    r;d7                     @   s6   d dl T d dlZd dlmZ G dd dejjjZdS )    )*N)CmfActiveEntityc                       s   e Zd ZedddZdddZdd	d
Z fddZdd Zdd Z	e
dd Z fddZ fddZd fdd	ZdddZ  ZS ) CmfWorkflowNFc                 K   sT  |s|st ddd |s dg}nd|kr2|d |s|dd|g}|rL||g}tjjf ||d|}|rx|jdd	 d
 |S tj|ddgd}	tjj	dd|	j
jgdddgd}
tjjf dd|
gdddgg|d|}t|}|
jD ]R}|jjs|	jjjdd |jD kr||	r|js*t ddd ||j qt|}|jdd	 d
 |S )Nz6DEV: FATAL get_status_list if not obj and not workflowTabortordernoworkflow==filterfieldsc                 S   s
   | j dkS Nclosedcodes r   ./common/models/cmf_workflow.py<lambda>       z-CmfWorkflow.get_status_list.<locals>.<lambda>keystatus)r   id=transztrans.status_to.ordernoztrans.status_fromallow_empty_transitionc                 S   s   g | ]}|j jqS r   )r   value).0tr   r   r   
<listcomp>+   s     z/CmfWorkflow.get_status_list.<locals>.<listcomp>z)DEV: Not supported if not trans.status_toc                 S   s   | j jS N)r   r   r   r   r   r   r   1   r   )	cmf_alertappendmodels	CmfStatuslistsortZcmfutilZget_obj_by_idr   getr   r   setr   status_fromZis_nullr   r   trans_filter_ok	status_toadd)clsZobj_idZworkflow_idr   closed_lastr   kwargs
get_filterresobjr   Zvalid_statusesr   r   r   r   get_status_list   sH    


$
zCmfWorkflow.get_status_listc                 O   sD   dd| g}|r||g}t jj|d|i|}|r@|jdd d |S )Nr   r	   r   c                 S   s
   | j dkS r   r   r   r   r   r   r   ;   r   z)CmfWorkflow.status_list.<locals>.<lambda>r   )r&   r'   r(   r)   )selfr   r1   argsr2   r3   r4   r   r   r   status_list4   s    
zCmfWorkflow.status_listOPENTc              	      s   dg}d }|r$| j dd|g|d}np rN| j |dd}|jd fddd	 nF|d
krzdg}| j ddd
gdddgg|d}|s| j dd|g|dd}|r|d S |rtd|  d| d| d  d S )Nr   r   r	   )r   order_byT)r;   r1   c                    s>   | j  j k| j jk| j jk| j jk jdko:| jdkfS )NZ	IN_REVIEWCLOSED)r   r   namestatus_typer   r#   r   r   r   M   s    



z0CmfWorkflow.get_default_status.<locals>.<lambda>)reverser   r<   z-ordernor>   r   )r   r;   r1   r   u+   Отсутствует статус для z status_type=z, status_code=z	, status=)r9   r)   ZCmfError)r7   r>   Zstatus_coder   Zraise_errorr;   r4   r   r#   r   get_default_status@   sB    
 zCmfWorkflow.get_default_statusc                    s   t   dg S )Nr   )supersave_preload_fieldsr7   	__class__r   r   rB   n   s    zCmfWorkflow.save_preload_fieldsc                    s  | j ddg i  | j jD ]v}|ddg | }d|_|j|_| |_|  | |< |jD ]0}|dddg | }d|_||_	|  q`q| j j
D ]}|ddd	d
dg | }d|_| |_ fdd|jD |_ |j |_|  |jD ]4}|ddg | }d|_| |_||_|  q|jD ]6}	|	ddg |	 }
d|
_| |
_||
_|
  q6|jD ]6}|ddg | }d|_| |_||_|  qtqd S )Nstatusesr   z**approve_groupsFZ	approversZmaster_approversr,   trans_filterstrans_validatorstrans_actionsc                    s   g | ]} | qS r   r   )r   Z_stZstatus_mappingr   r   r!      s     zACmfWorkflow.scaffold_statuses_and_transitions.<locals>.<listcomp>Zwz_value_obj)templateZload_fieldsrF   Zclonesystemr   r   saverG   parentr   r,   r.   rH   
transitionrI   rJ   )r7   stZst_newZ
approve_grZapprove_gr_newr   Z	trans_newr   Z
filter_newZ	validatorZvalidator_newactionZ
action_newr   rK   r   !scaffold_statuses_and_transitionsq   s\    




z-CmfWorkflow.scaffold_statuses_and_transitionsc                 C   sJ   | j sF| jjs>| jjs>| jjs>| jjs>| jjs>| jjs>| jjrFt	d dS )u   
        Оповещаем пользователя, если выбранные им галочки не будут активированы
        u   Для работы выбранных опций необходимо активировать "Переопределять опции Simple Logic Проекта". Иначе будут применяться настройки ПроектаN)
Zenable_sl_controlZsl_deadline_shift
is_changedZsl_only_owner_approveZsl_deny_no_approveZ)sl_allow_executor_change_nofatal_deadlineZsl_task_need_approveZsl_readonly_closed_taskZsl_task_only_owner_closer$   rC   r   r   r   sl_consistent_warning   s    z!CmfWorkflow.sl_consistent_warningc                 C   s   t tjj| ddS )uP   Возвращает есть ли на данном БП утверждениеT)r   need_approve)boolr&   r'   r*   rC   r   r   r   rV      s    zCmfWorkflow.need_approvec                    sh   | j r| jstddd | jjr<tj  tj	s<tddd | 
  | j }t j|| |rd|   d S )NuB   Выберите шаблон для Бизнес-процессаTr   u   Использование "Действий после сохранения объекта" недоступно в Вашей версии, обратитесь в Техническую поддержку.)is_newrL   r$   Zsave_eval_coderT   r&   ZCmfAccessListZcheck_admin_modeZconfigZBZPYTHON_ENABLEDrU   rA   rN   rS   r7   r8   r2   rX   rD   r   r   rN      s    
zCmfWorkflow.savec                    s$   | j }t j|| |r |   d S r"   )rX   rA   _save_importrS   rY   rD   r   r   rZ      s    zCmfWorkflow._save_importc           
         sF  d}g }t  D ]:}||jdd| gd7 }|r|s|jdd| gddgd}q|rn|d td| d	d
d tjj| ||dD ]}|j	f |d
d| qtj
j| ||dD ]}|j	f d|i| q|r*tjjddd| gdd| ggddgdD ]4}	|	j| kr
d |	_|	j| krd |	_|	jd
d qt j	f ||d| d S )Nr   r   r   r   
   )r   slicez...u   Невозможно удалить используемый бизнес процесс. Данный бизнес процесс используется в u    объектахTr   )r   include_deletedinclude_system)TEXKOM_db_deleteforce)Ztarget_workflowr^   r_   r`   ORdefault_task_workflowr	   default_subtask_workflowr
   )Z	only_data)r   Ziter_subclassescountZslistr%   r$   r&   r'   r(   deleteZCmfSchemeWfRuleZCmfSchemeWfrc   rd   rN   rA   )
r7   r`   ra   r2   Z	ref_countZ	top_usageZmodelr   ZruleZschemerD   r   r   rf      s8    

 
zCmfWorkflow.deletec              	   C   s   d}|sd S d }t jjdd|jggdd|ggdD ]}||r2|} qJq2|st jjddd gdd|ggdD ]}||rl|} qql|s|j  |jstd|j d|j d	|j	 d
| dd d S |
| ||}|S )NFr,   INr.   r   r[   uA   Нет доступного перехода из статуса u    в статус u"    у Бизнес-процесса u    для объекта Tr   )r&   ZCmfTransr(   r   r-   r   loadr$   r=   r   Ztrans_validator_okZtrans_run_actions)r7   r5   r,   r.   Zis_task_transition_runZhas_changesrP   Zpossible_transitionr   r   r   run_transition   s:    


"

zCmfWorkflow.run_transition)NNNFN)NF)r:   NNT)FF)F)__name__
__module____qualname__classmethodr6   r9   r@   rB   rS   rU   propertyrV   rN   rZ   rf   ri   __classcell__r   r   rD   r   r      s   ,

.1
r   )Zcmf.includeZcommon.fields.cmf_workflowcommonZcommon.models.cmf_active_entityr   r   Zcmf_workflowr   r   r   r   r   <module>   s   