
    chI                       d dl Z d dlZd dlmZ d dl mZ d dlmZ d dlZd dlZ	d dl
Z
d dlmZ d dlmZ d dlT d dlmZ d dlZd dlZd d	lmZ  G d
 dej        j        j        j        ej        j        j        j                  ZdS )    N)defaultdict)	timedelta)Decimal)FileStorage)relativedelta)*)CmfTUUID)CmfActiveEntityc                       e Zd Zej        j        j        j        j        ej	        j
        j        j        j        z   g dz   Zedd fd
            Zedd fd
            Zedd fd
            Zed             Zd Zd	 Zd
 Z fdZd Zd Zd Zd Z fdZ fdZ fdZd Zd Zd Zd Zd Z d Z!d Z" fdZ#d Z$d Z%d Z&d Z'd Z( fd Z) fd!Z*d" Z+ fd#Z,d$ Z-d% Z.d& Z/d' Z0	 	 dd(Z1dd*Z2dd+Z3dd,Z4d- Z5dd.Z6d/ Z7d0 Z8d1 Z9d2 Z:d3 Z;d4 Z< fd5Z= fd6Z>d7 Z?d8 Z@ fd9ZAd: ZBd; ZCd< ZDd= ZEd> ZFe fd?            ZGeHI                    d@eHjJ                  ZKeddA            ZLdB ZMdC ZNdD ZO fdEZPddGZQdH ZRdI ZSd)dJdKZTdL ZUd)dJdMZVdN ZW fdOZX fdPZYdQ ZZdR Z[dS Z\dT Z]dU Z^dV Z_dW Z`dX ZadY Zbd fdZ	Zcd[ Zde	 	 d fd\	            Zee	 dd]            Zfe	 	 d fd^	            Zge	 dd_            Zhe	 d fd`	            Zied fda	            Zje	 d fdb	            Zkel emdcd          	 	 dde                        Znelddf            Zodg Zpdh Zqdi ZrddkZsddlZtddmZuddnZvdo Zwdp Zxdq Zydr Zzds Z{dt Z| fduZ} fdvZ~ddxZel emdcdcdyz          d{                         Zeld|             Zeldd}            Zel emdcd~dcdy          d                         Zdjddef fdZedd)ddd fd
            Ze fd            Zededefd            Zed fd	            Zed             Zd)d)d)d)d)ddjd)ddededededef
 fdZd Zel emdcdgddc          d                         Zd Ze fd            Zedd            Zd Z fdZd fd	Zedddd            Z fdZd Zd Zel emdcdcd          d                         Z fdZed fd	            Zeddef fd            Zeddedefd            Zededefd            Zededefd            Zd Zd Zelemdedededdfd                        Zd Zd Z xZS )CmfTask)all_relation_personsapprove_onecopycopy_to_listcountcount_tasks_by_listscreate_dummy_taskcreate_task_from_templateclean_after_encryptdelete_dummy_taskgroup_changes_required_fieldsgroup_changes_list_recursivegroup_changes_statusesgroup_changesmark_clickedmovesave_dummy_taskstatus_options_listtimetracker_change_timeui_getpublic_list
public_getcount_approversN)include_systemc                f    |s|                     dd            t                      j        |i |S NsystemF)
setdefaultsuperlistclsr$   argskwargs	__class__s       !./modules/task/models/cmf_task.pyr*   zCmfTask.list2   s<     	/h...uww|T,V,,,    c                f    |s|                     dd            t                      j        |i |S r&   )r(   r)   r   r+   s       r0   r   zCmfTask.count8   <     	/h...uww}d-f---r1   c                f    |s|                     dd            t                      j        |i |S r&   )r(   r)   slistr+   s       r0   r5   zCmfTask.slist>   r3   r1   c                    t          j        d	ddi|}|j        |_        d|_        t
          j                            t          |j                             |	                    d           |j
        r?|j
                            d|d          s"d |_        d |_
        |	                                 |                                 |                                 d|j        iS )
NcodedummyT)skip_project_perms_checkPPP-TSK-CREATEF)objraise_errorid )modelsr   r=   r7   is_dummygskipcache_select_for_updateaddstr_calc_projectprojectcheck_project_role_accessparent_calc_default_fieldsave)r,   r-   r.   
dummy_tasks       r0   r   zCmfTask.create_dummy_taskE   s     ^;;;F;;
$-
"
	%))#jm*<*<=== 	  $ ??? 	'j&8&R&RScis  BG&R  'H  'H 	' $J!%J$$&&&&&((( jm$$r1   c                    |                      |                                 ddgz              | j        st          d| j         d           |                     d           t          j                            | dd          D ]}d |_	        |
                                 | j        D ]=}t          | j        |         t          j        j                  rt          | |g            >| 
                    d           | j        rC| j        j        }d | _        | 
                    d           |j                            |           t          j                            | d	          D ]}|j                            |           t          j                            d
dd| gdd| ggd          D ]}|j                            |           t          j                            | d          }|D ]}|j                            |           t          j        t          j        fD ]6}|                    | d	          D ]}	|	j                            |	           7t          j                            dd| gd          D ]}	|	j                            |	           t          j                            |           D ]}
|
j                            |
           t          j                            | dd          D ]}|                    d           t          j                            | d          D ]}|                    d           | j                            |            d S )Nr@   
checklists   Не dummy task TabortTEXKOM_db_deleteparent_taskinclude_deletedr$   	only_datataskrU   ORout_link==in_linkfilterrU   )rH   rU   r;   =rH   )rH   rU   include_dummy)load_fieldssave_preload_fieldsr@   	cmf_alertr=   _delete_checklistsr?   r   r*   rT   rJ   fields
issubclasscmf
CmfM2MBasesetattrop_gantt_taskvaluedpdeleteCmfShadowLinkCmfRelationOptionCmfTimeTrackerHistoryCmfListHistoryOTRCmfListHistoryRTECmfStatusHistoryCmfTaskResAssign
CmfCommentCmfAttachment)selfsubtask
field_namegtlinkreltt_history_listtthmodelhrescomment
attachments                r0   r   zCmfTask.delete_dummy_taskb   s   11337
 
 	 	 	 } 	@222$????666 ~**tTbf*gg 	 	G"&GLLNNNN + 	. 	.J$+j13:3HII .j"---		D	!!!  	#)B!%DIII%%%ELL(--4-NN 	! 	!DGNN4    +00
DRV?WZceikoYp8qAE 1 G G 	 	CFMM# 6;;4Y];^^" 	 	CFMM#.0HI 	 	EZZT4Z@@  A(--eS$5GY]-^^ 	 	ADKKNNNN*//t/<< 	 	CFMM#(--  . 
 
 	2 	2G
 NNDN1111 .33  4 
 
 	5 	5J t4444tr1   c                    |                      g d           | j        j        r| j        j        | _        | j        j        r| j        j        | _        | j        j        r&| j        | j        j        k     r| j        j        | _        | j        j        r| j        j        | _        | j        j        r2| j        j        D ]%}|| j        vr| j                            |           &| j        j        rn| j        j	        rbt          j
                            t          j        j                  | j        j        | j        j	        z
  z   }| j        r| j        |k    r|| _        | j        j	        r| j	                                         d S d S )N)
zcloned_from.parentzcloned_from.listszcloned_from.logic_typezcloned_from.priorityzcloned_from.deadlinezcloned_from.alarm_datezcloned_from.responsiblelistsprioritydeadlinetz)rc   cloned_fromrH   
logic_typer   responsibler   appendr   
alarm_datedatetimenowtimezoneutcset_now)ry   ldeadline_mins      r0   #_save_dummy_task_sync_from_templatez+CmfTask._save_dummy_task_sync_from_template   s   
 	 V V V 	W 	W 	W " 	2*1DK& 	:".9DO$ 	:}t/888 $ 0 9' 	<#/;D! 	)%+ ) )DJ&&J%%a((($ 	-)9)D 	-#,00H4E4I0JJdN^Ngjnjz  kF  OF  GL= -DML$@$@ ,& 	&O##%%%%%	& 	&r1   c                 |   |                                   | j        st          d| j         d           |                                D ]=\  }}t          | |         t          j        j                  r+|| |<   d| |         _	        >d| _        | 
                                 d| _        | j        | j        k    rd | _        nt          d| j         d           | j        r|                                  | j        r| j        j        rd| _        |                                  | j        | j        | j        | j        dS )NrN   TrO   Fu)   Выставлен код у dummy-task: )r=   r7   name	parent_id)save_preparer@   re   r=   items
isinstanceri   rg   
CmfBackref
is_changed_load_changed_fieldsis_newr7   cloned_from_idr   rT   is_templaterJ   r   r   )ry   changed_fieldskvs       r0   r   zCmfTask.save_dummy_task   s\    	} 	@222$???? #((** 	& 	&DAq$q'3:#899 DG!%DG!!###9DIIM$)MMUYZZZZ 	744666 	$ 0 < 	$#D		 'II	
 
 	
r1   c                 &   | j         st          d| j         d           dt          _        |                                  |                                  |                                  |                                  | 	                                 | 
                                 |                                  |                                  |                                  |                                  |                                  |                                  |                                  |                                  |                                  |                                  |                                  |                                  |                                  |                                  | j        j        r|                                  t9          t:          j        j        |                                ddd          S )NrN   TrO   F)notifyemitaudit)!r@   re   r=   rA   TEXCOM_ENABLE_GROWCACHE_HACKrE   _calc_parent_task!_calc_parent_task_has_child_tasks_calc_gantt_path_calc_gantt_task_calc_activity_calc_scheme_wf_calc_logic_type_calc_workflow_calc_status_calc_parent_logic_prefix_calc_ui_view_form_calc_fix_versionscalc_history_calc_wf_simple_logic_calc_perm_security_level_set_lists_from_parent_task_clean_result_text_clean_text_calc_checklistsrH   r   _do_parent_is_changedr)   ri   r?   CmfModelrJ   ry   r/   s    r0   _dummy_savezCmfTask._dummy_save   s    } 	@222$???? *.&   ..000 	&&(((!!!!!!""$$$&&(((((***!!!;! 	)&&((( SZ($//44EUZ4[[[r1   c                     d}|                      g ddd| j        ggdgd          }|r-t          |j                            d          d                   }|S )	N)r7   z
SIMILAR TOz
%-[0-9]+\ZrF   r`   -cmf_created_atT)r_   order_byrU   -)sget
project_idintr7   split)ry   
max_numberlasts      r0    _get_current_code_number_from_dbz(CmfTask._get_current_code_number_from_db%  sr    
yy!E!E!E	SVX\XgGh i#4"5)-  / /  	7TY__S11"566Jr1   c                 (   t           j        }d}| j        r| j        j        }d| j         d| }| j         d| d}|j                            |d          }|                                 	 |                    |          r|	                    |          }n-| 
                                dz   }|                    ||           	 |                                 n# t
          j        j        $ r7}t                              d| d	|j         d
|j                    Y d}~npd}~ww xY w# 	 |                                 w # t
          j        j        $ r7}t                              d| d	|j         d
|j                    Y d}~w d}~ww xY wxY w| S )uN    Высчитывает следующий номер для кода
        	NOPROJECTznext_code_number-r   z.lock   )timeout   zlock release error z, lock_name z
, timeout N)APPREDIS_DBr   rm   
class_nameredislockacquireexistsincrr   setrelease
exceptions	LockErrorrA   debugr   r   )ry   redis_dbsuffixkeylock_keyr   next_code_numberes           r0   r   zCmfTask.next_code_number/  s    < ? 	+_*F<$/<<F<<o55555~""8R"88
	bs## 4#+==#5#5  #'#H#H#J#JQ#N S"2333b#- b b b`a``TY``RVR^``aaaaaaaabb#- b b b`a``TY``RVR^``aaaaaaaab #$$sO   -AD) C D&/-D!!D&)F+E ?F F-FFFFc           
      t   | j         dk    rd S t          | j        j        t          j                  sd S |                                 \  }}|s|sd S | j        s1| j        j        rt          | j        j
         d           || _        d S | j        s*|r(t          j        j                                        | _        |rv| j        |k    rm| j        | j                                        k    rM|| _        | j        j        r<t          | j        j
         d| j         d| j        j
         d| d           d S d S d S d S d S )NCLOSEDuF    обновлен с учетом плановых дат списка u'    не может быть дальше ())cache_status_typer   rH   rm   r?   
CmfProject_calc_list_plan_intervalr   r   re   captionri   rg   CmfDateTimer   plan_end_datery   list_plan_start_date_minlist_plan_end_date_mins      r0   _calc_alarm_date_listzCmfTask._calc_alarm_date_listM  s   !X--F$++V->?? 	F;?;X;X;Z;Z8 "8' 	0F 	F  	) ~T_4|||}}}6DOF 	;#9 	;!j488::DO! 	Pdo8N&N&NOdo&9&9&;&;;;4DO) P. O O O O*2O O5KO O OP P P P P		P 	P&N&N;;P Pr1   c                    | j         r| j        j        s| j        j        sd S | j         j        rd S | j        D ]?}|j        s|j        r/|j        r| j         s|j        | _         |j        r|j        | _         n@| j         sM| j        rH| j        j        j        dk    r5| j        j         	                                r| j        j         | _         d S d S d S d S d S Nr   )
r   rH   r   
componentsdefault_responsibledefault_owner	cmf_ownerrm   r   load)ry   comps     r0   _calc_responsiblezCmfTask._calc_responsiblej  s    % 	&	*	 F& 	FO 	 	D' 4+= + @D4D @'+'?D$% 8%)%7DN ! 	7	7"-==(--// >  ${6D	7 	7 	7 	7====r1   c                    | j         sV| j        j        sJ| j        j        s>| j        j        s2| j        j        s&| j        j        s| j        j        s| j        j        sd S t                      
                                 | j        j        rM| j        rF| j        j        j        dk    r1| j        j                                        r| j        r| j        | _        | j        r|                                  | j        r\| j        j        s| j         rM| j        | j                                        k     r)t$          j        r!| j                                         d S d S d S d S d S r   )r   r   r   statusr   activityr   plan_start_dater   r)   _calc_alarm_daterH   rm   r   auto_alarm_dater   r   r   rA   import_moder   r   s    r0   r  zCmfTask._calc_alarm_date  s    
	?-
	 ;)
	 =+	
	
 =+
	 :(
	 '2
	 %0
	 F  """  +	3	3 $ 1 < L L+0022 !M$ !M #2DO : 	)&&((( _ 	&+	&/3{	&!4!4!6!666} 7 O##%%%%%	& 	&66	& 	&66r1   c                     | j         r | j        r| j                                          t	                      j        |i |S N)r   r   r   r   r)   _save_templatery   r-   r.   r/   s      r0   r	  zCmfTask._save_template  sG    ; 	&4+ 	&O##%%%%uww%t6v666r1   c                    | j         j        r	| j         rdS | j        s2| j        j        s&| j        j        s| j         j        s| j         j        sdS | j        j        rK| j        rDt          | j        d          r/| j        j                                         r| j        j         | _         | j        j        rtd}| j        j        D ],}|| j        j	        vr|j                             dg          }-|s.| j        r'| j        d         j                             dg          }|r|| _         | j         s"t                                                       dS dS )u   
        Вычисляем вид деятельности
        Метод вызывается из базового класса.
        :return:
        Nr  r   rg   r   )r  r   r   rH   r   is_nullhasattrr   newoldr)   r   )ry   tmp_activityr;   r/   s      r0   r   zCmfTask._calc_activity  s    =# 	 	F K	{%	 z$	 }'		
 }$	 F;! 	5{ 5wt{J?? 5DKDXD]D]D_D_ 5 $ 4:  		-Lz~ C Cdjn,,#&<#4#4SE#4#B#BL IDJ I#z!}5::3%:HH - ,} 	%GG""$$$$$	% 	%r1   c                     d S r  r>   ry   s    r0   _calc_parentzCmfTask._calc_parent  s    r1   c                    | j         | j         j        k    rd S | j        rT| j         sd | _        n/| j         j                                         | j         j        | _        |                     d           | j                                         t          j	        
                    dd| gddg          }|D ]2}|j         | j         k    r | j         |_         |                                 3d S )NTrV   rT   r`   rH   rl   r_   rg   )rH   r  gantt_projectmain_gantt_projectr   rJ   rl   task_parent_is_changed_hookr?   r   r*   )ry   child_tasksrY   s      r0   r   zCmfTask._do_parent_is_changed  s    ;$+/))F 	&; D%)"".33555%)[%C"III%%%66888n))-d1KU]_nTo)pp 	 	D{dk))"k			 	r1   c                    | j         j        s&| j        j        s| j        j        s| j        j        sd S | j        r| j        j        r| j        | j        j        k    r| j                            ddg           | j        j        dk    rgd}| j        j        | _        |                                  t          
                    | |d                                           t          |           d S | j        j        rd S | j         j        r\| j         rU|                                 }|r?|| j        k    r4|                    g d           || _        |                                  d S | j        j        r	| j        rd }d }|                     dd	g           | j        j        r3| j        j        j        r"| j        j        j        }| j        j        j        }|r| j        sNd
}|| _        t          
                    | |d                                           |                                  d S |rTd}|| _        t          
                    | |d                                           |                                  d S d S d S d S d S )NrH   logic_prefixtask.gantt_projectu   SimpleLogic: в задаче установлен проект равный проекту родительской задачи   rH   text	log_level)r   cmf_owner_assistantsr  r   8responsible.primary_role.structural_project.default_listz1responsible.primary_role.structural_project_forceu   SimpleLogic: Задача добавлена в Структурный проект Главной роли исполнителяu   SimpleLogic: Проект сменен, т.к. в Главной роли исполнителя указано менять проект)tree_parentr   r   rT   rH   r   rc   r  r   r?   rw   rJ   re   _node_parentrd   primary_rolestructural_projectstructural_project_force)ry   	sl_reasonrH   struct_projectstruct_project_forces        r0   _HACK24052023_calc_parentz!CmfTask._HACK24052023_calc_parent  s   '	*	 *	 {%		 F  		 0 : 		~!1!;;; ,,h-GHHH#04HHH !cI"&"2"9DK%%'''%%T	Q%OOTTVVVi(((F ;! 	F & 	4+; 	&&((F &DK//""#b#b#bccc$((***& 	4+; 	!N#' X  [N  O  P  P  P, ^1A1N1a ^!%!1!>!Q'+'7'D']$ {  !eI"0DK%%T	Q%OOTTVVV,,...F'  !lI"0DK%%T	Q%OOTTVVV,,...F/	 	 	 	  r1   c                    | j         r| j        j        s| j        j        sd S | j        j        r| j        dv r| j         r| j        r| j        j        r}|                     dg           | j         | j        k    rU| j         j        | j        k    r@t          j                            | j        ddg          | _         | j         s| j        | _         d S | j        j        re| j	        s| j        j        dvrP| j        dv rG| j
        s@t          j                            | j        ddg          | _         | j         s| j        | _         | j        j        r| j         ry| j        dvrp| j        j        dv rb| j                            d           | j        r9t          d           | j        D ]"}| j         |_         |                                 #d | _         | j        d	k    r	d | _         d S d S )
N	task.epictask.subprojectztree_parent.parentepictree_hidden)rH   sys_typerg   T)rU   u   Скрываем задачу в дереве проекта, её дочерние элементы вставляем вместо неёr  )r$  r  r   rH   r  rc   r?   	CmfFoldergetr   r   r   
tree_nodesr   re   rJ   )ry   childs     r0   _calc_tree_parentzCmfTask._calc_tree_parent,  sF    	 +	 {%	
 F ;! 
	%)III$ JK J KO J 234444;..43C3Jdk3Y3Y#)#3#7#7t{U[erds#7#t#t ' 3'+{D$F   	/[	/$($5$9Aa$a$a%)III( J%/334;QWan`o3ppD# /#';  ?% 	$ 	$!)III!%)IIIO   666 !  h  i  i  i!_ ! !E(,(8E%JJLLLL#D 444#D 54r1   c                 j   | j         rZ| j        }|rQ|j        j        dk    rA|                    ddg           |j        dv r|| _        n|j        }|r|j        j        dk    A| j        j        r[| j        rT| j        j                                         | j        r/| j        j        j        dk    r| j        j        dv r| j        | _        | j	        j        r(| j        dk    rt          dd	           | j	        | _        | j        j        r*| j        dk    rt          d
d	           | j        | _        d S d S )Nr   r  r$  r.  r   ztask.subu2   У подзадач нельзя менять EpicTrO   u@   У подзадач нельзя менять Подпроект)r   r$  rm   r   rc   r  rT   r   r   r1  re   
subproject)ry   tmp_tree_parents     r0   r   zCmfTask._calc_parent_task^  sr   ; 	>".O! >o&;&F,&V&V++^],KLLL"/3SSS'6D$"1"= " >o&;&F,&V&V & 	44+; 	4)..000 4D$4$:$E$R$R(59YYY#'#3 9 	) J..NVZ[[[[#yD?% 	/ J..\dhiiii#D	/ 	/r1   c                 r    | j         rd S | j        j        sd S t          j                            |            d S r  )r   r  r   r?   CmfTimeTrackertimetracker_task_change_statusr  s    r0   _calc_timetrackerzCmfTask._calc_timetrackerz  sB    ; 	F{% 	F 	<<TBBBBBr1   c                    | j         s2| j        j        s&| j        j        s| j        j        s| j        j        sd S |                                  d }|s| j        r| j        }|s2| j        r+t          | j        j        t          j
                  r| j        }|s,| j        r%| j        j                                        r| j        }|s%| j        D ]}|j                                        r|}|s| j        r| j        }|| _        d S r  )r   r$  r   rH   rT   	main_list_load_perm_fieldsr   rm   r?   CmfDocumentperm_has_aclr   r   perm_parent)ry   rE  r   s      r0   _calc_perm_parentzCmfTask._calc_perm_parent  s8    	#/:	>Bk>T	X\XhXs	>,	 F    	+t/ 	+*K 	&t{ 	&z$+:KVM_/`/` 	&+K 	)t~ 	)$.2M2R2R2T2T 	).K 	$Z $ $>&&(( $"#K 	&t{ 	&+K&r1   c                     t                                                      }d | j        D             |d<   d | j        D             |d<   | j        |d<   | j        |d<   | j        |d<   |S )Nc                 <    g | ]}|                     g d           S )r=   r   r7   to_json.0is     r0   
<listcomp>z1CmfTask.get_cache_fields_json.<locals>.<listcomp>  s+    NNNa		"8"8"899NNNr1   r   c                 <    g | ]}|                     g d           S rI  rJ  rL  s     r0   rO  z1CmfTask.get_cache_fields_json.<locals>.<listcomp>  s+    LLLQqyy!7!7!788LLLr1   tags
is_checkedr   activity_id)r)   get_cache_fields_jsonr   rQ  rR  r   rS  )ry   retr/   s     r0   rT  zCmfTask.get_cache_fields_json  st    gg++--NN4:NNNGLL$)LLLF OL>K!-M
r1   c                    d }d }| j         D ]N}|j        dk    r|j        j        r||j        |k     r|j        }|j        j        r||j        |k     r|j        }O|s%|r#t
          j        j                                        }||fS Nr   )	r   r   r  is_not_nullr   ri   rg   r   r   )ry   r   r   w_lists       r0   r   z CmfTask._calc_list_plan_interval  s    #' !%j 	B 	BF
 '833%1 F+3v7MPh7h7h/5/E,#/ B)1V5ILb5b5b-3-A*' 	D,B 	D'*z'='A'A'C'C$')???r1   c                 F   | j         j        r=t          | j                   r|s'|s%| j        s| j        rd | _        d | _        d | _        d S d }| j        r| j        r| j        | j        z
  }| j         j        r|r|| _        || _        | j        | _        | j        j        r	|r|| _        | j        j        r	|r|| _        | j        j        r|s|r
|dz   | _        |ri|rg| j        r| j        |k    s| j        |k     rJ| j        j        rt          | j        j         d           || _        |r| j        |z   | _        n	|r|| _        |r5| j        r| j        |k    r#t          | j        j         d           || _        | j        r#| j        r| j        | j        k     r| j        | _        d S )Nr   uP    установлена в соответствии с планом списка)	r   r   lenr  r   r   r  re   r   )ry   r   r   self_plan_shifts       r0   _calc_plan_listzCmfTask._calc_plan_list  sk   :  	
 tz?? 
+C 
Lb 
 ' +4+= +&*DO'+$%)" 	HD$6 	H"043GGO :  	3%= 	3#;D !7D"2DO ' 	<,D 	<#;D % 	8*@ 	8!7D% 	?.D 	?Ia 	?!9B!>D (	<,D	<+	< *-CCC*-EEE#. MT19  L  L  L  M  M  M#;D  <%)%9O%K""' <%;" " 	84+= 	8ASVlAlAl+3  F  F  F  G  G  G!7D  	6D$8 	6#d&:::!%!5D 	r1   c                    | j         j        r| j         r| j        dk    r| j        r| j         | j        k     s6| j        r| j         | j        k    s| j        sr| j         | j        z
  j        dk    rZ| j         | j        z
  }| j         | _        | j        r| j        xj        |z  c_        t          d           |                                  d S )NOPEN
   uM   План сдвинут в соответствии с будильником)	r   r   r   r  r   daysrm   re   
_calc_name)ry   	date_diffs     r0   _calc_plan_nolistzCmfTask._calc_plan_nolist  s    O&	+/?	&&00$ 1 )===) >.2o@R.R.R  - /S 48?4CW3W2]`b2b2b $*>>I#'?D ! 6"((I5((efffOOr1   c                 >   | j         j        s-| j        s&| j        j        s| j        j        s| j        j        sdS |                                 \  }}t          | j                   s| j         j        r|                     ||           n	 | 	                                 dS )u`   
        Ф-я вызывается из базового класса
        :return:
        N)
r   r   r   r   r  r   r   r[  r]  rb  r   s      r0   
_calc_planzCmfTask._calc_plan  s     
%	;	 ?-	 '2		
 %0	 F;?;X;X;Z;Z8 "8 tz?? 	dj3 	  !9;QRRRR
 r1   c                    | j         s&| j        j        s| j        j        s| j        j        sd S | j        j        r	| j         sd S | j        r| j        j        j        dk    r8d| _        t                              | dd          	                                 d S | 
                                }| j        sG|j        s@d| _        t                              | d|j         d          	                                 d S | j        rP|j        rI| j        rB| j        j        r6d| _        t                              | dd          	                                 | j        | j        j                                        k    s| j        j        | j        j        k    rKt          j        | j        k    r6d| _        t                              | d	d          	                                 | j         r#| j        j        r| j        r| j        sd| _        d S d S d S d S d S )
Nr   Tu~   SimpleLogic: Задача согласована автоматически, т.к. это Непроектная задачаr  r  u   SimpleLogic: Задача согласована автоматически, т.к. согласование отключено в Fu   SimpleLogic: Выполнен сброс согласования, т.к. сменился Постановщик или Проектu   SimpleLogic: Задача согласована автоматически, т.к. постановщик - руководитель.)r   approvedr   r   rH   rm   r   r?   rw   rJ   _get_sl_optionssl_task_need_approvesl_controller_strr   r=   rA   current_person
cmf_import
is_defined)ry   
sl_optionss     r0   _calc_approvedzCmfTask._calc_approved3  s_   	=+	 >,	 ;)		 F=# 	DK 	F { 	dk/:lJJ DMT $e()  + ++/4666F))++
} 	2  $!!(I*4*F(I (I,- " / / 04tvvv= 	2Z< 	2 	2QUQ\Qg 	2!DMT $l()  + ++/4666 Ndk388::::dn>OSWS^Sa>a>a$66 DMT e !  # ##'4666 ; 	!4?5 	!$/ 	!RVR_ 	! DMMM	! 	! 	! 	! 	! 	! 	! 	!r1   c                    t          t                                                                }|                     ddg           | j        D ];}|                    |j                   |j        D ]}|                    |           <| j        j        rt          | j        j	                  t          | j        j
                  z
  D ]R}|                    ddg           |                    |j                   |j        D ]}|                    |           S| j        rP| j        j                            d          s1| j                                        D ]}|                    |           t          |          S )Nzlists.cmf_ownerzlists.cmf_owner_assistantsr   r"  zCmfProject:)r   r)   
get_ownersrc   r   rC   r   r"  r   r  r  rH   r   rm   
startswithr*   )ry   r-   r.   ownerslstownerr/   s         r0   rr  zCmfTask.get_ownerse  s   UWW''))**+-IJKKK: 	" 	"CJJs}%%%1 " "

5!!!!" :  	&DJN++c$*..A.AA & &.D EFFF

3=))) 5 & &EJJu%%%%& ; 	"t~3>>}MM 	"//11 " "

5!!!!F||r1   c                 t    | j         rd S | j        dk    rd S t                                                       d S rW  )waiting_forr   r)   _calc_waiting_forr   s    r0   ry  zCmfTask._calc_waiting_for}  sB     	F!X--F!!#####r1   c                    | j         j        sJ| j        j        s>| j        j        s2| j        j        s&| j        j        s| j        j        s| j        j        sdS t          j	        
                    d          rdS |                                 }| j        }d}| j        r5| j        j        j        dk    r d}| j        j                                        }|r4| j        s-| j         j        j        dk    r| j        j        | _        d| _        | j        j        r | j        r| j        dk    rd| _        d| _        | j        dk    r#| j         j        j        dk    rd| _        d| _        |rW| j        j        rK| j        rD|j        r=|j        r6t*          j        | j                                        vrt1          d	d
           | j        r| j        j        r-| j        j        | j        k    s| j        j        s| j        | _        | j        j        r!| j        j        | j        k    r| j        | _        | j        j        rg| j        r`| j        j        rT| j        j        j                                        | j        k    r(| j        | j        k    s| j        s| j        j        | _        | j        j        r| j        j        s| j        j        | _        | j        j        r| j        sd| _        | j        j        r*| j        p|| _        | j         j        dk    r| j        | _        | j        rdS d}| j        j        r2| j        j        s| j        j        s| j        j        r| j        j        sd}| j         j        r| j         j        r| j         j        rd}| j        j        rd}| j        j        rd}|sdS 	 | j         j        j        dk    r| j         j        j        dk    }|sD| j                            dd          s(| j         j        | j                            d          k    }|rq| j         j        j        dvr| j        p|| _        | j        sZ| j        |k    rO|s|| _        d| _        || _        t>                               | d|j!         dd          "                                 | j        j        s}| j        j        rq| j        |k    rf| j        r_| j        | _        t>                               | d| j         dd          "                                 | j        dk    r|sd| _        d| _        | j        r]| j        |k    rR| j        rK| j        rD| j        | _        t>                               | d| j         dd          "                                 dS | j         j        j        dk    rc|j#        rl| j$        re| j%        j&        rtO          d | j%        D                       }n't>          j(        )                    dd| gg dg          }|rt1          dd
           |j#        s?| j$        r8t>          j(        )                    dd| gg dg          }|rt1          d           |j*        r| j+        rt>          j(        )                    dd| j+        gg ddd | j,        gg          }|sg| j+        -                    d!g           | j                            d          | j+        _         | j+        "                                 t1          d"           |j.        r6| -                    d#d$g           | j/        | j0        k    rt1          d%           |r|j1        rzt*          j        |                                 vrZ| j2        sS| j                            dd&          }|r5|| _         | j3        j        r| j3        j        | _3        t1          d'           !| j         j        j        dk    rd| _        | j        dk    s| j        rd| _        d| _        dS | j         j        j        dk    r| j2        r0| j                            d          | _         t1          d(           | j        s| j        4                                 | j         j        j        dk    r;| j        | j        5                                k    r| j        4                                 | j        | _        | j        | _        d| _        t>                               | d)| j        j!         d*| j         j!         d+d          "                                 dS | j         j        d,k    r| j         j        j        d,k    r.| j        s'|j6        rt1          d-d
           t1          d.           | j         j        j        dvr=| j        p|| _        t>                               | d/d          "                                 | j         j        j        dk    rH| j        |k    r=| j        p|| _        t>                               | d0d          "                                 | j        s| j        4                                 | j         j        j        d,k    rw| j        | j        5                                k    rU| j        4                                 t>                               | d1| j         j!         d          "                                 dS dS )2uS   
            Ф-я вызывается из базового класса
        NimportFr   T	IN_REVIEWapprove2approve1_reviewu[   Только Владелец проекта может согласовать задачуrO   r_  open)status_coder<   )r_  IN_PROGRESSapprove3_notassigneduh   SimpleLogic: Задачу переключили на Постановщика/Руководителя(u   ), т.к. не указан Будильник. Установите будильник, чтобы задача отобразилась у Исполнителяr  r  uM   SimpleLogic: Задачу переключили на Исполнителя(u   ), т.к. указан Будильник.Установите будильник, чтобы задача отобразилась у Исполнителяr   r   c                 (    g | ]}|j         d k    |S r   r   rM  r;   s     r0   rO  z1CmfTask._calc_wf_simple_logic.<locals>.<listcomp>*  s'    4z4z4zSX[XmqyXyXySXyXyXyr1   rT   r`   r   !=r   r_   um   Для закрытия задачи необходимо закрыть все дочерние задачиu_   Вы закрыли задачу у которой есть Открытые подзадачиr=   r  zchild_tasks.cache_status_typeu}   Родительская задача закрыта автоматически т.к. закрыты все дочерниеchecklists_items_countchecklists_items_done_countu_   Внимание! В задаче остались незавершенные чек-листы)r<   u   Спасибо! Статус установлен в "Подтверждение закрытия", для проверки постановщиком или владельцем проектаu   Спасибо! Статус изменен на «Закрыто» т.к установлен флаг «Без подтверждения».uO   SimpleLogic: Задачу переключили на Постановщика(u   ), т.к. статус=''r  uT   Нельзя брать в работу несогласованную задачу.um   Внимание! Вы взяли задачу без согласования с руководителем.u^   SimpleLogic: waiting_for  установлен т.к. статус снижен в in_progressui   SimpleLogic: waiting_for установлен т.к. статус перешел из open в in_progressu[   SimpleLogic: будильник установлен т.к. статус сменен на )7r  r   rh  r   r   rH   r   rx  osenvironr5  ri  rm   r   r   r  status_typeapprove_forapprove_for_placesl_only_owner_approverj  rA   rl  rr  re   r  r  r   r7   workflowget_default_statusr?   rw   r   rJ   ,sl_deny_closing_task_before_closing_subtaskshas_child_tasksr  rn  r[  r   r   %   sl_сlose_task_after_closing_subtasksrT   r=   rc   .sl_deny_closing_task_before_closing_checklistsr  r  sl_task_only_owner_close
no_controlstatus_closed_atr   r   sl_deny_no_approve)	ry   ro  task_controlleris_project_task
need_transsimple_logichas_unclosed_subtasks unclosed_subtasks_in_parent_taskin_review_statuss	            r0   r   zCmfTask._calc_wf_simple_logic  s     & 	(	 +	 )	 &		
 *	  +	 F :>>(## 	F))++
 .  ; 	;4;,7<GG"O"k388::O  	04= 	0T[_5PT_5_5_  ${4D%/D" =# 	* 	*$:PT^:^:^#D%)D" !%6664;?;VZe;e;e#D%)D" 	Et}7 	EDM 	EjNn 	E3	E t{'='='?'???w  @D  E  E  E  E
  	(* 40@0DHX0X0X`d`p`t0X#'#3 ~( 2T^-?4CS-S-S#'> {% =$+ =$+/ =dkoNgNlNlNnNnrv  sC  OC  OC #t'777t7'+{'<D${% 9dko 9#';#8 {% (dk (#' # 	2#/B?D{&+55#'>  ; 	F 
?% 	","151D"+"48O4G"
 "
 ;! 	dko 	$+/ 	J& 	J>$ 	J  	Fp	 {*f44#{3v=# c=;;\a;bb c'+{$-:Z:Z[a:b:b'b   ;?6:QQQ+/+;+N(? :t/??/R/R. L/>D,5KD2+:()) =o  hw  h| =o =o =o01 * 3 3374666?. 	>4?3F 	>4K[_nKnKn+ >/3/?D,"--T Ao  QU  Qa Ao Ao Ao01 . 3 3374666#59OOOXgO37 09= 6' :D,<,O,OTXTc,Ohlhu,O+/+;())  =`  MQ  M]  =`  =`  =`01 * 3 3374666F {*h66J _tOc _'2 034z4zDDT4z4z4z0{0{--060D0D%2C$>@e@e@e#f 1E 1 1- - _!  #R  Z^  _  _  _  _!N ESWSg E,2N,@,@!.T :<a<a<ab -A - -) - E!  #D  E  E  EC cHX c7=~7K7K!.T5E F E E E!%tTW 5 7 8L 8 84
 < c(446U5VWWW26-2R2RS[2\2\(/(--///!  #b  c  c  cL E$$&>@]%^___2T5UUU!  #D  E  E  E
 # 
!z'J 
!,DOO4E4EEEdoE'+}'G'Gaf'G'g'g$' !&60; N484I4MD1!}~ ~ ~ ! ;?.(::'+D$ )Z774=7'+D$-1D* {*k99?  #'-"B"B8"L"LDK  o  p  p  p .O++---;?.+==)<)<)>)>>>//111#'> #'> ):&!!  5I  GK  GW  G\  5I  5I  vz  vA  vF  5I  5I  5I  UV!  W  W  \  \  ^  ^  ^ {&-77;?.-???!4 F!"x  AE  F  F  F  F  N  O  O  O
 {26MMM'+'7'J?D$%%T  A$% & ' ''+tvvv ;?.&88T=MQ`=`=`'+'7'J?D$%%T  L$% & ' ''+tvvv .O++---;?.-??)<)<)>)>>>//111)) $T  BF  BM  BR  $T  $T() * + ++/4666 Er1   c                    t                                                       | j        j        s!| j        j        s| j        j        s	| j        sd S | j        j        rd S |                                 }|j	        d S |j	        }t          j        |          }t          j
                            t          j        j                  }| j        j        rc| j        r\| j        j        dk     rL| j        t$          j        k    r7| j        r0| j        j        | j        j        k    r| j        j        |z   | _        d S | j        j        s| j        j        r5| j        s||z   | _        n!| j        r| j        ||z   k    r||z   | _        n	 d S | j        s*| j        t$          j        k    r| j        j        r	| j        sd S | j        s||z   | _        d S d S )N)ra  i  )r)   _calc_deadliner  r   rH   r   r   r   ri  sl_deadline_shiftr   r   r   r   r   cmf_created_atager   rA   rl  rm   )ry   ro  
days_shiftshiftr   r/   s        r0   r  zCmfTask._calc_deadline  s      M$	{%	 )		
 {	 F =# 	F))++
 '/F1
"
333##H$5$9:: *		O		 '+g55Na&666M 7O)DM,??? O1E9DMF =# 		t{'= 		=  #e 4=3;#>#> #e F { 	t~1AAAdoF`AimixAF } 	(%KDMMM	( 	(r1   c                    |                      ddg           t          j                            |ddg          }|| j        v r| j                            |           || j        v r| j                            |           | S )Nr   fix_versionsr=   
members.idr  )rc   r?   CmfListr5  r   remover  )ry   src_list_idr-   r.   src_lists        r0   remove_from_listzCmfTask.remove_from_list  s    '>2333>%%k4:N%OOtz!!Jh'''t((($$X...r1   c                     |                      dg           t          j                            |ddg          }| j                            |           | S )Nr   r=   r  r  )rc   r?   r  r5  r   r   )ry   dst_list_idr-   r.   dst_lists        r0   r   zCmfTask.copy_to_list  sR    '###>%%k4:N%OO
(###r1   c                 l    t           j                            |                              |            | S )Nr;   )r?   CmfActiveEntityFilterr5  add_active_entity)ry   	filter_ids     r0   apply_filterzCmfTask.apply_filter	  s/    $((33EE$EOOOr1   c                     t           j                            |ddg          }|j        r5| j                            |j                   |                     d           | S )Nr   
filter_tagr  TrV   )r?   r  r5  r  rQ  r  rJ   )ry   r  active_entity_filters      r0   remove_from_filterzCmfTask.remove_from_filter  se    %;??	SVXdRe?ff  * 	&I1<===III%%%r1   c                    |                      g d           |st          dd           |st          dd           t          j        |          }t          j        |          }|t          j        k    r|                     |           ng|t          j        k    r|                     |           nA|t          j	        k    r|| j
        j        j        k    rd | _
        nt          d| d           |t          j        k    r|                     |           n|t          j        k    r|                     |           n|t          j	        k    rct          j	                            |dg          }| j
        r2| j
        |k    r't          d	|j         d
| j
        j         dd           || _
        nt          d| d           | S )N)r   rT   zparent_task.nameu   Укажите from_idTrO   u   Укажите to_idu(   Не могу перместить из r   r=   rg   u5   Нельзя переместить задачу в "u/   ", так как она находится в ""u&   Не могу перместить в )rc   re   r	   get_cls_by_tuuid_strr?   r  r  r  r  r   rT   r=   rm   r   r  r5  r   )ry   from_idto_idr-   r.   from_clsto_clstarget_tasks           r0   r   zCmfTask.move  s    	EEEFFF 	<.d;;;; 	:,D9999099.u55v~%%!!'****555##G,,,,''$*-333#' JJJRVWWWWV^##e$$$$v333e$$$$v~%% .,,vh,GGK yD$4$C$C  lR]Rb  l  l  TX  Td  Ti  l  l  l  tx  y  y  y  y*DFuFFdSSSSr1   Fc           	         |d         }|sdS |d         dvrdS |                     d          }t          j                            ddd|gddd	| d
gggdg          }|r'|| j        vr|s| j                            |           dS dS Ntoken_sanitizedFr      #№@rZ   r   ILIKEaliasz%"z"%r  T)lstripr?   CmfTagr5  rQ  r   )ry   	only_namectxr  tags        r0   _process_tag_tokenzCmfTask._process_tag_tokenA  s    /0 	51W,,5)0099 m Wo6g'?O'?'?'?@ 9   
 
  	3di''	'IS!!!4ur1   c           	          |d         }|sdS |d         dvrdS |                     d          }t          j                            ddd|gddd	| d
gggdg          }|r|s	|| _        dS dS r  )r  r?   CmfLogicTyper5  r   )ry   r  r  r  lts        r0   _process_logic_type_tokenz!CmfTask._process_logic_type_tokena  s    /0 	51W,,5)0099  $$ Wo6g'?O'?'?'?@ 9 % 
 
  	i 	 DO4ur1   c                 (   |d         }|sdS |                     d          sdS |                    d          }t          |          dk     rdS g dddd	d
| d
gdd	d
| d
ggg}t          j                            |          }|r|s	|| _        dS dS )Nr  F)#   №@r     
user_localr\   TrZ   r   r  %loginr  T)rs  r  r[  r?   	CmfPersonr5  r   )ry   r  r  r  _filterpersons         r0   _process_responsible_tokenz"CmfTask._process_responsible_token  s    /0 	5))*;<< 	5)0099!##5---67,B,B,B,BCW&</&<&<&<=?@ !%%W%55 	) 	%D4ur1   c                 r    |                                 }|                                 }|d| d| d| fv S )Nr  r  r  )lower)ry   stringhashtags      r0   hashtag_cmpzCmfTask.hashtag_cmp  s@    --//<v<<vVFFFr1   c                    |d         }t           j                                        D ]+\  }}|                                }|d| d| d| fv r n,dS |s| j        s"|| j        j                                        v rdS t          j                            t          j	        j
                                      dd	d	d	d	
          }||j        z
  }|d	k     r|dz  }|t          |
           z  }|t          dd          z   }| j        r6|j        | j        j        j        k    r| j        j        j        |j        k    rdS || _        || _        dS )Nr  r  r  r  FTr   r   r   )dayhourminutesecondmicrosecond   )monthsr   )r  ra  )cmfutil	RU_MONTHSr   r  r   r   r  r   r   r   r   replacemonthr   r  rm   yearr   )	ry   r  r  r  	month_idxr  r  r  r   s	            r0   _process_month_tokenzCmfTask._process_month_token  s   /0 !( 1 7 7 9 9 	 	IuKKMME;u;;e{5{{"KKK L 5 	/; 5DIM,?,?,A,A#A#At&/33x7H7L3MMUU V  O  55Eqyy}UF;;;;O+m2B.O.O.OOM $#)T-A-G-MMM(.37KKKt#2D !.Dtr1   c                 .    |                                   dS )uG    Ф-я вызывается из базового класса
        N)_calc_from_namer  s    r0   rb  zCmfTask._calc_name  s     	r1   c                 d   | j         j        s&| j        j        s| j        j        s| j        j        sd S | j         j        pd}|                                }g }|D ]}|                                                    d          }t                      
                                }|d= |                    |            | j        di |ro | j        di |r} | j        di |r|sg }|rE|                    |           t!          |          dz
  }||                             d          ||<   | j         j        r| j         j        rdfd| j         j                                        D             }fd| j                                         D             }	t!          |          t!          |	          k    rO|                    |	          }
t)          | j                  D ]%}|j         |
v r| j                            |           &| j        d	k    r| j        r| j        r| j                            d
g           | j        r| j        j        s| j         pd | _         d S | j         r| j         j                            d          sd| j         pd | _         d S d S | j         sd| _         d S d S d S )N z.,;:?!ry   r   .)r  r  r  c                 N    h | ]!}|                               |d d         "S r   Nrs  rM  eltag_symbolss     r0   	<setcomp>z*CmfTask._calc_from_name.<locals>.<setcomp>  s3    bbbr}}U`GaGabRVbbbr1   c                 N    h | ]!}|                               |d d         "S r   r  r  s     r0   r  z*CmfTask._calc_from_name.<locals>.<setcomp>  s2    ZZZBr}}[?Y?YZABBZZZr1   r/  add_object_typer  1EpiczEpic zEpic 1r>   )r   r   r  rQ  r   rm   r   r  striplocalsr   r   r  r  r  extendr[  rstripr  
differencer*   r  r  r   rH   rc   r  rs  )ry   r   name_tokensundefined_tokenstokenr  r  dot_token_postags_old_name	tags_nametags_for_deleter  r  s               @r0   r  zCmfTask._calc_from_name  s*    I 	#.	 y#	 *		 Fy$"jjll  	 	E#kkmm11(;;O((--//CF
 ##E***-t-4444 &t&---- .t.5555 "   	P/000,,q0M)4])C)J)J3)O)OK&9 
	.DIM 
	.+Kbbbbdim.A.A.C.CbbbMZZZZ$)//*;*;ZZZI=!!C	NN22"/":":9"E"E	?? . .Cx?22	((--- ++{ &; HK++4E3F+GGG; ;t{'B ;#'9#3 5DIII ;$)/*D*DV*L*L ; :	(8S : :DIII; ;Y &%			 ,+& &r1   c                     | j         j        s	| j        sd S | j        dv r	d| _        d S | j        dv r	d| _        d S | j        dk    r	d| _        d S | j                                        | _        d S )N)r0  gantt)r/  ztask.gantt_subprojectr*   z
pfeed.basepost)r   r   r   r  ui_view_formui_namer  r  s    r0   r   zCmfTask._calc_ui_view_form  s    * 	;	F  333 'D"HHH &D,.. &D $ 2 2 4 4Dr1   c                 z   |                      g d           | j        sQ| j        rJ| j                             g d           | j        j        dk    r| j        | _        n| j        j        | _        | j        s@| j        dk    r7| j        r2| j                             dg           | j        j        | _        d S d S d S d S )N)rH   r  rT   r  )zgantt_project.op_gantt_taskr  rl   r  z main_gantt_project.op_gantt_task)rc   r  rT   r  rH   r  r  s    r0   _calc_gantt_projectzCmfTask._calc_gantt_project)  s    SSSTTT! 	Dd&6 	D(()i)i)ijjj,0DDD%)%5""%)%5%C"! 	Dd&7;O&O&O{ D'')K(LMMM%)[%C"""	D 	D&O&OD Dr1   c                    | j         r| j         j        j        dk    r| j        dv rt	          dd           | j         r| j         j        j        dk    r.| j        s%t          j                            | d           | _        d S t          
                                5  | j        s't          j                            | d           }|| _        d d d            n# 1 swxY w Y   d S )Nr   r/  r0  r  u_   task.epic, task.subproject и task.gantt_project не могут быть без ПроектаTrO   )rH   rm   r   r  re   rl   r?   CmfGanttTaskcreate_gantt_taskr  disable_acl)ry   rl   s     r0   r   zCmfTask._calc_gantt_task8  s5   { 	Idk/:lJJ $ZZZ{  DH  I  I  I  I{ 	dk/:lJJ% W%+%8%J%J4QU%V%V"F  "" 	3 	3% 3 & 3 E EdD Q Q%2"		3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	s   /CCCc                 6   | j         j        r/| j                            | j         j        | j         j                   | j        j        s"| j        j        s|                    dd          r-| j	        D ]'}|j
        r| j                                          dS &dS dS )u   
        Изменяем счетчики Оперативной Гант-задачи при изменении задачи
        list_affect_gantt_taskFN)r  r   rl   task_status_is_changed_hookr  r  r  r   r5  r   affect_gantt_tasktask_plan_dates_is_changed_hook)ry   r.   ru  s      r0   _calc_op_gantt_task_countersz$CmfTask._calc_op_gantt_task_countersM  s     ;! 	]::4;?DKO\\\* 	d.@.K 	vzzZrtyOzOz 	z  ( &FFHHHFF	 	 r1   c                 f
   | j         rk| j        j         s_| j        dk    rT|                                 }|j        r9t
          j        dk    r)| j        j         s| j        j         st          dd           | j
        s t                                                      S | j        s	| j         sd S t                      }|                     d          D ]k}|j        |                                 vrN|j                            d          s4|j                            d          s|                    |j                   ld	|v sd
|v r| j        j         s| j
        j         r$| j
        r| j
                            d| d           | j
        j         rI| j
        j        r=| j
        j        | j
        j        k    r#| j        s| j
                            d|            d	|v r|                    d	           d
|v r|                    d
           d|v r_| j
                            d|            | j        r'| j
                            d| j        j        |            |                    d           d|v r=| j        j        r| j
                            d|            |                    d           d|v r1| j
                            d|            |                    d           d|v r1| j
                            d|            |                    d           d|v r| j        j         r8| j        dk    r-| j        j        dk    r| j
                            d|            nD| j        j        r8| j
                            d|            | j
                            d|            |                    d           d|v r1| j
                            d|            |                    d           d|v r1| j
                            d|            |                    d           d|v rD| j        s=| j        j        r1| j
                            d|            |                    d           d |v rq| j
                            d!|            | j        j         D ]3^}}}|d"k    r(|j        d#k    r| j
                            d||            4|                    d            d$|v r1| j
                            d%|            |                    d$           |r| j
                            d&|            d S d S )'Nr   sd_apiud   Редактирование запрещено, так как задача в статусе CLOSEDTrO   )r   cache__idrH   rF   r:   )r;   use_new_projectzPPP-TSK-MOVEr  r   zPPP-TSK-ASSIGNzPPP-TSK-ASSIGNABLE)userr;   r   zPPP-TSK-MODIFY-OWNERrT   r   r  zPPP-TSK-CLOSEzPPP-TSK-RESOLVEzPPP-TSK-TRANSITION
spectatorszPPP-VW-MANAGEr   zPPP-TSK-DEADLINEr   	executorszPPP-TSK-ASSIGN-EXECUTORSr   r  perm_security_levelzPPP-TSK-SET-SECURITYzPPP-TSK-EDIT)!r   r  r   ri  sl_readonly_closed_taskrA   	api_scopemark_commentmarkre   rF   r)   check_edit_permr   r   valuesr   project_perm_allow_fieldsrs  endswithrC   rH   rG   r  r  r@   r  r   rm   r   r   r/  _changes)ry   ro  changed_fields_to_checkfieldchange_action
change_obj_r/   s          r0   r5  zCmfTask.check_edit_permY  s   
 ? 	R4;#9 	Rd>TX`>`>`--//J1 R ;(**D4E4P*TXT]Th*  E  MQ  R  R  R  R | 	-77**,,, 	t 	F"%%%[[D[11 	> 	>E$D,J,J,L,LLL!,77AA M!,55e<< M (++E,<=== ...)?V2V2V & i$,*A it| i667GTcg6hhh|& U4<+; U@PTXT`Td@d@d} UL::>t:TTT 222'..x888333'..y999333 L223C2NNN t667KRVRbRhnr6sss#**=999111~! Y667MSW6XXX#**;777
 333L22>t2LLL#**=999---L22>t2LLL#**7333...%0 WT5Kx5W5W\`\r\v  {C  ]C  ]C66D6QQQQ W667Hd6SSS667KQU6VVV#**8444222L22?2MMM#**<888000L223E42PPP#**:666 222? =t': =667It6TTT'..|<<<111L223MSW2XXX151H l l-zA H,,1F+1U1UL::;OV`fj:kkk#**;777 $;;;L223It2TTT#**+@AAA # 	ML22>t2LLLLL	M 	Mr1   c                 
   |                      g d           | j        s| j        s| j        t          j        k    rG| j        r| j                            d|            d S t                      	                                 d S d S )N)r   rF   r   r   r   r/  zPPP-TSK-DELETEr  )
rc   r   r   r   rA   current_userrF   rG   r)   check_delete_permr   s    r0   rA  zCmfTask.check_delete_perm  s     ? ? ? 	@ 	@ 	@ 9 	,	 	,T^q~%E%E | ,667GT6RRRRR))+++++ &F%Er1   c                 
   | j         ss| j        j        ri| j        j        s_| j        rZt          j                            dd| j        gdg dg dgg          D ]*}| j        |_        |	                                 #dS dS dS dS dS )u  
        При создании задачи - у нее не указывается имя сразу, но уже создается нотифай с пустым именем.
        Но нотифай по str-полям когда пусто меняется на имя - не создается и не обновляет информацию в созданных нотифаях.
        Поэтому мы сделал этот ХАК с нарушением слоёв.
        obj_idr\   rZ   )r   r\   r  )r   r\   Nr  N)
r   r   r   r  r?   	CmfNotifyr*   r=   r   rJ   )ry   task_notifys     r0   _update_empty_task_notifyz!CmfTask._update_empty_task_notify  s     { 	#ty3 	#DIM 	#di 	#%/444))))+?+?+?@=4     # # $(9   """"	# 	# 	# 	# 	# 	# 	# 	## #r1   c                    | j         r!| j         j        j        dk    s| j         j        rd S d}| j        j        rDt          | j        j                  t          | j        j                  z
  D ]}|j	        dk    r|}|sd S t          | j                  }|D ]U}||k    r	|j	        dk    r|j
        dk    r!|j
        dk    rt          d           | j                            |           Vd S )Nr   Flist.agile_sprintr   r  u\   Внимание! Задача перемещена из Запущенного списка)rH   rm   r   task_allow_multiple_sprintsr   r   r   r  r  r  r   re   r  )ry   
add_sprintappended_listcurrent_sprints
cur_sprints        r0   _calc_sprintszCmfTask._calc_sprints  s&   
 { 	dk/:lJJdkNuJF
:  	!$TZ^!4!4s4:>7J7J!J   -1DDD!.J E  	Fdj//) 		* 		*JZ''&*===+x77+}<<yzzzJj))))		* 		*r1   c                 R    g d}t                                                      |z   S )N)7r@   zparent.project_typezparent.auto_alarm_datezparent.logic_prefixzparent.activity.prefixz"parent.task_allow_multiple_sprintsrT   parent_task.logic_prefixzparent_task.is_templatezparent_task.listszparent_task.lists.logic_prefixz#parent_task.lists.cache_status_typezparent.sdesk_feedbackproject.default_gantt_task_typer$  ztags.tag_categoryzlists.plan_start_datezlists.plan_end_datelists.ordernozlists.perm_has_aclzlists.sys_typelists.logic_prefixzlists.affect_gantt_taskzmain_list.plan_start_datezmain_list.plan_end_datezmain_list.ordernozmain_list.perm_has_aclzactivity.prefixr  r  cmf_modified_byrA  r  r:  r1  r  rl   op_gantt_task.actual_start_dater  zcomponents.default_responsiblezcomponents.default_ownerz!scheme_wf.default_task_logic_typez$scheme_wf.default_subtask_logic_typezlists.default_task_logic_typezstatus.need_approver   r  r   agile_story_pointsr  r   rh  parent_logic_prefixr  request_type_id)r)   rd   )ry   rg   r/   s     r0   rd   zCmfTask.save_preload_fields  s2    ;
 ;
 ;
x ww**,,V33r1   c                     t           j                            | d           d| _        |                     d           t          j        j        | dg|R i | d S )Nr   approve4TrV   approve_started)r?   
CmfApprovestart_approve_processr  rJ   CmfEventdo_eventry   r-   r.   s      r0   start_approvezCmfTask.start_approveE  sc    //a888!+		D	!!! '8J4JJJ6JJJJJr1   c                     |                      g d           | j        j        j        | _        g | _        |                                  t          j                            | d           d S )N)zstatus.trans_approvedzstatus.trans_approved.status_toapprovers_forapprove_success_full)	rc   r  trans_approved	status_torc  rJ   r?   r^  r_  r  s    r0   _approve_approvedzCmfTask._approve_approvedK  s`    fffgggk0:		  '=>>>>>r1   c                     |                      g d           | j        j        r| j        j        j        n| j        | _        g | _        |                     d           t          j                            | d           d S )N)zstatus.trans_rejectedzstatus.trans_rejected.status_torc  T)approve_rejected_doneapprove_rejected)	rc   r  trans_rejectedrf  rc  rJ   r?   r^  r_  r  s    r0   _approve_rejectedzCmfTask._approve_rejectedR  sz    fffggg>Bk>Xidk0::^b^i			---  '9:::::r1   c                 n    |                      g d           | j        j        j        | _        g | _        d S )N)zstatus.trans_updatedzstatus.trans_updated.status_torc  )rc   r  trans_updatedrf  rc  r  s    r0   _approve_updatedzCmfTask._approve_updatedZ  s:    dddeeek/9r1   c                 L   |                     d          }|                     d          }|                     d          }g }|dk    rg d}|dk    rg d}t          | |t          j        d	          }|r||d
<   t	          j        j         di |}|r |j        dd|i| |                     dg           t          j        | j        v r:| j        	                    t          j                   | 
                    d           t          j                            | d           d S )Napprove_group
resolutionr   rh  )approver_levelr`   masteraccepted)rs  r  rt  r  )r;   rq  approverapprove_typer_   rc  TrV   approve_success_oner>   )r5  dictrA   r@  r?   r\  _approve_onerc   rc  r  rJ   r^  r_  )ry   r.   rq  rr  r   master_filterparamsapproves           r0   r   zCmfTask.approve_one_  sP   

?33ZZ--
zz&!! ##===M##>>>M'^!	
 
 
  	-,F8#'11&11 	6 G 55d5f555/*+++>T///%%an555III%%%  '<=====r1   c                 N    dt           _         t                      j        |i |S )NT)rA   r   r)   create)r,   r-   r.   r/   s      r0   r  zCmfTask.create  s&    )-&uww~t.v...r1   z$(?P<code>[A-Z\d]+(?:-[A-Z\d]+)*-\d+)c                     |d}| j                             |          }dd|g}|r|ddd |D             gg}t          j                            |||          S )u  
        Нужно в тексте найти все потенциальные коды. Можно просто все слова...
        Какие сложности:
            - код может быть практически любым max_len = 64
            - в имени ветки нельзя пробелы
        ОСВ: код вначале, и содержит ^([A-Z0-9]+-[0-9]+).*
        Nr  r7   INrF   c                     g | ]	}|j         
S r>   r=   )rM  rF   s     r0   rO  z.CmfTask.find_related_tasks.<locals>.<listcomp>  s    2V2V2V'7:2V2V2Vr1   r_   rg   r   )_TASK_CODE_SEARCH_REfindallr?   r   r*   )r,   r   rg   projectsr   codesfilter_s          r0   find_related_taskszCmfTask.find_related_tasks  sv     <D(00664' 	YD2V2VX2V2V2V WXG~""'&8"TTTr1   c                    | j         s| j        j        s| j        j        sdS | j         s| j        j        r{|                     dg           g }| j        D ]"}|j        dk    r|                    |           #|D ]6}| j                            |           | j                            |           7| j         s| j        j        r{|                     dg           g }| j        D ]"}|j        dk    r|                    |           #|D ]8}| j                            |           | j                            |           7dS dS )u   
        При добавлении в список правильно выбирать поле lists или fix_versions
         в зависимости от типа списка
        Nzfix_versions.logic_prefixzlist.releaserS  )r   r  r   r   rc   r  r   r  )ry   r   r;   s      r0   r   zCmfTask._calc_fix_versions  s    K	(	 J!	
 F; 	'$+6 	'9:;;;D( % %#~55KK$$$ ' '!((---
!!#&&&&; 	.$*/ 	.23444Dz % %#~55KK$$$ . .
!!#&&&!((----	. 	.. .r1   c                    |                      ddg           t          | j                  }|                    | j                   | j        j        r|                    | j        j                   | j        j        r|                    | j        j                   d |D             }t          t          j	        j
        dt          |          i           d S )Nr   r  c                 6    h | ]}t          |j                  S r>   )rD   r=   )rM  r   s     r0   r  z4CmfTask.process_lists_count_cache.<locals>.<setcomp>  s     ,,,3qt99,,,r1   list_idsr.   )rc   r*   r   r  r  r   r  schedule_deferred_jobr?   r  recalculate_count_cache)ry   r   ids_sets      r0   process_lists_count_cachez!CmfTask.process_lists_count_cache  s    '>2333TZ  T&''':  	)LL(((' 	0LL*.///,,e,,,fnDjZ^_fZgZgMhiiiiiir1   c                 <   | j         j        sd S t          | j         j                  t          | j         j                  z
  D ]Y}|j        dk    rt          j        j        	                    |
                                          rt          d| dd           Zd S )NrH  u;   Задачу нельзя добавить в спринт u"   , попробуйте позже.TrO   )r   r   r   r  r  r  r   r   r   r   get_lock_keyre   )ry   rK  s     r0   _check_sprintszCmfTask._check_sprints  s    z$ 	F 003tz~3F3FF 	W 	WM)-@@@|!(()C)C)E)EFF W  JXe  J  J  J  RV  W  W  W  W		W 	Wr1   c                  &   |                                   | j        ry| j        sq| j        sidt          _        | j        j        rV| j        rN| j        j        j	        dk    r8| j        
                    g d           | j        j        r|| j        su| j                            | j        j                   d| j        j        j         d| j        j         d}t                              | |d                                           | j        j        r| j        j        | j        vru| j                            | j        j                   d	| j        j        j         d| j        j         d}t                              | |d                                           |                                  |                                  |                                  |                                  |                                  |                                  |                                  |                                  |                                  | j        rc| j        j                                        rEt<                                          5  |                                   d d d            n# 1 swxY w Y   | !                                 | "                                 | #                                 | $                                 | %                                 | &                                 | '                                  tQ                      j        |d
di|}| )                                 t          j*        +                    |            |S | j        r| ,                                S | j-        j        r| j.        j        st_          dd           | j0        j        s| j        r| | j0        k    rt_          dd           | j0        j        r[| j0        rTg dddd| gdd| j0        ggdd| j0        gdd| gggg}t          j1        2                    |          rt_          dd           | j        j        r(| 3                                 | 4                                 | 5                                 | 6                                 | 7                                 | 8                                 | j        j        rO| j9        rHtu          | j        j;                  tu          | j        j<                  z
  D ]}|| j9        k    rd | _9        | j9        sT| j        D ]}|j=        dk    r	|| _9         n| j        D ]}|j=        dk    r	|| _9         n| j9        s| j        D ]	}|| _9         | j        j        rw| j9        rp| 
                    dg           | j9        j=        dk    rJtu          | j        j<                  tu          | j        j;                  z
  D ]}|j=        dk    r	|| _9         n| j        j        s| j        r$| j        r| j        j        j	        dk    r| j        
                    g d           | j        j        r|| j        su| j                            | j        j                   d| j        j        j         d| j        j         d}t                              | |d                                           | j        j        r| j        j;        r| j        | j        j;        k    r| j        j;        j	        dk    r| j        j;        j                                         | j        j;        j        }	|	ro|	| j        v rf| j        >                    |	           d|	j         d| j        j;        j         d}t                              | |d                                           | j        j        r| j        j        | j        vru| j                            | j        j                   d	| j        j        j         d| j        j         d}t                              | |d                                           | j        j        r| j        j;        r| j        | j        j;        k    r| j        j;        j	        dk    r| j        j;        j                                         | j        j;        j        }
|
ro|
| j        v rf| j        >                    |
           d|
j         d| j        j;        j         d}t                              | |d                                           | j        j        rt          j?        stu          | j        j<                  tu          | j        j;                  z
  D ]/}|j@        dk    r"t_          d|j         d| j         dd           0| j        sctu          | j        j;                  tu          | j        j<                  z
  D ]/}|j@        dk    r"t_          d|j         d| j         dd           0| A                                 |B                    d           s| j        j        r| jC        rd!t          d"tt          fd#} || j        j<                  } || j        j;                  }||z
  }||z
  }t          ||g          rMt          jF        jG        H                    | jI        j        t          |          t          |          d$%           | J                                 |                                  |                                  |                                  |                                  | K                                 | jL        j        r,| jL        d&vr#| j=        d'vrt_          d(| jL         d)d           | M                                 | jN        j        rt          jO        jP        | d*g|R i | | &                                 | '                                  tQ                      j        |i |}|jQ        |jI        k    r>t          d+|S                                 d,t          jU         d-t          jV                    | j@        j        r| j@        j<        dk    ro| jW        rh| jX                                         | jX        D ]G}t<                                          5  |Y                                 d d d            n# 1 swxY w Y   H | jZ        d9i | | j[        j        r| j\        ]                                 | j^        j        r| j\        _                                 | j0        j        r| j\        `                                 | j        r| j        j        s| j        r| j        j        rFt<                                          5  |                                   d d d            n# 1 swxY w Y   n| j        j        r| j        j;        r| j        j;        j                                        rz|B                    d.          se| ja                                         | ja        rEt<                                          5  | b                                 d d d            n# 1 swxY w Y   | j        j        r| c                                 | jd        d/k    rt          je        f                    |            | j        r/| jg        h                                 |                     d0           | j        s&| j        rt          ji        j                    |            | j@        j        rB| j@        dk    r7| j        jk        r+t          t          jF        jm        | jI        j        g1           | j        j        s| jn        j        rt          t          jo        jp                   | j        o/t          | j                  d2k    pt          | jn                  d2k    }|s$| j        j        s| jn        j        s| j        j        r*| 
                    d3g           | r                                 d4D ]7}t          | |          j        r t          t          jt        jp                    n8| j0        rS| j0        j=                                        d5k    r1| j0        j        s| j        rt          t          jF        jp                   | j0        j;        rQ| j0        j        rE| j0        j;        j=                                        d5k    rt          t          jF        jp                   | j=        j        r| j=        j;        d5k    rd2| _u        | jv        j        rJ| j        rCt          | j        j        t          jx                  r| j        y                    | jv                   | j@        j        rv| j@        dk    rkt<                                          5  | z                    t          j{        jI                   d d d            n# 1 swxY w Y   | |                    d26           | j}        r| j=        d7vrt_          d8d           | )                                 | j~        j        s| j        j        rt          j                            |            t          j*        +                    |            |S ):NTr   )zdefault_list.plan_start_datezdefault_list.plan_end_datezdefault_list.ordernozdefault_list.perm_has_aclzdefault_list.sys_typezdefault_list.logic_prefixzdefault_list.affect_gantt_taskz%default_list_if_empty.plan_start_datez#default_list_if_empty.plan_end_datezdefault_list_if_empty.ordernoz"default_list_if_empty.perm_has_aclzdefault_list_if_empty.sys_typez"default_list_if_empty.logic_prefixz'default_list_if_empty.affect_gantt_taskuo   SimpleLogic: Задача добавлена в Список для Новых задач без Списка "   " проекта "r  r  r  ut   SimpleLogic: Задача добавлена в Обязательный список для Новых задач "r   Fu   Пожалуйста, воспользуйтесь контекстным меню (троеточие) в панели инструментов задачиrO   uK   Нельзя добавлять задачу в eё же подзадачиrelation_type.coder\   zsystem.additional_parentrZ   r[   r\   r]   r  u   Задачи не могут быть родительской и дочерней, так как они связаны связью Дополнительный родитель/Дополнительная дочерняя задача.rH  
list.boardzmain_list.logic_prefix	list.baseum   SimpleLogic: Задача удалена из Список для Новых задач без Списка "ut   SimpleLogic: Задача удалена из Обязательного списка для Новых задач "r   uS   Нельзя добавить задачу в Завершенный список "z" - "uU   Нельзя удалить задачу из Завершенного списка "from_sync_subtasksr   returnc                     t                      }| D ]K}|                    ddg           |j        dk    r%|j        dk    r1|                    |j                   L|S )up  Фильтрует lists - оставляет только незакрытые спринты и возвращает множество ID этих спринтов

                Args:
                    lists (list): список lists

                Returns:
                    set: множество не закрытых спринтов
                r  r   rH  r   )r   rc   r  r   rC   r=   )r   sprints_idslist_s      r0   get_correct_sprintsz)CmfTask.save.<locals>.get_correct_sprints  sv     "ee" . .E%%~7J&KLLL)-@@@ .(:: OOEH----""r1   )task_idsprints_to_add_idssprints_to_remove_idsr  )rY   r*   r  r  r.  u   Вид отображения uk    временно не поддерживается, используйте "task", "list", "post", "gantt"spectators_changeduj   DEV: WARNING: У задачи после сохранения совпадает код и id task.values=z, request.url=z, request.data=ri  project.servicedeskrV   )r-   r   r  )r  rH   rQ  r   r  rh  r/  )r   r  us   DEV: Недопустимое перемещение простой задачи в структуру дереваr>   )r  r   r   r@   rA   r   rH   r   rm   r   rc   default_list_if_emptyr   r   r?   rw   rJ   default_listr   r   r   r   r   r   r   r   r   r  need_approver   r  r!  ra  rf  r  r  r   r   r   r   r)   r   CmfBackbonePeerobj_after_save_hookr   perm_encryptresult_textre   rT   rq   r   r  rF  r   r?  _calc_estimate_workr,  rA  r   r  r  r  r  r  r   rN  r5  r  r*   anyr   _sync_subtask_sprintsapplyr=   _calc_logic_type_change_guard_calc_agile_story_pointsr  _calc_structural_listr.  r^  r_  r7   printr6  requesturldatar   staff_control_blocked_personscalc_staff_control_blockedr'  r   rl   task_logic_type_is_changed_hookr  "task_gantt_project_is_changed_hook task_parent_task_is_changed_hookrc  rl  r   rW  CmfSDeskSlaTriggertask_changed_hookr  r   CmfSDeskSlaCycleupdate_cycle_goalssdesk_feedbackr  sdesk_send_feedback_requestr  r  recalculate_cacher[  r  getattrr  cache_child_tasks_countrQ  r   r   hook_task_tags_changed_clear_notifyrl  _update_opened_notifiesr$  r   r/  rv   sync_task_resources)ry   r-   r.   	audit_msginstr  removed_listr   rK  old_default_list_if_emptyold_default_listr  sprints_newsprints_oldsprints_to_addsprints_to_removeself_instancer  is_new_with_listsr{   r/   s                       r0   rJ   zCmfTask.save  sb   ; A	ty A	 A	 .2A* {% W$+ W$+:K:VZf:f:f'' ) ) )   " ;4 WTZ WJ%%dk&GHHH!J  TX  T_  Tu  Tz !J !J59[5E!J !J !JI%%T	Q%OOTTVVV;+ W0HPTPZ0Z0ZJ%%dk&>???!J  Y]  Yd  Yq  Yv !J !J59[5E!J !J !JI%%T	Q%OOTTVVV ""$$$22444!!###!!###!!!  """!!###!!!{ )t{7<<>> )((** ) )&&((() ) ) ) ) ) ) ) ) ) ) ) ) ) ) OO!!!!!###**,,,##%%%##%%%##%%%577<<E<V<<D"66t<<<K = 	&##%%% ' 	C0@0K 	C  v  ~B  C  C  C  C & 	u$+ 	ut'''gostttt& 	S4+; 	SHHH $.D$BR0ST $(89ItT;RSG ',,G,<< S F NRS S S S 9 	-  """**,,, 	    	  """&&((( :  	*T^ 	* #DJN 3 3c$*.6I6I I * *4>11%)DN~ 	Z  >%888%&DNE 9 Z  >\11%&DNE 2 >   A%&DN :  	T^ 	67888~*k99%(%8%83tz~;N;N%N  M$15HHH)6 I K" ,	Wdk ,	WK,	W$(K$5$@L$P$PK## % % %     {0 S S
!!$+"CDDDF  PT  P[  Pq  Pv F F151AF F F	!!I!KKPPRRR{% W$+/ WdkT[_>\>\aealapa{  @L  bL  bL5::<<<,0KO,Q), W1Jdj1X1XJ%%&?@@@!N  Rk  Rp !N !N59[_5I!N !N !NI%%T	Q%OOTTVVV{' SDK,DDJ,V,V
!!$+":;;;F  UY  U`  Um  Ur F F151AF F F	!!I!KKPPRRR{% W$+/ WdkT[_>\>\aealapa{  @L  bL  bL,11333#';?#? # W(8DJ(F(FJ%%&6777!N  Yi  Yn !N !N59[_5I!N !N !NI%%T	Q%OOTTVVV :  	l 	l!$TZ^!4!4s4:>7J7J!J g g 2h>>  Z  uB  uG  Z  Z  NR  NW  Z  Z  Z  bf  g  g  g  g ; l$'
$7$7#djn:M:M$M l lL#5AA!  #_  {G  {L  #_  #_  SW  S\  #_  #_  #_  gk  l  l  l  lzz.// 	vDJ4I 	vdNb 	v#4 #C # # # #& .-djn==K--djn==K(;6N +k 9N$5677 v4::dgmY]^lYmYm\`ar\s\sCu Cu: v v v 	**,,,   ..000%%'''' 	CD,=Ef,f,f%-MMM  vt7H  v  v  v  ~B  C  C  C  C""$$$?% 	RO$T+?Q$QQQ&QQQ!!!!!!$d5f55 !111p,3355p pEL[p pahamp pq q q
 !, 	8&*h66 7.33555< 8 8((** 8 8557778 8 8 8 8 8 8 8 8 8 8 8 8 8 8
 	*)33F333?% 	A>>@@@( 	DAACCC& 	B??AAA; 	1DK2 	1dk 	1{' 
1((** ) )&&((() ) ) ) ) ) ) ) ) ) ) ) ) ) )+( 1+/1+/.33551 jj!8991 "'')))% 1 ,,.. 1 1..0001 1 1 1 1 1 1 1 1 1 1 1 1 1 1;! 	)&&((( #'<<<%77==={ * #++---		D	))); A4? A'::4@@@ %0 hT5Kx5W5W\`\g\v5W%fn&PX\X_XeWfgggg :  	DD$5$@ 	D!&."BCCC !K_S__q-@-^CHYDZDZ]^D^ 	-
 5 	-9J9U 	-Y]YdYo 	-n-...**,,, e 	 	JtZ((3 %f&B&TUUU  	D 0 = B B D D S SY]YiYt Sx|  yD S!&."BCCC 	DD$4$? 	DDDTDXDeDjDjDlDlp{D{D{!&."BCCC ' 	-D,=,A[,P,P+,D(9 	:DK 	:Jt{?PRXRc4d4d 	:K..ty999!, 	51G81S1S$$&& 8 8""1#3#67778 8 8 8 8 8 8 8 8 8 8 8 8 8 8((!(444  	Y 19o o o  L  TX  Y  Y  Y  Y& 	>$.*C 	>#77===224888s`   J00J47J4t$$t(	+t(	-xxx#{{{H!%AIIAIIAIchangedc                    | j         j        s}| j        j        j        sl| j        j        s`| j        j        j        sO| j        j        dk    r| j        j        dk    s/| j        j        dk    r| j        j        dk    s|dv s|	| j	        sd S | 
                    g d           | j        j        j        pd}| j        j        j        pd}||z
  }| j        j        j        }| j         j        }d}	|dk     rd}g }
| j	        rt          | j        j                  D ]}|j        dk    r|                    | j        j        d| j         j        | j        j        j        | j        j        j        d| j                   |                    | j        j        d dd	|||
           d S | j        j        rst          | j        j                  D ]}|j        dk    r|| j        j        vry|                    | j        j        d| j         j        | j        j        j        | j        j        j        d| j                   |                    | j        j        d dd	|||
           t          | j        j                  D ]}|j        dk    r|| j        j        vr|
                    |           |                    | j        j        d| j         j        | j        j        j        | j        j        j        d| j                   |                    | j        j        d dd	|||
           t%          | j                  }| j         j        r| j         j        |d<   | j        j        j        r| j        j        j        |d<   | j        j        j        r| j        j        j        |d<   |ra| j        D ]Y}|j        dk    s||
v r |j        | j        j        dfi | d|v r*|                    | j        j        d dd|d                    Z|ri| j        D ]a}|j        dk    s||
v r|                    | j        j        |j        j        ||j        j        |j        j        ||j        j        d           b|rV|dv rR|                    | j        j        d |||||	| j                   |                    | j        j        d d ||||
           | j        j        dk    rp| j        j        dk    r`| j        D ]X}|j        dk    s||
v r|                    | j        j        d           |                    | j        j        d dd|||           Y| j        j        dk    ru| j        j        dk    rg| j        D ]a}|j        dk    s||
v r|                    | j        j        d||||	           |                    | j        j        d dd|||           ^d S d S d S )Nr   )startedclosed)r   rV  op_gantt_task.sched_durationop_gantt_task.sched_workop_gantt_task.actual_workr   r   r  r   )estimate_spestimate_durationestimate_workestimate_countr  zscope-changed)timetracker_history_idtask_operatetask_list_operater  remaining_durationspent_durationr  r  r  r  r  changez
rte-changer  )r  r  r  r  work-logged)r  r  r  r  r  history_dater  )r  r  r  r  r  r  r  closer  zstate-change)r  r  r  unclose)r  r  r  r  reopened)rV  r   rl   sched_durationr   
sched_workr   r  r  r   rc   rm   actual_workr   history_otr_addr=   history_rte_addr   ry  
time_spentremaining_estimateend_date)ry   r  	task_listtimetracker_historyr  r  r  r  r  r  appendedru  r|  s                r0   r   zCmfTask.calc_history@	  s   #.	!0;	 z$	 !,7		 &*h664;Q;UYa;a;a&*h664;Q;UYa;a;a %:::".{ / F s s s 	t 	t 	t !.=CHq+7=B.?*5;+1!!!"; .	O4:+,, K K(M99##DGM8,0,C,I262D2S2Y.2.@.K.Q/0,0,B $ D D D ##DGM$9AUd>Pew;I $ K K K K FZ" 	O4:>** O O(M99djn,,''x040G0M6:6H6W6]262D2O2U34040F ( H H H ''d;CWfBShz?M ( O O O
 4:>** O O(M99djn,,OOC(((''x040G0M6:6H6W6]262D2O2U34040F ( H H H ''d;CWfBTi{?M ( O O O $"8999"- 	B$($;$AF=!,7 	R*.*<*K*QF&'(3 	J&*&8&C&IF?# 	Wz W W(M99SH__##DGM8FFvFFF&&00''dfr  BK:@AT:U ( W W W 	@z 
@ 
@(M99SH__##DGMJ]J`Jf6G3F3Q3W7J7]7c6G1D1M1S1> $ @ @ @ @  	E*.CCC%%dgm$Zk0;6G2?3A040F & H H H %%dgmD_c  xI8J_q5C & E E E !%11d6L6PT\6\6\z C C(M99SH__##DGM7;;;##DGM4>6G7I3A $ C C C C !%11d6L6PT\6\6\z 
C 
C(M99SH__##DGM9+:K6C7E $ G G G ##DGM4^6G7I3A $ C C C C 216\6\
C 
Cr1   c                    | j         j                                         | j         j        | _        | j        r| j        j                                          ddg}|                     |           | j        sd S | j         j        | j        _        t          j        	                    dd| g|          }|D ]2}|j         | j         k    r | j         |_         |
                                 3d S )NrH   rl   rT   r`   r  )rH   r  r   r  rT   rc   rl   r?   r   r*   rJ   )ry   rg   r  rY   s       r0    _change_parent_and_gantt_projectz(CmfTask._change_parent_and_gantt_project	  s    &++---![; 	+#((***O,   ! 	F+/;+I(n))-d1KTZ)[[ 	 	D{dk))"k			 	r1   c                 ~   ddd| gdd| gg}t           j                            |d          D ]}|                                 t           j                            | d          D ]}|                                 t           j                            ddd| gd	d| ggd          D ]}|                                 d S )
NrZ   rY   r\   r  Tr^   rX   r[   r]   )r?   r  r*   restorerp   rq   )ry   r  
gantt_taskr}   r~   s        r0   _restore_relationszCmfTask._restore_relations	  s    tD)_dD+IJ -22'SW2XX 	! 	!J    (--4-NN 	 	DLLNNNN+00
DRV?WZceikoYp8q  DH0  I  I 	 	CKKMMMM	 	r1   rQ   c                   |rd | _         |                     d           t          j                            | |          D ]} |j        |d|i| t          j                            | |          D ]}d |_        |                    d            ddd| gd	d| gg}t          j                            ||
          D ]} |j        ||dd| t          j	                            | |          D ]} |j        |d|i| t          j
                            ddd| gdd| gg|
          D ]}	 |	j        |d|i| d S )NTrV   rX   rR   )r  rU   rZ   rY   r\   r  r^   )rR   from_task_deleter[   r]   )rl   rJ   r?   CmfTaskCodeHistoryr*   ro   r   r  r  rp   rq   )
ry   rR   r-   r.   r7   rY   r  r  r}   r~   s
             r0   _delete_relationszCmfTask._delete_relations	  s    	*!%DIII%%%166DRb6cc P PTO4DOOOOO++$P`+aa * *%)"		D	))))tD)_dD+IJ -22'Sc2dd 	i 	iJJt6FY]hhaghhhh(--4IY-ZZ 	L 	LDDKK0@KFKKKK+00
DRV?WZceikoYp8q  DT0  U  U 	K 	KCCJJ/?J6JJJJ	K 	Kr1   c                 F    | j         sd S | j         D ]} |j        |i | d S r  )rM   ro   )ry   r-   r.   	checklists       r0   rf   zCmfTask._delete_checklists	  sG     	F 	. 	.IId-f----	. 	.r1   c                @   t           j                            | |dg          D ]} |j        |d|i| t           j                            | |dg          D ]} |j        |d|i| t           j                            | |          D ]} |j        |d|i| d S )Nr   )rY   rU   r   rR   )r;   rU   )r?   rs   r*   ro   rt   ru   )ry   rR   r-   r.   r   s        r0   _delete_historyzCmfTask._delete_history
  s    )..DJZfwex.yy 	I 	IAAHdH-=HHHHH)..DJZfwex.yy 	I 	IAAHdH-=HHHHH(--$HX-YY 	I 	IAAHdH-=HHHHH	I 	Ir1   c                 4   t           j                            | ddg          D ]} |j        |i | t           j                            | ddg          D ]} |j        |i | t           j                            | d          D ]} |j        |i | d S )NTr  )rY   cmf_deletedr   )r;   r  )r?   rs   r*   r  rt   ru   )ry   r-   r.   r   s       r0   _restore_historyzCmfTask._restore_history	
  s    )..DdVfUg.hh 	' 	'AAIt&v&&&&)..DdVfUg.hh 	' 	'AAIt&v&&&&(--$D-II 	' 	'AAIt&v&&&&	' 	'r1   c                    |                      g d           | j        r| j        D ]} |j        |i |  | j        |i |  | j        |i |  | j        |i |  | j        |i |  | j        |i |  | j        |i |  t                      j        |i |}| j
        s| j        r2t          t          j        j                   |                                  |                                  | j        r@| j        j                                        dk    rt          t          j        j                   | j        r| j                            |            t          j                            |            |S )N)r   rF   r   sdesk_sla_cyclesr  rT   r   r  r   r/  rM   r/  )rc   r  ro   _delete_task_resourcesr  _delete_timetracker_history_delete_subtasksr  rf   r)   r   r  r  r?   r  r  r  #_update_additional_parent_relationsrT   r  r   r   child_task_deleter  obj_after_delete_hook)ry   r-   r.   sdesk_sla_cycler   r/   s        r0   ro   zCmfTask.delete
  s    l l l 	m 	m 	m  	8#'#8 8 8&&77777##T4V444d-f---(($9&999 	t.v...////0000eggnd-f--: 	-* 	-!&."BCCC**,,,00222 	D 0 = B B D D S S!&."BCCC  	5..t44444T:::
r1   c                     t                      j        |i |}|                     g d           |                                  |                    dd          s(|                                  |                                  |                                  |                                  |                    dd           }|                    dd          r+| |d<   | j	        dk    r | j
        d
i | n | j        d
i | |r&|j        sd|_        |                    d           n|                     dd	g           | j        r| j                            |                                            d| j        _        | j                                         | j                            | j        j                   | j                            d           nk|                     |                                            |                                  |                     | j                   |                     d           |S )N)rl   rT   rQ  r  	recursiveFrH   r/  TrV   parent_task.has_child_taskszparent_task.parent_taskr>   )r)   r  rc   r  r5  _restore_timetracker_history_restore_task_resourcesr	  r  r  _restore_epics_subtasks_restore_subtasksr  rJ   rT   rd   _calc_cache_branch_gantt_path_recalc_gantt_path)ry   r-   r.   r   rH   r/   s        r0   r  zCmfTask.restore7
  s[   eggot.v.. 	kkklll00222 zz+u-- 	+--///((***!!!Hd++::k5)) 	1  $F8 K//,,66v6666&&00000 	*) ,)-&d+++
 ;=VWXXX 
* ,,T-E-E-G-GHHH37 0 >>@@@ 33D4D4PQQQ %%%5555  !9!9!;!;<<<22444''(8999		D	)))
r1   c                     |                     dd          }d|d<   t          j                            | |          }|D ]} |j        |i | d S )NrR   Fr  r   rU   )r5  r?   rr   r*   ro   )ry   r-   r.   rR   r   r   s         r0   r  z#CmfTask._delete_timetracker_historyn
  sp    !::&8%@@#{ 6;;d\l;mm" 	( 	(CCJ'''''	( 	(r1   c                 z    t           j                            | d          }|D ]}|                                 d S )NTr  )r?   rr   r*   r  )ry   r   r   s      r0   r  z$CmfTask._restore_timetracker_historyv
  sF     6;;d\`;aa" 	 	CKKMMMM	 	r1   c                 B   |                     dd          }t          j                            | |          }|D ]5}t          j                            |j        |          r |j        |i | 6t                              | dd                                           d S )NrR   Fr1  rU   )r=   rU   !   Подзадачи удаленыr  r  )	r5  r?   r   r*   r   r=   ro   rw   rJ   ry   r-   r.   rR   
tasks_listrY   s         r0   _delete_epics_subtaskszCmfTask._delete_epics_subtasks{
  s    !::&8%@@^((dDT(UU
 	- 	-D~""dg?O"PP -T,V,,,4 	 	
 	
 $&&&&&r1   c                     t           j                            | d          }|D ]} |j        |i | t                               | dd                                           d S )NTr   -   Подзадачи восстановленыr  r  r?   r   r*   r  rw   rJ   ry   r-   r.   r#  rY   s        r0   r  zCmfTask._restore_epics_subtasks
  sw    ^((dD(II
 	* 	*DDL$)&))))@ 	 	
 	
 $&&&&&r1   c                     |                     dd          }t          j                            | ||          }|D ]} |j        |i | t                              | dd                                           d S )NrR   FrS   r!  r  r  )r5  r?   r   r*   ro   rw   rJ   r"  s         r0   r  zCmfTask._delete_subtasks
  s    !::&8%@@^((TK[l|(}}
 	) 	)DDK(((((4 	 	
 	
 $&&&&&r1   c                     t           j                            | d          }|D ]} |j        |i | t                               | dd                                           d S )NT)rT   rU   r&  r  r  r'  r(  s        r0   r  zCmfTask._restore_subtasks
  sw    ^((T4(PP
 	* 	*DDL$)&))))@ 	 	
 	
 $&&&&&r1   c                     |                     dd          }t          j                            dd| g|          }|D ]} |j        |i | d S )NrR   FrH   r\   r^   )r5  r?   rv   r*   ro   )ry   r-   r.   rR   assignments
assignments         r0   r  zCmfTask._delete_task_resources
  sn    !::&8%@@-228T4:Pbr2ss% 	/ 	/JJt.v....	/ 	/r1   c                 r    t           j                            dd| gd          }|D ]} |j        |i | d S )NrH   r\   Tr^   )r?   rv   r*   r  )ry   r-   r.   r,  r-  s        r0   r  zCmfTask._restore_task_resources
  sY    -228T4:Pbf2gg% 	0 	0JJ/////	0 	0r1   c                     t           j                            g ddd| ggdg          }|D ]"}|j        j        }|                                 #d S )Nr  r[   r\   zin_link.op_gantt_taskr  )r?   rq   r*   r]   rl   *additional_children_relations_changed_hook)ry   !additional_parent_tasks_relationsrelationadditional_parent_gantt_tasks       r0   r  z+CmfTask._update_additional_parent_relations
  s    ,2,D,I,I  SK  SK  SK  NX  Z^  `d  Me  RfRiQj -J -l -l)9 	V 	VH+3+;+I((SSUUUU	V 	Vr1   c                 $   |                      ddg           |j        dk    rB|j        s;t          j        s/| j                                         t          j        j        | _	        | j
        s$| j        s|j        s|                     d           | j        dk    r<|r:|j        dk    r/|j        s(|j        s!t          j                            | |           t          j                            |            t)                      j        |d|i|S )	NrH   rW  r   TrV   r  )r   r   )rc   r!  r@   rA   r  cmf_modified_atr   r@  r=   cmf_modified_by_idr   is_recursion_saverJ   rW  privater?   r  r  r  r  r)   _comment_save_hook)ry   r   r-   r.   r/   s       r0   r9  zCmfTask._comment_save_hook
  s"   ($9:;;;
 !!'*:!1=! ((***&'n&7D#{ 	&4#9 	&'BR 	&III%%% #'<<<<WM^bcMcMclsl|Mc  FM  FUMc%77g7NNN227;;;)uww)4KKFKKKr1   c                 4   t           j                            dd| j        gg dg          }|D ]}|                                 t           j                            dd| j        gd |D             gg dg          }|D ]}|                                 d S )Nr   r\   )r  r  Tr  r  c                     g | ]	}|j         
S r>   r  )rM  cs     r0   rO  z/CmfTask.clean_after_encrypt.<locals>.<listcomp>
  s    WoWoWoabXYX\WoWoWor1   )r?   rw   r*   r=   ro   rx   )ry   r-   r.   commentsr   attachmentsr   s          r0   r   zCmfTask.clean_after_encrypt
  s    $));dg2NPlPlPl1m)nn 	 	GNN *//dTWLpWoWofnWoWoWoLp8q  tP  tP  tP  8Q/  R  R% 	  	 J	  	 r1   c                    |sg }|sdg}|sg }|g dddg dgdg dg dgg}|o|                     d	          }|r	|r|d	d
|gg}|                    d           |                    d            t                      j        |f||||d|S )Nr   r  r  r  )rH  r  r  rZ   )r3  r  trash)r3  r\   Nr   r`   r3  rH   object_fieldsr_   rg   r   )r5  r   r)   field_options_list)
r,   relation_field_namerB  r_   rg   r   filter_by_projectr.   r   r/   s
            r0   lists_options_listzCmfTask.lists_options_list
  s     	F 	 xH 	F111T#S#S#ST...0H0H0HI	K
 "Dm&7&7&D&D	 	= 	={C;<F 	j!!!h)uww)y/<VTZemy yqwy y 	yr1   c                     |sg }|r0|                     dd           r|dd|                     d          gg}|dg dg dgg} | j        |f||||d|S )Nr   r`   rZ   )r  r`   rH  )r  r`   r  rA  )r5  rF  )r,   rD  rB  r_   rg   r   r.   s          r0   main_list_options_listzCmfTask.main_list_options_list
  s      	F 	R]..{DAA 	R{C1B1B;1O1OPQF4!K!K!KMoMoMopq &s%&9  S_ent  @H  S  S  LR  S  S  	Sr1   c           	         |sg }|r0|                     dd           r|dd|                     d          gg}|                     dd           s|dg dg dgg} t                      j        |f||g dg|||d|}|rG|d         t          |          z
  }	|	d	k    r' t                      j        |f||g d
g||d	|	gd|}
n%|S  t                      j        |f||g d
g||d|}
||
z   S )Nr   r`   searchrZ   )r  r`   r/  )r  r`   r0  )rB  r_   rg   r   slicer   r   )r  r  r/  rA  )r5  r)   rC  r[  )r,   rD  rB  r_   rg   r   rK  r.   epicsend_cnt	not_epicsr/   s              r0   parent_task_options_listz CmfTask.parent_task_options_list  s     	F 	R]..{DAA 	R{C1B1B;1O1OPQF zz(D)) 	tt%G%G%GIqIqIqrsF**+> Um39:\:\:\2]fl4<EU UMSU U  	\AhU+G{{6EGG67J pZg8>?b?b?b7c7=YZ\cXdp phnp p		 223F \Vc8>?b?b?b7c7=\ \TZ\ \I y  r1   c           	      "   |sg }|dg dg dgg}|r0|                     dd           r|dd|                     d          gg}|                     dd           }|r|dddd	| d	gd
dd	| d	gddd	| d	ggg}t          j        j        d|||d|S )NrZ   )
cmf_hiddenr`   F)rQ  r`   Nr   r`   rJ  r   r  r  r   r  r  r>   )r5  r?   CmfComponentr*   )r,   rD  rB  r_   rg   r   r.   rJ  s           r0   components_options_listzCmfTask.components_options_list$  s     	F4!;!;!;=V=V=VWX 	R]..{DAA 	R{C1B1B;1O1OPQFHd++ 	V?67TaX^TaTaTaBbfmov  yF  }C  yF  yF  yF  fG  HF "'bvfxbb[abbbr1   c                     |sg }|g dg}|                     dd           }|s2|r0|                     dd           r|dd|                     d          gg}d|d<    t                      j        |f||||d|S )N)r  r`   r  rJ  r   r`   Tinclude_hiddenrA  r5  r)   rC  )	r,   rD  rB  r_   rg   r   r.   rJ  r/   s	           r0   gantt_project_options_listz"CmfTask.gantt_project_options_list7  s      	FEEEFHd++ 	R- 	RM,=,=k4,P,P 	R{C1B1B;1O1OPQF#' )uww)*=  W]cirx  DL  W  W  PV  W  W  	Wr1   c                    |sg }|r]|                     dd           rG|                     dd           r1|dd|                     d          gdd|                     d          gg} t                      j        |f||||d|S )Nr   logic_type_idr`   rA  rV  r,   rD  rB  r_   rg   r   r.   r/   s          r0   request_type_option_listz CmfTask.request_type_option_listG  s     	F 	N]..{DAA 	NmFWFWXgimFnFn 	N{C1B1B;1O1OPSbdgiviziz  |K  jL  jL  SM  NF)uww)*=  W]cirx  DL  W  W  PV  W  W  	Wr1   c                    |dk    r | j         |f||||d|S |dv r | j        |f||||d|S |dk    r | j        |f||||d|S |dk    r | j        |f||||d|S |dk    r | j        |f||||d|S |dk    r | j        |f||||d|S |dk    r | j        |f||||d|S  t                      j        |f||||d|S )	Nr   rA  )r  affected_versionsrA  rT   r   r  request_type)	rF  releases_options_listrH  rO  rS  rW  r[  r)   rC  rZ  s          r0   rC  zCmfTask.field_options_listO  s[    ')))3)*=  W]cirx  DL  W  W  PV  W  W  W"GGG,3,-@  ZP]flu{  GO  Z  Z  SY  Z  Z  Z+---3-.A  [Q^gmv|  HP  [  [  TZ  [  [  [-///3/0C ZS`io5;hZ ZRXZ Z Z,...3./B ZR_hn5;hZ ZRXZ Z Z/111312E ^Ubkq9?(^ ^V\^ ^ ^.00/3/0C ZS`io5;hZ ZRXZ Z Z *uww)y/<VTZemy yqwy y 	yr1   T)
system_jobc           	      (   t          d|  d|            |  d| }t          j        |                    d                                                    }	d|	 }
t
          j                            |
ddg          }|r|j        d	k    rtt          d
           |j	        
                                |_        |j                                         t
                              |d                                           nd}|r"t
          j                            |dg          }d}|rt
          j                            |          }d}|r$t"          j        j                            |          }t          d|j         d|j         d|            t
                              |
| | d|pd ||||          }|j                                         |                                 t          d|j         d|j         d           |j        j        S )u  
        Метод для автоматического создания задач.
        Переоткрывает задачу, если такая уже есть закрытая.
        Уникальность задачи определяется по topic + text.
        Дополнительную, переменную информацию, например параметры запроса, можно передать в extra_text
        z
Auto task z, info: /zutf-8zAuto-r   r  )r7   rg   r   zAuto task reopenu'   Переоткрываем задачу)rH   r   Ndefault_projectr  zNew auto task for r   z
) project 
r  )r7   r   r   r   r   r   rH   r   )r  hashlibmd5encode	hexdigestr?   r   r5  r   r  r  r  r   r   rw   rJ   r  ri   rg   r	   get_obj_by_tuuid_strr   r7   r=   rm   )r   r   
extra_textr   responsible_idcmf_owner_idr   _kwargstask_key	task_hash	task_coderY   r   r   rH   s                  r0   	auto_taskzCmfTask.auto_taskh  s4    	/4////000##T##K 8 899CCEE	'I''	~!!y:Mx9X!YY 	&%11)***"m>>@@'')))!!4]!^^cceeeK _$.22>K\J]2^^I ?",00>>	F M,AA)LL^{'7^^+:J^^V\^^___>>22
 0b22'9x "  D O##%%%		14911tw111222w}r1   c                    t           j                            g d          }g d}g d}|rdd|j        gg t	                      }|D ]y}t           j                            dd|j        gg dg          }	t           j                            dd|j        g          }
|                    |j        j	        |	|
d           z|S )Nr  r  )r   r\   r  rk  r\   )in_progressr   )
r?   r  r*   r=   ry  r   r5   r   r(   rm   )r,   r_   r-   r.   personsin_progress_filtercount_filterr  resultin_progress_countr   s              r0   get_responsibles_tasks_countz$CmfTask.get_responsibles_tasks_count  s    "''/I/I/I'JJGGGAAA 	3fi022 	c 	cF & 4 4)4;<f<f<fg !5 ! ! N((1A40S(TTEfio?P[`/a/abbbbr1   c                    | j         j        sJ| j        j        s>| j        j        s2| j        j        s&| j        j        s| j        j        s| j        j        sd S | j        j        r	| j        rd S | j	        
                    |           | _        d S r  )r  r   rH   r  r  r  r   r   rA  	scheme_wfcalc_workflowr  s    r0   r   zCmfTask._calc_workflow  s    M$		{%		  +		 }$			
 z$		 )		 ~(		 F =# 	 	F 44T::r1   c                     | j         j        sd S | j        dk    r-| j        j        r!| j        j        dk    rt	          dd           | j        j        dk    r| j        dk    rt	          dd           d S d S d S )Nr  ua   Нельзя изменить Логический тип задачи на Гант-проектTrO   uT   Нельзя изменить Логический тип у Гант-проекта)r   r   r  r  re   r  s    r0   r  z%CmfTask._calc_logic_type_change_guard  s    ) 	F  4449J9N4SWSdSh  mA  TA  TAy  BF  G  G  G  G $888T=NRf=f=fltxyyyyyy 98=f=fr1   c                     | j         j        s8| j        j        r| j        dv s#| j        j        dv s| j        j        r| j        sd S |                                  |                     | j                    d S )Nr  r.  )	rT   r   r   r  r  r   r  r  r  r  s    r0   r   zCmfTask._calc_gantt_path  s    '		 O.		 *.ddd -15UUU	$ V)-)= V F**,,, 011111r1   r   c                    |dk    rt          dd           |r||                    g d           | j        |j        k    r|j        | _        | j        |j        k    r|j        | _        |j        dk    r|| _        d | _        n!|j        dk    r|| _        nd | _        d | _        t
          j                            | g d	          D ]}d
}| j        dk    r| |_        | j        |_        d}nX| j        dk    r| |_        d |_        d}n<|j        | j        k    r| j        |_        d}|j        | j        k    r| j        |_        d}|j        r1|	                    |            |j
        j        |j
        j        k    rd}|r|                    d           |j        r|                    | |dz              |                    |            d S )Nd   uM   DEV: Защита от рекурсии: _recalc_gantt_path: if r_count > 100TrO   )r1  r:  r  r  r0  r/  )cache_branch_gantt_pathr1  r:  rT   r  r  r  rH   rT   rg   FrV   r   )rT   r_count)re   rc   r1  r:  r  r?   r   r*   r  r  r  r  r  rJ   r  _check_relations)ry   rT   r  ch	need_saves        r0   r  zCmfTask._recalc_gantt_path  s$   S==emqrrrr 	###$[$[$[\\\yK,,,',	+"888"-"8'+<<<"- 		)[88'	 DI"DO.%%$ @~ @~ @~%   	* 	*BI K// $ 		"&777 $ 		7di''"iBG $I=DO33$(OBM $I! %00666-1R5O5SSS $I ($'''! *%%$	%JJJJ##D))))7	* 	*r1   c                 R   | j                                          | j        s&| j         dvrd | _        |                                  d S |s|                     ddg           | j        }|s	g | _        d S |j        j        }|t          dd           g ||j	        j        |j
        j        |j        j        |j         j        d| _        | j	        j        d | j        D             v r't          d	| j         d
| j        j         dd           |                     | j                   d S )Nr  #parent_task.cache_branch_gantt_pathrP  zODEV: WARNING: _calc_cache_branch_gantt_path: if cache_branch_gantt_path is NoneTrO   )r=   r7   r   r  c                     g | ]
}|d          S r  r>   rM  ts     r0   rO  z9CmfTask._calc_cache_branch_gantt_path.<locals>.<listcomp>  s    KKKQtWKKKr1   ul   Произошло зацикливание! Попытка добавить дочернюю задачу "uK   ", которая уже является родительской для "r  )r  r   r  r  r  rc   rT   rm   re   r=   r7   r   )ry   rT   r  s      r0   r  z%CmfTask._calc_cache_branch_gantt_path  s      # 	(9Aw(w(w+/D(!!###F 	+CE_`aaa*K 	+-D(F"-"E"K"*gostttt()@ (.&$*$*'4:	C
 C
 ($ 7=KKd.JKKKKK }  GK  GP } }cgcscx} } } " " " " 	d./////r1   c                 |   |rt          |          nt                      }|s|                     dg           | j        }| j        r|d | j        D             z  }| j        s<|r:|j        r|d |j        D             z  }|                    |j        j                   t          	                    d| j
        j         d|            |rdddd	ggd
dd| gdd| ggg}ddg}t          j                            ||          D ]_}|j        j        j        | j        j        k    r|j        n|j        }|j        j        |v r"t!          d|j         d|j
         dd           `g ddd| gg}g d}t          j                            ||          D ]-}	|	j        }
|
                    || j        j        hz             .d S )Nr  c                     h | ]
}|d          S r  r>   r  s     r0   r  z+CmfTask._check_relations.<locals>.<setcomp>.  s    &U&U&U1qw&U&U&Ur1   c                     h | ]
}|d          S r  r>   r  s     r0   r  z+CmfTask._check_relations.<locals>.<setcomp>1  s    *`*`*`q1T7*`*`*`r1   z&cmf_task._check_relations, task_code: z, parent_tasks: r  r  zsystem.finish:startzsystem.finish:finishrZ   r]   r\   r[   r  u   Невозможно перенести задачу из-за того, что существует связь ОН/ОО у задачи "z" u?   . Удалите связь и попробуйте снова.TrO   r  )z,out_link.parent_task.cache_branch_gantt_pathz out_link.cache_branch_gantt_pathzout_link.has_child_tasksrg   r_   )
gantt_path)r   rc   rT   r  r  rC   r=   rm   rA   r   r7   r?   rq   r*   r[   r]   re   r   _check_additional_relations)ry   rT   r  r  _fieldsr~   rY   additional_child_filteradditional_child_fieldsadditonal_child_relationadditional_childs              r0   r  zCmfTask._check_relations%  s   (2=S___
 	+CDEEE*K' 	V#&U&U8T&U&U&UUJ# 	1 	12 a'*`*`K<_*`*`*``
NN;>/000	fffZdffggg 		Q%t.CE[-\]	4.T40HIG !*-G/44GG4TT Q Q'*|'<'M'Ms||SVS^7=J..  D  mq  mv  D  D  z~  zC  D  D  D  LP  Q  Q  Q  Q EDDd##
#
 #
 #

 )/(@(E(EMd  nE(E  )F  )F 	b 	b$7@88JRVRYR_Q`D`8aaaa	b 	br1   c                    |dk    rt          dd           |rt          |          nt                      }|                     | j        |           g d}t          j                            | |          D ]\}|j        r)|                    || j	        j
        hz  |dz   	           2|                    |j        || j	        j
        hz             ]d S )
Nr  u_   DEV: Защита от рекурсии: cmf_task._check_additional_relations: if r_count > 100TrO   )rT   r  )r  r  r  r  r   )r  r  )re   r   r  rT   r?   r   r*   r  r  r=   rm   )ry   r  r  child_fieldsr7  s        r0   r  z#CmfTask._check_additional_relationsN  s   S==w  @D  E  E  E  E(2=S___
$*:zRRR
 
 

 ^((T,(OO 	o 	oE$ o11Z47=/=Ycjmncn1oooo&&53DQ[_c_f_l^mQm&nnnn		o 	or1   c                     |                      dg           t          j                            dd| j        gdd|j        gg          }|s3d| _        |                                  |                     d	           d
S d
S )u   
        Убирает метку дерева у родительской задачи при удалении или перемещении дочерних задач
        r  rT   r`   r=   r  r  FTrV   N)rc   r?   r   r   r=   r  r  rJ   )ry   r7  have_childrens      r0   r  zCmfTask.child_task_deleteb  s     	+,---++]C4QTXZ^`e`hSi3j+kk 	&#(D ..000III%%%%%	& 	&r1   c                    | j         j        sdS | j         j        r|                     ddg           | j         j        s^d| j         _        | j                                          | j                             d           | j         j                                         | j         j	        r6| j         | j         j	        k    s#| j         j	        
                    |            dS dS dS )u   
            Рассчет has_child_tasks
            должен вызываться после _calc_parent_task
        Nr  zparent_task.op_gantt_taskTrV   )rT   r   rX  rc   r  r  rJ   rl   $task_has_child_tasks_is_changed_hookr  r  r  s    r0   r   z)CmfTask._calc_parent_task_has_child_tasksm  s    
 * 	F' 	V;=XYZZZ#3 V37 0 >>@@@ %%%555 .SSUUU 	9(8D<L<P(P(P 22488888	9 	9(P(Pr1   c                    | j         j        s	| j        sd S | j        r'| j        r | j        j                                        rd S d }|                     ddg           | j         rQ| j         j        rD| j         j        j	        r2| j         j        j	        }| j         j        j
        }|rl|                    g d           | j                            |           d|j         d}t                              | |d                                           n|j        r| j        |k    r|j        | j        vr|j                            g d           | j                            |j                   d|j        j         d	|j         d
}t                              | |d                                           | j         j        r>| j        s8| j         j        }|                    ddg           |j        r|j        j	        r|j        j	        }|j        j
        }|r\||k    rV| j                            |           d|j         d}t                              | |d                                           d S |j        r| j        |k    r|j        | j        v rt| j                            |j                   d|j        j         d	|j         d}t                              | |d                                           d S d S d S d S d S d S d S d S )Nr#  z0responsible.primary_role.structural_project_list)r  r   ordernorD  r3  r  uU   SimpleLogic: Задача добавлена в структурный список "uG   " т.к. он указан в должности исполнителяr  r  u>   SimpleLogic: Задача добавлена в список "r  u   " т.к. он является Структурным проектом Главной роли ответственного по задачеz,primary_role.structural_project.default_listz$primary_role.structural_project_listuS   SimpleLogic: Задача убрана из структурного списка "uX   " т.к. он указан в должности прошлого исполнителяu<   SimpleLogic: Задача удалена из списка "u   " т.к. он является Структурным проектом Главной роли прошлого ответственного по задаче)r   r   r   r   r   r   r   rc   r&  r'  structural_project_listr   r   r?   rw   rJ   r  rH   r  r  )ry   append_structural_project_listr'  r  old_responsibleremove_structural_project_lists         r0   r  zCmfTask._calc_structural_list  s4   * 	4; 	F 	4; 	%**,, )-&T  WI  J  	K  	K  	K 	W 0 = 	W$BRB_Br 	W!%!1!>!Q-1-=-J-b*- W.:: < < <    
!!"@AAAj  vT  vY j j j	!!I!KKPPRRRR#0 WT[DV5V5V)6$*DD&3?? A A A    J%%&8&EFFF!Sbt  cB  cG !S !S5G5L!S !S !SI %%T	Q%OOTTVVV 	[ 	[".2O'')WY  )A  B  B  B+ [0L0_ [%4%A%T"1@1M1e.1 [6TXv6v6vJ%%&DEEE!  xV  x[ ! ! !I%%T	Q%OOTTVVVVV'4 [HZ9Z9Z)6$*DD
))*<*IJJJ%hdv  eD  eI %h %h9K9P%h %h %h	 ))IQR)SSXXZZZZZ%	[ 	[ 	[ 	[[ [ [ [[ [9Z9ZDDr1   c                 6   | j         s| j        j        s| j        j        d S | j        rjt          | j        j        t          j                  rH|                     dg           | j        j        (| j        j	        j        | j        j	        | _        d S d S d S d S d S )Nz!parent.default_agile_story_points)
r   rH   r   rV  rm   r   r?   r   rc   default_agile_story_pointsr  s    r0   r  z CmfTask._calc_agile_story_points  s     	t{5 	9P9V9^F; 	:dk&79JKK 	ABCCC&,49_9e9q*.+*P'		 	 	 	449q9qr1   c                    | j         j        sd S |                     dg           | j        r&| j         | j        j        k    rt          dd           | j                            ddg           | j        j        r| j        j        | j         j        k    r:| j        j        s,| j         | j        _        | j        	                                 d S d S d S )Nzbp_gantt_task.sched_worku   DEV: FATAL: нельзя изменять поле estimate_work, когда существует базовый Гант-планTrO   r  
const_work)
r  r   rc   bp_gantt_taskr  re   rl   r  r  rJ   r  s    r0   r  zCmfTask._calc_estimate_work  s   !, 	F45666 	l!T%7%BBB  _  gk  l  l  l  l 	&&l'CDDD!, 	*0B0MQUQcQg0g0g%0 *040B"-"'')))))* * 1h0gr1   c                    |                      g d            | j        d	i |}t          j                                        }| j        dz   |                    d          z   |_        | j        r| j        |_        d|j        _        |	                                 |
                    d           t                              |d| j         d| j         d          
                                 |j        j        S )
u    Создание задачи из шаблона
        :param self: Шаблон документа
        :param params: Параметры для шаблона
        :return: Идентификатор новой задачи
        )tmplt_document.textr   r   r   z%d.%m.%YTrV   u0   Задача создана из шаблона r  r  r>   )rc   create_from_templater   r   r   strftimer   rH   r   r   rJ   r?   rw   r7   r=   rm   )ry   r|  new_tasknow_dates       r0   r   z!CmfTask.create_task_from_template  s%    	    	 	 	 -4,66v66 $((**	C(*;*;J*G*GG : 	(!ZHN%)"**,,,%%%0zcgcl0z0zosox0z0z  GH  	I  	I  	N  	N  	P  	P  	P{  r1   c                     |                      dg           | j        dk    rdS t                                                      S )uB    Шаблон уведомлений для разных workflow r  r  ztask.ticketzhelpdesk_mail_notification.html)rc   r  r)   +get_default_mail_notification_template_namer   s    r0   r  z3CmfTask.get_default_mail_notification_template_name  sG     0111--44wwBBDDDr1   c                 j   |                      | j                   t          j                            | j        j        pd          |d<   | j        r| j        j        j        pd|d<   |dxx         dd	                    d | j
        D                       z   z  cc<    t                      j        di |S )Nr  obj_result_textobj_responsible_namesr   c                 :    g | ]}t          |j        pd           S )r  )rD   r   )rM  rs     r0   rO  z-CmfTask.full_search_index.<locals>.<listcomp>  s'    :e:e:eQR3qv|;L;L:e:e:er1   r>   )rc   full_search_fieldsr?   CmfFullSearch
strip_htmlr  rm   r   r   joinr/  r)   full_search_indexry   r.   r/   s     r0   r  zCmfTask.full_search_index  s    0111$*$8$C$CDDTDZD`^`$a$a !*.*:*Zt?O?T?Z*`^`&'&'''3:e:eVZVd:e:e:e1f1f+ff'''(uww(226222r1      Добавленоc                    |t           j        }n5t          |t                    r t          j                            |          }t          j                            | |||||          }| 	                    d|           |S )Nr  )
start_dater   r  )r  )
rA   r@  r   rD   r?   r  r5  r=  timetracker_task_change_timer   )ry   r  r  r   dater   r  s          r0   r   zCmfTask.timetracker_change_time  s    II	3'' 	;(,,	,::I$3PPQUWaBTVZgkLU Q W W 	-=PQQQ""r1      )	only_oncer`  r   c                 D    t           j                            |            d S r  )r?   r   _recalculate_codes)r   rm  s     r0   recalculate_codes_celeryz CmfTask.recalculate_codes_celery"  s      	))*55555r1   c                 
   d}d}	 t           j                            dd| gddg|||z   gdd          }||z  }|sd S |D ]6}|j        s
|                    d           |                    d	           7t                       )
Nr      TrF   r`   r7   )r_   rg   rK  rU   r$   )from_recalculaterV   )r?   r   r*   rF   
_calc_coderJ   commit_with_event)r   rN  limit
task_slicerY   s        r0   r  zCmfTask._recalculate_codes'  s     	 ,,!3
3!6*%'l $# -  J JA " * *| 666		D	))))!	 r1   c                    t                                           5  t          j                            |           }|st          d           	 ddd           dS t          d|            t          j                            |dg          }t          dt          |                      d t          |fd	
          }d}|D ]$}|dz  }t          d|            |r7t          j
                            |          D ]}|                                 |j        j                            d          d          d| }t          j
                            dd|gd          rft          d| d           |dz  }|j        j                            d          d          d| }t          j
                            dd|gd          f||_        |                    d           &	 ddd           dS # 1 swxY w Y   dS )u  
            Метод для ручного запуска.
            Пересчитает номера в кодах задач начиная с единицы.
            ! Прошлые коды задач не сохраняются
            ! Пошлые коды задач удаляются
            Если код занят задачей из другого проекта - он пропусается
        r  u   Проект не найден!NuY   Удаляем историю выдачи кодов задачам из проекта r7   )rF   rg   u   Всего задач: c                 2    	 t          |           S #  Y dS xY w)Nr   )r   )rN  s    r0   tryintz:CmfTask.reindex_project_tasks_code_numbers.<locals>.tryintP  s"    q66M22s    c                 `     | j         j                            d          d                   S )Nr   r  )r7   rm   
rpartition)r  r  s    r0   <lambda>z<CmfTask.reindex_project_tasks_code_numbers.<locals>.<lambda>W  s*    qv|?V?VWZ?[?[\]?^8_8_ r1   )r   r   r   u'   Обрабатываем задачу: )rY   r   r`   Tr^   u   Код u    занятrV   )r  disable_notifyr?   r   r5  r  r   r*   r[  sortedr  ro   r7   rm   r  r   rJ   )	r   with_history_deleterF   r  rN  rY   histnew_coder  s	           @r0   "reindex_project_tasks_code_numbersz*CmfTask.reindex_project_tasks_code_numbers>  s    ##%% "	* "	*'++z+::G 7888	"	* "	* "	* "	* "	* "	* "	* "	*
 wnuwwxxx++GVH+MMI<C	NN<<===   y._._._._```IA! * *QFFFGGG& & & 9 > >D > I I & &"io88==a@FF1FF/44VS(<Sei4jj K9H999:::FA"&)/"<"<S"A"A!"DJJqJJH /44VS(<Sei4jj K
 %			D	))))*'"	* "	* "	* "	* "	* "	* "	* "	* "	* "	* "	* "	* "	* "	* "	* "	* "	* "	*s   3G=FG==HH<   )r  soft_time_limitr`  r   c            	      >   t           j        }d}d}|                    ddg          D ]}|dz  }|                    dd|g          }|j        |k    r|dz  }t
                              d	|j         d
| d|j                    ||_        |                    d           |j        j	        |j        j	        d}t          d|j         |           t          d|           |dz  dk    rt                       t
                              d| d| d           |S )u   Актуализация кеша кол-ва задач в епике (нужно ли для подпроекта? Вроде как нет).r   r/  r  )r  rg   r   rT   r`   r  zUpdate cache_members_count z -> r   TrV   )node_idelements_countztree-node-count-changes-ztree-node-count-changesr  zRecalculate rb  z lists caches)r?   r   r*   r   r  rA   r   r=   rJ   rm   cmf_emit_event
cmf_commit)rm  r,   total_count
calc_countcmf_epic
real_count
event_datas          r0   r  zCmfTask.recalculate_cachek  sN    n
kC\B]^^ 	 	H1K=#x*HIIJ/:==a
vh6Vvv\fvviqitvvwww3=0 ---)1):hNnNtuu
G(+GGTTT9:FFFC1$$	FzFFKFFFGGGr1   	recursionr  c                   t                      }|                     g d           | j        r1|                    | j                            |dz                       } t                      j        |d|i|                    |          S )N)zfollowers.personzfollowers.person.cmf_deletedzfollowers.person.does_not_workzfollowers.notify_volumezfollowers.follow_childrenr$  rT   r   r  r  )r   rc   rT   unionget_all_followersr)   )ry   r  r-   r.   r   r/   s        r0   r  zCmfTask.get_all_followers  s    ee p p p 	q 	q 	q 	Y))D,>>UV>WWXXC(uww($N)NvNNTTUXYYYr1   inline_save)tmp_objcreate_formui_form_moderg   c                     | j         |g ddd|}|j        r0|j        j        dk    r d} t                      j        |||||d|S |p|j        } t                      j        ||||d|S )N)r   r  zproject.ui_form_schemezproject.cust_field_conf_schemezproject.logic_prefixr  r@   r^  T)rg   rU   r  r  )r  r  r  rg   )r  r  rg   )r   rF   r  r)   r    r@   )r,   r  r  r  rg   r-   r.   r/   s          r0   r    zCmfTask.ui_get  s    
 #( S S S !	, , %+	, ,
 ? 	Gw;?TTT(L!577>4|alu{  G  G  @F  G  G  G!5W%5uww~t,K`fqqjpqqqr1   c                    t                                          |          }t          |dd           rNt          j                            |j        j                  }t          j                            |          |_        |S )Nrl   r  )r)   get_automation_ui_formr  r?   r  r   rl   r=   )r,   r;   ui_formrl   r/   s       r0   r  zCmfTask.get_automation_ui_form  sn    ''0055 3.. 	^"/448I8L4MMM$*$7$N$N}$]$]G!r1   
ui_form_idc                 @    t           j                            |          S r  )r?   	CmfUiFormget_ui_group_fields)r,   r  s     r0   _get_ui_group_fieldszCmfTask._get_ui_group_fields  s    33J???r1   c                 L   t                               t          |j                            }|p|j        }|rG|j        dk    r<|j        r5t          j        	                    |j        dg          }|j
        r|j
        }t                                          |||||          S )Nr  zui_form_view_inner.ui_form_jsonr  )tmp_is_public_formtmp_ui_view_formr  r  )r   get_cache_projectrD   r   r@   r  rX  r?   CmfSDeskRequestTyper   ui_form_view_innerr)   _build_ui_form)	r,   r  r  r  r  r  tmp_projectr^  r/   s	           r0   r  zCmfTask._build_ui_form  s     ++C0B,C,CDD!5W%5 	>;37LLL & >%9>>.8Y7Z  ?  \  \2 >*=Gww%%(:-;PW & Y Y 	Yr1   c                 H    t           j                            ddgd          S )u   
        Экран по умолчанию если нет никаких правил и схем экранов

        Returns:
            CmfUiForm: системный экран по умолчанию
        zui_form.task:defaultui_form_jsonT)r7   rg   cache_inmemory)r?   r  r5  r  s    r0   _get_default_ui_formzCmfTask._get_default_ui_form  s'     ##)?HXim#nnnr1   )copy_attachmentscopy_relationscopy_subtaskscopy_alldeferred
new_parentlevel
copy_listsr   r  r  r  r  c       	            |r<|s:|r|j         j        nd }t          | j        | j         j        ||||||d           d S t                              d| j          d|            |rd}d}d}d}	|                     g d            t                      j        |
||d|}| j	        s'|j
                            d	          |_        d |_        t          j                            d
d          }|rdd|gg}t          j                            |dd| ggz   dg          D ]1}|                                }||_        |                                 2t          j                            |dd| ggz   dg          D ]1}|                                }||_        |                                 2| j	        s/t                              | ||                                           | j        j        r;| j        j        r| j        j        }n| j        j        }|j        pd|j        z   |_        |j        r	|sd|_        |                     ||           |r||_        d|_	        |	rd |j        D             |_        ng |_        d|_        |                                 |rVt          j                             dd| gd          }|D ]/}|                    |j!        j        dz   |||||||dz              0|dk    r|j"        #                                 t          j$        %                    |           | j&        r| '                    |           |S )N)r  r   r  r  r  r  new_parent_idr  zcopy_task: task_id: z	, level: T)**zattachments.urlrQ  r   r/  r.  zattachments.url_previewzattachments.url_preview_imgr  r  r  ztmplt_document.text_renderrM   )r   r  r_  r  zsystem.clone)r7   r   relation_typer  r[   r\   r  r  r]   )r[   r]   r  r  Fc                 (    g | ]}|j         d k    |S r  r  r  s     r0   rO  z CmfTask.copy.<locals>.<listcomp>  s&    ___SS=RV^=^=^S=^=^=^r1   rT   )r_   include_templatesu    Копияr   )r   copy_attachmentr  r  r  r  r  r  r   )(r=   rm   r  copy_task_with_subtasksrA   r   rc   r)   r   r   r  r  r  rr  r?   CmfRelationTyper5  rq   r*   cloner[   rJ   r]   tmplt_documentrX  text_renderr   r  _clone_op_gantt_taskrT   r   r   r   r   rl   task_copy_hookrv   r  rM   _copy_checklists)ry   r   r  r  r  r  r  r  r  r	  r-   r.   r  new_obj
clone_typer  r2  new_relation
tmplt_textsubtasksrz   r/   s                        r0   r   zCmfTask.copy  s     	 	3=GJM//4M!,#w} (8&4%2 (%2     F	@tw@@@@AAA 	#!N MJ 	 ] ] ] 	^ 	^ 	^ %'',4BR]]V\]] 	&$-@@V@TTGN!%G+//^TX/YY
 	$%tZ89G"499ZY]_cLdKeAeBF : I I $ $'~~//(/%!!####"499YX\^bLcKdAdBF : I I $ $'~~//'.$!!#### 	f$$dGS]$^^cceee
 * 	C". 6!0<

!05
#L.B*2BBGL" 	,= 	,&+G#!!':666 	(",G"'G 	__GM___GMMGM 	~**=$2Mae*ffH# 
 
 +m;$4#1"/%%&!)  	 	 	 	 A::!0022233G<<<? 	+!!'***r1   c                 F    | j         D ]}|                    |           d S )Nra   )rM   r   )ry   rH   r  s      r0   r  zCmfTask._copy_checklists.  s4     	* 	*INN&N))))	* 	*r1   r  u!   Копирование задач)r  only_once_argsdescriptionshow_bg_progressbarc           	         t           j                            dd| g          }|                    |                                           t           j                            |          }|                    ||||||d           d S )Nr=   r\   r  r  T)r   r  r  r  r  r  r  )r?   r   r5  rc   rd   r   )	r  r   r  r  r  r  r  rY   r  s	            r0   r  zCmfTask.copy_task_with_subtasks2  s     ~!!$g)>!??1133444^''='99
		t.>~ -Zbf 	 	h 	h 	h 	h 	hr1   c                    |j                             dg           |j                                         |_         |j        s|j         j        rd|j         _        d|j         _        d|j         _        d|j         _        d|j         _        d |j         _	        d |j         _
        t          d          |j         _        t          d          |j         _        ||j         _        |r||j         _        |j                             d           d S )Nr  r   z0.00TrV   )rl   rc   r  r  agregat_workr  actual_durationactual_completeactual_myself_workactual_start_dateactual_finish_dater   actual_costactual_myself_costrY   rT   rJ   )ry   r  r  s      r0   r  zCmfTask._clone_op_gantt_task<  s    ))4&111 ' 5 ; ; = =& 	37+@+M 	312G!.,-)01-01-34026/370,3FOO)3:6??0%," 	;0:G!-""T"22222r1   c                     |                      dg           | j        dk    rd| j         d| j         S t	                      j        S )Nr  r0  zproject/rb  )rc   r  r  r7   r)   hrefr   s    r0   r-  zCmfTask.hrefN  sO    .)*** 1118dl88TY888ww|r1   c                     t          t                    }d}d}	 |                     |g d||z  |dz   |z  g          }|D ]!}|j        D ]}||j        xx         dz  cc<   "t          |          |k     rn|dz  }c|S )Nr   i  T)--r=   zlists.idr   )r_   rg   rK  )r   r   r5   r   r=   r[  )	r,   r_   rm  rw  page	page_sizer  rY   r  s	            r0   r   zCmfTask.count_tasks_by_listsV  s    S!!				&>&>&>tI~X\]^X^`iWiFj " l lI! * *!Z * *E58$$$)$$$$*9~~	))AID	 r1   c                    | j         s| j        S |                     g d           | j                            ddg           | j        r| j        j                                         | j        rE| j        j        r9| j        r2| j        j        r&| j        j        j	        dz   | j        j        j	        z   S | j        j        j	        S )N)zproject.task_code_prefix'project.task_code_use_logic_type_prefixzlogic_type.obj_code_prefixtask_code_use_logic_type_prefixtask_code_prefixr   )
r   code_prefixrc   rF   r   obj_code_prefixr   r4  r5  rm   r  s    r0   get_code_prefixzCmfTask.get_code_prefixf  s     	$ ## 8 8 8 	9 	9 	9
 	  "CEW!XYYY ? 	3O+00222 < 	iDLH 	i i4?#B i|4:S@4?CbChhh|,22r1   c                 "   t                                                      }dd l} |j                    }d}d}t          j                            dd|gd          r|dz  }t                                                      }||k     sJ d| d	| j         d
             |j                    |z
  }|dk    r5t          d|dd| j         d| j         dd| j	        v o| j
         d	           t          j                            dd|gd          |S )Nr   i'  r7   r`   Tr^   r   u8   Превышен лимит поиска кода limit=z model=uA   , возможно надо отключить def gen_code: passz$!!! --- gen_code::duration too long z.1fz sec, r   z, r   )r)   gen_codetimer?   r  r   r   r  r=   rg   r7   )ry   r7   r;  startr  rN  durationr/   s          r0   r:  zCmfTask.gen_code  sy   ww!!	',,VS$4GY],^^ 		_FA77##%%Du999 aY^ a agkgv a a a999 ty{{U*H!||^8N ^ ^^ ^*.'^ ^6<6K5ZQUQZ^ ^ ^_ _ _ ',,VS$4GY],^^ 		_ r1   c                    | j         r| j        j        s| j        j        s|sd S | j         s"t	                                                       d S | j         r| j                             d          rd S d }d }| j        r| j        }| j        j        r| j        j        r| j        j        }|r|                                 }| j         j	                            | d          r6| j         j	        
                    d          |
                    d          k    r| j         j	        }|rQt          j                            |          s1t                              || |          }|                                 d| j        _        t	                                                       d S | j        j        r| j         j	                            |                                  d          s| j         j	        }| j        sS|rQt          j                            |          s1t                              || |          }|                                 d | _         t	                                                       d S | j        j        r|                     dg           | j        r| j        j        r| j         j	                            |                                  d          s| j         j	        }| j        sf|rdt          j                            |          sDt                              || |          }| j        j        r||_        |                                 t	                                                       d S d S d S d S d S )NzA-r   )r7   )r7   rY   rF   Tr3  )r7   rF   r   r   r)   r  rs  r  r8  rm   r   r?   r  r   rJ   r   rc   r4  r   )ry   r  rF   project_old
new_prefix	prev_codecode_historyr/   s          r0   r  zCmfTask._calc_code  s   		 |&	 )		
  	 F y 	GG   F
 9 	--d33 	F< 	#lG<" 	+t|'7 	+,*K 	--//J9?--.>.>.>?? 	49?CXCXY\C]C]akaqaqruavavCvCv IO	 ,!499y9II ,'-'@'@iVZdk'@'l'l$))+++-1*""$$$ <" 	49?+E+EI]I]I_I_FbFbFb+c+c 	 	I; (9 (05595EE (#)#<#<)RV`k#<#l#lL %%'''DIGG   F ?% 	%GHIII| %L@%	22d6J6J6L6L3O3O3OPP% !IO	{ ,y ,!499y9II ,'-'@'@iVZdk'@'l'l<2 B6AL3$))+++""$$$$$	% 	%% % % % % %r1   r  c                    |sg }|sg } | j         |||d|}g }|D ]>}	 |                    d           |                    |           /# t          $ r Y ;w xY w|S )Nr  T)TEXKOM_skip_failread_audit)r*   _acl_check_readr   CmfPermissionError)r,   rg   r_   r-   r.   res_uncheckedr   r  s           r0   r!   zCmfTask.public_list  s     	F 	F $vfOOOO 	 	A!!T!BBB

1%   
s   +A
AAc                 J    d|d<   d|d<    t                      j        di |S )NFwith_parent_ownerinherit_executorsr>   )r)   r   r  s     r0   r   zCmfTask.all_relation_persons  s8     ',"#&+"#+uww+55f555r1   c                     | j         j                                         | j         j        j        }|                     | j        j        |            |                     | j        j        |           d S r  )rl   r  r   rm   #_update_actual_work_for_all_parentsrT   r  r  )ry   actual_work_times     r0   _update_actual_workzCmfTask._update_actual_work  sl    &++----9?001A1EHXGXYYY001A1EGWXXXXXr1   c                    |sd S |j                                          |j         j                                         |j         xj        |z  c_        |j         j        dk     rd|j         _        |j                             d           d S )Nr   F)
user_input)rl   r   r  rJ   )ry   rY   rM  s      r0   rL  z+CmfTask._update_actual_work_for_all_parents   s     	F!!!&++---&&*::&&)A---.D*511111r1   z@hourly)r  r`  schedulec                     t                               d           dg dg dgg dgg dddt          j                            t          j        j        	          gg} t          j                            | g d
          D ]Z}|j	        r|
                                }t                               d|            |j        j        r|j        j        |_        |j                            d          |_        |j                                         |j        |_        d |_        d |_        |                                 |                                 |                    d           t                               d|            |j        dv r|j        j        dk    rN|j        j        }|                                 |j        r|j        |j        k    r||_        |j        j        dk    N|j        j        r|j        j        |_        |j        r%|j        j                            dd          |_        |j                            d          |_        |                                 |j        j        dk    r]|j                            d          |_        |j        j        dk     r|j                                         |                                 \d S )Nz(Run CmfPerson.cron_celery_check_periodicrZ   )status.coder  r  )r   r  r  )period_create_newr`   T)period_intervalr  Nperiod_next_datez<=r   )rR  r  r  rT  period_clear_checkboxr   r  rV  rU  r   r   rS  r   r  z6CmfPerson.cron_celery_check_periodic: create new task r  )r  TrV   z2CmfPerson.cron_celery_check_periodic: reopen task )r   r|  r   ztox-checklist--checkedr  pause)rA   r   r   r   r   r   r?   r   r*   rT  r  r  rX  r   r  r  r  r   r   r   rU  rV  rJ   _cacl_next_periodr   r  rm   rW  r  r7   )r  rY   r  old_deadlines       r0   cron_celery_check_periodicz"CmfTask.cron_celery_check_periodic  s    	
:;;;5557a7a7ab777 322&h.?.C.CxGXG\.C.].]^` N''w @] @] @]' ^ ^ 0	  0	 D % ) 4466[QY[[\\\*6 A$,$;$@HM"*"3"F"FSY"F"Z"Z#++---$(M!+/(,0)&&(((		D	))))STSSTTT)-DDD /3a77'+}':..000= 9T]T=R-R-R,8DM /3a77 *6 =$($7$<	1 Z$(IO$;$;<TVX$Y$Y	"&-"B"Bv"B"V"VDKIIKKKK[%00 #'-"B"Bv"B"V"VDK*Q..//111IIKKKa0	  0	 r1   c                    |                                   |                                  |                                  |                                  |                                  |                                  |                                  | j        j        r| j	        
                                 |                                   t                      j        |i | d S r  )r,  r   r   r   r   r'  r  rT   r   rl   r  r  r)   _save_importr
  s      r0   r]  zCmfTask._save_importX  s    &&(((   ..000))+++""$$$& 	B??AAA&&(((d-f-----r1   c                    t                                          |          }|sZ|                    t                                          g d                     |t          j                            g d          z  }|S )N)
cmf_authorr  r  )r  r]   r[   )r)   import_shop_fieldsr  r?   rq   )r,   fields_namer   r/   s      r0   r`  zCmfTask.import_shop_fieldse  s    gg((55 
	i JJ** , , ,     6+>>?g?g?ghhhC
r1   csvc                     |sTg d}t           j        j                                        D ],}|                    d          r|                    |           -t                                          ||||          S )N)=r=   r7   r   r   r  zcmf_author.namezcmf_author.loginzcmf_owner.namezcmf_owner.loginzparent.namezworkflow.namezlogic_type.namezstatus.namer   zcompany.namezresponsible.namezresponsible.loginzexecutors.namezexecutors.loginzspectators.namezspectators.loginz	tags.namezattachments.namezactivity.namez
lists.namezgit_repos.namezgit_branches.namezgit_merge_requests.namezgit_commits.namezrequest_type.namerU  z op_gantt_task.actual_finish_datezop_gantt_task.actual_durationr  zop_gantt_task.sched_start_datezop_gantt_task.sched_finish_dater  zop_gantt_task.perform_workr  r   rT   r  r5  r  r1  r:  r0  rr  r  rx  r4  r   rV  r   r  r]  zop_gantt_task.actual_costzop_gantt_task.actual_completez#op_gantt_task.duration_is_estimatedr   r  cf_)r?   r   rg   keysrs  r   r)   export2file)r,   rg   bqlformat_fileinclude_archivedr{   r/   s         r0   rf  zCmfTask.export2fileu  s     	.; ; ;F( %n388:: . .
((// .MM*---ww""63=MNNNr1   id_listrg   c                    g }|                      dd|gdg          D ]5}|                    |j                            |          j                   6|r4|                    |                     d |D             |                     |S )Nr=   r  r/  r  r  c                     g | ]	}|j         
S r>   r  r  s     r0   rO  z8CmfTask.group_changes_list_recursive.<locals>.<listcomp>  s    =Y=Y=Ycf=Y=Y=Yr1   )r*   r  r  r   rm   r   )r,   rj  rg   childrenrY   s        r0   r   z$CmfTask.group_changes_list_recursive  s    HHT4$94&HII 	H 	HDOOD,111@@FGGGG 	kOOC<<=Y=YPX=Y=Y=Ybh<iijjjr1   	subgroupsc                 *   |D ]} | |d         |d         |d         |d                   }|                      |          }t                      |d<   |d                                         D ]%\  }}|                    d          r||d         |<   &|S )Nr   rY  rS  rF   rH   r   r  required_fields	ui_fieldsrequired)r  ry  r   r5  )r,   rn  subgroupr  r  r{   metas          r0   r   z%CmfTask.group_changes_required_fields  s    ! 		C 		CHc(<"8!),!7%-o%>#+M#:< < <G --g66L*.&&H&'$0$=$C$C$E$E C C 
D88J'' C>BH./
;C r1   c                 D   |D ]} | |d         |d         |d         |d                   }t           j                            |          |d<   |d                             |          |d<   t           j                            |d         j        j                  |d<   |S )	Nr   rY  rS  rp  r{  r  )workflow_idstatus_list)r?   CmfSchemeWfcalc_schemer|  CmfWorkflowget_status_listr=   rm   )r,   rn  rt  r  s       r0   r   zCmfTask.group_changes_statuses  s    ! 	t 	tHc(<"8!),!7%-o%>#+M#:< < <G &,%7%C%CG%L%LH[!#+K#8#F#Fw#O#OHZ &,&8&H&HU]^hUiUlUr&H&s&sH]##r1   c                 b    ddl m} | j        j        sd S  || j        j                  | _        d S )Nr   )markup_html_clean)cmf.util.cmf_clean_textr~  r  r   rm   )ry   r~  s     r0   r   zCmfTask._clean_result_text  sF    ======* 	F,,T-=-CDDr1   c                     | j         rP| j        sK| j        rF| j        j        }|D ]9}|j        dk    s|j        dk    r| j                            |           4dS dS dS dS )ux   Устанавливаем для dummy task теже спринты, что и у родительской задачиrH  r   N)r   r   rT   r  r   r   )ry   parent_task_listsparent_lists      r0   r   z#CmfTask._set_lists_from_parent_task  s    ; 	/tz 	/d.> 	/ $ 0 60 / /,0CCC{GdhpGpGp
!!+....	/ 	/ 	/ 	/ 	/ 	// /r1   r  r  c                    t           j                            | dg          }t           j                            dd|g          }t           j                            dd|g          }t                      }|g}	 t          j        d|             g }t           j                            g dd	d|gg d
g          }	d}
|	D ]}|j        |v rt          j	        d|j                    (|
                    |j                   |
dz  }
d}|D ]'}||j        vr|j                            |           d}(|D ]'}||j        v r|j                            |           d}(|s|                    d           |
dz  dk    rt                       |j        r|                    |           t                       |}|sdS G)u  Синхронизация изменённых спринтов у подзадач

        Args:
            task_id (str): ИД родительской задачи, у которой поменялся lists
            sprints_to_add_ids (list): ИД спринтов для добавления в lists
            sprints_to_remove_ids (list): ИД спринтов для удаления из lists
        r   r  r=   r  r  Tz)deferred_job(_sync_subtask_sprints) task:)r   r  r@   rT   r  r  r   zjob FAIL RESURSION r   F)r  r`  N)r?   r   r5  r  r*   r   logginginfor=   errorrC   r   r   r  rJ   r  r  )r  r  r  rY   r  r  processed_task_idsprev_lvl_task_listnew_lvl_task_listsub_tasks_listrN  sub_taskr  	sprint_ids                 r0   r  zCmfTask._sync_subtask_sprints  s%    ~!!'7)!<<,,T4AS4T,UU"N//dDY7Z/[[ UU"V(	LNWNNOOO "#^008`8`8`:GOa9b9^9^9^9` 1 a aN A* 7 7;"444M"E"E"EFFF"&&x{333Q!/ ' 'I 66 --i888"&!2 ' 'I HN22 --i888"& 666r6Q;;LLL+ 7%,,X666LLL!2$ Q(	r1   c                 `   | j         r| j         j        s| j        r| j        rdS t          j                            dddd| j         j        ggdg          }|sdS |D ]Q}t          j                            dd	d| j	        gd
d|gg          r1t          j        
                    ||            RdS )u:   Создание чек-листов из шаблоновNdefault_for_logic_typesEXISTSr7   r`   r   r  ANDrH   from_templater  )r   r   r   r@   r?   CmfChecklistTemplater*   r7   CmfChecklistr=   create_checklist)ry   	templatestemplates      r0   r   zCmfTask._calc_checklists  s     	T_%? 	DK 	X\Xe 	F/44-x&#tG[9\]8 5 
 
	  	F! 	I 	IH"''xdg6NQ`begoPp/q'ss '884HHHH	I 	Ir1   c                 Z    |                      dg           dt          | j                  iS )Nrc  approvers_count)rc   r[  rc  r`  s      r0   r#   zCmfTask.count_approvers  s/    /*+++!3t'9#:#:;;r1   )NN)F)NNN)r  NNr  )NNNNN)NNNN)NNNNNN)r   )Nr   )r  NN)FNFN)NNrb  F)__name__
__module____qualname__modulesrY   rg   cmf_taskr   api_methodsservicedeskr?   CmfTaskMixinclassmethodr*   r   r5   r   r   r   r   r   r   r   r   r   r  r	  r   r  r   r,  r8  r   r?  rF  rT  r   r]  rd  rf  rp  rr  ry  r   r  r  r   r  r  r   r  r  r  r  r  rb  r  r   r  r   r'  r5  rA  rF  rN  rd   ra  rg  rl  ro  r   r  recompileASCIIr  r  r   r  r  rJ   r   r  r  r  rf   r  r	  ro   r  r  r  r$  r  r  r  r  r  r  r9  r   rF  rH  rO  rS  rW  r[  rC  staticmethodcmf_deferred_jobrq  ry  r   r  r   r  r  r  r  r  r   r  r  r  r   r  r  r   r  r  r  r  r   r  r    r  rD   r  r  r  boolr   r  r  r  propertyr-  r   r8  r:  r  r!   r   rN  rL  r[  r]  r`  rf  r   ry  r   r   r   r   r  r   r#   __classcell__)r/   s   @r0   r   r      s       ,%.6B


$
-
:
FG
 
 

K: (, - - - - - - [-
 )- . . . . . . [.
 )- . . . . . . [. % % [%8> > >@& & &B$
 $
 $
L9\ 9\ 9\ 9\ 9\x  % % %<P P P:7 7 72#& #& #& #& #&J7 7 7 7 7"% "% "% "% "%H    ,< < <B0$ 0$ 0$d/ / /8C C C' ' '>    @ @ @,? ? ?B  ,  40! 0! 0!d    0$ $ $ $ $e e eP	I( I( I( I( I(V         ) ) ) )V   @   @   2G G G( ( ( (T  
F& F& F&P5 5 5$D D D  *
 
 
uM uM uM uM uMn
, 
, 
, 
, 
,# # #* * *8=4 =4 =4 =4 =4~K K K? ? ?; ; ;     
> > >B / / / / [/ ::&MrxXXU U U [U". . .>j j jW W Wo o o o obGC GC GC GCV  (   9> K K K K K$. . . 6; I I I I I' ' '$ $ $ $ $L5 5 5 5 5n( ( (  
  	 	 	
 
 
	 	 	/ / /0 0 0
V V VL L L L L L*	  	  	  ]a"y y y y y [y4 ]aS S S [S IMPT! ! ! ! ! [!: ]ac c c [c$ ]aW W W W W [W W W W W W [W ]ay y y y y [y0 &&&7;>B) ) ) '& \)V    \; ; ;&z z z2 2 2.* .* .* .*`0 0 0 0@'b 'b 'b 'bRo o o o(	& 	& 	&9 9 9$<[ <[ <[z  * * *& !  !  !XE E E E E3 3 3 3 3# # # # BBB6 6 CB \6     \ , ** ** ** \**X bTTUVVV  WV \2 23 Z Z Z Z Z Z Z Z Z #'U_c r r r r r r [r     [ @c @d @ @ @ [@ Y Y Y Y Y [Y  o o [o ?D\a#(55]aijw|e e e et eUY e e48e e e e e eN* * * i[Nq  HL  M  M  Mh h M  M \h3 3 3$     X    [3 3 38    $I% I% I% I% I% I%V '+D     [$6 6 6 6 6Y Y Y	2 	2 	2 	JJJ?  ?  KJ \? V. . . . .      [ O O^a O O O O O [O:  $ t    [ T d    [ 	d 	t 	 	 	 [	E E E/ / / 7s 7 7]a 7fj 7 7 7  \7rI I I"< < < < < < <r1   r   )r   r;  collectionsr   r   decimalr   re  redis.exceptionsr   r  werkzeug.datastructuresr   dateutil.relativedeltar   cmf.includecmf.fields.base_fieldsr	   modules.task.fields.cmf_taskr  #modules.servicedesk.models.cmf_taskcommon.models.cmf_active_entityr
   r  r?   r  r  rY   rg   r   r>   r1   r0   <module>r     s8     # # # # # #                   / / / / / / 0 0 0 0 0 0     + + + + + + # # # # * * * * ; ; ; ; ; ;@@< @@< @@< @@< @@<g!(1>@S@\@d @@< @@< @@< @@< @@<r1   