B
    fm                 @   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	d7dd	Z
d8d
dZd9d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d$d%d& Zd; fd'd(	Zd)d* Zd<d+d,Zd=d.d/Zeeddd0d1d2 Zeeddd0d3d4 Z eeddd0d>d5d6Z!  Z"S )?CmfWorkflowTstatus_listget_default_statusget_related_projects_inforeplaceNFc             K   sl  |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|}xb|jD ]X}|r|jsq|jjs,|
jjjdd |jD kr||
r|js@q||j qW t|}|jdd	 d
 |S )Nz6DEV: FATAL get_status_list if not obj and not workflowT)abortordernoworkflowz==)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_lastr)   r   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   z==r   c             S   s
   | j dkS )Nr   )r   )r   r   r   r   r   K   r   z)CmfWorkflow.status_list.<locals>.<lambda>)r   )r#   r$   r%   r&   )selfr   r/   argsr0   r1   r2   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   z==)r   order_byT)r8   r/   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_type)r   )r   r   r   r   ]   s
    



z0CmfWorkflow.get_default_status.<locals>.<lambda>)reverser   r9   z-ordernor;   r   )r   r8   r/   r   u+   Отсутствует статус для z status_type=z, status_code=z	, status=)r   r&   ZCmfError)r5   r;   Zstatus_coder   Zraise_errorr8   r2   r   )r   r   r   P   s4    



zCmfWorkflow.get_default_statusc                s   t   dg S )Nr   )supersave_preload_fields)r5   )	__class__r   r   r>   ~   s    zCmfWorkflow.save_preload_fieldsc                s  | j ddg i  x| j jD ]z}|ddg | }d|_|j|_| |_|  | |< x:|jD ]0}|dddg | }d|_||_	|  qdW qW x<| j j
D ].}|ddg | }d|_| |_ fd	d
|jD |_|jjr |j |_|  |dddg x@|jD ]6}|ddg | }d|_| |_||_|  qW x@|jD ]6}	|	ddg |	 }
d|
_| |
_||
_|
  q\W x@|jD ]6}|ddg | }d|_| |_||_|  qW qW d S )Nstatusesr   z**approve_groupsF	approversmaster_approversr*   c                s   g | ]} | qS r   r   )r   Z_st)status_mappingr   r   r       s    zACmfWorkflow.scaffold_statuses_and_transitions.<locals>.<listcomp>trans_filterstrans_validatorstrans_actionsZwz_value_obj)templateZload_fieldsr@   Zclonesystemr   r   saverA   parentr   r*   r,   Zis_not_nullrE   
transitionrF   rG   )r5   stZst_newZ
approve_grZapprove_gr_newr   Z	trans_newr   Z
filter_newZ	validatorZvalidator_newactionZ
action_newr   )rD   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!   )r5   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'   )r5   r   r   r   rR      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   Выберите шаблон для Бизнес-процессаT)r
   u   Использование "Действий после сохранения объекта" недоступно в Вашей версии, обратитесь в Техническую поддержку.)is_newrH   r!   Zsave_eval_coderP   r#   ZCmfAccessListZcheck_admin_modeZconfigZBZPYTHON_ENABLEDrQ   r=   rJ   rO   )r5   r6   r0   rT   )r?   r   r   rJ      s    
zCmfWorkflow.savec                s$   | j }t j|| |r |   d S )N)rT   r=   _save_importrO   )r5   r6   r0   rT   )r?   r   r   rU      s    zCmfWorkflow._save_importc             C   s   t jj| dgdd}|S )Ntarget_workflowT)rV   r   r   )r#   CmfSchemeWfRuler%   )r5   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 )z==r   )r   field)r5   r   r   r       s    z4CmfWorkflow._get_related_schemes.<locals>.<listcomp>T)r   r   r   )rX   r#   CmfSchemeWfr%   )r5   Zscheme_fieldsfilter_schemeZschemesr   )r5   r   _get_related_schemes   s    z CmfWorkflow._get_related_schemesc                sz  |   }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}x>|D ]6}|jrn||jj   ||jj d  d7  < qnW tj	jddd| gdd| ggdgd}x>|D ]6}|jr||jj   ||jj d  d7  < qW i }xT|
 D ]H\}	}
|
 kr:|
||	jj< n&tj	j|	dtjj|	dd||	jj< qW |rvt|S d S )Nra   Z	scheme_wfrc   r   z==)r   r   )tasksdocsc                s   i | ]}   |qS r   )copy)r   project)default_scorer   r   
<dictcomp>   s    z9CmfWorkflow.get_related_projects_info.<locals>.<dictcomp>r_   rk   )r   r   ri      rh   )rk   )rg   r#   Z
CmfProjectr%   CmfDocumentrk   
setdefaultr   rj   CmfTaskitemsr:   countZjsondumps)r5   Zrelated_schemesZrelated_projectsZprojects_dictZrelated_docsdocZrelated_taskstaskZres_dictrk   Z
count_dictr   )rl   r   r      s4    







 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   rc   openZin_progressr:   z==Zparams_jsonZILIKE%)r   uc   Работа по замене данного бизнес-процесса уже запущенаT)r
   )r6   )
r#   ZCmfDeferredJobrs   replace_workflowr:   r   r   r!   Zschedule_deferred_jobr   )r5   new_workflow_idZ_kwargsZreplace_task_existsr   r   r   r	     s    zCmfWorkflow.replaceu(   Смена бизнес-процесса)descriptionZshow_bg_progressbarc                s4  t jj| d t jj|d}t jj dgd}x.|D ]&}|j kr4||_|jdd t  q4W dddd	d
dddg}ddd|gg}| fdd|D 7 }t jj||d}	xF|	D ]>}
x&|D ]}t	|
| krt
|
|| qW |
jdd t  qW ddg}xt D ]}|jdkrq x|jdg fdd|D  |ddgd}|sFP xF|D ]>}x*|D ]"}t	|| krVt
||| qVW |jdd qLW t  qW q W xt D ]}|jdkrqd|jkrx^|jdd gdgddgd}|sP x,|D ]$}|j kr||_|jdd qW t  qW qW d S )N)r   rV   )rV   r   F)ZnotifyrY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   c                s   g | ]}|d  gqS )z==r   )r   rd   )old_workflowr   r   r    ;  s    z0CmfWorkflow.replace_workflow.<locals>.<listcomp>)r   r   r   )rW   re   c                s   g | ]}|d  gqS )z==r   )r   rd   )r|   r   r   r    L  s    r      )r   r   slice)r$   ZCmfTransActionZCmfTransFilterZCmfTransValidCmfTransdefault_workflowz==)r#   r   r'   rW   r%   rV   rJ   Z
cmf_commitre   getattrsetattrr   iter_subclasses
class_namer   r   r   )Zold_workflow_idrz   r6   r0   Znew_workflowZwf_rulesruleZwf_scheme_fieldsrf   Z
wf_schemesschemerd   Zactive_entity_fieldsmodelZobj_listr3   r   )r|   r   ry   "  sr    








zCmfWorkflow.replace_workflowc       
         sZ  d}g }xFt  D ]:}||jdd| gd7 }|r|s|jdd| gddgd}qW |rr|d td| d	d
d x0tjj| ||dD ]}|j	f |d
d| qW x.tj
j| ||dD ]}|j	f d|i| qW |r>xbtjjddd| gdd| ggddg|dD ]6}	|	j| krd |	_|	j| kr,d |	_|	jd
d qW t j	f ||d| d S )Nr   r   r   )r   
   )r   r~   z...u   Невозможно удалить используемый бизнес процесс. Данный бизнес процесс используется в u    объектахT)r
   )r   include_deletedinclude_system)TEXKOM_db_deleteforce)rV   r   r   r   ra   r_   z==r`   )r   r   r   )Z	only_data)r   r   rs   Zslistr"   r!   r#   r$   r%   deleterW   re   r_   r`   rJ   r=   )
r5   r   r   r0   Z	ref_countZ	top_usager   r   r   r   )r?   r   r   r   h  s2    

zCmfWorkflow.deletec             C   s   |r|sd S x:t jjddd|jggdd|ggdD ]}||r2|S q2W x6t jjdddd gdd|ggdD ]}||rj|S qjW d S )NTr*   rc   r,   r   )r   r   )r#   r   r%   r   r+   )r5   r3   r*   r,   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    для объекта T)r
   )r   r   loadr!   r:   r   Ztrans_validator_okZtrans_run_actions)r5   r3   r*   r,   Zis_task_transition_runZhas_changesrL   r   r   r   run_transition  s    
"

zCmfWorkflow.run_transitionr   c             C   s   t jj|||d d S )N)obj_version)r#   
CmfApproveZupdate_approves)r5   r3   approve_groupr   r   r   r   recalc_approvegroup_approves  s    z(CmfWorkflow.recalc_approvegroup_approves)Z	only_onceZ
system_jobc             C   s   dd| gdddgg}x8t jj|ddgdD ] }t j|| t j|d q*W x>t jj|ddd	gdD ]$}t j|| t j||jj qfW d S )
Nr   z==zstatus.need_approveTr   rk   )r   r   r   z cur_workflow_version.doc_version)	r#   rq   r%   r   remove_approvegroup_approvescalc_statusro   cur_workflow_versiondoc_version)wfr   r   rv   ru   r   r   r   r     s    

z(CmfWorkflow.remove_approvegroup_approvesc             C   s   t jj|dddgd}dd| gdddgg}x8t jj|d	d
gdD ] }t j|| t j|d q@W xFt jj|d	d
ddgdD ]*}t j|||j	j
 t j||j	j
 q~W d S )NrB   rC   Zmin_approvers)r   r   z==zstatus.need_approveTr   rk   )r   r   r   r   z cur_workflow_version.doc_version)r#   CmfApproveGroupr'   rq   r%   r   Zcreate_approvegroup_approvesr   ro   r   r   )wf_idapprove_group_idr   r   rv   ru   r   r   r   add_approvegroup_approves  s    

z%CmfWorkflow.add_approvegroup_approvesc          	   C   sp  t j| }t jj|ddgd}dd|gdddgg}dd	d
ddddddg	}xpt jj||dD ]\}|rt jj|d|dgd}	|	d dks\|	d dkrq\||||jj	 t j
||jj	 q\W xjt jj||dD ]V}
|r
t jj|
d|dgd}	|	d dks|	d dkr
q||
| t j
|
d qW |s8|s8dS dddgdd|gdddgdddgdddgd dd!gg}t jj|ddd"gd}|sdS t|t| }t|t| }t }xN|D ]F}|r|jjj|kr|  td#|jj  ||jj qW |rlt jjd$d%t|gd&}xJ|D ]B}x:|D ]2}t jj||||jdd'}td(|jj  q0W q&W dS ))uj  
        Перезаполняет аппрувы задач/документов на утверждении при изменении состава/свойств апрувгрупп или мастераппруверов статуса
        Если approve_group==None => поменялся статус. Иначе - аппрувгруппа
        rB   rC   )r   r   z==zstatus.need_approveTr   zstatus.master_approverszstatus.approve_groupsz"status.approve_groups.approve_typezstatus.approve_groups.approversz&status.approve_groups.master_approversrk   r   z cur_workflow_version.doc_version)r   r   r   Z
resolution)r3   approve_typer   r   ZapprovedZrejectedr   Nr   r   Zpersonapproverz!=r   r3   zobj.cache_status_typer9   z
obj.statusu   Удалили аппрув: r   rc   )r   )r3   r   r   Z
obj_statusr   u(   Создали новый аппрув: )r#   r   r'   r   ro   r%   r   r   r   r   r   rq   r(   r   r   r   r   gdebugr-   r3   Z	CmfPersonZ_create_or_update_approver   )r   r   Zapprovers_old_idsZapprovers_new_idsr   r   r   r   ru   Zaggreg_grouprv   Zapprove_filterZapprovesZadd_approversZdelete_approversZobj_idsZapprover3   Zadd_approverZnew_approver   r   r   recalc_all_approves  sb    


zCmfWorkflow.recalc_all_approves)NNNFFN)NF)r7   NNT)N)FF)F)r   )NNN)#__name__
__module____qualname__Z	api_allowcommonr   cmf_workflowr   Zapi_methodsclassmethodr4   r   r   r>   rO   rQ   propertyrR   rJ   rU   rX   rg   r   r	   staticmethodZcmf_deferred_jobry   r   r   r   r   r   r   r   __classcell__r   r   )r?   r   r      sD   
 2

.4#
	E!


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   