U
    ܌fU                     @   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dZejjjjddddg 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d0d!d"Zeed#dd$d%d& Zd1 fd'd(	Zd)d* Zd2d+d,Z  ZS )3CmfWorkflowTstatus_listget_default_statusget_related_projects_inforeplaceNFc                 K   sh  |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dgdd}g }|stjjf dd|gdddgg|dd|}t|}|jD ]X}|r|jsq|jjs*|
jjjdd |jD kr||
r|js>q||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_fromztrans.trans_sdesk_portal_allow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>c                 S   s   | j jS N)r   r%   r   r   r   r   r   A   r   )	cmf_alertappendmodels	CmfStatuslistsortZcmfutilZget_obj_by_idr   getr   r   setr!   trans_sdesk_portal_allowstatus_fromZis_nullr   r%   trans_filter_ok	status_toadd)clsZobj_idZworkflow_idr   closed_lastr3   r   kwargs
get_filterresobjr   Zvalid_statusesr!   r   r   r   get_status_list   sT    


	
$
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   K   r   z)CmfWorkflow.status_list.<locals>.<lambda>r   )r-   r.   r/   r0   )selfr   r9   argsr:   r;   r<   r   r   r   r   D   s    
zCmfWorkflow.status_listOPENc              	      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)rB   r9   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   ]   s    



z0CmfWorkflow.get_default_status.<locals>.<lambda>)reverser   rC   z-ordernorE   r   )r   rB   r9   r   u+   Отсутствует статус для z status_type=z, status_code=z	, status=)r   r0   ZCmfError)r?   rE   Zstatus_coder   Zraise_errorrB   r<   r   r*   r   r   P   sB    
 zCmfWorkflow.get_default_statusc                    s   t   dg S )Nr   )supersave_preload_fieldsr?   	__class__r   r   rH   ~   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g | }d|_| |_ fd	d
|jD |_|jjr |j |_|  |dddg |jD ]6}|ddg | }d|_| |_||_|  q|jD ]6}	|	ddg |	 }
d|
_| |
_||
_|
  qJ|jD ]6}|ddg | }d|_| |_||_|  qqd S )Nstatusesr!   z**approve_groupsFZ	approversZmaster_approversr4   c                    s   g | ]} | qS r   r   )r&   Z_stZstatus_mappingr   r   r(      s     zACmfWorkflow.scaffold_statuses_and_transitions.<locals>.<listcomp>trans_filterstrans_validatorstrans_actionsZwz_value_obj)templateZload_fieldsrL   Zclonesystemr   r   saverM   parentr!   r4   r6   Zis_not_nullrO   
transitionrP   rQ   )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_transitions   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+   rI   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.   r1   rI   r   r   r   r\      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_newrR   r+   Zsave_eval_coderZ   r-   ZCmfAccessListZcheck_admin_modeZconfigZBZPYTHON_ENABLEDr[   rG   rT   rY   r?   r@   r:   r^   rJ   r   r   rT      s    
zCmfWorkflow.savec                    s$   | j }t j|| |r |   d S r)   )r^   rG   _save_importrY   r_   rJ   r   r   r`      s    zCmfWorkflow._save_importc                 C   s   t jj| dgdd}|S )Ntarget_workflowT)ra   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ORscheme_wf_rulesINc                    s   g | ]}|d  gqS r   r   r&   fieldrI   r   r   r(      s     z4CmfWorkflow._get_related_schemes.<locals>.<listcomp>Tr"   )rc   r-   CmfSchemeWfr/   )r?   Zscheme_fieldsfilter_schemeZschemesr   rI   r   _get_related_schemes   s    z CmfWorkflow._get_related_schemesc                    sn  |   }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 ]6}|jrl||jj   ||jj d  d7  < qltj	jddd| gdd| ggdgd}|D ]6}|jr||jj   ||jj d  d7  < qi }|
 D ]H\}	}
|
 kr0|
||	jj< n&tj	j|	dtjj|	dd||	jj< q|rjt|S d S )Nrl   Z	scheme_wfrn   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>rj   ry   r   rw      rv   )ry   )rt   r-   Z
CmfProjectr/   ZCmfDocumentry   
setdefaultr%   rx   ZCmfTaskitemsrD   countZjsondumps)r?   Zrelated_schemesZrelated_projectsZprojects_dictZrelated_docsdocZrelated_tasksZtaskZres_dictry   Z
count_dictr   rz   r   r      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   rn   openZin_progressrD   r   Zparams_jsonZILIKE%ru   uc   Работа по замене данного бизнес-процесса уже запущенаTr
   )r@   )
r-   ZCmfDeferredJobr   replace_workflowrD   r   r%   r+   Zschedule_deferred_jobr   )r?   new_workflow_id_kwargsZreplace_task_existsr   r   r   r	     s    zCmfWorkflow.replaceu(   Смена бизнес-процесса)descriptionZshow_bg_progressbarc                    s
  t jj| d t jj|d}t jj dgd}|D ]&}|j kr2||_|jdd t  q2dddd	d
dddg}ddd|gg}| fdd|D 7 }t jj||d}	|	D ]:}
|D ]}t	|
| krt
|
|| q|
jdd t  qddg}t D ]}|jdkrq|jdg fdd|D  |ddgd}|s4q|D ]:}|D ]"}t	|| kr@t
||| q@|jdd q8t  qqt D ]|}|jdkrqd|jkr|jdd gdgddgd}|sΐq|D ]$}|j kr||_|jdd qt  qqd S )N)r   ra   )ra   r   F)notifyrd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   c                    s   g | ]}|d  gqS ro   r   rp   Zold_workflowr   r   r(   ;  s     z0CmfWorkflow.replace_workflow.<locals>.<listcomp>r   r   )rb   rr   c                    s   g | ]}|d  gqS ro   r   rp   r   r   r   r(   L  s     r      )r   r   slice)r.   ZCmfTransActionZCmfTransFilterZCmfTransValidCmfTransdefault_workflowr   )r-   r   r1   rb   r/   ra   rT   Z
cmf_commitrr   getattrsetattrr   iter_subclasses
class_namer   r   r   )Zold_workflow_idr   r@   r:   Znew_workflowZwf_rulesruleZwf_scheme_fieldsrs   Z
wf_schemesschemerq   Zactive_entity_fieldsmodelZobj_listr=   r   r   r   r   "  sv    

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    ru   
   )r   r   z...u   Невозможно удалить используемый бизнес процесс. Данный бизнес процесс используется в u    объектахTr
   )r   include_deletedinclude_system)TEXKOM_db_deleteforce)ra   r   r   r   rl   rj   r   rk   )r   r   r   )Z	only_data)r   r   r   Zslistr,   r+   r-   r.   r/   deleterb   rr   rj   rk   rT   rG   )
r?   r   r   r:   Z	ref_countZ	top_usager   r   r   r   rJ   r   r   r   h  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 )NTr4   rn   r6   r    )r#   r   )r-   r   r/   r   r5   )r?   r=   r4   r6   Zpossible_transitionr   r   r   calc_transition  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+   rD   r   Ztrans_validator_okZtrans_run_actions)r?   r=   r4   r6   Zis_task_transition_runZhas_changesrV   r   r   r   run_transition  s    
"

zCmfWorkflow.run_transition)NNNFFN)NF)rA   NNT)N)FF)F)__name__
__module____qualname__Z	api_allowcommonr   cmf_workflowr   Zapi_methodsclassmethodr>   r   r   rH   rY   r[   propertyr\   rT   r`   rc   rt   r   r	   staticmethodZcmf_deferred_jobr   r   r   r   __classcell__r   r   rJ   r   r      s<   
  3

.4
#
	
D!r   )
Zcmf.includeZcommon.fields.cmf_workflowr   Z
cmf.modelsr   Zcommon.models.cmf_active_entityr   r   r   r   r   r   r   r   <module>   s   