
    bhs                     h    d dl T d dlZd dlmZ d dlmZ  G d dej        j        j	                  Z	dS )    )*N)	CmfEntity)CmfActiveEntityc                       e Zd ZdZej        j        j        j        g dz   Ze		 	 d d            Z
d!dZd"dZ fd	Zd
 Zd Zed             Zd Z fdZ fdZd Zd Zd Zd#dZe edd          d                         Zd$ fd	Zd Zd%dZd&dZe edd          d                         Z e edd          d                         Z!e edd          d'd                        Z" xZ#S )(CmfWorkflowT)status_listget_default_statusget_related_projects_inforeplaceNFc                    |s|st          dd           |sdg}nd|vr|                    d           |s?dd|g}|r||g}t          j        j        d||d|}	|r|	                    d 	           |	S t                              |dd
g          }
t          j        	                    dd|
j
        j        gg dd          }g }|s!t          j        j        ddd|gg dg|dd|}t          |          }|j        D ]}|r|j        s|j        rM|
j        j        j        d |j        D             v r+|j        r$|j        |v r|                    |j                   `|j        j        s"|
j        j        j        d |j        D             v r7|                    |
          r"|j        s|                    |j                   t	          |          }|                    d 	           |S )Nz6DEV: FATAL get_status_list if not obj and not workflowTabortordernoworkflow==filterfieldsc                     | j         dk    S Nclosedcodess    ./common/models/cmf_workflow.py<lambda>z-CmfWorkflow.get_status_list.<locals>.<lambda>!   s    qv'9     keystatusr   id=)transztrans.status_to.ordernoztrans.status_fromztrans.trans_sdesk_portal_allowztrans.restrict_manual_transr   r   cache_inmemory)allow_empty_transitionr$   Tc                 &    g | ]}|j         j        S  r#   value.0ts     r   
<listcomp>z/CmfWorkflow.get_status_list.<locals>.<listcomp>A   s    FmFmFmVWqtzFmFmFmr   c                 &    g | ]}|j         j        S r*   r+   r-   s     r   r0   z/CmfWorkflow.get_status_list.<locals>.<listcomp>E   s    CjCjCjSTADJCjCjCjr   c                     | j         j        S N)r   r,   )r!   s    r   r   z-CmfWorkflow.get_status_list.<locals>.<lambda>K   s    v~/C r   r*   )	cmf_alertappendmodels	CmfStatuslistsortcmfutilget_obj_by_idr   getr   r#   setr%   trans_sdesk_portal_allowrestrict_manual_transr!   r,   status_from	status_toremoveis_nulltrans_filter_okadd)clsobj_idworkflow_idr   closed_lastr>   r   kwargs
get_filterresobjr   valid_statusesr%   s                 r   get_status_listzCmfWorkflow.get_status_list   s     	\k 	\NVZ[[[[ 	%[FFf$$MM)$$$  	$dK8J 2(&1
"'Sz&SSFSSC ;99:::J ##FJ3I#JJ%))#s|/     * 

 

 ' 	9#-2 9Jh;W7\7\7\;^6<>B9 9 28	9 9N
 ^,,^ 	8 	8E' 0N * sz}/BFmFm[`[lFmFmFm/m/mrw  sB/m  GL  GV  Zh  Gh  Gh%%eo666 ( 8CJM,?CjCjX]XiCjCjCj,j,j((-- 8 ? ! "&&u777n-- C CDDDr   c                     dd| g}|r||g}|pg }d|vr|                     d           t          j        j        d||d|}|r|                    d            |S )Nr   r   need_approve)r   r   c                     | j         dk    S r   r   r   s    r   r   z)CmfWorkflow.status_list.<locals>.<lambda>Z   s    16X#5 r   r   r*   )r5   r6   r7   r8   r9   )selfr   rI   r   rJ   rK   rL   s          r   r   zCmfWorkflow.status_listN   s     $-
 	.$f-J2''MM.)))#O6*OOOO 	7HH55H666
r   OPENc           
         dg}d }|r|                      dd|g|          }nwr2|                      |d          }|                    dfd           nC|d	k    r d
g}|                      g dg dg|          }|s|                      dd|g|d          }|r|d         S |rt          d|  d| d| d           d S )Nr   r   r   )r   order_byT)rV   rI   c                     | j         j         k    | j        j        k    | j        j        k    | j        j        k    j        dk    o
| j        dk    fS )N	IN_REVIEWCLOSED)r#   r   namestatus_type)r   r!   s    r   r   z0CmfWorkflow.get_default_status.<locals>.<lambda>k   sR    DFI%Ffk)Ffk)MV%77&+5S!-8:S r   )reverser    rY   z-orderno)r[   r   rY   )r   r   r   r[   )r   rV   rI   r   u+   Отсутствует статус для z status_type=z, status_code=z	, status=)r   r9   CmfError)rS   r[   status_coder!   raise_errorrV   rL   s      `   r   r	   zCmfWorkflow.get_default_status^   s   ; "	""k2! #  CC  	""H$"GGCHH     	 	 	 	 h&&&<&&777000 & '    &&)4=%4 '  
  	[q6M 	[Zd Z Z +Z Z;FZ ZQWZ Z[ [ [	[ 	[r   c                 L    t                                                      dgz   S )Nr   )supersave_preload_fields)rS   	__class__s    r   rb   zCmfWorkflow.save_preload_fields   s     ww**,,w66r   c                 V   | j                             ddg           i | j         j        D ]}|                    ddg           |                                }d|_        |j        |_        | |_        |                                 ||<   |j        D ]O}|                    g d           |                                }d|_        ||_	        |                                 P| j         j
        D ]}|                    ddg           |                                }d|_        | |_        fd|j        D             |_        |j        j        r|j                 |_        |                                 |                    g d	           |j        D ]V}|                    dd
g           |                                }d|_        | |_        ||_        |                                 W|j        D ]V}	|	                    dd
g           |	                                }
d|
_        | |
_        ||
_        |
                                 W|j        D ]V}|                    dd
g           |                                }d|_        | |_        ||_        |                                 Wd S )Nstatusesr%   **approve_groupsF)rf   	approversmaster_approversr@   c                      g | ]
}|         S r*   r*   )r.   _ststatus_mappings     r   r0   zACmfWorkflow.scaffold_statuses_and_transitions.<locals>.<listcomp>   s    $V$V$VS^C%8$V$V$Vr   )trans_filterstrans_validatorstrans_actionswz_value_obj)templateload_fieldsre   clonesystemr   r   saverg   parentr%   r@   rA   is_not_nullrm   
transitionrn   ro   )rS   stst_new
approve_grapprove_gr_newr%   	trans_newr   
filter_new	validatorvalidator_newaction
action_newrl   s                @r   !scaffold_statuses_and_transitionsz-CmfWorkflow.scaffold_statuses_and_transitions   s   !!:w"7888-( 	& 	&BNND"23444XXZZF!FM'FK"FOKKMMM!'N2 / & &
&&'N'N'NOOO!+!1!1!3!3(-%(.%##%%%%& ](  	"  	"Et]3444I$I!%I$V$V$V$VEDU$V$V$VI!". J&4Y5H&I	#NNTTTUUU- " """D.#9:::#\\^^
$)
!&*
#(1
%!!!!"3 % %	%%t^&<=== ) 1 1',$)-&+4(""$$$$- " """D.#9:::#\\^^
$)
!&*
#(1
%!!!!" 	r   c                     | j         sq| j        j        sT| j        j        sH| j        j        s<| j        j        s0| j        j        s$| j        j        s| j        j        s| j	        j        rt          d           dS dS dS )u   
        Оповещаем пользователя, если выбранные им галочки не будут активированы
        u   Для работы выбранных опций необходимо активировать "Переопределять опции Simple Logic Проекта". Иначе будут применяться настройки ПроектаN)enable_sl_controlsl_deadline_shift
is_changedsl_only_owner_approvesl_deny_no_approve)sl_allow_executor_change_nofatal_deadlinesl_task_need_approvesl_readonly_closed_tasksl_task_only_owner_close.sl_deny_closing_task_before_closing_checklistsr4   rS   s    r   sl_consistent_warningz!CmfWorkflow.sl_consistent_warning   s     % 
	l%0 	l1<	l.9	l EP	l 0;		l
 3>	l 4?	l JU	l  k l l l l l
	l 
	l	l 	lr   c                 `    t          t          j                            | dd                    S )uP   Возвращает есть ли на данном БП утверждениеT)r   rQ   r'   )boolr6   r7   r<   r   s    r   rQ   zCmfWorkflow.need_approve   s+     F$(($TZ^(__```r   c                     | j                             ddg           | j         j        | _        | j         j        | _        d S )Npublish_approved_onlypublish_by_owner_only)rq   rr   r   r   r   s    r   scaffold_flagszCmfWorkflow.scaffold_flags   s?    !!#:<S"TUUU%)]%H"%)]%H"""r   c                    | j         r| j        st          dd           | j        j        r;t
          j                                         t          j	        st          dd           | 
                                 | j         r|                                  | j         } t                      j        |i | |r|                                  d S d S )NuB   Выберите шаблон для Бизнес-процессаTr   u   Использование "Действий после сохранения объекта" недоступно в Вашей версии, обратитесь в Техническую поддержку.)is_newrq   r4   save_eval_coder   r6   CmfAccessListcheck_admin_modeconfigBZPYTHON_ENABLEDr   r   ra   ru   r   rS   argsrJ   r   rc   s       r   ru   zCmfWorkflow.save   s    ; 	ht} 	hZbfgggg) 	{ 11333* {  n  vz  {  {  {  {""$$$; 	"!!!d%f%%% 	52244444	5 	5r   c                     | j         r|                                  | j         } t                      j        |i | |r|                                  d S d S r3   )r   r   ra   _save_importr   r   s       r   r   zCmfWorkflow._save_import   sl    ; 	"!!!d-f--- 	52244444	5 	5r   c                 L    t           j                            | dgd          }|S )Ntarget_workflowT)r   r   r'   )r6   CmfSchemeWfRuler8   )rS   ruless     r   _get_related_ruleszCmfWorkflow._get_related_rules   s)    &++DJ[I\mq+rrr   c                      g d}ddd                                  gg}| fd|D             z  }t          j                            ||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                     g | ]}|d gS r   r*   )r.   fieldrS   s     r   r0   z4CmfWorkflow._get_related_schemes.<locals>.<listcomp>  s     III%5$-IIIr   Tr&   )r   r6   CmfSchemeWfr8   )rS   scheme_fieldsfilter_schemeschemess   `   r   _get_related_schemesz CmfWorkflow._get_related_schemes   sv    	
 	
 	
  149P9P9R9RSTIIII=IIII$))}ei)jjr   c                    |                                  }t          j                            ddd|gdd| gg          }dddfd	|D             }t          j                            ddd| gd
d| ggdg          }|D ][}|j        rR|                    |j        j                                                   ||j        j                 dxx         dz  cc<   \t          j	                            ddd| gd
d| ggdg          }|D ][}|j        rR|                    |j        j                                                   ||j        j                 dxx         dz  cc<   \i }|
                                D ]i\  }	}
|
k    r|
||	j        j        <   t          j	                            |	          t          j                            |	          d||	j        j        <   j|rt                              |          nd S )Nr   	scheme_wfr   r   r   r   r   )tasksdocsc                 :    i | ]}|                                 S r*   )copy)r.   projectdefault_scores     r   
<dictcomp>z9CmfWorkflow.get_related_projects_info.<locals>.<dictcomp>  s'    WWW7-"4"4"6"6WWWr   r   r   r   r      r   )r   )r   r6   
CmfProjectr8   CmfDocumentr   
setdefaultr,   r   CmfTaskitemsrZ   countjsondumps)rS   related_schemesrelated_projectsprojects_dictrelated_docsdocrelated_taskstaskres_dictr   
count_dictr   s              @r   r
   z%CmfWorkflow.get_related_projects_info  su   3355!,11$dTc@dAKTSW@X:Z1 [ ["#Q//WWWWFVWWW)..tj$PT=U>UW[]a=b7d7@k / C C   	> 	>C{ >(():M<N<N<P<PQQQck/0888A=888++D:tT:R;RTXZ^:_4a4=; , @ @ " 	@ 	@D| @(();]=O=O=Q=QRRRdl01':::a?:::#0#6#6#8#8 	 	GZ]**/9+,, $^11'1BB".44W4EE0 0+,, (09tzz(###T9r   c           
         t           j                            dddddggdd| j        j        gdd	d
| j        j         d
gg          }|rt          dd           t          t           j	        j        | j        j        |g           d S )NANDr!   r   openin_progressrZ   r   params_jsonILIKE%r   uc   Работа по замене данного бизнес-процесса уже запущенаTr   )r   )
r6   CmfDeferredJobr   replace_workflowrZ   r#   r,   r4   schedule_deferred_jobr   )rS   new_workflow_id_kwargsreplace_task_existss       r   r   zCmfWorkflow.replace0  s    $399%(TX[acpZqIrJPRVX\XmXrIsJWY`bvfjfmfsbvbvbvIwBy9 z z  	I{  DH  I  I  I  If0AXgHhiiiiiir   u(   Смена бизнес-процесса)descriptionshow_bg_progressbarc                    t           j                            |           t           j                            |          }t           j                            dg          }|D ]8}|j        k    r+||_        |                    d           t                       9g d}ddd	|gg}|fd
|D             z  }t           j                            ||          }	|	D ]P}
|D ]'}t          |
|          k    rt          |
||           (|
                    d           t                       Qddg}t          j                    D ]}|j        dv r	 |                    dgfd|D             z   |ddg          }|snT|D ]B}|D ]'}t          ||          k    rt          |||           (|                    d           Ct                       t          j                    D ]s}|j        dv rd|j        v r^	 |                    ddgdgddg          }|sn<|D ]*}|j        k    r||_        |                    d           +t                       ]td S )N)r#   r   )r   r   F)notifyr   r   r   r   c                     g | ]}|d gS r   r*   r.   r   old_workflows     r   r0   z0CmfWorkflow.replace_workflow.<locals>.<listcomp>R  s     TTT%5$5TTTr   r   r   r   )r   r   Tc                     g | ]}|d gS r   r*   r   s     r   r0   z0CmfWorkflow.replace_workflow.<locals>.<listcomp>c  s!    6u6u6uW\t\7R6u6u6ur   r      )r   r   slice)r7   CmfTransActionCmfTransFilterCmfTransValidCmfTransdefault_workflowr   )r6   r   r<   r   r8   r   ru   
cmf_commitr   getattrsetattrr   iter_subclasses
class_namer   r   r   )old_workflow_idr   r   rJ   new_workflowwf_rulesrulewf_scheme_fieldsr   
wf_schemesschemer   active_entity_fieldsmodelobj_listrM   r   s                   @r   r   zCmfWorkflow.replace_workflow9  s,    )---AA)---AA)..|UfTg.hh 	 	D#|33'3$			'''	
 	
 	
  14BCTTTTCSTTTT',,MJZ,[[
  	 	F) 9 965))\99FE<888KKuK%%%LLLL # 
 %466 	 	E#EEE ::dV6u6u6u6u`t6u6u6u-u-A-.G & 5 5   # + +C!5 > >"3..,>>#C===HHEH****
  .00 	! 	!E#qqq!U\11
!$zz2DdL1Y2D1E12B  *  9  9H $ ' 3 3/<??3?C0HHEH222LLL
!		! 	!r   c                 N   d}g }t          j                    D ]n}ddd| gdd| gg}t          |d          r|                    dd| g           ||                    |          z  }|r|s|                    dd| gddg	          }o|r*|                    d
           t          d| dd           t          j        	                    | ||          D ]} |j
        d|dd| t          j        	                    | ||          D ]}	 |	j
        dd|i| |rjt          j        	                    ddd| gdd| ggddg|          D ]<}
|
j        | k    rd |
_        |
j        | k    rd |
_        |
                    d           = t!                      j
        d||d| d S )Nr   r   r   r$   r   r   r   
   )r   r   z...u   Невозможно удалить используемый бизнес процесс. Данный бизнес процесс используется в u    объектахTr   )r   include_deletedinclude_system)TEXKOM_db_deleteforce)r   r  r  r  r   )r   r   r  	only_datar*   )r   r   hasattrr5   r   slistr4   r6   r7   r8   deleter   r   r   r   ru   ra   )rS   r  r  rJ   	ref_count	top_usager  _filterr!   r   r   rc   s              r   r  zCmfWorkflow.delete  s   		$466 
	W 
	WE
 j#t47NPSUY6Z[Gu899 H :CFGGGG444I W W!KK
C/FqRTgKVV	 	\U### O  s|  O  O  O  W[\ \ \ \ &++TK[l|+}} 	S 	SFFMR+;4RR6RRRR*//Vf  xH/  I  I 	E 	EDDKDD)9DVDDDD 		, ,11$AXZ^`d@e;UW[]a:b:d:QSm9nBR 2 T T , , /47737F02d::6:F3d++++P(8PPPPPPPr   c                 0   |r|sd S t           j                            ddd|j        ggdd|gg          D ]}|                    |          r|c S t           j                            dg ddd|gg          D ]}|                    |          r|c S d S )NTr@   r   rA   r$   )r'   r   )r@   r$   N)r6   r   r8   r#   rD   )rS   rM   r@   rA   possible_transitions        r   calc_transitionzCmfWorkflow.calc_transition  s     	) 	4#)?#7#7tD;>"23#y)U
#7 $ $ 	+ 	+ #22377 +****+ $*?#7#7t&&&#y)U
#7 $ $ 	+ 	+ #22377 +****+tr   c           
      4   d}|sd S |                      |||          }|sN|j                                         |j        s,t          d|j         d|j         d|j         d| d           d S |                    |           |                    |          }|S )NFuA   Нет доступного перехода из статуса u    в статус u"    у Бизнес-процесса u    для объекта Tr   )r  r(   loadr4   rZ   r   trans_validator_oktrans_run_actions)rS   rM   r@   rA   is_task_transition_runhas_changesrx   s          r   run_transitionzCmfWorkflow.run_transition  s      	F))#{IFF
 	,113333 w j^i^n j j  BK  BP j j?B|j jdgj jquw w w wF 	%%c*** !22377r   r   c                 J    t           j                            |||           d S )N)obj_version)r6   
CmfApproveupdate_approves)rS   rM   approve_groupr  s       r   recalc_approvegroup_approvesz(CmfWorkflow.recalc_approvegroup_approves  s&    ))-+)VVVVVr   )	only_once
system_jobc                    dd| gg dg}t           j                            |ddg          D ]B}t           j                            ||           t           j                            |d           Ct           j                            |g d          D ]L}t           j                            ||           t           j                            ||j        j                   Md S )	Nr   r   zstatus.need_approver   Tr!   r   r   r   )r!   r    cur_workflow_version.doc_version)	r6   r   r8   r  remove_approvegroup_approvescalc_statusr   cur_workflow_versiondoc_version)wfr  r   r   r   s        r   r&  z(CmfWorkflow.remove_approvegroup_approves  s    r"///
 N''v08)/D ( F F 	3 	3D::=$OOO))$2222%**&/h/h/h + j j 	U 	UC::=#NNN))#s/G/STTTT	U 	Ur   c                     t           j                            |g d          }dd| gg dg}t           j                            |ddg          D ]B}t           j                            ||           t           j                            |d	           Ct           j                            |g d
          D ]W}t           j                            |||j	        j
                   t           j                            ||j	        j
                   Xd S )N)rh   ri   min_approversr"   r   r   r$  r!   r   r   r   )r!   r   r(  r%  )r6   CmfApproveGroupr<   r   r8   r  create_approvegroup_approvesr'  r   r(  r)  )wf_idapprove_group_idr  r   r   r   s         r   add_approvegroup_approvesz%CmfWorkflow.add_approvegroup_approves  s:    .223CL~L~L~2 u%///
 N''v08)/D ( F F 	3 	3D::=$OOO))$2222%**& 0A  0A  0A + B B 	U 	UC::=#sOgOsttt))#s/G/STTTT	U 	Ur   c           	         t           j                            |           }t           j                            |ddg          }dd|gg dg}g d}t           j                            ||          D ]}|r=t           j                            |d	|d
g          }	|	d
         dk    s|	d
         dk    rA|                    |||j        j	                   t           j        
                    ||j        j	                   t           j                            ||          D ]w}
|r=t           j                            |
d	|d
g          }	|	d
         dk    s|	d
         dk    rA|                    |
|           t           j        
                    |
d           x|s|sdS g dd	d|gg dg dg dg dg}t           j                            |g d          }|sdS t          |          t          |          z
  }t          |          t          |          z
  }t                      }|D ]q}|rN|j        j        j        |v r;|                                 t"                              d|j        j                    |                    |j        j                   r|rt           j                            ddt          |          g          }|D ]}t-          |t           j                  r0|j                            |           |                    d           |D ]R}t           j                            ||||j        d          }t"                              d|j        j                    SdS dS )uj  
        Перезаполняет аппрувы задач/документов на утверждении при изменении состава/свойств апрувгрупп или мастераппруверов статуса
        Если approve_group==None => поменялся статус. Иначе - аппрувгруппа
        rh   ri   r"   r   r   r$  )	r!   zstatus.master_approverszstatus.approve_groupsz"status.approve_groups.approve_typezstatus.approve_groups.approversz&status.approve_groups.master_approversr   r(  r%  r   r  
resolution)rM   approve_typer  r   approvedrejectedr   N)r4  r$   personr$   )approver!=N)r!   r9  r   )rM   r9  N)zobj.cache_status_typer9  rY   )rM   r8  z
obj.statusu   Удалили аппрув: r#   r   r   Tr	  )rM   r8  r  
obj_statusr  u(   Создали новый аппрув: )r6   r   r<   r-  r   r8   r  r   r(  r)  r'  r   r=   r8  r#   r,   r  gdebugrE   rM   	CmfPerson
isinstanceapprovers_forextendru   _create_or_update_approver!   )r/  r0  approvers_old_idsapprovers_new_idsr*  r  r   r   r   aggreg_groupr   approve_filterapprovesadd_approversdelete_approversobj_idsapproverM   add_approvernew_approves                       r   recalc_all_approveszCmfWorkflow.recalc_all_approves  s*    ##E**.223C[ZlLm2nn r"///

] ] ] %**&*HH 	U 	UC %044?jw  BN  AO4   P   P-;;|L?Y]g?g?g++C@X@deee))#s/G/STTTTN''vf'EE 	3 	3D %044Okx  CO  BP4   Q   Q-;;|L?Y]g?g?g++D-@@@))$2222! 	%6 	F ,++c=1$$$&&&555
 $))HiHiHi)jj 	F-..5F1G1GG011C8I4J4JJ%% 	+ 	+G LG$4$7$=AQ$Q$Q   J
8HJJKKKKK)**** 	_",11$d=FYFY9Z1[[M _ _c6>22 -%,,];;;HHtH,,,$1 _ _L"("3"M"MRUWc\iY\YcZ[	 #N #P #PK GG]{~G[]]^^^^_	_ 	__ _r   )NNNFFN)NFN)rT   NNTr3   )FF)F)r   )NNN)$__name__
__module____qualname__	api_allowcommonr   cmf_workflowr   api_methodsclassmethodrO   r   r	   rb   r   r   propertyrQ   r   ru   r   r   r   r
   r   staticmethodcmf_deferred_jobr   r  r  r  r   r&  r1  rM  __classcell__)rc   s   @r   r   r      s       I-,8D H
 H
 H
 
K uz $; ; ; [;z    ,[ ,[ ,[ ,[\7 7 7 7 72 2 2hl l l  a a XaI I I
5 5 5 5 5$5 5 5 5 5    $!: !: !:Fj j j j "LbfgggB! B! hg \B!H"Q "Q "Q "Q "Q "QH  &   :W W W W 666U U 76 \U 666U U 76 \U" 666P_ P_ P_ 76 \P_ P_ P_ P_ P_r   r   )
cmf.includecommon.fields.cmf_workflowrR  
cmf.modelsr   common.models.cmf_active_entityr   r   rS  r   r*   r   r   <module>r^     s        ! ! ! !             ; ; ; ; ; ;E	_ E	_ E	_ E	_ E	_&-,8 E	_ E	_ E	_ E	_ E	_r   