U
    c'                     @   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                       sp   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	 fddZ
 fddZdddZ  ZS )CmfWorkflowNFc                 K   s0  |s|st ddd |s\dd|g}|r.||g}tjjf d|i|}|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d|	gdddggi|}
t|
}
|	jD ]P}|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workflow==filterc                 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)fieldsid=transztrans.status_to.ordernoztrans.status_from)r	   r   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)ordernor   r   r   r   r   r   -   r   )	cmf_alert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_lastkwargs
get_filterresobjr   Zvalid_statusesr   r   r   r   get_status_list   s<    

"
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   7   r   z)CmfWorkflow.status_list.<locals>.<lambda>r   )r#   r$   r%   r&   )selfr	   r.   argsr/   r0   r1   r   r   r   status_list0   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)r8   r.   c                    s4   | j  j k| j jk| j jk jdko0| jdkfS )NZ	in_reviewr   )r   namestatus_typer   r!   r   r   r   I   s
    


z0CmfWorkflow.get_default_status.<locals>.<lambda>)reverser   r   z-ordernor:   )r	   r8   r.   r   u+   Отсутствует статус для z status_type=z, status_code=z	, status=)r6   r&   ZCmfError)r4   r:   Zstatus_coder   Zraise_errorr8   r1   r   r!   r   get_default_status<   sB    
 zCmfWorkflow.get_default_statusc                    s   t   dg S )Nr   )supersave_preload_fieldsr4   	__class__r   r   r>   i   s    zCmfWorkflow.save_preload_fieldsc                 C   sP   | j dg | j jD ]4}|dg | }d|_|j|_| |_|  qd S )Nstatusesz**F)templateZload_fieldsrB   Zclonesystemr   r   save)r4   stZst_newr   r   r   scaffold_statusesl   s    
zCmfWorkflow.scaffold_statusesc                 C   sB   | j s>| jjs6| jjs6| jjs6| jjs6| jjs6| jjr>t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_task_only_owner_closer"   r?   r   r   r   sl_consistent_warningw   s    z!CmfWorkflow.sl_consistent_warningc                    s^   | j r| jstddd | jjr2tjs2tddd |   | j }t j	|| |rZ| 
  d S )NuB   Выберите шаблон для Бизнес-процессаTr   u   Использование "Действий после сохранения объекта" недоступно в Вашей версии, обратитесь в Техническую поддержку.)is_newrC   r"   Zsave_eval_coderH   ZconfigZBZPYTHON_ENABLEDrI   r=   rE   rG   )r4   r5   r/   rJ   r@   r   r   rE      s    zCmfWorkflow.savec                    s   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f | d S )Nr   r   r   r	   
   )r	   slicez...u   Невозможно удалить используемый бизнес процесс. Данный бизнес процесс используется в u    объектахTr   )r   Ziter_subclassescountZslistappendr"   r=   delete)r4   r/   Z	ref_countZ	top_usageZmodelr@   r   r   rP      s    

 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	d
 d S |	| |
|}|S )NFr)   INr+   r   rK   uA   Нет доступного перехода из статуса u    в статус Tr   )r#   ZCmfTransr%   r   r*   r   loadr"   r9   Ztrans_validator_okZtrans_run_actions)r4   r2   r)   r+   Zis_task_transition_runZhas_changesZ
transitionZpossible_transitionr   r   r   run_transition   s6    




zCmfWorkflow.run_transition)NNNF)NF)r7   NNT)F)__name__
__module____qualname__classmethodr3   r6   r<   r>   rG   rI   rE   rP   rS   __classcell__r   r   r@   r   r      s   (

-r   )Zcmf.includeZcommon.fields.cmf_workflowcommonZcommon.models.cmf_active_entityr   r   Zcmf_workflowr   r   r   r   r   <module>   s   