
    6Ni}                         d dl  d dlZd dlmZ d dlmZ  G d dej                  j                  j                        Z	y)    )*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 Zd dZ fdZ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replacec                    |s|st        dd       |sdg}nd|vr|j                  d       |sDdd|g}|r||g}t        j                  j                  d||d|}	|r|	j                  d 	       |	S t        j                  |dd
g      }
t        j                  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 ]D  }|r|j                  s|j                  r|
j                   j                  j"                  |j$                  D cg c]  }|j                  j"                   c}v r6|j&                  r*|j&                  |v r|j)                  |j&                         |j$                  j*                  sP|
j                   j                  j"                  |j$                  D cg c]  }|j                  j"                   c}v s	|j-                  |
      s|j&                  s*|j/                  |j&                         G t	        |      }|j                  d 	       |S c c}w c c}w )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    qvv'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                 .    | j                   j                  S N)r   value)r!   s    r   r   z-CmfWorkflow.get_status_list.<locals>.<lambda>K   s    v~~/C/C 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_lastr7   r   kwargs
get_filterresobjr   valid_statusesr%   ts                  r   get_status_listzCmfWorkflow.get_status_list   sl    kNVZ[[Ff$MM)$ $dK8J(&1
""''Sz&SFSC9:J ##FJ3I#J%%))#s||/   * 

 '#--22 9Jh;W7\;^6<>B9 28	9N
 ^,^^ 	8E'0N0N**szz}}/B/B[`[l[lFmVWqttzzFm/mrw  sB  sB  GL  GV  GV  Zh  Gh%%eoo6  ((CJJMM,?,?X]XiXiCjSTADDJJCj,j((- ?? "&&u7	8 n- CD Gn Dks   I42I9c                     dd| g}|r||g}|xs g }d|vr|j                  d       t        j                  j                  d||d|}|r|j	                  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    166X#5 r   r   r,   )r.   r/   r0   r1   r2   )selfr   rB   r   rC   rD   rE   s          r   r   zCmfWorkflow.status_listN   so     $-
$f-J2'MM.)##O6*OOHH5H6
r   c                 d    t         j                  j                  d| dddg      }|j                  S )uN   Получает стартовый статус бизнес-процессаTr:   zstatus_to.need_approve)r'   r   is_create_transitionr   )r/   CmfTransr5   r:   )rM   r%   s     r   get_create_statuszCmfWorkflow.get_create_status^   s>     ##4$]akv  yQ  kR#  Sr   c           
         dg}d }|t         j                  sd}|r| j                  dd|g|      }nmr*| j                  |d      }|j                  dfd	       nA|d
k(  rdg}| j                  g dg dg|      }|s|rdd|g}nd }| j                  ||d      }|r|d   S |rt	        d|  d| d| d       y )Nr   OPENr   r   )r   order_byT)rT   rB   c                    | j                   j                   k(  | j                  j                  k(  | j                  j                  k(  | j                  j                  k(  j                  dk(  xr | 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>t   sh    DDFII%FFfkk)FFfkk)MMV%7%77&&+5S!--8:S r   )reverser    rW   z-orderno)rY   r   rW   )r   r   r   rY   )r   rT   rB   r   u+   Отсутствует статус для z status_type=z, status_code=z	, status=)configWF_CREATE_STATUS_ALLr   r2   CmfError)rM   rY   status_coder!   raise_errorrT   rE   _filters      `    r   r	   zCmfWorkflow.get_default_statusd   s-   ;v'B'B K""k2! # C ""H$"GCHH  	 h&&<&&70 & '  ,dK@G"G&&"%4 ' 
 q6M=dV}N;-yQWPXZ[ [ r   c                 (    t         |          dgz   S )Nr   )supersave_preload_fields)rM   	__class__s    r   rc   zCmfWorkflow.save_preload_fields   s    w*,w66r   c                     t         j                  j                  | dd       }|s<| j                         }t         j                  d| d |dd      }|j	                          y y )NT)r   rO   r9   u   Создание)rX   r   r9   r:   rO   system)r/   rP   r5   r	   save)rM   r%   r:   s      r   create_create_transzCmfWorkflow.create_create_trans   sd    ##TZ^#_//1IOO' #%) $ E JJL r   c                    | j                   j                  ddg       i }| j                   j                  D ]  }|j                  ddg       |j                         }d|_        |j
                  |_        | |_        |j                          |||<   |j                  D ]C  }|j                  g d       |j                         }d|_        ||_	        |j                          E  | j                   j                  D ]  }|j                  ddg       |j                         }d|_        | |_        |j                  D cg c]  }||   	 c}|_        |j                  j                  r||j                     |_        |j                          |j                  g d       |j                  D ]J  }	|	j                  dd	g       |	j                         }
d|
_        | |
_        ||
_        |
j                          L |j                   D ]J  }|j                  dd	g       |j                         }d|_        | |_        ||_        |j                          L |j"                  D ]J  }|j                  dd	g       |j                         }d|_        | |_        ||_        |j                          L  | j%                          y c c}w )
Nstatusesr%   **approve_groupsF)rk   	approversmaster_approversr9   )trans_filterstrans_validatorstrans_actionswz_value_obj)templateload_fieldsrj   clonerf   r   r   rg   rl   parentr%   r9   r:   is_not_nullro   
transitionrp   rq   rh   )rM   status_mappingstst_new
approve_grapprove_gr_newr%   	trans_new_str   
filter_new	validatorvalidator_newaction
action_news                  r   !scaffold_statuses_and_transitionsz-CmfWorkflow.scaffold_statuses_and_transitions   s   !!:w"78--(( 	&BNND"234XXZF!FM''FK"FOKKM!'N2 // &
&&'NO!+!1!1!3(-%(.%##%&	& ]]((  	"Et]34I$I!%IDIDUDU$VS^C%8$VI!""..&4Y5H5H&I	#NNTU-- """D.#9:#\\^
$)
!&*
#(1
%!" #33 %	%%t^&<= ) 1',$)-&+4(""$%  -- """D.#9:#\\^
$)
!&*
#(1
%!"5 	"D 	  "= %Ws   =J=c                    | j                   s| j                  j                  s| j                  j                  s| j                  j                  sn| j
                  j                  sX| j                  j                  sB| j                  j                  s,| j                  j                  s| j                  j                  rt        d       yyy)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_checklistsr-   rM   s    r   sl_consistent_warningz!CmfWorkflow.sl_consistent_warning   s     %%%%0011<<..99EEPP00;;33>>44??JJUU k l V &r   c                 X    t        t        j                  j                  | dd            S )uP   Возвращает есть ли на данном БП утверждениеT)r   rK   r'   )boolr/   r0   r5   r   s    r   rK   zCmfWorkflow.need_approve   s(     F$$(($TZ^(_``r   c                     | j                   j                  ddg       | j                   j                  | _        | j                   j                  | _        y )Npublish_approved_onlypublish_by_owner_only)rs   rt   r   r   r   s    r   scaffold_flagszCmfWorkflow.scaffold_flags   s?    !!#:<S"TU%)]]%H%H"%)]]%H%H"r   c                    | j                   r| j                  st        dd       | j                  j                  r;t
        j                  j                          t        j                  st        dd       | j                          | j                   r| j                          | j                   }t        | 4  |i | |r| j                          y y )NuB   Выберите шаблон для Бизнес-процессаTr   u   Использование "Действий после сохранения объекта" недоступно в Вашей версии, обратитесь в Техническую поддержку.)is_newrs   r-   save_eval_coder   r/   CmfAccessListcheck_admin_moder[   BZPYTHON_ENABLEDr   r   rb   rg   r   rM   argsrC   r   rd   s       r   rg   zCmfWorkflow.save   s    ;;t}}Zbfg))  113**  m  vz  {""$;;!d%f%224 r   c                     | j                   r| j                          | j                   }t        |   |i | |r| j	                          y y r*   )r   r   rb   _save_importr   r   s       r   r   zCmfWorkflow._save_import  sE    ;;!d-f-224 r   c                 L    t         j                  j                  | dgd      }|S )Ntarget_workflowT)r   r   r'   )r/   CmfSchemeWfRuler1   )rM   ruless     r   _get_related_ruleszCmfWorkflow._get_related_rules  s)    &&++DJ[I\mq+rr   c                     g d}ddd| j                         gg}||D cg c]  }|d| g	 c}z  }t        j                  j                  ||d      }|S c c}w )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INr   Tr&   )r   r/   CmfSchemeWfr1   )rM   scheme_fieldsfilter_schemefieldschemess        r   _get_related_schemesz CmfWorkflow._get_related_schemes  sk    	
  149P9P9RST=I%5$-II$$))}ei)j Js   Ac                 t   | j                         }t        j                  j                  ddd|gdd| gg      }ddd}|D ci c]  }||j	                          }}t        j
                  j                  ddd| gd	d| ggd
g      }|D ]g  }|j                  s|j                  |j                  j                  |j	                                ||j                  j                     dxx   dz  cc<   i t        j                  j                  ddd| gd	d| ggd
g      }|D ]g  }	|	j                  s|j                  |	j                  j                  |j	                                ||	j                  j                     dxx   dz  cc<   i i }
|j                         D ]|  \  }}||k7  r||
|j                  j                  <   %t        j                  j                  |      t        j
                  j                  |      d|
|j                  j                  <   ~ |
rt        j                  |
      S d S c c}w )Nr   	scheme_wfr   r   r   r   r   )tasksdocsr   projectr   r      r   )r   )r   r/   
CmfProjectr1   copyCmfDocumentr   
setdefaultr+   CmfTaskitemsrX   countjsondumps)rM   related_schemesrelated_projectsdefault_scorer   projects_dictrelated_docsdocrelated_taskstaskres_dict
count_dicts               r   r
   z%CmfWorkflow.get_related_projects_info+  sH   335!,,11$dTc@dAKTSW@X:Z1 ["#Q/FVW7-"4"4"66WW))..tj$PT=U>UW[]a=b7d7@k / C   	>C{{(():):M<N<N<PQckk//08A=8	>
 ++D:tT:R;RTXZ^:_4a4=; , @ " 	@D||((););]=O=O=QRdll001':a?:	@
 #0#6#6#8 	GZ]*/9++, $^^11'1B"..44W4E0++,	 (0tzz(#9T99 Xs   H5c           
      N   t         j                  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       y )NANDr!   r   openin_progressrX   r   params_jsonILIKE%r   uc   Работа по замене данного бизнес-процесса уже запущенаTr   )r   )
r/   CmfDeferredJobr   replace_workflowrX   r#   r+   r-   schedule_deferred_jobr   )rM   new_workflow_id_kwargsreplace_task_existss       r   r   zCmfWorkflow.replaceN  s    $3399%(TX[acpZqIrJPRVX\XmXmXrXrIsJWY`defjfmfmfsfsettubvIwBy9 z {  DH  If00AAXgHhir   u(   Смена бизнес-процесса)descriptionshow_bg_progressbarc           
         t         j                  j                  |       }t         j                  j                  |      }t         j                  j	                  |dg      }|D ]5  }|j
                  |k(  s||_        |j                  d       t                7 g d}ddd	|gg}	|	|D 
cg c]  }
|
d
|g	 c}
z  }	t         j                  j	                  |	|      }|D ]B  }|D ]  }
t        ||
      |k(  st        ||
|       ! |j                  d       t                D ddg}t        j                         D ]  }|j                  dv r	 |j	                  dg|D 
cg c]  }
|
d
|g	 c}
z   |ddg      }|sA|D ]8  }|D ]  }
t        ||
      |k(  st        ||
|       ! |j                  d       : t                v t        j                         D ]x  }|j                  dv rd|j                  v s!	 |j	                  dd
|gdgddg      }|s?|D ]+  }|j                   |k(  s||_        |j                  d       - t                X y c c}
w c c}
w )N)r#   r   )r   r   F)notifyr   r   r   r   r   r   r   r   )r   r   r      )r   r   slice)r0   CmfTransActionCmfTransFilterCmfTransValidrP   default_workflow)r/   r   r5   r   r1   r   rg   
cmf_commitr   getattrsetattrr   iter_subclasses
class_namer   r   r   )old_workflow_idr   r   rC   old_workflownew_workflowwf_rulesrulewf_scheme_fieldsr   r   
wf_schemesschemeactive_entity_fieldsmodelobj_listrF   s                    r   r   zCmfWorkflow.replace_workflowW  s    ))---A))---A))..|UfTg.h 	D##|3'3$			'			
  14BCCST%5$5TT'',,MJZ,[
  	F) 965)\9FE<89 KKuK%L	 # 
 %446 	E#EE ::dV`t6uW\t\7R6u-u-A-.G & 5  # +C!5 >"3.,>#C=> HHEH*	+
  	  ..0 	!E#qq!U\\1$zz2DdL1Y2D1E12B  *  9H $' 3//<?3?C0HHEH23 L 		!; U" 7vs   -I"Ic                 :   d}g }t        j                         D ]`  }ddd| gdd| gg}t        |d      r|j                  dd| g       ||j	                  |      z  }|sF|rI|j                  dd| gddg	      }b |r"|j                  d
       t        d| dd       t        j                  j                  | ||      D ]  } |j                  d|dd|  t        j                  j                  | ||      D ]  }	 |	j                  dd|i|  |rpt        j                  j                  ddd| gdd| ggddg|      D ]@  }
|
j                  | k(  rd |
_        |
j                  | k(  rd |
_        |
j                  d       B t!        | (  d||d| y )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   hasattrr.   r   slistr-   r/   r0   r1   deleter   r   r   r   rg   rb   )rM   r   r  rC   	ref_count	top_usager   r`   r!   r   r   rd   s              r   r  zCmfWorkflow.delete  s   		$446 
	WE
 j#t47NPSUY6Z[Gu89 :CFGG44I!KK
C/FqRTgKV	
	W U# r  s|  r}  }N  O  W[\ &&++TK[l|+} 	SFFMMR+;4R6R	S**//Vf  xH/  I 	EDDKKD)9DVD	E ,,11$AXZ^`d@e;UW[]a:b:d:QSm9nBR 2 T , //4737F022d:6:F3d+, 	P(8PPr   c                 n   |syg }|j                   rH|j                  s<g ddd| gg}t        j                  j	                  d|      }|j                  |       n|sy|j                   r| j                         }||k7  r|}t        j                  j                  ddd|j                  ggd	d
|gg      D ](  }|j                  |      s|j                  |       |c S  t        j                  j                  dg dd	d
|gg dg      D ](  }|j                  |      s|j                  |       |c S  |S )u  
        Может возвращать 2 перехода в случае, когда в дамми-объекте меняем статус.
        Тогда надо отрабатывать и транзишн create-перехода, и вычисленный транзишн на введенный пользователем статус
        https://bcrm.carbonsoft.ru/project/Document/DOC-016537#spec-perehod-pri-sozdanii-ob-ekta
        N)rO   r   Tr   r   T)r'   r   r9   r   r:   r$   )r9   r$   N)rO   !=T)
r   is_templater/   rP   r5   r.   rQ   r1   r#   r=   )	rM   rF   r9   r:   rE   r   r%   create_statuspossible_transitions	            r   calc_transitionzCmfWorkflow.calc_transition  sJ    ::coo:Zt<TUFOO''tF'KEJJu :: 224M++ $*??#7#7tD;>>"23#y)U
#7 $ 	 #2237

./
	 $*??#7#7t&#y)0U
#7 $ 	
 #2237

./
	 
r   c           
      z   d}t        |d      r|j                  ry | j                  |||      }|s^|j                  j	                          |j                  s7t        d|j                   d|j                   d|j                   d| d       y |D ]'  }|j                  |       ||j                  |      z  }) |S )	NFis_dummyuA   Нет доступного перехода из статуса u    в статус u"    у Бизнес-процесса u    для объекта Tr   )
r  r  r  r(   loadr-   rX   r   trans_validator_oktrans_run_actions)rM   rF   r9   r:   is_task_transition_runhas_changestransitionsrx   s           r   run_transitionzCmfWorkflow.run_transition  s     3
#**3YG,,11333]^i^n^n]o  pA  BK  BP  BP  AQ>s||nLcdgchjquw & 	=J))#. :77<<K		=
 r   c                 H    t         j                  j                  |||       y )N)obj_version)r/   
CmfApproveupdate_approves)rM   rF   approve_groupr  s       r   recalc_approvegroup_approvesz(CmfWorkflow.recalc_approvegroup_approves  s    ))-+)Vr   )	only_once
system_jobc                    dd| gg dg}t         j                  j                  |ddg      D ]B  }t         j                  j	                  ||       t         j                  j                  |d       D t         j                  j                  |g d      D ]V  }t         j                  j	                  ||       t         j                  j                  ||j                  j                         X y )	Nr   r   zstatus.need_approver   Tr!   r   r   r   )r!   r    cur_workflow_version.doc_version)	r/   r   r1   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"/
 NN''v08)/D ( F 	3D::=$O))$2	3
 %%**&/h + j 	UC::=#N))#s/G/G/S/ST	Ur   c                 N   t         j                  j                  |g d      }dd| gg dg}t         j                  j	                  |ddg      D ]B  }t         j
                  j                  ||       t         j
                  j                  |d	       D t         j                  j	                  |g d
      D ]k  }t         j
                  j                  |||j                  j                         t         j
                  j                  ||j                  j                         m y )N)rm   rn   min_approversr"   r   r   r!  r!   r   r   r   )r!   r   r%  r"  )r/   CmfApproveGroupr5   r   r1   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~2 u%/
 NN''v08)/D ( F 	3D::=$O))$2	3
 %%**& 0A + B 	UC::=#sOgOgOsOst))#s/G/G/S/ST	Ur   c           	         t         j                  j                  |       }t         j                  j                  |ddg      }dd|gg dg}g d}t         j                  j                  ||      D ]  }|r5t         j                  j                  |d	|d
g      }	|	d
   dk(  s|	d
   dk(  r:|j                  |||j                  j                         t         j                  j                  ||j                  j                          t         j                  j                  ||      D ]k  }
|r5t         j                  j                  |
d	|d
g      }	|	d
   dk(  s|	d
   dk(  r:|j                  |
|       t         j                  j                  |
d       m |s|syg dd	d|gg dg dg dg dg}t         j                  j                  |g d      }|syt        |      t        |      z
  }t        |      t        |      z
  }t               }|D ]  }|r^|j                  j                  j                  |v r<|j!                          t"        j%                  d|j                  j                          |j'                  |j(                  j                          |rt         j*                  j                  ddt        |      g      }|D ]  }t-        |t         j                        r-|j.                  j1                  |       |j3                  d       |D ]\  }t         j                  j5                  ||||j6                  d      }t"        j%                  d|j                  j                          ^  yy)uj  
        Перезаполняет аппрувы задач/документов на утверждении при изменении состава/свойств апрувгрупп или мастераппруверов статуса
        Если approve_group==None => поменялся статус. Иначе - аппрувгруппа
        rm   rn   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)rF   approve_typer  r   approvedrejectedr   N)r1  r$   personr$   )approverr
  N)r!   r
  r   )rF   r
  N)zobj.cache_status_typer
  rW   )rF   r5  z
obj.statusu   Удалили аппрув: r#   r   r   Tr  )rF   r5  r  
obj_statusr  u(   Создали новый аппрув: )r/   r   r5   r*  r   r1   r  r  r%  r&  r$  r   r6   r5  r#   r+   r  gdebugr>   rF   	CmfPerson
isinstanceapprovers_forextendrg   _create_or_update_approver!   )r,  r-  approvers_old_idsapprovers_new_idsr'  r  r   r   r   aggreg_groupr   approve_filterapprovesadd_approversdelete_approversobj_idsapproverF   add_approvernew_approves                       r   recalc_all_approveszCmfWorkflow.recalc_all_approves4  sp    ##E*..223C[ZlLm2n r"/

] %%**&*H 	UC%0044?jw  BN  AO4   P-;|L?Y]g?g++C@X@X@d@de))#s/G/G/S/ST	U NN''vf'E 	3D%0044Okx  CO  BP4   Q-;|L?Y]g?g++D-@))$2	3 "%6 ,c=1$&5
 $$))Hi)j-.5F1GG01C8I4JJ% 	+GG$4$4$7$7$=$=AQ$Q 7

8H8H7IJKKK))*	+ ",,11$d=FY9Z1[M _c6>>2%%,,];HHtH,$1 _L"("3"3"M"MRUWc\iY\YcYcZ[	 #N #PK GGF{~~G[G[F\]^__ r   )NNNFFN)NFN)NNNTr*   )FF)F)r   )NNN)&__name__
__module____qualname__	api_allowcommonr   cmf_workflowr   api_methodsclassmethodrI   r   rQ   r	   rc   rh   r   r   propertyrK   r   rg   r   r   r   r
   r   staticmethodcmf_deferred_jobr   r  r  r  r  r#  r.  rI  __classcell__)rd   s   @r   r   r      s^   I--,,88DD H
 
K uz $; ;z 3[j75nl  a aI
5$5$!:Fj "LbfgB! h B!H"QH-^:W 6U 7 U 6U 7 U" 6P_ 7 P_r   r   )
cmf.includecommon.fields.cmf_workflowrN  
cmf.modelsr   common.models.cmf_active_entityr   r   rO  r   r,   r   r   <module>rZ     s1     !   ;	_&--,,88 	_r   