U
    \peR                     @   sB   d dl T d dlZd dlmZ d dlmZ G dd dejjj	Z	dS )    )*N)	CmfEntity)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d Zdd Zdd Zd*ddZee dd  Zd+ fd!d"	Zd#d$ Zd,d%d&Z  ZS )-CmfWorkflowNFc                 K   sX  |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d}
tjjf dd|
gdddgg|d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r   r   cache_inmemory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   4   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   sL    

	
$
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   r4   argsr5   r6   r7   r   r   r   status_list7   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>   r4   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   P   s    



z0CmfWorkflow.get_default_status.<locals>.<lambda>)reverser   r?   z-ordernorA   r   )r   r>   r4   r   u+   Отсутствует статус для z status_type=z, status_code=z	, status=)r<   r,   ZCmfError)r:   rA   Zstatus_coder   Zraise_errorr>   r7   r   r&   r   get_default_statusC   sB    
 zCmfWorkflow.get_default_statusc                    s   t   dg S )Nr   )supersave_preload_fieldsr:   	__class__r   r   rE   q   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_fieldsrI   Zclonesystemr   r	   saverJ   parentr   r/   r1   rK   
transitionrL   rM   )r:   stZst_newZ
approve_grZapprove_gr_newr   Z	trans_newr   Z
filter_newZ	validatorZvalidator_newactionZ
action_newr   rN   r   !scaffold_statuses_and_transitionst   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'   rF   r   r   r   sl_consistent_warning   s    z!CmfWorkflow.sl_consistent_warningc                 C   s   t tjj| dddS )uP   Возвращает есть ли на данном БП утверждениеT)r	   need_approver   )boolr)   r*   r-   rF   r   r   r   rY      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_newrO   r'   Zsave_eval_coderW   r)   ZCmfAccessListZcheck_admin_modeZconfigZBZPYTHON_ENABLEDrX   rD   rQ   rV   r:   r;   r5   r[   rG   r   r   rQ      s    
zCmfWorkflow.savec                    s$   | j }t j|| |r |   d S r%   )r[   rD   _save_importrV   r\   rG   r   r   r]      s    zCmfWorkflow._save_importc                 C   s   t jj| dgdd}|S )Ntarget_workflowT)r^   r   r   )r)   CmfSchemeWfRuler+   )r:   Zrulesr   r   r   _get_related_rules   s    zCmfWorkflow._get_related_rulesc                    sR   ddddddddg}d	d
d   gg}| fdd|D 7 }tjj||dd}|S )Ndefault_list_workflowdefault_epic_workflowdefault_subproject_workflowdefault_release_workflowdefault_sprint_workflowdefault_document_workflowdefault_task_workflowdefault_subtask_workflowORZscheme_wf_rulesINc                    s   g | ]}|d  gqS r
   r   r"   fieldrF   r   r   r$      s     z4CmfWorkflow._get_related_schemes.<locals>.<listcomp>Tr   )r`   r)   CmfSchemeWfr+   )r:   Zscheme_fieldsZfilter_schemeZschemesr   rF   r   _get_related_schemes   s    z CmfWorkflow._get_related_schemesc                    s  |   }tjjddd|gdd| ggd}ddd  fd	d
|D }tjjddd| gdd| ggdgd}|D ]J}|jjd krl|jjjdkrl||jj 	  ||jj d  d7  < qltj
jddd| gdd| ggdgd}|D ]J}|jjd kr|jjjdkr||jj 	  ||jj d  d7  < qi }| D ]H\}	}
|
 krX|
||	jj< n&tj
j|	dtjj|	dd||	jj< q8|rt|S d S )Nri   Z	scheme_wfrj   r	   r
   r   r   )tasksdocsc                    s   i | ]}|   qS r   )copy)r"   projectZdefault_scorer   r   
<dictcomp>   s      z9CmfWorkflow.get_related_projects_info.<locals>.<dictcomp>rg   root_parentr   
CmfProjectrr      rq   )rw   )ro   r)   rx   r+   ZCmfDocumentrw   r!   
class_name
setdefaultrs   ZCmfTaskitemsr@   countZjsondumps)r:   Zrelated_schemesZrelated_projectsZprojects_dictZrelated_docsdocZrelated_tasksZtaskZres_dictrt   Z
count_dictr   ru   r   get_related_projects_info   s@    

z%CmfWorkflow.get_related_projects_infoc              	   K   sh   t jjdddddggdd| jjgdd	d
| jj d
ggd}|rLtddd tt j	j| jj|gd d S )NZANDr   rj   openZin_progressr@   r
   Zparams_jsonZILIKE%rp   uc   Работа по замене данного бизнес-процесса уже запущенаTr   )r;   )
r)   ZCmfDeferredJobr}   replace_workflowr@   r   r!   r'   Zschedule_deferred_jobr   )r:   new_workflow_id_kwargsZreplace_task_existsr   r   r   replace	  s    zCmfWorkflow.replacec                    s  t jj| d t jj|d}  }|D ]&}|j kr(||_|jdd t  q(dddddd	d
dg}  }|D ]:}	|D ]}
t|	|
 krxt	|	|
| qx|	jdd t  qpdd
g}t
 D ]}|jdkrq|jdg fdd|D  |ddgd}|sq|D ]:}|D ]"}
t||
 krt	||
| q|jdd  qt  qqt D ]|}|jdkr`qLd|jkrL|jdd gdgddgd}|sqL|D ]$}|j kr||_|jdd qt  qlqLd S )N)r   F)notifyra   rb   rc   rd   re   rf   rg   rh   r	   )r_   rn   ri   c                    s   g | ]}|d  gqS rk   r   rl   Zold_workflowr   r   r$   :  s     z0CmfWorkflow.replace_workflow.<locals>.<listcomp>r      )r   r   slice)r*   ZCmfTransActionZCmfTransFilterZCmfTransValidCmfTransdefault_workflowr
   )r)   r   r-   r`   r^   rQ   Z
cmf_commitro   getattrsetattrr   iter_subclassesrz   r+   r   r   r   )Zold_workflow_idr   r;   r5   Znew_workflowZwf_rulesruleZwf_scheme_fieldsZ
wf_schemesschemerm   Zactive_entity_fieldsmodelZobj_listr8   r   r   r   r     sr    



zCmfWorkflow.replace_workflowc           
         sH  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   rp   
   )r   r   z...u   Невозможно удалить используемый бизнес процесс. Данный бизнес процесс используется в u    объектахTr   )r	   include_deletedinclude_system)TEXKOM_db_deleteforce)r^   r   r   r   ri   rg   r
   rh   )r   r   r   )Z	only_data)r   r   r}   Zslistr(   r'   r)   r*   r+   deleter_   rn   rg   rh   rQ   rD   )
r:   r   r   r5   Z	ref_countZ	top_usager   r   r   r   rG   r   r   r   V  s:    

 
zCmfWorkflow.deletec                 C   s   |r|sd S t jjddd|jggdd|ggdD ]}||r0|  S q0t jjdddd gdd|ggdD ]}||rh|  S qhd S )NTr/   rj   r1   r   )r   r   )r)   r   r+   r   r0   )r:   r8   r/   r1   Zpossible_transitionr   r   r   calc_transitionw  s    



zCmfWorkflow.calc_transitionc              	   C   st   d}|sd S |  |||}|s\|j  |jsXtd|j d|j d|j d| dd d S || ||}|S )NFuA   Нет доступного перехода из статуса u    в статус u"    у Бизнес-процесса u    для объекта Tr   )r   r    loadr'   r@   r	   Ztrans_validator_okZtrans_run_actions)r:   r8   r/   r1   Zis_task_transition_runZhas_changesrS   r   r   r   run_transition  s    
"

zCmfWorkflow.run_transition)NNNFN)NF)r=   NNT)N)FF)F)__name__
__module____qualname__classmethodr9   r<   rC   rE   rV   rX   propertyrY   rQ   r]   r`   ro   r   r   staticmethodZcmf_deferred_jobr   r   r   r   __classcell__r   r   rG   r   r      s*   .

.1
#
	B!r   )
Zcmf.includeZcommon.fields.cmf_workflowcommonZ
cmf.modelsr   Zcommon.models.cmf_active_entityr   r   Zcmf_workflowr   r   r   r   r   <module>   s   