
    Gwi;                       d dl mZ 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Zd dlmZ d dlmZ d dl d d	lmZ d dlZd dlZd d
lmZ d dlmZmZmZmZmZ  G d dej@                  jB                  jD                  jF                  ejH                  jJ                  jD                  jL                        Z&y)    )	dataclassN)defaultdict)	timedelta)Decimal)FileStorage)relativedelta)*)CmfTUUID)CmfActiveEntity)ListDictMappingIterableTuplec                       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edd       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-d& Z. fd'Z/d( Z0d) Z1d* Z2d+ Z3	 	 dd,Z4dd-Z5dd.Z6dd/Z7d0 Z8dd1Z9d2 Z:d3 Z;d4 Z<d5 Z=d6 Z>d7 Z? fd8Z@ fd9ZAd: ZBd; ZC fd<ZDd= ZEd> ZFd? ZGd@ ZHdA ZIe fdB       ZJeKj                  dCeKj                        ZNeddD       ZOdE ZPddFZQdG ZR fdHZSdI ZTeddJ       ZUddKZVdL ZWdM ZXddNdOZYdP ZZddNdQZ[dR Z\ fdSZ] fdTZ^dU Z_dV Z`dW ZadX ZbdY ZcdZ Zdd[ Zed\ Zfd] Zgdň fd^	Zhd_ Zie	 	 dƈ fd`	       Zje	 dda       Zke	 	 dƈ fdb	       Zle	 ddc       Zme	 dǈ fdd	       Znedǈ fde	       Zoe	 dǈ fdf	       Zpeq erdgh      	 	 ddi              Zseqddj       Ztdk Zudl Zvdm Zweq erdgdngo      ddp              ZxddrZyeds        ZzddtZ{dduZ|ddvZ}dw Z~dx Zdy Zdz Zd{ Zd| Zd} Z fd~Z fdZ fdZddZeq erdgdgd      d               Zeqd        Zeqdd       Zeq erdgddgd      d               Zdqd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dqdddededededef
 fdZd Zeq erdgdngddg      d               Zd Ze fd       Zedd       Zd Z fdZd fd	Zedddd       Z fdZd Zd Zd Zeq erdgdgd      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 Zeqerdnedededdfd              Zddee   def 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                J    |s|j                  dd       t        |   |i |S NsystemF)
setdefaultsuperlistclsr*   argskwargs	__class__s       !./modules/task/models/cmf_task.pyr0   zCmfTask.list4   s*    h.w|T,V,,    c                J    |s|j                  dd       t        |   |i |S r,   )r.   r/   r   r1   s       r6   r   zCmfTask.count:   *    h.w}d-f--r7   c                J    |s|j                  dd       t        |   |i |S r,   )r.   r/   slistr1   s       r6   r;   zCmfTask.slist@   r9   r7   c                    t        j                  d	ddi|}|j                  |_        d|_        t
        j                  j                  t        |j                               |j                  d       |j                  r<|j                  j                  d|d      sd |_        d |_
        |j                          |j                          |j                          d|j                  iS )
NcodedummyT)skip_project_perms_checkPPP-TSK-CREATEF)objraise_errorid )modelsr   rC   r=   is_dummygskipcache_select_for_updateaddstr_calc_projectprojectcheck_project_role_accessparent_calc_default_fieldsave)r2   r3   r4   
dummy_tasks       r6   r   zCmfTask.create_dummy_taskG   s     ^^;;F;
$--
"
	%%))#jmm*<= 	  $ ?j&8&8&R&RScis  BG&R  'H $J!%J$$&&&( jmm$$r7   c                    | j                  | j                         ddgz          | j                  st        d| j                   d       | j                  d       t        j                  j                  | dd      D ]  }d |_	        |j                           | j                  D ]A  }t        | j                  |   t        j                  j                        s5t        | |g        C | j                  d       | j                   rJ| j                   j"                  }d | _        | j                  d       |j$                  j'                  |       t        j(                  j                  | d	      D ]  }|j$                  j'                  |        t        j*                  j                  d
dd| gdd| ggd      D ]  }|j$                  j'                  |        t        j,                  j                  | d      }|D ]  }|j$                  j'                  |        t        j.                  t        j0                  fD ]5  }|j                  | d	      D ]  }	|	j$                  j'                  |	        7 t        j2                  j                  dd| gd      D ]  }	|	j$                  j'                  |	        t        j4                  j                  |       D ]  }
|
j$                  j'                  |
        t        j6                  j                  | dd      D ]  }|j'                  d        t        j8                  j                  | d      D ]  }|j'                  d        | j$                  j'                  |        y )NrF   
checklists   Не dummy task TabortTEXKOM_db_deleteparent_taskinclude_deletedr*   	only_datataskr[   ORout_link==in_linkfilterr[   )rN   r[   rA   =rN   )rN   r[   include_dummy)load_fieldssave_preload_fieldsrF   	cmf_alertrC   _delete_checklistsrE   r   r0   rZ   rP   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                r6   r   zCmfTask.delete_dummy_taskd   s>   1137
 
 	 }}(	2$?6 ~~**tTbf*g 	G"&GLLN	 ++ 	.J$++j13::3H3HIj"-	. 			D	! ##))B!%DIII%EELL((--4-N 	!DGGNN4 	! ++00
DRV?WZceikoYp8qAE 1 G 	CFFMM#	 !66;;4Y];^" 	CFFMM#	 ..0H0HI 	EZZT4Z@ A	 ((--eS$5GY]-^ 	ADDKKN	 **//t/< 	CFFMM#	 ((--  . 
 	2G
 NNDN1	2 !..33  4 
 	5J t4		5 	tr7   c                    | j                  g d       | j                  j                  r| j                  j                  | _        | j                  j                  r,| j                  j                  | _        d| j                  _        | j                  j
                  r>| j
                  | j                  j
                  k  r| j                  j
                  | _        | j                  j                  r| j                  j                  | _        | j                  j                  rE| j                  j                  D ],  }|| j                  vs| j                  j                  |       . | j                  j                  r| j                  j                  rt        j                  j                  t        j                  j                        | j                  j                  | j                  j                  z
  z   }| j                  r| j                  |kD  r|| _	        | j                  j                  r| j                  j                          y y )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deadlineTtz)ri   cloned_fromrN   
logic_type
is_changedr   responsibler   appendr   
alarm_datedatetimenowtimezoneutcset_now)r   ldeadline_mins      r6   #_save_dummy_task_sync_from_templatez+CmfTask._save_dummy_task_sync_from_template   s   
 	 V 	W ""**11DK&&"..99DO)-DOO&$$}}t//888 $ 0 0 9 9''#//;;D!!%%++ )DJJ&JJ%%a() $$)9)9)D)D#,,00H4E4E4I4I0JdN^N^NgNgjnjzjz  kF  kF  OF  GL==DMML$@ ,&&OO##% 'r7   c                    | j                          | j                  st        d| j                   d       |j	                         D ]<  \  }}t        | |   t        j                  j                        r.|| |<   d| |   _	        > d| _        | j                          d| _        | j                  | j                  k(  rd | _        nt        d| j                   d       | j                  r| j                          | j                  r| j                  j                   rd| _        g }| j#                         D ]   }|j$                  s|j'                  |       " | j)                  |D cg c]  }|j*                   c}       |D ]  }|j,                  rd|_	         | j/                          | j                  | j                  | j0                  | j2                  dS c c}w )NrT   TrU   Fu)   Выставлен код у dummy-task: )rC   r=   name	parent_id)save_preparerF   rk   rC   items
isinstancero   rm   
CmfBackrefr   _load_changed_fieldsis_newr=   cloned_from_idr   rZ   is_templatevaluescolumn_historyr   ri   
class_nameis_nullrP   r   r   )r   changed_fieldskvhistory_fieldsfieldfs          r6   r#   zCmfTask.save_dummy_task   s    	}}(	2$? #((* 	&DAq$q'3::#8#89DG!%DG		& !!#99DIA$))MUYZ446 0 0 < <#D [[] 	-E##%%e,	- 	?1!,,?@# 	(E==#' 	( 			 ''IIII	
 	
 @s   (Gc                    | j                   st        d| j                   d       dt        _        | j                          | j                          | j                          | j                          | j                          | j                          | j                          | j                          | j                          | j                          | j                          | j!                          | j#                          | j%                          | j'                          | j)                          | j+                          | j-                          | j/                          | j1                          | j3                          | j5                          | j6                  j8                  r| j;                          t<        t>        j@                  jB                  |   ddd      S )NrT   TrU   F)notifyemitaudit)#rF   rk   rC   rG   TEXCOM_ENABLE_GROWCACHE_HACKrK   _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_deadline_calc_alarm_date_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_checklistsrN   r   _do_parent_is_changedr/   ro   rE   CmfModelrP   r   r5   s    r6   _dummy_savezCmfTask._dummy_save  su    }}(	2$? *.& ..0 	&&(!!""$&&(((*!;;!!&&( SZZ(($4EUZ4[[r7   c                     d}| j                  g ddd| j                  ggdgd      }|r't        |j                  j	                  d      d         }|S )	N)r=   z
SIMILAR TOz
%-[0-9]+\ZrL   rf   -cmf_created_atT)re   order_byr[   -)sget
project_idintr=   split)r   
max_numberlasts      r6    _get_current_code_number_from_dbz(CmfTask._get_current_code_number_from_db=  sa    
yy!E	SVX\XgXgGh i#4"5)-  / TYY__S1"56Jr7   c                 f   t         j                  }d}| j                  r| j                  j                  }d| j                   d| }| j                   d| d}|j
                  j                  |d      }|j                          	 |j                  |      r|j                  |      }n%| j                         dz   }|j                  ||       	 |j                          | S # t
        j                  j                  $ r>}t        j!                  d| d	|j"                   d
|j$                          Y d}~| S d}~ww xY w# 	 |j                          w # t
        j                  j                  $ r<}t        j!                  d| d	|j"                   d
|j$                          Y d}~w d}~ww xY wxY w)uN    Высчитывает следующий номер для кода
        	NOPROJECTznext_code_number-r   z.lock   )timeout   zlock release error z, lock_name z
, timeout N)APPREDIS_DBr   rs   r   redislockacquireexistsincrr   setrelease
exceptions	LockErrorrG   debugr   r   )r   redis_dbsuffixkeylock_keyr   next_code_numberes           r6   r   zCmfTask.next_code_numberG  s    << ??__**F!$//!2!F8<oo&axu5~~""8R"8
	bs##+==#5 #'#H#H#JQ#N S"23b
 ##$	 ##-- b-aSTYYKzRVR^R^Q_`aa ##$	bb##-- b-aSTYYKzRVR^R^Q_`aabsO   AE C# #D> 2D99D>F0EF0F-12F(#F0(F--F0c           
         | j                   dk(  ry t        | j                  j                  t        j
                        sy | j                         \  }}|s|sy | j                  s@| j                  j                  r"t        | j                  j                   d       || _        y | j                  s/|r-t        j                  j                  j                         | _        |r| j                  |kD  r| j                  | j                  j                         kD  rh|| _        | j                  j                  rJt        | j                  j                   d| j                   d| j                  j                   d| d       y y y y y )NCLOSEDuF    обновлен с учетом плановых дат списка u'    не может быть дальше ())cache_status_typer   rN   rs   rE   
CmfProject_calc_list_plan_intervalr   r   rk   captionro   rm   CmfDateTimer   plan_end_dater   list_plan_start_date_minlist_plan_end_date_mins      r6   _calc_alarm_date_listzCmfTask._calc_alarm_date_liste  sH   !!X-$++++V->->?;?;X;X;Z8 "8'0F ))T__4455{|}6DO#9!jj4488:DO!doo8N&NOOdoo&9&9&;;4DO))../q0A B**22315K4LAOP * < 'O!r7   c                 `   | j                   sO| j                  j                  r| j                  r-| j                  j                  s| j
                  j                  sy | j                  j                  ry | j                  g d       | j                  D ].  }|j                  s| j                  r|j                  | _         y  | j
                  D ]b  }|j                  s|j                  s|j                  r| j                  s|j                  | _        |j                  r|j                  | _
         n | j                  so| j                  rb| j                  j                  j                  dk(  r>t        j                  | j                        }|j                  r|j                  | _        y y y y y )N)zcomponents.default_responsiblezcomponents.default_ownerzlists.default_responsibler   )r   r   r   responsible_idrN   
componentsri   r   default_responsibledefault_owner	cmf_ownerrs   r   r   get_cache_projectr   )r   r0   comprL   s       r6   _calc_responsiblezCmfTask._calc_responsible  sZ   !!,,T5H5H&&**&&tuJJ 	D''0@0@#'#;#; 	
 OO 	D''4+=+=++D4D4D'+'?'?D$%%%)%7%7DN	 !!""--=++DNN;G""#*#6#6  # >  "r7   c                    | j                   s| j                  j                  s| j                  j                  so| j                  j                  sY| j
                  j                  sC| j                  j                  s-| j                  j                  s| j                  j                  sy t        | )          | j                  j                  rw| j                  rk| j                  j                  j                  dk(  rH| j                  r<t        j                  | j                         }|j"                  r| j                  | _        | j                  r| j%                          | j                  rw| j                  j                  s| j                   rT| j                  | j                  j'                         k  r,t(        j*                  r| j                  j-                          y y y y y )Nr   )r   r   r   statusr   activityr   plan_start_dater   r/   r   rN   rs   r   r   r  r   auto_alarm_dater  r   rG   import_moder   r   rL   r5   s     r6   r   zCmfTask._calc_alarm_date  sP    ??--;;))==++==++::((''22%%00 "
   ++ 1 1 < < L$$++DNN;G&&"&"6"6 ::&&(
 __++t{{!4!4!66}}OO##% % 7 0; r7   c                     | j                   r&| j                  r| j                  j                          t	        |   |i |S N)r   r   r   r   r/   _save_templater   r3   r4   r5   s      r6   r  zCmfTask._save_template  s7    ;;4++OO##%w%t6v66r7   c                 
   | j                   j                  r| j                   ry| j                  sC| j                  j                  s-| j                  j                  s| j                   j                  sy| j                  j                  r| j                  rt        | j                  d      r| j                  j                  j                  d      r/t        j                  | j                        j                   | _         n?| j                  j                   j                         r| j                  j                   | _         | j                  j                  rd}| j                  j                  D ]8  }|| j                  j                  vs|j                   j                  dg      }: |s6| j                  r*| j                  d   j                   j                  dg      }|r|| _         | j                   st        | =          yy)u   
        Вычисляем вид деятельности
        Метод вызывается из базового класса.
        :return:
        Nr  r   r	   rm   r   )r  r   r   rN   r   hasattrr   rs   
startswithr   r  loadnewoldr/   r   )r   tmp_activityrA   r5   s      r6   r   zCmfTask._calc_activity  sm    ==## KK{{%%zz$$}}'';;!!{{wt{{J?>>''22<@$'$9$9$..$I$R$RDM{{++002(,(<(<::  Lzz~~ Cdjjnn,#&<<#4#4SE#4#BLC  DJJ#zz!}55::3%:H ,}}G"$ r7   c                      y r  rD   r   s    r6   _calc_parentzCmfTask._calc_parent  s    r7   c                     | j                   j                  sy | j                  ry d| j                  j                  it
        j                  t        | j                        <   y )Nr   )	rL   r   r   r   rs   rG   deferred_update_task_projectrJ   rC   r"  s    r6   _do_project_is_changedzCmfTask._do_project_is_changed  sE    ||&&;;$////8
&&s477|4r7   Fc                    |ri t         _        yt         j                  syt         j                  j                         D ]  \  }}t        j                  j                  dd|gd|d   i       t        j                  j                  dd|gd|d   i       t        j                  j                  dd|gd|d   i        i t         _        y)u  
        Отложенное обновление project_id у связанных объектов задачи после смены проекта.
        Выполняется после commit транзакции в cmf_commit_after_request.
        Nr   rb   r   re   r   )rG   r%  r   rE   r}   bulk_updater~   rx   )r2   rollbacktask_idobj_datas       r6   "apply_deferred_update_task_projectz*CmfTask.apply_deferred_update_task_project  s     -/A*--!"!?!?!E!E!G 	GX))#T73$h|&<= *    ,,#T73$h|&<= -  ((44#T73$h|&<= 5 	 *,&r7   c                    | j                   | j                   j                  k(  ry | j                  rT| j                   sd | _        n.t        j	                  | j
                        j                  | _        | j                  d       | j                  j                          t        j                  j                  dd| gddg      }|D ]=  }|j                   | j                   k7  s| j                   |_         |j                          ? y )NTr\   rZ   rf   rN   rr   re   rm   )rN   r  gantt_projectr   r  r   main_gantt_projectrP   rr   task_parent_is_changed_hookrE   r   r0   )r   child_tasksr_   s      r6   r   zCmfTask._do_parent_is_changed!  s    ;;$++//);;%)"%(%:%:4>>%J%]%]"III%668nn))-d1KU]_nTo)p 	D{{dkk)"kk			r7   c                    | j                   j                  sC| j                  j                  s-| j                  j                  s| j                  j                  sy | j                  r| j                  j
                  r| j
                  | j                  j
                  k7  r| j                  j                  ddg       | j                  j                  dk7  rZd}| j                  j                  | _        | j                          t        j                  j                  | |       t        |       y | j                  j                  ry | j                   j                  rX| j                   rL| j                         }|r:|| j                  k7  r+|j                  g d       || _        | j                          y | j                  j                  r#| j                  rd }d }| j                  ddg       | j                  j                  r`| j                  j                  j                   r@| j                  j                  j                   }| j                  j                  j"                  }|r| j                  s;d	}|| _        t        j                  j                  | |       | j                          y |r;d
}|| _        t        j                  j                  | |       | j                          y y y y y )NrN   logic_prefixtask.gantt_projectu   SimpleLogic: в задаче установлен проект равный проекту родительской задачиrN   text)r
  cmf_owner_assistantsr  r   z8responsible.primary_role.structural_project.default_listz1responsible.primary_role.structural_project_forceu   SimpleLogic: Задача добавлена в Структурный проект Главной роли исполнителяu   SimpleLogic: Проект сменен, т.к. в Главной роли исполнителя указано менять проект)tree_parentr   r   rZ   rN   r   ri   r5  r   rE   r}   add_comment_auditrk   _node_parentrj   primary_rolestructural_projectstructural_project_force)r   	sl_reasonrN   struct_projectstruct_project_forces        r6   _HACK24052023_calc_parentz!CmfTask._HACK24052023_calc_parent6  su   ''****{{%%  0 0 : :~~!1!1!;!;;  ,,h-GH##004HH !cI"&"2"2"9"9DK%%'%%77t)7Ti( ;;!! &&4+;+;&&(F&DKK/""#bc$((*&&4+;+;!N#' X  [N  O  P,,1A1A1N1N1a1a!%!1!1!>!>!Q!Q'+'7'7'D'D']']${{ !eI"0DK%%77t)7T,,.' !lI"0DK%%77t)7T,,. (  ,<&r7   c                    | j                   j                  s-| j                  j                  s| j                  j                  sy | j                  j                  r| j                   dv r| j                  r| j                  r| j                  j
                  r| j                  dg       | j                  | j                  k7  rr| j                  j                  | j                  k7  rOt        j                  j                  | j                  ddg      | _        | j                  s| j                  | _        y | j                  j                  r| j                   j
                  r| j                  s| j                   j
                  dvri| j                   dv r[| j                  sOt        j                  j                  | j                  ddg      | _        | j                  s| j                  | _        | j                  r| j                   dvr| j                   j
                  dv rl| j                  j                  d       | j                  r=t        d       | j                  D ]#  }| j                  |_        |j!                          % d | _        | j                   d	k(  rd | _        | j                   j
                  r| j                  s| j                   j
                  dvri| j                   dv r[| j                  sOt        j                  j                  | j                  ddg      | _        | j                  s| j                  | _        fd
| j                  j                  rx| j                   dv ri| j                  r8| j                  j                   j                         dv r| j                  | _        y | j                  r | j                        | _        y y y y )N	task.epictask.subprojectztree_parent.parentepictree_hidden)rN   sys_typerm   T)r[   u   Скрываем задачу в дереве проекта, её дочерние элементы вставляем вместо неёr6  c                     | j                  ddg       | j                  dvr| S | j                  r*| j                  j                  dv r | j                        S | j                  S )Nztree_parent.logic_prefixr5  rE  )ri   r5  r:  )rA   get_tree_parents    r6   rL  z2CmfTask._calc_tree_parent.<locals>.get_tree_parent  s[    OO7HI'GG
3??#?#?Cc#c&s77??"r7   )r5  r   rN   rZ   r:  r  ri   rE   	CmfFoldergetr   r   r   
tree_nodesr  rk   rP   )r   childrL  s     @r6   _calc_tree_parentzCmfTask._calc_tree_parentw  s     (({{%%** ;;!!%%)II$$KKKKOO2344;;.43C3C3J3Jdkk3Y#)#3#3#7#7t{{U[erds#7#t '''+{{D$??%%   $$(9(9(=(=Ee(e))-MM ,,#)#3#3#7#7t{{U[erds#7#t '''+{{D$ %%-MM%%))-MM$$T$:??  l  m!% %,0,<,<)

% $(   $88#'    $$(9(9(=(=Ee(e))-MM ,,#)#3#3#7#7t{{U[erds#7#t '''+{{D$	# &&4+<+<@`+`D$4$4$A$A$F$F$HLl$l#'#3#3 !!#243C3C#D  " ,a&r7   c                 "   | j                   rx| j                  }|rj|j                  j                  dk7  rQ|j	                  ddg       |j
                  dv r|| _        n(|j                  }|r|j                  j                  dk7  rQ| j                  j                  r| j                  rx| j                  j
                  j                          | j                  j                  j                  dk(  r*| j                  j
                  dv r| j                  | _        nd | _        | j                  j                  r-| j
                  dk(  rt        dd	       | j                  | _        | j                  j                  r-| j
                  dk(  rt        d
d	       | j                  | _        | j
                  j                  rU| j
                  j                  dv r<| j                  r/| j                  j
                  j                         dvrd | _        y y y y y )Nr   r5  r:  rE  r   ztask.subu2   У подзадач нельзя менять EpicTrU   u@   У подзадач нельзя менять Подпроект)r   r:  rs   r   ri   r5  rZ   r   r  rH  rk   
subprojectr  )r   tmp_tree_parents     r6   r   zCmfTask._calc_parent_task  s   ;;"..O!o&;&;&F&F,&V++^],KL"//3SS'6D$"1"="= "o&;&;&F&F,&V &&4+;+;))..0%%00I=((559YY#'#3#3 #' 99  J.NVZ[#yyD??%%  J.\dhi#D''D,=,=,A,AEe,eD$4$4$A$A$F$F$HPp$p#'  %q -f'r7   c                     | j                   ry | j                  j                  sy t        j                  j                  |        y r  )r   r  r   rE   CmfTimeTrackertimetracker_task_change_statusr"  s    r6   _calc_timetrackerzCmfTask._calc_timetracker  s2    ;;{{%% 	<<TBr7   c                    | j                   sY| j                  j                  sC| j                  j                  s-| j                  j                  s| j
                  j                  sy | j                          d }|s| j                  r| j                  }|sF| j                  r:t        | j                  j                  t        j                        r| j                  }|s<| j
                  r0| j
                  j                  j                         r| j
                  }|s.| j                  D ]  }|j                  j                         s|}! |s| j                  r| j                  }|| _        y r  )r   r:  r   rN   rZ   	main_list_load_perm_fieldsr   rs   rE   CmfDocumentperm_has_aclr  r   perm_parent)r   r^  r   s      r6   _calc_perm_parentzCmfTask._calc_perm_parent  s    t//::dkk>T>TX\XhXhXsXs>>,, t//**Kt{{z$++:K:KVM_M_/`++Kt~~$..2M2M2R2R2T..KZZ $>>&&("#K$ t{{++K&r7   c                 J   t         |          }| j                  D cg c]  }|j                  g d       c}|d<   | j                  D cg c]  }|j                  g d       c}|d<   | j
                  |d<   | j                  |d<   | j                  |d<   |S c c}w c c}w )N)rC   r   r=   r   tags
is_checkedr   activity_id)r/   get_cache_fields_jsonr   to_jsonra  rb  r   rc  )r   retir5   s      r6   rd  zCmfTask.get_cache_fields_json  s    g+-CG::Na		"89NGBF))LQqyy!78LF OOL>>K!--M
 OLs   BB c                 |   d }d }| j                   D ]z  }|j                  dk(  r|j                  j                  r||j                  |k  r|j                  }|j                  j                  s]||j                  |k  so|j                  }| |s*|r(t
        j                  j                  j                         }||fS Nr   )	r   r   r  is_not_nullr   ro   rm   r   r   )r   r  r  w_lists       r6   r   z CmfTask._calc_list_plan_interval  s    #' !%jj 	BF
 ''83%%11+3v7M7MPh7h/5/E/E,##//)1V5I5ILb5b-3-A-A*	B (,B'*zz'='='A'A'C$')???r7   c                    | j                   j                  rGt        | j                         r|s0|s.| j                  s| j                  rd | _        d | _        d | _        y 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   | _        |r|r| j                  r| j                  |kD  s| j                  |k  r_| j                  j                  r"t        | j                  j                   d       || _        |r| j                  |z   | _        n	|r|| _        |rD| j                  r| j                  |kD  r)t        | j                  j                   d       || _        | j                  r6| j                  r*| j                  | j                  k  r| j                  | _        y )Nr   uP    установлена в соответствии с планом списка)	r   r   lenr  r   r   r   rk   r   )r   r  r  self_plan_shifts       r6   _calc_plan_listzCmfTask._calc_plan_list-  s   ::  
 tzz?+CLb ''4+=+=&*DO'+$%)"D$6$6"0043G3GGO ::  %=#;D !7D"22DO '',D#;D %%*@!7D%%.DIa!9B!>D (,D++**-CC**-EE##..T1199:  ;K  L  M#;D %)%9%9O%K"'%;" "4+=+=ASASVlAl++334  5E  F  G!7D D$8$8##d&:&::!%!5!5D 	r7   c                 @   | j                   j                  r| j                   r| j                  dk(  r| j                  r| j                   | j                  k  sW| j                  r| j                   | j                  kD  s2| j                  s| j                   | j                  z
  j
                  dkD  rp| j                   | j                  z
  }| j                   | _        | j                  r| j                  xj                  |z  c_        t        d       | j                          y )NOPEN
   uM   План сдвинут в соответствии с будильником)	r   r   r   r  r   daysrs   rk   
_calc_name)r   	date_diffs     r6   _calc_plan_nolistzCmfTask._calc_plan_nolistn  s    OO&&4??&&&0$$)=)==))doo@R@R.R  --4??4CWCW3W2]2]`b2b $*>*>>I#'??D !!""((I5(efOOr7   c                 f   | j                   j                  s9| j                  s-| j                  j                  s| j                  j                  sy| j                         \  }}t        | j                         s| j                   j                  r| j                  ||       n	 | j                          y)u`   
        Ф-я вызывается из базового класса
        :return:
        N)	r   r   r   r  r   r   rm  ro  rt  r  s      r6   
_calc_planzCmfTask._calc_plan  s     

%%;;''22%%00;?;X;X;Z8 "8 tzz?djj33  !9;QR
 r7   c                    | j                   sC| j                  j                  s-| j                  j                  s| j                  j                  sy | j                  j                  r| j                   sy | j                  r#| j                  j
                  j                  dk7  r)d| _        t        j                  j                  | d       y | j                         }| j                  sB|j                  s6d| _        t        j                  j                  | d|j                          y | j                  rV|j                  rJ| j                  r>| j                  j                  r(d| _        t        j                  j                  | d       | j                  | j                  j                  k(  s-| j                  j                  | j                  j                  k(  rEt        j                  | j                  k(  r(d| _        t        j                  j                  | d       | j                   r5| j                   j"                  r| j                   r| j                  sd| _        | j                   r| j$                  rr| j$                  D ]b  }|j&                  s|j                  | j                  k(  s*d| _        d	|j(                   d
}t        j                  j                  | |        y  y y y )Nr   Tu~   SimpleLogic: Задача согласована автоматически, т.к. это Непроектная задачаr7  u   SimpleLogic: Задача согласована автоматически, т.к. согласование отключено в Fu   SimpleLogic: Выполнен сброс согласования, т.к. сменился Постановщик или Проектu   SimpleLogic: Задача согласована автоматически, т.к. постановщик - руководитель.ue   SimpleLogic: Задача согласована автоматически (опция списка r   )r   approvedr   r
  rN   rs   r   rE   r}   r;  _get_sl_optionssl_task_need_approvesl_controller_strrC   rG   current_person
cmf_import
is_definedr   sl_task_auto_approver   )r   
sl_optionsr   comment_texts       r6   _calc_approvedzCmfTask._calc_approved  sl   ==++>>,,;;))==##DKK {{dkk//::lJ DM//t &d 0 f))+
}}22 $!!334 *m*4*F*F)G(I 4 J ==Z<<QUQ\Q\QgQg!DM//t &k 0 m
 NNdkk333t~~7H7HDKKNN7Z$$6 DM//t d 0 f ;;4??55$//RVR_R_ DM ;;4::ZZ ))ahh$++.E$(DM &K  LM  LR  LR  KS  ST  $UL%%77t,7W &;r7   c                     t        t        | 	               }| j                  ddg       | j                  D ]?  }|j                  |j                         |j                  D ]  }|j                  |        A | j                  j                  rt        | j                  j                        t        | j                  j                        z
  D ]R  }|j                  ddg       |j                  |j                         |j                  D ]  }|j                  |        T | j                  rU| j                  j                  j                  d      s0| j                  j                         D ]  }|j                  |        t        |      S )Nzlists.cmf_ownerzlists.cmf_owner_assistantsr
  r9  CmfProject:)r   r/   
get_ownersri   r   rI   r
  r9  r   r  r  rN   r   rs   r  r0   )r   r3   r4   ownerslstownerr5   s         r6   r  zCmfTask.get_owners  s@   UW')*+-IJK:: 	"CJJs}}%11 "

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

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

5!"F|r7   c                     | j                   s9| j                  j                  r| j                  r| j                  j                  sy | j                  ry | j                  dk(  ry t        |           y ri  )r   waiting_forr   r   r/   _calc_waiting_forr   s    r6   r  zCmfTask._calc_waiting_for  s[    !!,,T5E5E&&11!!X-!#r7   c                    | j                   j                  s| j                  j                  so| j                  j                  sY| j                  j                  sC| j
                  j                  s-| j                  j                  s| j                  j                  syt        j                  j                  d      ry| j                         }| j                  }d}| j                  rP| j                  j                  j                  d      r+d}t        j!                  | j                        j                  }|r)| j                  s| j"                  dk7  r|| _        d| _        | j                  j                  r)| j                  r| j&                  dk(  rd| _        d| _        | j&                  dk(  r| j"                  dk7  rd| _        d| _        |r| j                  j                  r| j                  r|j(                  r|j*                  rd}| j,                  rF| j.                  s:| j0                  D ]+  }|j2                  s|j
                  | j
                  k(  s*d}- |s7t4        j6                  | j
                  j9                         vrt;        d	d
       | j                  j                  s-| j                  j                  s| j
                  j                  r| j<                  r| j                  j                  rJ| j                  j>                  | j                  k(  s| j                  j>                  s| j                  | _        | j                  j                  r4| j                  j>                  | j                  k(  r| j                  | _        | j
                  j                  r| j
                  r| j
                  j>                  r{| j
                  j>                  j                  jA                         | j                  k(  r@| j                  | j                  k7  s| j                  s| j
                  j                  | _        | j
                  j                  r1| j
                  j>                  s| j
                  j                  | _        | j
                  j                  r| j
                  sd| _        | j<                  s5| j                  xs || _        | j"                  dk(  r| j                  | _        | j,                  ryd}| j                  j                  rZ| j                  j>                  s| j                  jB                  s,| j                  j>                  r| j                  jB                  sd}| j                   j                  r.| j                   j>                  r| j                   jB                  rd}| j                  j                  rd}| j                  j                  rd}|sy	 | j"                  dk(  r)| j                   jB                  jD                  dk(  }|sO| jF                  jI                  dd      s2| j                   jB                  | jF                  jI                  d      k(  }|r| j                   j>                  jJ                  dvr| j                  xs || _        | j                  sU| j                  |k7  rF|s|| _        d| _        || _        tL        jN                  jQ                  | d|jR                   d       | j                  j>                  s| j                  jB                  rz| j                  |k(  rk| j                  r_| j                  | _        tL        jN                  jQ                  | d| j                   d       | j&                  dk(  r|sd| _        d| _        | j                  rg| j                  |k(  rX| j                  rL| j                  r@| j                  | _        tL        jN                  jQ                  | d| j                   d       y| j                   jB                  jJ                  dk(  r|jT                  r| jV                  r| jX                  jZ                  r4t]        | jX                  D cg c]  }|j"                  dk7  s| c}      }	n'tL        j^                  ja                  dd| gg dg      }	|	rt;        dd
       |jT                  s@| jV                  r4tL        j^                  ja                  dd| gg dg      }	|	rt;        d       |jb                  r| jd                  rtL        j^                  ja                  dd| jd                  gg ddd| jf                  gg      }
|
sk| jd                  ji                  dg       | jF                  jI                  d      | jd                  _         | jd                  jk                          t;        d        |jl                  r$| jn                  | jp                  kD  rt;        d!       |r|jr                  rt4        j6                  | j9                         vrp| jt                  sd| jF                  jI                  dd"      }|rE|| _         | jv                  j                  r| jv                  j>                  | _;        t;        d#       | j                   j>                  jJ                  dk7  rd| _        | j&                  dk7  s| j                  rd| _        d| _        y| j                   jB                  jJ                  dk(  r=| jt                  r-| jF                  jI                  d      | _         t;        d$       | j                  s| j                  jy                          | j                   j>                  jJ                  dk7  rA| j                  | j                  j{                         kD  r| j                  jy                          | j                  | _        | j                  | _        d| _        tL        jN                  jQ                  | d%| j                  jR                   d&| j                   jR                   d'       y| j                   jJ                  d(k(  r| j                   j>                  jJ                  d(k7  r0| j                  s$|j|                  rt;        d)d
       t;        d*       | j                   j>                  jJ                  dvr6| j                  xs || _        tL        jN                  jQ                  | d+       | j                   j>                  jJ                  dk(  rE| j                  |k(  r6| j                  xs || _        tL        jN                  jQ                  | d,       | j                  s| j                  jy                          | j                   j>                  jJ                  d(k7  ry| j                  | j                  j{                         kD  rR| j                  jy                          tL        jN                  jQ                  | d-| j                   jR                          yyc c}w ).uS   
            Ф-я вызывается из базового класса
        NimportFr  T	IN_REVIEWapprove2approve1_reviewu[   Только Владелец проекта может согласовать задачуrU   rq  openstatus_coderB   )rq  IN_PROGRESSapprove3_notassigneduh   SimpleLogic: Задачу переключили на Постановщика/Руководителя(u   ), т.к. не указан Будильник. Установите будильник, чтобы задача отобразилась у Исполнителяr7  uM   SimpleLogic: Задачу переключили на Исполнителя(u   ), т.к. указан Будильник.Установите будильник, чтобы задача отобразилась у Исполнителяr   r   rZ   rf   r   !=r   re   um   Для закрытия задачи необходимо закрыть все дочерние задачиu_   Вы закрыли задачу у которой есть Открытые подзадачиrC   r  zchild_tasks.cache_status_typeu}   Родительская задача закрыта автоматически т.к. закрыты все дочерниеu_   Внимание! В задаче остались незавершенные чек-листы)rB   u   Спасибо! Статус установлен в "Подтверждение закрытия", для проверки постановщиком или владельцем проектаu   Спасибо! Статус изменен на «Закрыто» т.к установлен флаг «Без подтверждения».uO   SimpleLogic: Задачу переключили на Постановщика(u   ), т.к. статус=''r  uT   Нельзя брать в работу несогласованную задачу.um   Внимание! Вы взяли задачу без согласования с руководителем.u^   SimpleLogic: waiting_for  установлен т.к. статус снижен в in_progressui   SimpleLogic: waiting_for установлен т.к. статус перешел из open в in_progressu[   SimpleLogic: будильник установлен т.к. статус сменен на )?r  r   rz  r   r
  rN   r   r  osenvironrN  r{  r   rs   r  r   r  r   approve_forapprove_for_placesl_only_owner_approver|  r   rF   r   r  rG   r~  r  rk   waiting_for_idr  r  r  r=   workflowget_default_statusstatus_typerE   r}   r;  r   ,sl_deny_closing_task_before_closing_subtaskshas_child_tasksr3  r  rm  r   r   %   sl_сlose_task_after_closing_subtasksrZ   rC   ri   rP   .sl_deny_closing_task_before_closing_checklistschecklists_items_countchecklists_items_done_countsl_task_only_owner_close
no_controlstatus_closed_atr   r   sl_deny_no_approve)r   r  task_controlleris_project_taskcreate_in_autoapprove_listr   
need_transsimple_logicrA   has_unclosed_subtasks unclosed_subtasks_in_parent_taskin_review_statuss               r6   r   zCmfTask._calc_wf_simple_logic  s8    &&((  ++))&&**  ++ ::>>(#))+
 ..  >>dnn22==mL"O!33DNNCMMO 4==T5K5K{5Z  /D%/D" ==##$:P:PT^:^#D%)D" !!%664;Q;QU`;`#D%)D"MM$$MM,,++ */&{{4== :A--!((dkk2I592: .!2B2B$++J`J`Jb2bw  @D  E
 ''4>>+D+DH^H^''**0@0@0D0DHXHX0X`d`p`p`t`t#'#3#3 ~~((T^^-?-?4CSCS-S#'>> {{%%$++$++//dkkooNgNgNlNlNnrv  sC  sC  OC ##t'7'77t'+{{'<'<D${{%%dkkoo#';;#8#8 {{%%dkk#' ""#//B?D%%4#'>>  ;; 
??%%,,1D1D++DOO4G4G "
 ;;!!dkkoo$++//J&&J>>$$J  %%/#{{33v=#==;;\a;b'+{{$--:Z:Z[a:b'b  ;;??66:QQ+/+;+;+N(??t/?/??/R./>D,5KD2+:());;4  Qy  zI  zN  zN  yO On Oo; q??..4??3F3F4K[K[_nKn++/3/?/?D,"--??t  Ub  cg  cs  cs  bt tn So? p#559OOXg37 09= 6''D,<,<,OTXTcTchlhuhu+/+;+;());;4  Q^  _c  _o  _o  ^p  pq  Or;  s {{**h6JJtOcOc''2203DDTDT4zSX[XmXmqyXyS4z0{-060D0D%2C$>@e#f 1E 1- -!  #R  Z^  _!NNSWSgSg,2NN,@,@!.T :<ab -A -) -!  #D  ECCHXHX7=~~7K7K!.T5E5E F E!%tTWW 5 7 8L 84
 <((446U5VW26--2R2RS[2\((/((--/!  #b  cLL22T5U5UU!  #D  E
 #z'J'J,,DOO4EEdoo'+}}'G'Gaf'G'g$'&600;;484I4I4M4MD1!}~ ! ;;??..(:'+D$ ))Z74=='+D$-1D* {{**k9?? #'--"B"B8"LDK  o  pOO++-;;??..+=)<)<)>>//1#'>> #'>> ):&!!334  IX  Y]  Yi  Yi  Yn  Yn  Xo  oG  HL  HS  HS  HX  HX  GY  YZ  G[3  \ {{&&-7;;??..-?!44!"x  AE  F  N  O
 {{226MM'+'7'7'J?D$%%77t! 8 C ;;??..&8T=M=MQ`=`'+'7'7'J?D$%%77t "K 8 N OO++-;;??..-?)<)<)>>//1));;4 &A  BF  BM  BM  BR  BR  AS  $T < V y 5{s   y#y#c                    | j                   j                  r| j                  r| j                   r| j                   j                  dk  r| j                  j                  dkD  st
        j                  | j                  k7  r| j                   rD| j                   j                  | j                  j                  t        j                  d      z   kD  r8d}| j                  t
        j                  k7  r|dz  }n|dz  }t        |d	       y y y y y y )
Nr        )hoursum   Нельзя передвигать будильник задачи дальше крайнего срока.u    Обратитесь к постановщику задачи для разрешения на сдвиг крайнего срока.uO    Сдвиньте крайний срок задачи если уверены.TrU   )r   r   r   agecmf_created_atrG   r~  r
  rs   r   r   rk   )r   msgs     r6   _check_alarm_date_validzCmfTask._check_alarm_date_valid&  s    OO&&__(;(;a(?$$((72a6F6F$..6X__(=(=ATATW_WiWipqWrAr(s
 BC~~!1!11  a  ahhc& )t 7Y )@  'r7   c                    t         |           | j                  j                  sO| j                  j                  s9| j
                  j                  s#| j                  s| j                  j                  sy | j                         }| j                  st        j                  t        j                  k7  r| j                  j                  r| j                  t        j                  k7  rl| j                  j                          t        j                  | j                  vr6| j                  dk\  rt!        dd       n|j"                  st!        dd       | j                  j                  ry |j$                  y |j$                  }t'        j(                  |      }t&        j&                  j+                  t&        j,                  j.                        }| j                  s@| j                  t        j                  k(  r#| j
                  j                  r| j
                  sy | j                  s||z   | _        y | j
                  j                  r| j
                  r| j0                  j2                  dk  ru| j                  t        j                  k(  rX| j                  rL| j
                  j4                  | j                  j4                  kD  r| j
                  j4                  |z   | _        y | j                  j                  s| j                  j                  rB| j                  s||z   | _        y | j                  r| j                  ||z   kD  r||z   | _        y 	 y y )N   u   Нельзя сдвигать крайний срок блокирующей задачи, обратитесь к постановщикуTrU   ut   Нельзя сдвигать крайний срок задачи, обратитесь к постановщику)rs  r  )r/   r   r  r   rN   r   r   r   r{  rG   r~  system_personr
  r9  r  r   rk   )sl_allow_executor_change_nofatal_deadlinesl_deadline_shiftr   r   r   r   r   r  r  rs   )r   r  
days_shiftshiftr   r5   s        r6   r   zCmfTask._calc_deadline:  s    MM$${{%%)){{}}''))+
$$7MM,,NNa&6&66%%**,t'@'@@==A%  l  tx  y#MM  U  ]a  b ==## ''/11
""
3##H$5$5$9$9: {{t~~1A1AAdooF`F`imixix }}%KDM **OO''++g5NNa&6&66MMOO))DMM,?,?? OO11E9DM ==##t{{'='=== #e  4==3;#> #e   (>r7   c                    | j                  ddg       t        j                  j                  |ddg      }|| j                  v r| j                  j                  |       || j                  v r| j                  j                  |       | S )Nr   fix_versionsrC   
members.idr  )ri   rE   CmfListrN  r   remover  )r   src_list_idr3   r4   src_lists        r6   remove_from_listzCmfTask.remove_from_list  sx    '>23>>%%k4:N%Otzz!JJh't((($$X.r7   c                     | j                  dg       t        j                  j                  |ddg      }| j                  j                  |       | S )Nr   rC   r  r  )ri   rE   r  rN  r   r   )r   dst_list_idr3   r4   dst_lists        r6   r   zCmfTask.copy_to_list  sG    '#>>%%k4:N%O

(#r7   c                 d    t         j                  j                  |      j                  |        | S )NrA   )rE   CmfActiveEntityFilterrN  add_active_entity)r   	filter_ids     r6   apply_filterzCmfTask.apply_filter  s)    $$((3EE$EOr7   c                     t         j                  j                  |ddg      }|j                  r7| j                  j                  |j                         | j                  d       | S )Nr	   
filter_tagr  Tr\   )rE   r  rN  r  ra  r  rP   )r   r  active_entity_filters      r6   remove_from_filterzCmfTask.remove_from_filter  s\    %;;??	SVXdRe?f  **II1<<=III%r7   c                    | j                  g d       |st        dd       |st        dd       t        j                  |      }t        j                  |      }|t        j
                  k(  r| j                  |       ns|t        j                  k(  r| j                  |       nN|t        j                  k(  r+|| j                  j                  j                  k(  rd | _
        nt        d| d       |t        j
                  k(  r| j                  |       | S |t        j                  k(  r| j                  |       | S |t        j                  k(  rxt        j                  j                  |dg      }| j                  rA| j                  |k7  r2t        d	|j                    d
| j                  j                    dd       || _
        | S t        d| d       | S )N)r   rZ   zparent_task.nameu   Укажите from_idTrU   u   Укажите to_idu*   Не могу переместить из r   rC   rm   u5   Нельзя переместить задачу в "u/   ", так как она находится в ""u(   Не могу переместить в )ri   rk   r
   get_cls_by_tuuid_strrE   r  r  r  r  r   rZ   rC   rs   r   r  rN  r   )r   from_idto_idr3   r4   from_clsto_clstarget_tasks           r6   r"   zCmfTask.move  s    	EF.d;,D9009..u5v~~%!!'*555##G,'$**--333#' B7)LTXYV^^#e$  v333e$  v~~% ..,,vh,GKD$4$4$CQR]RbRbQc  dS  TX  Td  Td  Ti  Ti  Sj  jk  l  tx  y*D  @HPTUr7   c           	      6   |d   }|sy|d   dvry|j                  d      }t        j                  j                  ddd|gddd	| d
gggdg      }| j                  j                          |r,|| j                  vr|s| j                  j                  |       yyNtoken_sanitizedFr      #№@r`   r   ILIKEaliasz%"z"%r/  T)lstriprE   CmfTagrN  ra  r  r   )r   	only_namectxr  tags        r6   _process_tag_tokenzCmfTask._process_tag_token  s    /01W,)009 mm Wo6gO+<B'?@ 9   
 			3dii'	IIS!r7   c           	          |d   }|sy|d   dvry|j                  d      }t        j                  j                  ddd|gddd	| d
gggdg      }|r
|s|| _        yyr  )r  rE   CmfLogicTyperN  r   )r   r  r  r  lts        r6   _process_logic_type_tokenz!CmfTask._process_logic_type_token  s    /01W,)009   $$ Wo6gO+<B'?@ 9 % 
 i DOr7   c                     |d   }|sy|j                  d      sy|j                  d      }t        |      dk  ryg dddd	d
| d
gdd	d
| d
ggg}t        j                  j                  |      }|r
|s|| _        yy)Nr  F)#   №@r     
user_localrb   Tr`   r   r  %loginr  T)r  r  rm  rE   	CmfPersonrN  r   )r   r  r  r  _filterpersons         r6   _process_responsible_tokenz"CmfTask._process_responsible_token  s    /0))*;<)009!#-67a/@,BCW/):!&<=?@ !!%%W%5)%Dr7   c                 b    |j                         }|j                         }|d| d| d| fv S )Nr  r  r  )lower)r   stringhashtags      r6   hashtag_cmpzCmfTask.hashtag_cmp-  s<    --/Qvh<3vh1VHFFFr7   c                     |d   }t         j                  j                         D ]'  \  }}|j                         }|d| d| d| fv s' n y|s-| j                  s'|| j
                  j                  j                         v ryt        j                  j                  t        j                  j                        j                  dd	d	d	d	
      }||j                  z
  }|d	k  r|dz  }|t        |      z  }|t        dd      z   }| j                  r[|j                  | j                  j                  j                  k(  r.| j                  j                  j                   |j                   k(  ry|| _        || _        y)Nr  r  r  r  FTr   r   r   )dayhourminutesecondmicrosecond   )monthsr   )r  rs  )cmfutil	RU_MONTHSr   r  r   r   r  r   r   r   r   replacemonthr   r  rs   yearr   )	r   r  r  r  	month_idxr  r  r  r   s	            r6   _process_month_tokenzCmfTask._process_month_token3  su   /0 !( 1 1 7 7 9 	IuKKMEQug;#eW5'{"KK	
 ;;5DIIMM,?,?,A#A&//33x7H7H7L7L3MUU V O  5 55Eqy}UF;;O+m2B.OOM $$#))T-A-A-G-G-M-MM((..337K7KK#2D !.Dr7   c                 $    | j                          y)uG    Ф-я вызывается из базового класса
        N)_calc_from_namer"  s    r6   rt  zCmfTask._calc_name]  s     	r7   c                    | j                   j                  sC| j                  j                  s-| j                  j                  s| j                  j                  sy | j
                  s/| j                   s#| j                   j                  rt        dd       | j                   j                  xs d}|j                         }g }|D ]  }|j                         j                  d      }t               j                         }|d= |j                  |        | j                  di |ra | j                   di |rt | j"                  di |r|r g }|r6|j%                  |       t'        |      dz
  }||   j)                  d      ||<   | j                   j                  r| j                   j                  rd	}| j                   j                  j                         D 	ch c]  }	|	j+                  |      s|	dd   }
}	| j                   j                         D 	ch c]  }	|	j+                  |      s|	dd   }}	t'        |
      t'        |      kD  rg|
j-                  |      }| j/                  d
g       t1        | j                        D ],  }|j                   |v s| j                  j3                  |       . | j4                  dk(  r| j6                  r| j8                  r@t:        j=                  | j>                        j@                  s| j                   xs d | _         y | j                   r%| j                   j                  j+                  d      sd| j                   xs d | _         y y | j                   sd| _         y y y c c}	w c c}	w )Nu+   Отсутствует имя задачи!TrU    z.,;:?!r   r   .)r  r  r  	tags.namerF  1EpiczEpic zEpic 1rD   )!r   r   r  ra  r   rF   r  rk   rs   r   r  striplocalsr   r   r  r  r   extendrm  rstripr  
differenceri   r0   r  r5  r   rN   r   r  r   add_object_type)r   r   name_tokensundefined_tokenstokenr  r  dot_token_postag_symbolseltags_old_name	tags_nametags_for_deleter  s                 r6   r  zCmfTask._calc_from_nameb  s    II  ##..yy##**}}TYY499==C4Pyy$"jjl  	E#kkm11(;O(--/CF
 ##E*-t--44&t&&--.t..55")	, /0,q0M)4])C)J)J3)OK&99DIIMM+K.2iimm.A.A.Cbr}}U`GaRVbMb*.))//*;ZBr}}[?YABZIZ=!C	N2"/":":9"E  +/		? .Cxx?2		((-. +{{;;s'<'<T^^'L'\'\#'99#3"4DI$))//*D*DV*L"'		(8S'9 :DI +MYY$	  ,! cZs   N6NN2Nc                    | j                   j                  s| j                  sy | j                  dv rd| _        y | j                  dv rd| _        y | j                  dk(  rd| _        y | j
                  j                         | _        y )N)rG  gantt)rF  ztask.gantt_subprojectr0   z
pfeed.basepost)r   r   r   r5  ui_view_formui_namer  r"  s    r6   r   zCmfTask._calc_ui_view_form  st    **;;  33 'D"HH &D,. &D $ 2 2 4Dr7   c                    | j                  g d       | j                  so| j                  rc| j                  j                  g d       | j                  j                  dk(  r| j                  | _        n| j                  j                  | _        | j                  sV| j                  dk7  rFt        j                  | j                        }|r$|j                  dg       |j                  | _        y y y y )N)r   r0  rZ   r5  )zgantt_project.op_gantt_taskr5  rr   r6  z main_gantt_project.op_gantt_task)ri   r0  rZ   r5  r   r  r   r1  r   rL   s     r6   _calc_gantt_projectzCmfTask._calc_gantt_project  s    WX!!d&6&6(()ij,,0DD%)%5%5"%)%5%5%C%C"!!d&7&7;O&O++DOO<G##%G$HI%,%?%?"  'P!r7   c                    | j                   j                  s"| j                  s| j                  j                  rL| j                   r%| j                   j                  j                  d      s| j                  dv rt        dd       | j                  sy | j                  r#| j                  j                  j                  dk7  r2| j                  s%t        j                  j                  | d       | _	        y t        j                         5  | j                  s't        j                  j                  | d       }|| _	        d d d        y # 1 sw Y   y xY w)Nr  rF  rG  r6  u_   task.epic, task.subproject и task.gantt_project не могут быть без ПроектаTrU   r   )r   r   r   r5  rs   r  rk   rN   r   rr   rE   CmfGanttTaskcreate_gantt_taskr  disable_acl)r   rr   s     r6   r   zCmfTask._calc_gantt_task  s   >>$$t7H7H7S7S>>)=)=)H)H)W$$(^^  HL  M{{{{dkk//::lJ%%%+%8%8%J%J4QU%V"  " 	3%% & 3 3 E EdD Q%2"		3 		3 	s   4EEc                    | j                   j                  r^| j                  j                          | j                  j	                  | j                   j
                  | j                   j                         | j                  j                  s(| j                  j                  s|j                  dd      rT| j                  D ]D  }|j                  s| j                  j                          | j                  j                           y yy)u   
        Изменяем счетчики Оперативной Гант-задачи при изменении задачи
        list_affect_gantt_taskFN)r  r   rr   r  task_status_is_changed_hookr  r  r  r   rN  r   affect_gantt_tasktask_plan_dates_is_changed_hook)r   r4   r  s      r6   _calc_op_gantt_task_countersz$CmfTask._calc_op_gantt_task_counters  s     ;;!!##%::4;;??DKKOO\**d.@.@.K.KvzzZrtyOzzz ((&&++-&&FFH	 P{r7   c                    | j                   r| j                  j                   sw| j                  dk(  rh| j                         }|j                  rLt
        j                  dk7  r9| j                  j                   s#| j                  j                   st        dd       | j                  s| j                  ry t        | 5         S | j                  s| j                   sy t               }| j!                  d      D ]r  }|j"                  | j%                         vs |j"                  j'                  d      r<|j"                  j)                  d      rX|j+                  |j"                         t d	|v sd
|v r| j,                  j                   s| j.                  j                   r5t0        j3                  | j                        x}r|j5                  d| d       | j.                  j                   rl| j                  j6                  rV| j                  j6                  | j                  j8                  k7  r)| j                  s| j.                  j5                  d|        d	|v r|j;                  d	       d
|v r|j;                  d
       t0        j3                  | j                        }d|v rX|j5                  d|        | j<                  r(|j5                  d| j<                  j>                  |        |j;                  d       d|v rF| j@                  j6                  r| j                  s|j5                  d|        |j;                  d       d|v r:| j                  s| j.                  j5                  d|        |j;                  d       d|v r:| j                  s| j.                  j5                  d|        |j;                  d       d|v r| j                  j                   r<| j                  dk(  r-| j                  j6                  dk7  r|j5                  d|        n<| j                  j6                  r&|j5                  d|        |j5                  d|        |j;                  d       d|v r$|j5                  d|        |j;                  d       d|v r$|j5                  d|        |j;                  d       d|v rF| jB                  s:| jB                  j6                  r$|j5                  d|        |j;                  d       d |v rl|j5                  d!|        | jD                  jF                  D ]/  ^}}}|d"k(  s|j"                  d#k(  s|j5                  d||        1 |j;                  d        d$|v r$|j5                  d%|        |j;                  d$       |r.| j                  s!| j                  s|j5                  d&|        y y y y )'Nr   sd_apiud   Редактирование запрещено, так как задача в статусе CLOSEDTrU   r   cache__idrN   rL   r@   )rA   use_new_projectzPPP-TSK-MOVEr  r   zPPP-TSK-ASSIGNzPPP-TSK-ASSIGNABLE)userrA   r
  zPPP-TSK-MODIFY-OWNERrZ   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   r{  sl_readonly_closed_taskrG   	api_scopemark_commentmarkrk   r   rF   r/   check_edit_permr   r   r   r   project_perm_allow_fieldsr  endswithrI   rN   rL   r   r  rM   r  r  r  r   rs   r
  r   rG  _changes)	r   r  changed_fields_to_checkr   rL   change_action
change_obj_r5   s	           r6   rM  zCmfTask.check_edit_perm  s*   
 ??4;;#9#9d>T>TX`>`--/J11 ;;(*D4E4E4P4PTXT]T]ThTh  E  MQ  R }}7*,,t"%%[[D[1 	>E$$D,J,J,LL!,,77A!,,55e<'++E,<,<=	> ..)?V2V &&$,,*A*ASVShShimixixSyHyHy112B^b1c||&&4??+>+>4??CVCVZ^ZiZiZmZmCm}}LL::>t:T 22'..x833'..y9''833 --.>D-I112FTM]M]McMcim1n#**=911~~!!$++112Hd1S#**;7
 33 ;;66~46P#**=9--;;66~46P#**73..%%00T5K5Kx5W\`\r\r\v\v  {C  ]C11/t1L112C1N112FD1Q#**8422--o4-H#**<800--.@d-K#**:6 22??t':':112D$1O'..|<11--.Hd-S151H1H g-zA H,1F1F+1U556JQ[ae5fg $**;7 $;;--.D$-O#**+@A # ==11.d1K *5= #r7   c                 2   | j                  g d       | j                  s)| j                  s| j                  t        j
                  k7  rN| j                  r3t        j                  | j                        }|j                  d|        y t        | -          y y )N)r8  r   r
  r   r   rG  zPPP-TSK-DELETEr  )ri   r8  r   r
  rG   current_userr   r   r  rM   r/   check_delete_permr  s     r6   rW  zCmfTask.check_delete_permx  sw     ? 	@ 99		T^^q~~%E //@112B1M)+ &Fr7   c                 L   | j                   s| j                  j                  r| j                  j                  sj| j                  r]t        j
                  j                  dd| j                  gdg dg dgg      D ]#  }| j                  |_        |j                          % yyyyy)u  
        При создании задачи - у нее не указывается имя сразу, но уже создается нотифай с пустым именем.
        Но нотифай по str-полям когда пусто меняется на имя - не создается и не обновляет информацию в созданных нотифаях.
        Поэтому мы сделал этот ХАК с нарушением слоёв.
        obj_idrb   r`   )r8  rb   r  )r8  rb   Nr  N)
r   r   r   r  rE   	CmfNotifyr0   rC   r8  rP   )r   task_notifys     r6   _update_empty_task_notifyz!CmfTask._update_empty_task_notify  s     {{tyy33DIIMMdii%//444))+?@=4   # $(99   "# OXM3{r7   c                 @   | j                   r)t        j                  | j                         j                  ry d}| j                  j
                  rVt        | j                  j                        t        | j                  j                        z
  D ]  }|j                  dk(  s|} |sy t        | j                        }|D ]]  }||k(  r	|j                  dk7  r|j                  dk(  r)|j                  dk(  rt        d       | j                  j                  |       _ y )NFlist.agile_sprintr   r  u\   Внимание! Задача перемещена из Запущенного списка)r   r   r  task_allow_multiple_sprintsr   r   r   r  r  r5  r   rk   r  )r   
add_sprintappended_listcurrent_sprints
cur_sprints        r6   _calc_sprintszCmfTask._calc_sprints  s    
 #"7"7"H"d"d
::  !$TZZ^^!4s4::>>7J!J  --1DD!.J djj/) 		*JZ'&&*==++x7++}<xzJJj)		*r7   c                    t        | j                        }|g dz  }|ddgz  }|dgz  }|dgz  }|dgz  }|dgz  }|dd	gz  }|d
dgz  }t        | j                  d            }|dhk(  r|g dz   S |dhk(  r|g dz   S |r|ddhk  r|g dz   S |dhk(  r|g dz   S |r|h dk  r|g dz   S |d
hk(  r|g dz   S |dhk(  r|g dz   S g d}t        |          |z   S )N)logic_type_idr   rc  scheme_wf_idrF   cmf_modified_atcmf_modified_by_idr  r  perm_security_level_idzworkflow.save_eval_codeparent_logic_prefixrequest_type.idr   r   TrA  r   )r   r5  r  r8  )r8  r5  r  perm_encryptr   )r   r5  r  zparent_task.parent_id.responsible.primary_role.structural_project_id3responsible.primary_role.structural_project_list_idzstatus.textr  rz  r  r   r   r  r  r  r  r
  r   )zmain_list.idlists.logic_prefixzlists.cache_status_typelists.plan_start_datelists.plan_end_dater  r   r  r5  zcloned_from.idr   lists.affect_gantt_taskrz  r  r   r   r   r  r  r  r  r
  period_interval>   r  	status_idr   )r  status_review_atstatus_in_progress_startstatus_in_progress_endstatus_modified_atr   op_gantt_task.actual_start_date
resolutionr  rz  r  r   r   r  r  r  r  r
  rq  rr  r  r  )rq  rr  r  r   r   rz  r  r   r   r  r  r  r  r
  )4rF   zparent.project_typezparent.auto_alarm_datezparent.logic_prefixz"parent.task_allow_multiple_sprintsrZ   parent_task.logic_prefixzparent_task.is_templater:  rq  rr  lists.ordernozlists.perm_has_aclzlists.sys_typerp  rs  zlists.default_task_logic_typerZ  zmain_list.plan_start_datezmain_list.plan_end_datezmain_list.ordernozmain_list.perm_has_aclmain_list.logic_prefixzactivity.prefixr  r  cmf_modified_byr  rS  rH  r0  rr   rz  r5  z!scheme_wf.default_task_logic_typez$scheme_wf.default_subtask_logic_typezstatus.need_approver   r   agile_story_pointsr  r   rz  rk  r  rl  r  r  rn  ro  zlists.sl_task_auto_approvert  )r0   cache_cluster_fieldsr   keysr/   rj   )r   required_fieldsr   rm   r5   s       r6   rj   zCmfTask.save_preload_fields  s   t889dd-/CDD,--,--45556613DEEL*55 TYY$Y78fX%" &   fX%" &   n@P0QQ" 
& 
 
 gY&" '  $ n0\\" '    l^+" &   j\)" 	& 	 	A
D w*,V33r7   c                     t         j                  j                  | d       d| _        | j	                  d       t        j
                  j                  | dg|i | y )Nr   approve4Tr\   approve_started)rE   
CmfApprovestart_approve_processr  rP   CmfEventdo_eventr   r3   r4   s      r6   start_approvezCmfTask.start_approve`  sM    //a8!+		D	!  '8J4J6Jr7   c                     | j                  g d       | j                  j                  j                  | _        g | _        | j                          t        j                  j                  | d       y )N)zstatus.trans_approvedzstatus.trans_approved.status_toapprovers_forapprove_success_full)	ri   r  trans_approved	status_tor  rP   rE   r  r  r"  s    r6   _approve_approvedzCmfTask._approve_approvedf  sN    fgkk00::		  '=>r7   c                 *   | j                  g d       | j                  j                  r | j                  j                  j                  n| j                  | _        g | _        | j                  d       t        j                  j                  | d       y )N)zstatus.trans_rejectedzstatus.trans_rejected.status_tor  T)approve_rejected_doneapprove_rejected)	ri   r  trans_rejectedr  r  rP   rE   r  r  r"  s    r6   _approve_rejectedzCmfTask._approve_rejectedm  sh    fg>Bkk>X>Xdkk00::^b^i^i			-  '9:r7   c                     | j                  g d       | j                  j                  j                  | _        g | _        y )N)zstatus.trans_updatedzstatus.trans_updated.status_tor  )ri   r  trans_updatedr  r  r"  s    r6   _approve_updatedzCmfTask._approve_updatedu  s0    dekk//99r7   c                 V   |j                  d      }|j                  d      }|j                  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| | j                  dg       t        j                  | j                  v r;| j                  j                  t        j                         | j                  d       t        j                  j                  | d       y )Napprove_groupr{  r8  rz  )approver_levelrf   masteraccepted)r  r  r  r  )rA   r  approverapprove_typere   r  Tr\   approve_success_onerD   )rN  dictrG   rV  rE   r  _approve_oneri   r  r  rP   r  r  )r   r4   r  r{  r8  master_filterparamsapproves           r6   r   zCmfTask.approve_onez  s   

?3ZZ-
zz&! #=M#>M'^^!	
 ,F8##''1&1 G  5d5f5/*+>>T///%%ann5III%  '<=r7   c                 8    dt         _        t        |   |i |S )NT)rG   r   r/   create)r2   r3   r4   r5   s      r6   r  zCmfTask.create  s    )-&w~t.v..r7   z$(?P<code>[A-Z\d]+(?:-[A-Z\d]+)*-\d+)c                     |d}| j                   j                  |      }dd|g}|r|dd|D cg c]  }|j                   c}gg}t        j                  j                  |||      S c c}w )u  
        Нужно в тексте найти все потенциальные коды. Можно просто все слова...
        Какие сложности:
            - код может быть практически любым max_len = 64
            - в имени ветки нельзя пробелы
        ОСВ: код вначале, и содержит ^([A-Z0-9]+-[0-9]+).*
        r  r=   INrL   re   rm   r   )_TASK_CODE_SEARCH_REfindallrC   rE   r   r0   )r2   r8  rm   projectsr   codesfilter_rL   s           r6   find_related_taskszCmfTask.find_related_tasks  su     <D((0064'DX2V'7::2V WXG~~""'&8"TT 3Ws   A(
c                    | j                   s-| j                  j                  s| j                  j                  sy| j                   s| j                  j                  r| j	                  dg       g }| j                  D ]#  }|j
                  dk7  s|j                  |       % |D ]8  }| j                  j                  |       | j                  j                  |       : | j                   s| j                  j                  rrg }| j                  D ]#  }|j
                  dk(  s|j                  |       % |D ]8  }| j                  j                  |       | j                  j                  |       : yy)u   
        При добавлении в список правильно выбирать поле lists или fix_versions
         в зависимости от типа списка
        Nzfix_versions.logic_prefixzlist.release)r   r  r   r   ri   r5  r   r  )r   r"   rA   s      r6   r   zCmfTask._calc_fix_versions  s?    KK((JJ!!;;$++669:;D(( %##~5KK$%  '!!((-

!!#&' ;;$**//Dzz %##~5KK$%  .

!!#&!!((-. 0r7   c                 .   |rt               }| j                  r|j                  | j                         | j                  r|j                  | j                         |sy |D ch c]  }t	        |j
                         }}t        t        j                  j                  t        |      d d       t        t        j                  j                  dt        |      i       y | j                  rD| j                  j                  r| j                  se| j                  j                  r| j                  sC| j                  j                  s-| j                  j                  s| j                  j                  sy | j                  j                  r;t        t        j                  j                  d t	        | j
                        d       t               }| j                  j                  rB| j                  j                  D ])  ^}}}|j!                  t	        |j
                               + | j                  j                  rB| j                  j                  D ])  ^}}}|j!                  t	        |j
                               + |sy t        t        j                  j                  t        |      d d       | j                  j                  s| j                  j                  r1t        t        j                  j                  dt        |      i       y y c c}w )N)list_idsr+  r4   r  )r0   r   r  r  rJ   rC   schedule_deferred_jobrE   r  recalculate_count_cacherecalculate_cacher   r   r  r   rP  rI   )r   from_deleter   r   ids_setrT  rS  s          r6   _calc_lists_count_cachezCmfTask._calc_lists_count_cache  s<   FEzzTZZ(  T../*/0Qs144y0G0!&.."H"H^bcj^kx|Q}~!&.."B"BJX\]dXeKfg [[tzz44IZIZIeIejnj{j{zz$$  ++{{%% ;;!!!&.."H"H^borswszszo{Q|} %::  %)ZZ%8%8 0!:C
./0 ''%)%6%6%?%? 0!:C
./0 fnnDDZ^_fZgtxMyz ::  D$5$5$@$@!&.."B"BJX\]dXeKfg %AG 1s   "Lc                 l   | j                   j                  sy t        | j                   j                        t        | j                   j                        z
  D ][  }|j
                  dk7  rt        j                  j                  j                  |j                               sKt        d| dd       ] y )Nr^  u;   Задачу нельзя добавить в спринт u"   , попробуйте позже.TrU   )r   r   r   r  r  r5  r   r   r   r   get_lock_keyrk   )r   ra  s     r6   _check_sprintszCmfTask._check_sprints	  s    zz$$ 03tzz~~3FF 	WM))-@@||!!(()C)C)EFWXeWf  gI  J  RV  W		Wr7   c                 (   | j                          | j                  r3| j                  s&| j                  sdt        _        | j                  j                  rf| j                  rY| j                  j                  j                  dk(  r5t        j                  | j                        }|j                  ry| j                  sm| j                  j                  |j                         d|j                  j                   d|j                   d}t         j"                  j%                  | |       |j&                  r|j&                  | j                  vrm| j                  j                  |j&                         d|j&                  j                   d|j                   d}t         j"                  j%                  | |       | j)                          | j+                          | j-                          | j/                          | j1                          | j3                          | j5                          | j7                          | j9                          | j:                  rC| j:                  j<                  r-t>        jA                         5  | jC                          d d d        | jE                          | jG                          | jI                          | jK                          | jM                          | jO                          | jQ                          tS        |   |dd	i|}| jW                          t         jX                  j[                  |        |S | j                  r| j]                         S | j^                  j                  r#| j`                  j                  stc        d
d       | jd                  j                  s"| jf                  j                  s| j                  r+| | jd                  k(  s| | jf                  k(  rtc        dd       | jd                  j                  rf| jd                  rZg dddd| gdd| jd                  ggdd| jd                  gdd| gggg}t         jh                  jk                  |      rtc        dd       | j                  j                  r | jm                          | jo                          | jq                          | js                          | ju                          | jw                          | j                  j                  rg| jx                  r[t{        | j                  j|                        t{        | j                  j~                        z
  D ]  }|| jx                  k(  sd | _<         | j                  s,| jx                  j                  s| j                  j                  r| jx                  sw| j                  D ]  }|j                  dk(  s|| _<         n | j                  D ]  }|j                  dk(  s|| _<         n | jx                  s| j                  D ]
  }|| _<         n | j                  j                  r| jx                  r| j                  dg       | jx                  j                  dk(  r\t{        | j                  j~                        t{        | j                  j|                        z
  D ]  }	|	j                  dk(  s|	| _<         n | j                  j                  s| j                  r| j                  ry| j                  j                  j                  dk(  rUt        j                  | j                        }|j                  ry| j                  sm| j                  j                  |j                         d|j                  j                   d|j                   d}t         j"                  j%                  | |       | j                  j                  r| j                  j|                  r| j                  | j                  j|                  k7  r| j                  j|                  j                  dk(  rt        j                  | j                  j|                        }
|
j                  }|rg|| j                  v rY| j                  j                  |       d|j                   d|
j                   d}t         j"                  j%                  | |       |j&                  r|j&                  | j                  vrm| j                  j                  |j&                         d|j&                  j                   d|j                   d}t         j"                  j%                  | |       | j                  j                  r| j                  j|                  r| j                  | j                  j|                  k7  r| j                  j|                  j                  dk(  rt        j                  | j                  j|                        }
|
j&                  }|rg|| j                  v rY| j                  j                  |       d|j                   d|
j                   d}t         j"                  j%                  | |       | j                  j                  rt        j                  st{        | j                  j~                        t{        | j                  j|                        z
  D ]:  }	|	j                  dk(  stc        d|	j                   d| j                   dd       < | j                  s|t{        | j                  j|                        t{        | j                  j~                        z
  D ]:  }|j                  dk(  stc        d|j                   d| j                   dd       < | j                          |j                  d      s| j                  j                  r| j                  rdt        d tz        fd!} || j                  j~                        } || j                  j|                        }||z
  }||z
  }t        ||g      rTt         j                  j                  j                  | j                  j                  t        |      t        |      d"#       | j                          | j)                          | j+                          | j-                          | j/                          | j                          | j                  j                  r7| j                  d$vr)| j                  d%vrtc        d&| j                   d'd       | j                          | j                  j                  r$t!        j                  j                  | d(g|i | | jO                          | jQ                           | j                  d3i | tS        |   |i |}|j                  |j                  k(  r>t        d)|j                          d*t        j                   d+t        j                          | j                  j                  r}| j                  j~                  dk(  rd| j                  rX| j                  j                          | j                  D ]/  }t>        jA                         5  |j                          d d d        1  | j                  d3i | | j                  j                  r| j                  j                          | j                  j                  r| j                  j                          | jd                  j                  r| j                  j                          | j:                  j                  s| j                  r| j:                  j<                  r.t>        jA                         5  | jC                          d d d        n| j:                  j                  r| j:                  j|                  r| j:                  j|                  j<                  j                         rd|j                  d,      sS| j                  j                          | j                  r-t>        jA                         5  | j                          d d d        | j                  j                  r| j                          | j                           | j                  d3i | | j                          d-D ]=  }t        | |      j                  st        t         j                  j                          n | jd                  j                  s| j                  rV| jd                  rJ| jd                  j                  j                         d.k(  r#t        t         j                  j                         | jd                  j                  rj| jd                  j|                  rT| jd                  j|                  j                  j                         d.k(  r#t        t         j                  j                         | j                  j                  r | j                  j|                  d.k(  rd/| _q        | j                  j                  r_| j                  rSt        | j                  j                  t         j                        r%| j                  j                  | j                         | j                          | j                  j                  s"| j                  s| j                  j                  r'| j                  r| j                  d0vrtc        d1d       | jW                          | j                  j                  s| j                  j                  r:t        t         j                  j                  d2t        | j                        i#       t         jX                  j[                  |        |S # 1 sw Y   >xY w# 1 sw Y   SxY w# 1 sw Y   gxY w# 1 sw Y   txY w)4NTr   uo   SimpleLogic: Задача добавлена в Список для Новых задач без Списка "   " проекта "r  r7  ut   SimpleLogic: Задача добавлена в Обязательный список для Новых задач "r   Fu   Пожалуйста, воспользуйтесь контекстным меню (троеточие) в панели инструментов задачиrU   uK   Нельзя добавлять задачу в eё же подзадачиrelation_type.coderb   zsystem.additional_parentr`   ra   rb   rc   r  u   Задачи не могут быть родительской и дочерней, так как они связаны связью Дополнительный родитель/Дополнительная дочерняя задача.r^  
list.boardr~  	list.baseum   SimpleLogic: Задача удалена из Список для Новых задач без Списка "ut   SimpleLogic: Задача удалена из Обязательного списка для Новых задач "r   uS   Нельзя добавить задачу в Завершенный список "z" - "uU   Нельзя удалить задачу из Завершенного списка "from_sync_subtasksr   returnc                     t               }| D ]P  }|j                  ddg       |j                  dk7  r&|j                  dk(  r6|j	                  |j
                         R |S )up  Фильтрует lists - оставляет только незакрытые спринты и возвращает множество ID этих спринтов

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

                Returns:
                    set: множество не закрытых спринтов
                r5  r   r^  r   )r   ri   r5  r   rI   rC   )r   sprints_idslist_s      r6   get_correct_sprintsz)CmfTask.save.<locals>.get_correct_sprints	  si     "e" .E%%~7J&KL))-@@ ..(: OOEHH-. #"r7   )r+  sprints_to_add_idssprints_to_remove_idsr  )r_   r0   r.  r-  rE  u   Вид отображения uk    временно не поддерживается, используйте "task", "list", "post", "gantt"spectators_changeduj   DEV: WARNING: У задачи после сохранения совпадает код и id task.values=z, request.url=z, request.data=r  )r  rN   ra  r   r  rz  rF  r   r5  us   DEV: Недопустимое перемещение простой задачи в структуру дереваr+  rD   )}r  r   r   rF   rG   r   rN   r   rs   r   r   r  r   default_list_if_emptyr   r   rE   r}   r;  default_listr   r   r   r   r   r   r   r   r   r  need_approver  r8  r  rx  r   r   r   r   r   r   r/   rP   r   CmfBackbonePeerobj_after_save_hookr   rm  result_textrk   rZ   rH  rw   r   r  r\  r   rX  _calc_estimate_workrC  rZ  r   r  r  r5  ri   r  r  r   rd  rN  r  r0   anyr   _sync_subtask_sprintsapplyrC   _calc_logic_type_change_guard_calc_agile_story_pointsr/  _calc_structural_listrF  r  r  _sdesk_before_super_saver=   printr   requesturldatar   staff_control_blocked_personsr  calc_staff_control_blockedr>  r   rr   task_logic_type_is_changed_hookr0  "task_gantt_project_is_changed_hook task_parent_task_is_changed_hookr  r  r   r&  _sdesk_after_super_saver  getattrr  r  r  cache_child_tasks_countra  r   r   hook_task_tags_changed_calc_hide_closed_task_notifiesr:  r   rG  r|   sync_task_resourcesrJ   )r   r3   r4   rL   	audit_msginstr  removed_listr   ra  project_oldold_default_list_if_emptyold_default_listr  sprints_newsprints_oldsprints_to_addsprints_to_removeself_instancer  r   r5   s                        r6   rP   zCmfTask.save	  s   ;;tyy .2A* {{%%$++$++:K:K:V:VZf:f//?00JJ%%g&C&CD #S  T[  Tq  Tq  Tv  Tv  Sw w55<\\N"!FI%%77t)7T''G,@,@

,RJJ%%g&:&:; #X  Y`  Ym  Ym  Yr  Yr  Xs s55<\\N"!FI%%77t)7T ""$224!!#!!#!  "!!#!{{t{{77((* )&&() OO!!!#**,##%##%##%7<<E<V<D""66t<K ==##%% ''0@0@0K0K  v  ~B  C &&$))*>*>$++t'''4499+<gost&&4+;+;H $.D$BRBR0ST $(8(89ItT;RSG '',,G,< F NRS 99  "**, 	  	  "&&( ::  T^^ #DJJNN 3c$**..6I I *4>>1%)DN* ;;$..33tzz7L7L>> A~~)<<)*  A~~5)* ~~!ZZ )*
 ::  T^^678~~**k9%(%83tzz~~;N%N M$115HH)6 KK""dkkKKDKK$5$5$@$@L$P++DNN;G,,TZZ

!!'"?"?@ O  PW  Pm  Pm  Pr  Pr  Os s118bB	!!334i3P{{%%$++//dkkT[[__>\aealalapapa{a{  @L  bL!33DNN4F4FG,7,M,M),1Jdjj1XJJ%%&?@ #Q  Rk  Rp  Rp  Qq q55@5E5E4Fb!JI%%77t)7T##(<(<DJJ(N

!!'"6"67 T  U\  Ui  Ui  Un  Un  To o118bB	!!334i3P{{%%$++//dkkT[[__>\aealalapapa{a{  @L  bL!33DNN4F4FG#.#;#; #(8DJJ(FJJ%%&67 #X  Yi  Yn  Yn  Xo o55@5E5E4Fb!JI%%77t)7T ::  !$TZZ^^!4s4::>>7J!J g 22h> s  uB  uG  uG  tH  HM  NR  NW  NW  MX  XY  Z  bf  gg ;;$'

$7#djjnn:M$M lL#55A!$y  {G  {L  {L  zM  MR  SW  S\  S\  R]  ]^  #_  gk  ll 	zz./DJJ4I4IdNbNb#4 #C #& .djjnn=K-djjnn=K(;6N +k 9N$56744::dggmmY]^lYm\`ar\sCu: v 	**, ..0%%'''D,=,=Ef,f%%-MM6t7H7H6I  Ju  v  ~B  C""$??%%OO$$T+?Q$Q&Q!! 	&%%//d5f5 !1!11,3356nW[[MQ`ahamam`npq
 !!,,&&**h6..335<< 8((* 85578 88 	*))3F3??%%>>@((AAC&&??A;;!!T[[{{''((* )&&() )++((++//++//..335jj!89""'')%% ,,. 1..01;;!!&&(##% 	%$$.v.$$& e 	JtZ(33%f&B&B&T&TU	
 ''4;;D<L<LQUQaQaQnQnQsQsQu  zE  RE!&.."B"BC&&4+;+;+?+?DDTDTDXDXDeDeDjDjDlp{D{!&.."B"BC ''D,=,=,A,A[,P+,D(99DKKJt{{?P?PRXRcRc4dKK..tyy9,,. ''4;;$:K:K:V:V\`\l\lqu  rC  rC  KA  rA  L  TX  Y&&$..*C*C!&"9"9"M"MW`befjfmfmbnVop2248w) )n8 8$) )1 1s=   AO/AO!9AO.A8AO;OAOO!AO+	O.AO8O;APc                    | j                   j                  rn| j                   dk(  r^t        t        j                  j
                        t        | j
                        dt        j                  t        | j
                        <   y y y )Nr   )	person_idrY  )r   r   rJ   rG   r~  rC   "deferred_hide_closed_task_notifiesr"  s    r6   r  z'CmfTask._calc_hide_closed_task_notifiesK
  sc    !!,,1G1G81S !!1!1!4!45dgg,BA00TWW> 2T,r7   c                 p   |ri t         _        y t         j                  sy t         j                  j                         D ]k  }g ddd|d   gg}t        j                  j                  |ddi       |j                  dd|d   g       t        j                  j                  |dd	i       m i t         _        y )
N)r  r  closedrY  rb   r   r   r(  r  r  r  )rG   r  r   rE   rZ  r)  r   )r2   r*  r,  r  s       r6   (apply_deferred_hide_closed_task_notifiesz0CmfTask.apply_deferred_hide_closed_task_notifiesU
  s    35A033<<CCE 	VH1HdHXDV3WXG ((Q(PNNKx/DEF((8@T(U	V 02,r7   c                 V   | j                   j                  s&| j                  j                  s| j                  j                  r2| j                  j                  dk(  r| j                  j
                  dk7  s| j                  j                  r2| j                  j                  dk7  r| j                  j
                  dk(  s|dv s{|y| j                  sm| j                  j                  r | j                  j                  j                  s7| j                  j                  r | j                  j                  j                  sy | j                  g d       | j                  j                  j                  xs d}| j                  j                  j                  xs d}||z
  }| j                  j                  j                  }| j                   j                  }d}	|dk  rd}g }
| j                  rt        | j                  j                        D ]  }|j                  dk7  r|j                  | j                   j                  d| j                   j                  | j                  j                  j                  | j                  j                  j                  d| j                         |j#                  | j                   j                  d dd	|||
        y | j                  j                  rt        | j                  j
                        D ]  }|j                  dk7  r|| j                  j                  vs,|j                  | j                   j                  d| j                   j                  | j                  j                  j                  | j                  j                  j                  d| j                         |j#                  | j                   j                  d dd	|||
        t        | j                  j                        D ]  }|j                  dk7  r|| j                  j
                  vs,|
j%                  |       |j                  | j                   j                  d| j                   j                  | j                  j                  j                  | j                  j                  j                  d| j                         |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<   |r| j                  D ]p  }|j                  dk7  s||
v r |j                  | j                   j                  dfi | d|v sD|j#                  | j                   j                  d dd|d          r |r| j                  D ]  }|j                  dk7  s||
v r|j#                  | j                   j                  |j                   j                  ||j(                  j                  |j*                  j                  ||j,                  j                  d        |rg|dv rc|j                  | j                   j                  d |||||	| j                         |j#                  | j                   j                  d d ||||
       | j                  j                  dk(  r| j                  j
                  dk7  rw| j                  D ]h  }|j                  dk7  s||
v r|j                  | j                   j                  d       |j#                  | j                   j                  d dd|||       j | j                  j                  dk7  r| j                  j
                  dk(  r}| j                  D ]m  }|j                  dk7  s||
v r|j                  | j                   j                  d||||	       |j#                  | j                   j                  d dd|||       o y y y )Nr   )startedr  )r   r  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-changechanged)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)r  r   r   r   r  r  r   rr   r  sched_duration
sched_workri   rs   actual_workr   history_otr_addrC   history_rte_addr   r  
time_spentremaining_estimateend_date)r   r  	task_listtimetracker_historyr  r
  r	  r  r  r  appendedr  r  s                r6   r   zCmfTask.calc_historyn
  s   ##..zz$$&&11d6L6L6P6PT\6\aeawawa{a{  @H  bH&&11d6L6L6P6PT\6\aeawawa{a{  @H  bH $99".{{""--$2D2D2S2S2^2^""--$2D2D2O2O2Z2Z s 	t !..==CCHq++77==B.?**55;;++11!!";;4::++, K((M9##DGGMM8,0,C,C,I,I262D2D2S2S2Y2Y.2.@.@.K.K.Q.Q/0,0,B,B $ D ##DGGMM$9AUd>Pew;I $ KK ZZ""4::>>* O((M9djjnn,''x040G0G0M0M6:6H6H6W6W6]6]262D2D2O2O2U2U34040F0F ( H ''d;CWfBShz?M ( OO 4::>>* O((M9djjnn,OOC(''x040G0G0M0M6:6H6H6W6W6]6]262D2D2O2O2U2U34040F0F ( H ''d;CWfBTi{?M ( OO $"8"89""--$($;$;$A$AF=!,,77*.*<*<*K*K*Q*QF&'((33&*&8&8&C&C&I&IF?#zz W((M9SH_###DGGMM8FvF&&0''dfr  BK:@AT:U ( WW zz 
@((M9SH_##DGGMMJ]J`J`JfJf6G3F3Q3Q3W3W7J7]7]7c7c6G1D1M1M1S1S1> $ @	
@ *.CC%%dggmm$Zk0;6G2?3A040F0F & H %%dggmmD_c  xI8J_q5C & E !!%%1d6L6L6P6PT\6\zz C((M9SH_##DGGMM7;##DGGMM4>6G7I3A $ C	C !!%%1d6L6L6P6PT\6\zz 
C((M9SH_##DGGMM9+:K6C7E $ G ##DGGMM4^6G7I3A $ C
C 7]1r7   c                 <   | j                   j                  j                          | j                   j                  | _        | j                  r$| j                  j                   j                          ddg}| j                  |       | j                  sy | j                   j                  | j                  _        t        j                  j                  dd| g|      }|D ]=  }|j                   | j                   k7  s| j                   |_         |j                          ? y )NrN   rr   rZ   rf   r/  )rN   r1  r  r0  rZ   ri   rr   rE   r   r0   rP   )r   rm   r3  r_   s       r6    _change_parent_and_gantt_projectz(CmfTask._change_parent_and_gantt_project
  s    &&++-![[;;##((*O, !!+/;;+I+I(nn))-d1KTZ)[ 	D{{dkk)"kk			r7   c                 p   ddd| gdd| gg}t         j                  j                  |d      D ]  }|j                           t         j                  j                  | d      D ]  }|j                           t         j
                  j                  ddd| gd	d| ggd      D ]  }|j                           y )
Nr`   r_   rb   r0  Trd   r^   ra   rc   )rE   r6  r0   restorerv   rw   )r   r  
gantt_taskr   r   s        r6   _restore_relationszCmfTask._restore_relations  s    tD)_dD+IJ --22'SW2X 	!J 	!((--4-N 	DLLN	++00
DRV?WZceikoYp8q  DH0  I 	CKKM	r7   rW   c                   |rd | _         | j                  d       t        j                  j	                  | |      D ]  } |j
                  |d|i|  t        j                  j	                  | |      D ]  }d |_        |j                  d        ddd| gd	d| gg}t        j                  j	                  ||
      D ]  } |j
                  ||dd|  t        j                  j	                  | |      D ]  } |j
                  |d|i|  t        j                  j	                  ddd| gdd| gg|
      D ]  }	 |	j
                  |d|i|  y )NTr\   r^   rX   )r0  r[   r`   r_   rb   r0  rd   )rX   from_task_deletera   rc   )rr   rP   rE   CmfTaskCodeHistoryr0   ru   r   r0  r6  rv   rw   )
r   rX   r3   r4   r=   r_   r  r"  r   r   s
             r6   _delete_relationszCmfTask._delete_relations  s   !%DIII%1166DRb6c PTO4DOOP++$P`+a *%)"		D	)* tD)_dD+IJ --22'Sc2d 	iJJt6FY]hagh	i((--4IY-Z 	LDDKKK0@KFK	L++00
DRV?WZceikoYp8q  DT0  U 	KCCJJJ/?J6J	Kr7   c                 d    | j                   sy | j                   D ]  } |j                  |i |  y r  )rS   ru   )r   r3   r4   	checklists       r6   rl   zCmfTask._delete_checklists'  s4     	.IId-f-	.r7   c                h   t         j                  j                  | |dg      D ]  } |j                  |d|i|  t         j                  j                  | |dg      D ]  } |j                  |d|i|  t         j
                  j                  | |      D ]  } |j                  |d|i|  y )Nr   )r_   r[   r   rX   )rA   r[   )rE   ry   r0   ru   rz   r{   )r   rX   r3   r4   r   s        r6   _delete_historyzCmfTask._delete_history.  s    ))..DJZfwex.y 	IAAHHdH-=HH	I))..DJZfwex.y 	IAAHHdH-=HH	I((--$HX-Y 	IAAHHdH-=HH	Ir7   c                 \   t         j                  j                  | ddg      D ]  } |j                  |i |  t         j                  j                  | ddg      D ]  } |j                  |i |  t         j
                  j                  | d      D ]  } |j                  |i |  y )NTr  )r_   cmf_deletedr   )rA   r-  )rE   ry   r0   r!  rz   r{   )r   r3   r4   r   s       r6   _restore_historyzCmfTask._restore_history6  s    ))..DdVfUg.h 	'AAIIt&v&	'))..DdVfUg.h 	'AAIIt&v&	'((--$D-I 	'AAIIt&v&	'r7   c                    | j                  g d       | j                  r#| j                  D ]  } |j                  |i |   | j                  |i |  | j                  |i |  | j
                  |i |  | j                  |i |  | j                  |i |  | j                  |i | t        |   |i |}| j                  d       | j                          | j                  rJ| j                  j                  j                         dk(  r#t        t         j"                  j$                         | j                  r| j                  j'                  |        t         j(                  j+                  |        |S )N)r8  rL   r
  sdesk_sla_cyclesr5  rZ   r   r  r   rG  rS   T)r  rF  )ri   r0  ru   _delete_task_resourcesr+  _delete_timetracker_history_delete_subtasksr'  rl   r/   r  #_update_additional_parent_relationsrZ   r5  r  r  rE   r   r  child_task_deleter  obj_after_delete_hook)r   r3   r4   sdesk_sla_cycler   r5   s        r6   ru   zCmfTask.delete>  sl    l 	m  #'#8#8 8&&&778 	$##T4V4d-f-((($9&9 	t.v.//00gnd-f-$$$6002 0 0 = = B B D S!&.."B"BC ..t444T:
r7   c                 T   t        |   |i |}| j                  g d       | j                          |j	                  dd      s | j                          | j                          | j                          | j                          |j	                  dd       }|j	                  dd      r9| |d<   | j                  dk(  r | j                  d
i | n | j                  d
i | |r'|j                  sd|_        |j                  d       |S | j                  dd	g       | j                  r| j                  j                  | j                                d| j                  _        | j                  j!                          | j                  j#                  | j                  j                         | j                  j                  d       |S | j                  | j                                | j!                          | j#                  | j                         | j                  d       |S )N)rr   rZ   zproject.default_gantt_task_typer5  r  	recursiveFrN   rF  Tr\   parent_task.has_child_taskszparent_task.parent_taskrD   )r/   r!  ri   r4  rN  _restore_timetracker_history_restore_task_resourcesr.  r#  r5  _restore_epics_subtasks_restore_subtasksr  rP   rZ   rj   _calc_cache_branch_gantt_path_recalc_gantt_path)r   r3   r4   r   rN   r5   s        r6   r!  zCmfTask.restoreb  s   got.v. 	 
 	 	002 zz+u---/((*!Hd+::k5)  $F8  K/,,,6v6&&&00)))-&d+$ 
 ;=VWX  ,,T-E-E-GH37  0  >>@  33D4D4D4P4PQ  %%%5 
   !9!9!;<224''(8(89		D	)
r7   c                     |j                  dd      }d|d<   t        j                  j                  | |      }|D ]  } |j                  |i |  y )NrX   Fr9  r   r[   )rN  rE   rx   r0   ru   )r   r3   r4   rX   r   r   s         r6   r2  z#CmfTask._delete_timetracker_history  s\    !::&8%@#{ 66;;d\l;m" 	(CCJJ''	(r7   c                 t    t         j                  j                  | d      }|D ]  }|j                           y )NTrB  )rE   rx   r0   r!  )r   r   r   s      r6   r;  z$CmfTask._restore_timetracker_history  s6     66;;d\`;a" 	CKKM	r7   c                 6   |j                  dd      }t        j                  j                  | |      }|D ]@  }t        j                  j	                  |j
                  |      s/ |j                  |i | B t        j                  j                  | d       y )NrX   FrH  r[   )rC   r[   !   Подзадачи удаленыr7  )	rN  rE   r   r0   r   rC   ru   r}   r;  r   r3   r4   rX   
tasks_listr_   s         r6   _delete_epics_subtaskszCmfTask._delete_epics_subtasks  s    !::&8%@^^((dDT(U
 	-D~~""dgg?O"PT,V,	-
 	++4 	, 	7r7   c                     t         j                  j                  | d      }|D ]  } |j                  |i |  t         j                  j                  | d       y )NTrE  -   Подзадачи восстановленыr7  rE   r   r0   r!  r}   r;  r   r3   r4   rH  r_   s        r6   r=  zCmfTask._restore_epics_subtasks  s_    ^^((dD(I
 	*DDLL$)&)	* 	++@ 	, 	Cr7   c                     |j                  dd      }t        j                  j                  | ||      }|D ]  } |j                  |i |  t        j
                  j                  | d       y )NrX   FrY   rF  r7  )rN  rE   r   r0   ru   r}   r;  rG  s         r6   r3  zCmfTask._delete_subtasks  st    !::&8%@^^((TK[l|(}
 	)DDKK((	) 	++4 	, 	7r7   c                     t         j                  j                  | d      }|D ]  } |j                  |i |  t         j                  j                  | d       y )NT)rZ   r[   rK  r7  rL  rM  s        r6   r>  zCmfTask._restore_subtasks  s_    ^^((T4(P
 	*DDLL$)&)	* 	++@ 	, 	Cr7   c                     |j                  dd      }t        j                  j                  dd| g|      }|D ]  } |j                  |i |  y )NrX   FrN   rb   rd   )rN  rE   r|   r0   ru   )r   r3   r4   rX   assignments
assignments         r6   r1  zCmfTask._delete_task_resources  s[    !::&8%@--228T4:Pbr2s% 	/JJt.v.	/r7   c                 ~    t         j                  j                  dd| gd      }|D ]  } |j                  |i |  y )NrN   rb   Trd   )rE   r|   r0   r!  )r   r3   r4   rQ  rR  s        r6   r<  zCmfTask._restore_task_resources  sI    --228T4:Pbf2g% 	0JJ//	0r7   c                     t         j                  j                  g ddd| ggdg      }|D ](  }|j                  j                  }|j                          * y )Nr  ra   rb   zin_link.op_gantt_taskr/  )rE   rw   r0   rc   rr   *additional_children_relations_changed_hook)r   !additional_parent_tasks_relationsrelationadditional_parent_gantt_tasks       r6   r4  z+CmfTask._update_additional_parent_relations  s    ,2,D,D,I,I  SK  NX  Z^  `d  Me  RfRiQj -J -l)9 	VH+3+;+;+I+I((SSU	Vr7   c                 \   | j                  g d       |j                  dk(  rK|j                  s?t        j                  s/| j
                  j                          t        j                  | _        | j                  s*| j                  s|j                  s| j                  d       | j                  dk(  rJ|rH|j                  dk(  r9|j                  s-|j                  s!t        j                  j!                  | |       t        j"                  j%                  |       t'        | P  |d|i|S )N)rN   rk  cmf_author_idr   Tr\   project.servicedesk)r   r   )ri   	log_levelrF   rG   r  rh  r   rV  r  r   is_recursion_saverP   rk  privaterE   CmfSDeskSlaTriggertask_changed_hookr  r  r/   _comment_save_hook)r   r   r3   r4   r5   s       r6   ra  zCmfTask._comment_save_hook  s    KL
 !'*:*:1==  ((*#$>>D {{4#9#9'BRBRIII% ##'<<WM^M^bcMc((%%77g7N227;w)4KKFKKr7   c           	      d   t         j                  j                  dd| j                  gg dg      }|D ]  }|j	                           t         j
                  j                  dd| j                  g|D cg c]  }|j                   c}gg dg      }|D ]  }|j	                           y c c}w )Nr   rb   )rm  r  Tr  r  )rE   r}   r0   rC   ru   r~   )r   r3   r4   commentsr   cattachmentsr   s           r6   r   zCmfTask.clean_after_encrypt  s    $$));dgg2NPl1m)n 	GNN	 **//dTWWLpfnWoabXYX\X\WoLp8q  tP  8Q/  R% 	 J	  Xps   4B-c                     |sg }|sdg}|sg }|g dddg dgdg dg dgg}|xr |j                  d	      }|r	|r|d	d
|gg}|j                  d       |j                  d       t        	|   |f||||d|S )Nr   r  r5  r  )r^  r  r  r`   )rJ  r  trash)rJ  rb   Nr   rf   rJ  rN   object_fieldsre   rm   r   )rN  r   r/   field_options_list)
r2   relation_field_nameri  re   rm   r   filter_by_projectr4   r   r5   s
            r6   lists_options_listzCmfTask.lists_options_list  s     FxHF1T#ST.0HI	K
 "Dm&7&7&D	{C;<F 	j!hw)y/<VTZemyqwy 	yr7   c                     |sg }|r(|j                  dd       r|dd|j                  d      gg}|dg dg dgg} | j                  |f||||d|S )Nr   rf   r`   )r5  rf   r^  )r5  rf   r  rh  )rN  rm  )r2   rk  ri  re   rm   r   r4   s          r6   main_list_options_listzCmfTask.main_list_options_list"  s     F]..{DA{C1B1B;1OPQF4!KMopq &s%%&9  S_ent  @H  S  LR  S  	Sr7   c           	         |sg }|r(|j                  dd       r|dd|j                  d      gg}|j                  dd       s|dg dg dgg}t        |   |f||g dg|||d|}|r9|d   t        |      z
  }	|	d	kD  r!t        |   |f||g d
g||d	|	gd|}
||
z   S |S t        |   |f||g d
g||d|}
||
z   S )Nr   rf   searchr`   )r5  rf   rF  )r5  rf   rG  )ri  re   rm   r   slicer   r   )r5  r  rF  rh  )rN  r/   rj  rm  )r2   rk  ri  re   rm   r   rr  r4   epicsend_cnt	not_epicsr5   s              r6   parent_task_options_listz CmfTask.parent_task_options_list0  sA    F]..{DA{C1B1B;1OPQF zz(D)t%GIqrsF*+> Um39:\2]fl4<EUMSU AhU+G{!G67J pZg8>?b7c7=YZ\cXdphnp	 y   23F \Vc8>?b7c7=\TZ\I y  r7   c           	         |sg }|dg dg dgg}|r(|j                  dd       r|dd|j                  d      gg}|j                  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 )Nr`   )
cmf_hiddenrf   F)rx  rf   Nr   rf   rq  r   r  r  r8  r  r  rD   )rN  rE   CmfComponentr0   )r2   rk  ri  re   rm   r   r4   rq  s           r6   components_options_listzCmfTask.components_options_listN  s     F4!;=VWX]..{DA{C1B1B;1OPQFHd+1VHA?67VWX^W__`TaBbfmovz{  }C  |D  DE  yF  fG  HF ""''bvfxb[abbr7   c                     |sg }|g dg}|j                  dd       }|s*|r(|j                  dd       r|dd|j                  d      gg}d|d<   t        |   |f||||d|S )N)r5  rf   r6  rq  r   rf   Tinclude_hiddenrh  rN  r/   rj  )	r2   rk  ri  re   rm   r   r4   rq  r5   s	           r6   gantt_project_options_listz"CmfTask.gantt_project_options_lista  s     FEFHd+-M,=,=k4,P{C1B1B;1OPQF#' w)*=  W]cirx  DL  W  PV  W  	Wr7   c                     |sg }|rM|j                  dd       r;|j                  dd       r)|dd|j                  d      gdd|j                  d      gg}t        |   |f||||d|S )Nr   rf  rf   rh  r}  r2   rk  ri  re   rm   r   r4   r5   s          r6   request_type_option_listz CmfTask.request_type_option_listq  s    F]..{DAmFWFWXgimFn{C1B1B;1OPSbdgiviziz  |K  jL  SM  NFw)*=  W]cirx  DL  W  PV  W  	Wr7   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        |    |f||||d|S )	Nr   rh  )r  affected_versionsrZ  rZ   r  r0  request_type)	rm  releases_options_listro  rv  rz  r~  r  r/   rj  r  s          r6   rj  zCmfTask.field_options_listy  s    '))3))*=  W]cirx  DL  W  PV  W  W"GG,3,,-@  ZP]flu{  GO  Z  SY  Z  Z+--3--.A  [Q^gmv|  HP  [  TZ  [  [-//3//0C ZS`io5;hZRXZ Z,..3../B ZR_hn5;hZRXZ Z/113112E ^Ubkq9?(^V\^ ^.0/3//0C ZS`io5;hZRXZ Z w)y/<VTZemyqwy 	yr7   T)
system_jobc           	      0   t        d|  d|        |  d| }t        j                  |j                  d            j	                         }	d|	 }
t
        j                  j                  |
ddg      }|rz|j                  d	k(  rGt        d
       |j                  j                         |_        |j                  j                          t
        j                  |d      j                          nd}|r"t
        j                   j                  |dg      }d}|rt
        j                   j                  |      }d}|r)t"        j$                  j&                  j)                  |      }t        d|j*                   d|j,                   d|        t
        j                  |
| | d|xs d ||||      }|j                  j                          |j                          t        d|j,                   d|j.                   d       |j.                  j0                  S )u  
        Метод для автоматического создания задач.
        Переоткрывает задачу, если такая уже есть закрытая.
        Уникальность задачи определяется по topic + text.
        Дополнительную, переменную информацию, например параметры запроса, можно передать в extra_text
        z
Auto task z, info: /zutf-8zAuto-r   r  )r=   rm   r   zAuto task reopenu'   Переоткрываем задачуr7  Ndefault_projectr  zNew auto task for r   z
) project 
r  )r=   r   r8  r   r
  r   rN   r   )r  hashlibmd5encode	hexdigestrE   r   rN  r   r  r  r  r   r   r}   rP   r  ro   rm   r
   get_obj_by_tuuid_strr   r=   rC   rs   )r   r8  
extra_textr   r  cmf_owner_idr   _kwargstask_key	task_hash	task_coder_   r   r
  rN   s                  r6   	auto_taskzCmfTask.auto_task  s    	
4&/0V1TF#KK 89CCE	I;'	~~!!y:Mx9X!Y%%1(*"mm>>@'')!!4]!^cceK$..22>K\J]2^I",,00>	F,,AA)L&{'7'7&8+:J:J9K:V\U]^_>>vR
 0b12'9x " D OO##%		
499+Qtwwiq12ww}}r7   c                    t         j                  j                  g d      }g d}g d}|rddj                  gg t	               }|D ]  }t         j
                  j                  dd|j                  gg dg      }	t         j
                  j                  dd|j                  g      }
|j                  |j                  j                  |	|
d        |S )Nr  r  )r   rb   r  r  rb   )in_progressr   )
rE   r  r0   rC   r  r   r;   r   r.   rs   )r2   re   r3   r4   personsin_progress_filtercount_filterr  resultin_progress_countr   s              r6   get_responsibles_tasks_countz$CmfTask.get_responsibles_tasks_count  s    ""''/I'JGAfii02 	cF & 4 4)4;<fg !5 ! NN((1A40S(TEfiioo?P[`/ab	c r7   c                    | j                   j                  s| j                  j                  s{| j                  j                  se| j                  j                  sO| j
                  sC| j                  j                  s-| j                  j                  s| j                  j                  sy | j                  j                  r| j                  ry | j                  j                  |       | _        y r  )r  r   rN   r5  r  r   r   r   rZ  	scheme_wfcalc_workflowr"  s    r6   r   zCmfTask._calc_workflow  s    MM$${{%%  ++}}''{{zz$$))~~(( ==## 44T:r7   c                 6   | j                   j                  sy | j                  dk(  r<| j                  j                  r&| j                  j                  dk7  rt	        dd       | j                  j                  dk(  r| j                  dk7  rt	        dd       y y y )Nr6  ua   Нельзя изменить Логический тип задачи на Гант-проектTrU   uT   Нельзя изменить Логический тип у Гант-проекта)r   r   r5  r  rk   r"  s    r6   r  z%CmfTask._calc_logic_type_change_guard  s    ))  449J9J9N9NSWSdSdShSh  mA  TAy  BF  G  $88T=N=NRf=fltxy >g8r7   c                    | j                   j                  s_| j                  j                  r&| j                  dv s;| j                  j                  dv s#| j
                  j                  r| j                  sy | j                          t        t        j                  j                  d| j                  j                  i       y )Nr5  rE  r+  r  )rZ   r   r   r5  r  r   r  r?  r  rE   r   _recalc_gantt_path_deferredrC   rs   r"  s    r6   r   zCmfTask._calc_gantt_path  s    ''OO..**.dd --115UU		$$)=)=**,fnnHHR[\`\c\c\i\iQjkr7   r+  )	only_onceonly_once_argsc                     t         j                  j                  | g d      }|sy |j                  |j                         |j                  d       y )N)rZ   rH  rS  r5  cache_branch_gantt_pathr  Tr\   )rE   r   rN  r@  rZ   rP   )r+  ts     r6   r  z#CmfTask._recalc_gantt_path_deferred  sJ     NN' 3N O	Q]]+	r7   r   c                 F   |dkD  rt        dd       |r|j                  g d       | j                  |j                  k7  r|j                  | _        | j                  |j                  k7  r|j                  | _        |j                  dk(  r|| _        d | _        n%|j                  dk(  r|| _        nd | _        d | _        t
        j                  j                  | g d	      D ]<  }d
}| j                  dk(  r| |_        | j                  |_        d}nx| j                  dk(  r| |_        d |_        d}nX|j                  | j                  k7  r| j                  |_        d}|j                  | j                  k7  r| j                  |_        d}|j                  r@|j                  |        |j                  j                  |j                  j                  k7  rd}|r|j                  d       |j                  r|j                  | |dz          ,|j                  |        ? y )Nd   uM   DEV: Защита от рекурсии: _recalc_gantt_path: if r_count > 100TrU   )rH  rS  r5  r0  rG  rF  )r  rH  rS  rZ   r5  r  r0  rN   rZ   rm   Fr\   r   )rZ   r_count)rk   ri   rH  rS  r5  rE   r   r0   r  r?  r  r  r  rP   r@  _check_relations)r   rZ   r  ch	need_saves        r6   r@  zCmfTask._recalc_gantt_path  s   S=emqr##$[\yyK,,,',,	+"8"88"-"8"8''+<<"- 	))[8'	 DI"DO..%%$ @~%  	*BI  K/ $ 	""&77 $ 	77dii'"iiBG $I==DOO3$(OOBM $I!!006--11R5O5O5S5SS $I$'!!%%$	%J##D)7	*r7   c                 j   dd l }t        j                  j                  j                  j                         }t        j                  j                  t        j                  |      }| j                  |      }|j                  j                  |      D ]  }t        |      5 }|j                  |j!                               }d d d        t        j"                  j%                  |d         }	t        j'                  d|d   d|	j(                   d|	      }
|
j+                           y # 1 sw Y   jxY w)
Nr   rC   r   )rN   r   r  authoru   Вложение u    было изменено)r\  
cmf_authorr8  rN   )yamlrE   CmfRFilert   data_driverget_rdr  pathjoinconfig
DIRTY_PATHrN  io
io_iterdirr  	safe_loadreadr~   r   r}   r   rP   )r2   rY  r  rdisk
dirty_pathrA   	file_pathr   	file_dataattachr   s              r6   process_dirty_attachzCmfTask.process_dirty_attach=  s    ""..557WW\\&"3"3V<
ggg ,,Z8 	Ii 5A NN16684	5))..c	&@Q.RF''!	(@S/@Mg-h/2 ( 4G LLN	5 5s     D))D2	c                    | j                   s<| j                  dvr.d | _        | j                  j                  r| j                          y |s| j                  ddg       | j                  }|sg | _        y |j                  j                  }|t        dd       g ||j                  j                  |j                  j                  |j                  j                  |j                  j                  d| _        | j                  j                  | j                  D cg c]  }|d   	 c}v r(t        d	| j                   d
|j                   dd       | j                  |       y c c}w )Nr5  #parent_task.cache_branch_gantt_pathr|  zODEV: WARNING: _calc_cache_branch_gantt_path: if cache_branch_gantt_path is NoneTrU   )rC   r=   r   r5  rC   ul   Произошло зацикливание! Попытка добавить дочернюю задачу "uK   ", которая уже является родительской для "r  )r  r5  r  rZ   r   r  ri   rs   rk   rC   r=   r   )r   rZ   r  r  s       r6   r?  z%CmfTask._calc_cache_branch_gantt_pathM  ss    ##(9(9Aw(w+/D(**%%'CE_`a**K+-D("-"E"E"K"K"*gost()@ (..&&$$**$$**'44::	C
 ($ 77==d.J.JKQtWKK  F  GK  GP  GP  FQ Qccncscsbttvx " 	k* Ls   E&c                 h   |rt        |      n	t               }|s| j                  dg       | j                  }| j                  r || j                  D ch c]  }|d   	 c}z  }| j                  sS|rQ|j                  r ||j                  D ch c]  }|d   	 c}z  }|j                  |j                  j                         t        j                  d| j                  j                   d|        |rddddggd	d
d| gdd| ggg}d
dg}t        j                  j                  ||      D ]  }|j                  j                  j                  | j                  j                  k7  r|j                  n|j                  }|j                  j                  |v skt!        d|j"                   d|j                   dd        g dd
d| gg}g d}	t        j                  j                  |	|      D ]8  }
|
j                  }|j%                  || j                  j                  hz         : y c c}w c c}w )Nr  rC   z&cmf_task._check_relations, task_code: z, parent_tasks: r  r  zsystem.finish:startzsystem.finish:finishr`   rc   rb   ra   r/  u   Невозможно перенести задачу из-за того, что существует связь ОН/ОО у задачи "z" u?   . Удалите связь и попробуйте снова.TrU   r  )z,out_link.parent_task.cache_branch_gantt_pathz out_link.cache_branch_gantt_pathzout_link.has_child_tasksrm   re   )
gantt_path)r   ri   rZ   r  r  rI   rC   rs   rG   r   r=   rE   rw   r0   ra   rc   rk   r   _check_additional_relations)r   rZ   r  r  r  _fieldsr   r_   additional_child_filteradditional_child_fieldsadditonal_child_relationadditional_childs               r6   r  zCmfTask._check_relationso  s`   (2S_
CDE**K''#8T8T&U1qw&UUJ##22'K<_<_*`q1T7*``
NN;>>//0	88IIYZdYefg%t.CE[-\]	4.T40HIG !*-G//44GG4T Q'*||'<'<'Ms||SVS^S^77==J.  !l  mq  mv  mv  lw  wy  z~  zC  zC  yD  DC  D  LP  QQ Ed##
#

 )/(@(@(E(EMd  nE(E  )F 	b$7@@88JRVRYRYR_R_Q`D`8a	b9 'V +as   H*H/c                    |dkD  rt        dd       |rt        |      n	t               }| j                  | j                  |       g d}t        j
                  j                  | |      D ]r  }|j                  r/|j                  || j                  j                  hz  |dz   	       >|j                  |j                  || j                  j                  hz         t y )
Nr  u_   DEV: Защита от рекурсии: cmf_task._check_additional_relations: if r_count > 100TrU   )rZ   r  )r  r  r  r  r   )r  r  )rk   r   r  rZ   rE   r   r0   r  r  rC   rs   )r   r  r  child_fieldsrP  s        r6   r  z#CmfTask._check_additional_relations  s    S=w  @D  E(2S_
$*:*:zR

 ^^((T,(O 	oE$$11Z477==/=Ycjmncn1o&&53D3DQ[_c_f_f_l_l^mQm&n		or7   c                     | j                  ddg       t        j                  j                  dd| j                  gdd|j                  gg      }|s*d| _        | j                          | j                  d	
       yy)u   
        Убирает метку дерева у родительской задачи при удалении или перемещении дочерних задач
        r  r5  rZ   rf   rC   r  r  FTr\   N)ri   rE   r   r   rC   r  r?  rP   )r   rP  have_childrens      r6   r5  zCmfTask.child_task_delete  sy     	+^<=++]C4QTXZ^`e`h`hSi3j+k#(D ..0III% r7   c                 F   | j                   j                  sy| j                   j                  r| j                  ddg       | j                   j                  skd| j                   _        | j                   j                          | j                   j                  d       | j                   j                  j                          | j                   j                  rJ| j                   | j                   j                  k(  s&| j                   j                  j                  |        yyy)u   
            Рассчет has_child_tasks
            должен вызываться после _calc_parent_task
        Nr:  zparent_task.op_gantt_taskTr\   )rZ   r   rj  ri   r  r?  rP   rr   $task_has_child_tasks_is_changed_hookr  r5  r"  s    r6   r   z)CmfTask._calc_parent_task_has_child_tasks  s    
 **'';=XYZ##3337  0  >>@  %%%5  ..SSU(8(8D<L<L<P<P(P  2248 )Qr7   c                    | j                   j                  s| j                  sy | j                  r1| j                  r%| j                  j
                  j                         ry d }| j                   r| j                   j                  r| j                   j                  j                  rt        j                  | j                   j                  j                        }| j                   j                  j                  r| j                  dD cg c]  }d| 	 c}       | j                   j                  j                  }| j
                  j                  |       d|j                   d}t         j"                  j%                  | |       n|j&                  r| j(                  |j*                  k7  r|j&                  | j
                  vr|j&                  j                  g d       | j
                  j                  |j&                         d|j&                  j                   d|j                   d}t         j"                  j%                  | |       | j                   j,                  r| j                  s| j                   j,                  }|j                  d	d
g       |j                  rO|j                  j                  r7t        j                  |j                  j                        }|j                  j                  }|rR||k7  rM| j
                  j/                  |       d|j                   d}t         j"                  j%                  | |       y |j&                  r| j0                  |k7  r|j&                  | j
                  v rn| j
                  j/                  |j&                         d|j&                  j                   d|j                   d}t         j"                  j%                  | |       y y y y y y y y c c}w )N)r  r   ordernor]  rJ  r5  zresponsible.primary_role.uU   SimpleLogic: Задача добавлена в структурный список "uG   " т.к. он указан в должности исполнителяr7  u>   SimpleLogic: Задача добавлена в список "r  u   " т.к. он является Структурным проектом Главной роли ответственного по задачеz"primary_role.structural_project_idz$primary_role.structural_project_listuS   SimpleLogic: Задача убрана из структурного списка "uX   " т.к. он указан в должности прошлого исполнителяu<   SimpleLogic: Задача удалена из списка "u   " т.к. он является Структурным проектом Главной роли прошлого ответственного по задаче)r   r   r   r   r   r   r  r=  structural_project_idr   r  structural_project_list_idri   structural_project_listr   r   rE   r}   r;  r  r   rC   r  r  rN   )r   append_structural_project_listr>  r   r  old_responsibleremove_structural_project_lists          r6   r  zCmfTask._calc_structural_list  s   **4;;;;4..%%**,)-& 0 0 = =$BRBRB_B_BuBu!$!6!6t7G7G7T7T7j7j!k,,GG   L "a$=aS"A "  261A1A1N1N1f1f.

!!"@At  vT  vY  vY  uZ Zi j	!!334i3P#00T^^GYG\G\5\)66$**D&33?? A  JJ%%&8&E&EF"abt  cB  cB  cG  cG  bH H55G5L5L4M NR!SI %%77t)7T"..22O'')MOu(vw++0L0L0b0b%(%:%:?;W;W;m;m%n"1@1M1M1e1e.16TXv6vJJ%%&DE"v  xV  x[  x[  w\ \~ !I%%77t)7T'44HZ9Z)66$**D

))*<*I*IJ&cdv  eD  eD  eI  eI  dJ J99K9P9P8Q Rg%h	 ));;4i;X E :[4 1c+ )4="s   
O=c                    | j                   sC| j                  j                  s-| j                  j                  r| j                  j                  y | j                  rt        | j                  j                  t        j                        r_t        j                  | j                        }| j                  j                  )|j                  j                  |j                  | _        y y y y y r  )r   rN   r   r  rs   r   rE   r   r   r  r   default_agile_story_pointsr2  s     r6   r  z CmfTask._calc_agile_story_points  s    t{{55$:Q:Q:\:\aeaxaxa~a~  bG;;:dkk&7&79J9JK++DNN;G&&,,49[9[9a9a9m*1*L*L' :n4 L;r7   c                     | j                  g d       t        | j                        xs t        | j                        | _        | j                  j
                  r| j                  d       y y )N)r   has_related_tasksin_tasks	out_tasksTr\   )ri   rm  r  r  r  r   rP   r"  s    r6   has_related_tasks_hookzCmfTask.has_related_tasks_hook  sR    PQ!$T]]!3!Js4>>7J!!,,III% -r7   c                 (   | j                   j                  sy | j                  dg       | j                  r0| j                   | j                  j                  k7  rt        dd       | j                  j                  ddg       | j                  j                  r-| j                  j                  | j                   j                  k(  rM| j                  j                  s6| j                   | j                  _        | j                  j                          y y y )Nzbp_gantt_task.sched_worku   DEV: FATAL: нельзя изменять поле estimate_work, когда существует базовый Гант-планTrU   r  
const_work)
r  r   ri   bp_gantt_taskr  rk   rr   r  r  rP   r"  s    r6   r  zCmfTask._calc_estimate_work  s    !!,,456!!T%7%7%B%BB  _  gk  l 	&&l'CD!!,,0B0B0M0MQUQcQcQgQg0g%%00040B0B""-""'') 1 1hr7   c                    | j                  g d        | j                  d
i |}t        j                  j                         }|j                  dz   |j                  d      z   |_        | j                  r| j                  |_        d|j                  _        |j                          |j                  d       t        j                  j                  |d| j                   d| j                          t        j                  j!                  | dd      D ]S  }||d	<   |j#                  |      }t        j                  j                  |d| j                   d| j                          U |j$                  j&                  S )u    Создание задачи из шаблона
        :param self: Шаблон документа
        :param params: Параметры для шаблона
        :return: Идентификатор новой задачи
        )tmplt_document.textr   r  r   z%d.%m.%YTr\   u0   Задача создана из шаблона r7  )rZ   r   include_templatesrZ   rD   )ri   create_from_templater   r   r   strftimer   rN   r   r   rP   rE   r}   r;  r=   r   r0   r   rC   rs   )r   r  new_tasknow_datechild_tmpltchild_task_ids         r6   r   z!CmfTask.create_task_from_template-  s    	  	 -4,,6v6 $$((* +h.?.?
.KK ::!ZZHN%)"**,%++8Dtuyu~u~t  @A  BF  BK  BK  AL  CM+  	N ">>..4Tei.j 	WK$,F=!'AA&IM//}M}  C  H  H  ~I  IJ  KO  KT  KT  JU  LV/  W		W {{   r7   c                 f    | j                  dg       | j                  dk(  ryt        |          S )uB    Шаблон уведомлений для разных workflow r5  r  ztask.ticketzhelpdesk_mail_notification.html)ri   r5  r/   +get_default_mail_notification_template_namer   s    r6   r  z3CmfTask.get_default_mail_notification_template_name`  s6     01-4wBDDr7   c                 \   | j                   r4t        j                  j                  | j                  j
                         y | j                  | j                         t        j                  j                  | j                  j
                  xs d      |d<   | j                  xr  | j                  j                  j
                  xs d|d<   |dxx   ddj                  | j                  D cg c]  }t        |j                  xs d       c}      z   z  cc<   t        | @  di |S c c}w )Nr  obj_result_textobj_responsible_namesr   rD   )rF   rE   CmfFullSearch
mark_cleanrC   rs   ri   full_search_preload_fields
strip_htmlr  r   r   r  rG  rJ   r/   full_search_index)r   r4   rr5   s      r6   r  zCmfTask.full_search_indexg  s    ==  ++DGGMM:889$*$8$8$C$CDDTDTDZDZD`^`$a !*.*:*:*Zt?O?O?T?T?Z?Z*`^`&'&'3VZVdVd:eQR3qvv|;L:e1f+ff'w(2622 ;fs   , D)c                 <    | j                   ry t        |   |i |S r  )rF   r/   mark_full_searchr  s      r6   r  zCmfTask.mark_full_searchs  s"    ==w'888r7   c                     |t         j                  }n0t        |t              r t        j
                  j                  |      }t        j                  j                  | |||||      }| j                  d|       |S )Nr  )
start_dater
  r  )r  )
rG   rV  r   rJ   rE   r  rN  rV  timetracker_task_change_timer   )r   r  r  r8  dater
  r  s          r6   r%   zCmfTask.timetracker_change_timey  s    I	3'((,,	,:I$33PPQUWaBTVZgkLU Q W 	-=PQ""r7      )r  r  r   c                 B    t         j                  j                  |        y r  )rE   r   _recalculate_codes)r   r  s     r6   recalculate_codes_celeryz CmfTask.recalculate_codes_celery  s     	))*5r7   c                     d}d}	 t         j                  j                  dd| gddg|||z   gdd      }||z  }|sy |D ]3  }|j                  s|j	                  d       |j                  d	       5 t                y)
Nr      TrL   rf   r=   )re   rm   rr  r[   r*   )from_recalculater\   )rE   r   r0   rL   
_calc_coderP   commit_with_event)r   rg  limit
task_slicer_   s        r6   r  zCmfTask._recalculate_codes  s     ,,!3
3!6*%'l $# - J JA" *||6		D	)	*
 ! r7   c                    t         j                         5  t        j                  j	                  |       }|st        d       	 ddd       yt        d|        t        j                  j                  |dg      }t        dt        |              d t        |fd	
      }d}|D ]  }|dz  }t        d|        |r5t        j                  j                  |      D ]  }|j                           |j                  j                  j                  d      d    d| }t        j                  j                  dd|gd      rft        d| d       |dz  }|j                  j                  j                  d      d    d| }t        j                  j                  dd|gd      rf||_        |j!                  d         	 ddd       y# 1 sw Y   yxY w)u  
            Метод для ручного запуска.
            Пересчитает номера в кодах задач начиная с единицы.
            ! Прошлые коды задач не сохраняются
            ! Пошлые коды задач удаляются
            Если код занят задачей из другого проекта - он пропусается
        r  u   Проект не найден!NuY   Удаляем историю выдачи кодов задачам из проекта r=   )rL   rm   u   Всего задач: c                 (    	 t        |       S #  Y yxY w)Nr   )r   )rg  s    r6   tryintz:CmfTask.reindex_project_tasks_code_numbers.<locals>.tryint  s    q6Ms   
 c                 `     | j                   j                  j                  d      d         S )Nr   r  )r=   rs   
rpartition)r  r  s    r6   <lambda>z<CmfTask.reindex_project_tasks_code_numbers.<locals>.<lambda>  s&    qvv||?V?VWZ?[\]?^8_ r7   )r   r   r   u'   Обрабатываем задачу: )r_   r   rf   Trd   u   Код u    занятr\   )r  disable_notifyrE   r   rN  r  r   r0   rm  sortedr&  ru   r=   rs   r  r   rP   )	r   with_history_deleterL   r  rg  r_   histnew_coder  s	           @r6   "reindex_project_tasks_code_numbersz*CmfTask.reindex_project_tasks_code_numbers  s    ##% "	*''++z+:G78	"	* "	*
 mnumvwx++GVH+MI+C	N+;<= y._`IA! *Q?vFG& & 9 9 > >D > I && #iioo88=a@A1#F//44VS(<Sei4jGH:[9:FA"&))//"<"<S"A!"D!EQqcJH //44VS(<Sei4j
 %			D	)*'"	* "	* "	*s   /GE"G1GG <   )r  soft_time_limitr  r   c            	      T   t         j                  }d}d}|j                  ddg      D ]  }|dz  }|j                  dd|g      }|j                  |k7  r|dz  }t
        j                  d	|j                   d
| d|j                          ||_        |j                  d       |j                  j                  |j                  j                  d}t        d|j                   |       t        d|       |dz  dk(  st                 t
        j                  d| d| d       |S )u   Актуализация кеша кол-ва задач в епике (нужно ли для подпроекта? Вроде как нет).r   rF  r  )r5  rm   r   rZ   rf   r  zUpdate cache_members_count z -> r   Tr\   )node_idelements_countztree-node-count-changes-ztree-node-count-changesr  zRecalculate r  z lists caches)rE   r   r0   r   r  rG   r   rC   rP   rs   cmf_emit_event
cmf_commit)r  r2   total_count
calc_countcmf_epic
real_count
event_datas          r6   r  zCmfTask.recalculate_cache  s0    nn
kC\B]^ 	H1K=#x*HIJ//:=a
5h6V6V5WW[\f[gghiqitithuvw3=0 -)1):):hNnNnNtNtu
!9(++GT!8:FC1$	  	
,zl!K=FGr7   	recursionr  c                    t               }| j                  g d       | j                  r.|j                  | j                  j	                  |dz               }t        |   |d|i|j                  |      S )N)zfollowers.personzfollowers.person.cmf_deletedzfollowers.person.does_not_workzfollowers.notify_volumezfollowers.follow_childrenr:  rZ   r   r'  r(  )r   ri   rZ   unionget_all_followersr/   )r   r(  r3   r4   r   r5   s        r6   r+  zCmfTask.get_all_followers  su    e p 	q))D,,>>UV>WXCw($N)NvNTTUXYYr7   inline_save)tmp_objcreate_formui_form_moderm   c                     | j                   |g ddd|}|j                  r/|j                  j                  dk(  rd}t        |   |||||d|S |xs |j
                  }t        |   ||||d|S )N)r   r  zproject.ui_form_schemezproject.cust_field_conf_schemezproject.logic_prefixr-  rF   r  T)rm   r[   r[  r,  )r-  r/  r.  rm   )r/  r.  rm   )r   rL   r5  r/   r&   rF   )r2   r-  r.  r/  rm   r3   r4   r5   s          r6   r&   zCmfTask.ui_get  s    
 #(( S !	, %+	,
 ??w;;?TT(L7>4|alu{  G  @F  G  G!5W%5%5w~t,K`fqjpqqr7   c                     t         |   |      }t        |dd       rXt        j                  j                  |j                  j                        }t        j                  j                  |      |_        |S )Nrr   r  )r/   get_automation_ui_formr  rE   r6  r   rr   rC   )r2   rA   ui_formrr   r5   s       r6   r2  zCmfTask.get_automation_ui_form  sc    '05 3."//448I8I8L8L4MM$*$7$7$N$N}$]G!r7   
ui_form_idc                 @    t         j                  j                  |      S r  )rE   	CmfUiFormget_ui_group_fields)r2   r4  s     r6   _get_ui_group_fieldszCmfTask._get_ui_group_fields  s    33J??r7   c                 b   t         j                  t        |j                              }|xs |j                  }|ra|j
                  dk(  rR|sP|j                  rDt        j                  j                  |j                  dg      }|j                  r|j                  }t        | 1  |||||      S )Nr[  zui_form_view_inner.ui_form_jsonr  )tmp_is_public_formtmp_ui_view_formr.  r3  )r   r  rJ   r   rF   r5  request_type_idrE   CmfSDeskRequestTyper   ui_form_view_innerr/   _build_ui_form)	r2   r-  r:  r;  r.  r3  tmp_projectr  r5   s	           r6   r?  zCmfTask._build_ui_form  s     ++C0B0B,CD!5W%5%5;337LL w66%99>>..8Y7Z  ?  \22*==Gw%(:-;PW & Y 	Yr7   c                 H    t         j                  j                  ddgd      S )u   
        Экран по умолчанию если нет никаких правил и схем экранов

        Returns:
            CmfUiForm: системный экран по умолчанию
        zui_form.task:defaultui_form_jsonT)r=   rm   cache_inmemory)rE   r6  rN  r"  s    r6   _get_default_ui_formzCmfTask._get_default_ui_form!  s'     ##)?HXim#nnr7   )copy_attachmentscopy_relationscopy_subtaskscopy_alldeferred
new_parentlevel
copy_listsr   rE  rF  rG  rH  c       	            |rP|sN|r|j                   j                  nd }t        | j                  | j                   j                  ||||||d       y t        j                  d| j                    d|        |rd}d}d}d}	| j                  g d       t        |    |
||d|}| j                  s(|j                  j                  d	      |_        d |_        t        j                  j!                  d
d      }|rdd|gg}t        j"                  j%                  |dd| ggz   dg      D ]+  }|j'                         }||_        |j+                  d       - t        j"                  j%                  |dd| ggz   dg      D ]+  }|j'                         }||_        |j+                  d       - | j                  s&t        j#                  | ||      j+                          | j.                  j0                  re| j.                  j2                  r| j.                  j2                  }n| j.                  j4                  }|j4                  xs d|j                  z   |_        |j6                  r	|sd|_        | j9                  ||       |r||_        d|_	        |	r0|j<                  D cg c]  }|j>                  dk7  s| c}|_        ng |_        d|_         d|jB                  _"        |j+                          |rt        jF                  j%                  dd| gd      }|D ]Z  }| j                  r|jH                  j                  }n|jH                  j                  dz   }|j                  ||||||||dz          \ |dk(  r|jJ                  jM                          t        t        jN                  jP                  dtS        |j                         i       | jT                  r| jW                  |       |S c c}w )N)r+  r   rE  rF  rG  rH  new_parent_idr  zcopy_task: task_id: z	, level: T)**zattachments.urlra  r   rG  rF  r  r  zattachments.url_previewzattachments.url_preview_imgr  r  ztmplt_document.text_renderrS   )r   rE  rq  r  zsystem.clone)r=   rC  relation_typer  ra   rb   rO  r/  )from_task_copyrc   )ra   rc   rP  r  Fr   rZ   )re   r  u    Копияr   )r   copy_attachmentrF  rG  rH  rI  rJ  rK  r   r+  ),rC   rs   r  copy_task_with_subtasksrG   r   ri   r/   r   r   r  r  r  r{  rE   CmfRelationTyperN  rw   r0   clonera   rP   rc   tmplt_documentrj  text_renderr8  r  _clone_op_gantt_taskrZ   r   r   r   r  r   r   r   rr   task_copy_hookr|   r  rJ   rS   _copy_checklists)r   r   rE  rF  rG  rH  rI  rJ  rK  rL  r3   r4   rN  new_obj
clone_typer  rW  new_relation
tmplt_textrA   subtasksr   subtask_namer5   s                          r6   r   zCmfTask.copy+  s    3=JMM//4M!,,#ww}} (8&4%2 (%2 	&twwiy@A#!N MJ 	 ] 	^ ',4BR]V\]$--@@V@TGN!%G++//^TX/Y
%tZ89G"4499ZY]_cLdKeAeBF : I 7'~~/(/%!!!6	7
 #4499YX\^bLcKdAdBF : I 7'~~/'.$!!!6	7
 $$dGS]$^cce
 **""..!00<<
!0055
#LL.B*2B2BBGL""=&+G#!!':6",G"'G,3MM_SS=R=RV^=^S_GMGM'+$~~**=$2Mae*fH# ###*<<#5#5L#*<<#5#5#EL%$4#1"/%%&!)  	  A:!!002f55IIS\^abiblbl^mRno??!!'*C `s   'O5<O5c                 J    | j                   D ]  }|j                  |        y )Nrg   )rS   r   )r   rN   r)  s      r6   rZ  zCmfTask._copy_checklists  s#     	*INN&N)	*r7   u!   Копирование задач)r  r  descriptionshow_bg_progressbarc           	          t         j                  j                  dd| g      }|j                  |j	                                t         j                  j                  |      }|j                  ||||||d       y )NrC   rb   r  r  T)r   rE  rF  rG  rH  rJ  rI  )rE   r   rN  ri   rj   r   )	r+  r   rE  rF  rG  rH  rN  r_   rJ  s	            r6   rS  zCmfTask.copy_task_with_subtasks  ss     ~~!!$g)>!?1134^^''='9
		t.>~ -Zbf 	 	hr7   c                    |j                   j                  dg       |j                   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                   j!                  d       y )NrO  r   z0.00Tr\   )rr   ri   rU  r  agregat_workr  actual_durationactual_completeactual_myself_workactual_start_dateactual_finish_dater   actual_costactual_myself_costr_   rZ   rP   )r   r[  rJ  s      r6   rX  zCmfTask._clone_op_gantt_task  s   ))4&1 ' 5 5 ; ; =&&7+@+@+M+M12G!!.,-)01-01-34026/370,3FO)3:6?0%,"0:G!!-""T"2r7   c                     | j                  dg       | j                  dk(  rd| j                   d| j                   S t        |   S )Nr5  rG  zproject/r  )ri   r5  r0  r=   r/   hrefr   s    r6   ro  zCmfTask.href  sH    .)* 11dll^1TYYK88w|r7   c                     t        t              }d}d}	 | j                  |g d||z  |dz   |z  g      }|D ]*  }|j                  D ]  }||j                  xx   dz  cc<    , t        |      |k  r	 |S |dz  }g)Nr   i  )--rC   zlists.idr   )re   rm   rr  )r   r   r;   r   rC   rm  )	r2   re   r  r  page	page_sizer  r_   r  s	            r6   r   zCmfTask.count_tasks_by_lists  s    S!			&>tI~X\]^X^`iWiFj " lI! *!ZZ *E588$)$** 9~	) AID r7   c                    | j                   s| j                  S | j                  dg       t        j	                  | j                         }| j
                  r$| j
                  j                  j                          |rh|j                  r\| j
                  rP| j
                  j                  r:|j                  j                  dz   | j
                  j                  j                  z   S |j                  j                  S )Nzlogic_type.obj_code_prefixr   )r   code_prefixri   r   r  r   obj_code_prefixr  task_code_use_logic_type_prefixtask_code_prefixrs   r2  s     r6   get_code_prefixzCmfTask.get_code_prefix  s     ###678 ''8 ??OO++002 w>>4??#B#B//55;doo>]>]>c>ccc''---r7   c                    t         |          }dd l} |j                         }d}d}t        j                  j                  dd|gd      r|dz  }t         |          }||k  sJ d| d	| j                   d
        |j                         |z
  }|dkD  rGt        d|dd| j                   d| j                   dd| j                  v xr | j                   d	       t        j                  j                  dd|gd      r|S )Nr   i'  r=   rf   Trd   r   u8   Превышен лимит поиска кода limit=z model=uA   , возможно надо отключить def gen_code: passz$!!! --- gen_code::duration too long z.1fz sec, r   z, r   )r/   gen_codetimerE   r&  r   r   r  rC   rm   r=   )r   r=   r|  startr  rg  durationr5   s          r6   r{  zCmfTask.gen_code  s/   w!		'',,VS$4GY],^FA7#%Du9 a XY^X__fgkgvgvfw x` a a9 tyy{U*H!|:8C. I($''"f6K5ZQUQZQZ4[[\^_ '',,VS$4GY],^ r7   c                    | j                   r/| j                  j                  s| j                  j                  s|sy | j                   st        |           y | j                   r| j                   j                  d      ry d }d }| j                  rt        j                  | j                        }| j                  j                  rI| j                  j                  r3t        j                  | j                  j                  j                        }|r| j                         }| j                   j                  j                  | d      r7| j                   j                  j                  d      |j                  d      k7  r| j                   j                  }|rHt        j                   j#                  |      s(t        j!                  || |      }|j%                          d| j                  _        t        |           y | j                  j                  r| j                   j                  j                  | j                          d      s| j                   j                  }| j&                  sJ|rHt        j                   j#                  |      s(t        j!                  || |      }|j%                          d | _         t        |           y | j                  j                  r|r|j(                  r| j                   j                  j                  | j                          d      s| j                   j                  }| j&                  sg|ret        j                   j#                  |      sEt        j!                  || |      }| j                  j                  r||_        |j%                          t        |           y y y y y )NzA-r   )r=   )r=   r_   rL   T)r=   rL   r   r   r/   r  r  r   r   r  r  rC   ry  rs   r   rE   r&  r   rP   r   rw  )r   r
  rL   r  
new_prefix	prev_codecode_historyr5   s          r6   r  zCmfTask._calc_code  s   		||&&)) yyG 
 99--d3??++DOO<G<<""t||'7'7//0@0@0C0CDK--/J99??--A.>?499??CXCXY\C]akaqaqruavCv IIOO	!4499y9I'-'@'@iVZdk'@'l$))+-1*"$ <<""499??+E+EI]I]I_H``aFb+c 		I;;9005595E#)#<#<)RV`k#<#lL %%'DIG  ??%%;;		22d6J6J6L5MQ3OP IIOO	{{y!4499y9I'-'@'@iVZdk'@'l<<226AL3$))+"$ Q <  &r7   r  c                    |sg }|sg } | j                   |||d|}g }|D ]&  }	 |j                  d       |j                  |       ( |S # t        $ r Y 6w xY w)Nr  T)TEXKOM_skip_failread_audit)r0   _acl_check_readr   CmfPermissionError)r2   rm   re   r3   r4   res_uncheckedr   r  s           r6   r'   zCmfTask.public_listF  s{    FF $vfOO 	A!!T!B

1		 
 & s   #A	AAc                 6    d|d<   d|d<   t        |   di |S )NFwith_parent_ownerinherit_executorsrD   )r/   r   )r   r4   r5   s     r6   r   zCmfTask.all_relation_personsY  s.     ',"#&+"#w+5f55r7   c                 &   | j                   j                  j                          | j                   j                  j                  }| j	                  | j
                  j                  |        | j	                  | j
                  j                  |       y r  )rr   r  r  rs   #_update_actual_work_for_all_parentsrZ   r  r  )r   actual_work_times     r6   _update_actual_workzCmfTask._update_actual_worka  so    &&++---99??001A1A1E1EHXGXY001A1A1E1EGWXr7   c                 P   |sy |j                   j                          |j                   j                  j                          |j                   xj                  |z  c_        |j                   j                  dk  rd|j                   _        |j                   j                  d       y )Nr   F)
user_input)rr   r  r  rP   )r   r_   r  s      r6   r  z+CmfTask._update_actual_work_for_all_parentsg  s    !&&++-&&*::&))A--.D*51r7   c                 z    | j                   j                  dd      }|s| j                   j                  d      S |S )Nr  Fr  rq  )r  r  )r   default_statuss     r6   _get_default_open_statusz CmfTask._get_default_open_statusr  s:    99fZ_9`==33F;;r7   z@hourly)r  r  schedulec                     t         j                  d       t         G d d             g d dfd} dg dg dgg dgg d	d
dt        j                  j	                  t        j
                  j                        gg}t        j                  j                  |g d      D ]  }|j                  r|j                         }t         j                  d|        |j                  j                  r|j                  j                  |_        |j                         |_        |j"                  j%                          |j&                  |_        d |_        d |_         | |       |j-                          |j/                  d       t         j                  d|        |j0                  dv r|j*                  j2                  dkD  rl|j&                  j4                  }|j-                          |j&                  r |j&                  |j*                  kD  r||_        |j*                  j2                  dkD  rl|j                  j                  r|j                  j                  |_        |j6                  r+|j                  j4                  j9                  dd      |_        |j                         |_         | |       |j                   j:                  dk(  s0|j                         |_        |j"                  j2                  dk  r|j"                  j%                           | |        r<dj=                  dj?                  d D                    }t@        jC                  |       ry )Nz(Run CmfPerson.cron_celery_check_periodicc                   ,    e Zd ZU eed<   eed<   eed<   y)8CmfTask.cron_celery_check_periodic.<locals>.UserErrorMsg	task_namer  err_textN)__name__
__module____qualname__rJ   __annotations__rD   r7   r6   UserErrorMsgr  }  s    NNMr7   r  c                    	 | j                          t                y # t        $ r}t        j	                  d| j
                   dt        j                                  | j                  j                  | j
                  j                  |      }j                  |       t                Y d }~y d }~wt        $ rM}t        j	                  d| j
                   dt        j                                 |t                Y d }~y d }~ww xY w)Nz8CmfPerson.cron_celery_check_periodic UserError for task z:
z<CmfPerson.cron_celery_check_periodic not UserError for task )rP   r!  CmfUserErrorrG   r   r=   	traceback
format_excr   rs   r   cmf_rollback	Exception)r_   r   errr  not_user_erruser_errors_aggs      r6   
_task_savez6CmfTask.cron_celery_check_periodic.<locals>._task_save  s    		 RSWS\S\R]]`ajauauaw`xyz"499??DIIOOQG&&s+ VW[W`W`Vaadeneyeye{d|}~ s"    	D	BB00D	<ADD	r`   )status.coder  r  )r   r  r  )period_create_newrf   T)rt  r  Nperiod_next_datez<=r   )r}  rq  r  r  r  period_clear_checkboxr8  r  r  rt  r   r   r  r   rm  r   r/  z6CmfPerson.cron_celery_check_periodic: create new task Tr\   z2CmfPerson.cron_celery_check_periodic: reopen task )r   r  r   ztox-checklist--checkedr  pauseus   Ошибки при шедуллинге задач из-за пользовательских тригеров:
{}r  c              3   p   K   | ].  }d |j                    d|j                   d|j                   d 0 yw)zTask name: "z"; Task code: "z"; Error text: "r  N)r  r  r  ).0r  s     r6   	<genexpr>z5CmfTask.cron_celery_check_periodic.<locals>.<genexpr>  s<      twl3==/O_`c`l`l_mmnos   46)r_   zmodels.CmfTask)"rG   r   r   r   r   r   r   rE   r   r0   r  r  rV  rj  r8  r  r  r   r   r   rt  r  _cacl_next_periodrP   r   r  rs   r  r  r=   formatr  r  admin_alert)	r  r  r_   r  old_deadliner  r  r  r  s	         @@@r6   cron_celery_check_periodicz"CmfTask.cron_celery_check_periodicx  s    	
:;		 	 
	
 13	$ 57ab7 3&h.?.?.C.CxGXGXG\G\.C.]^` NN''w @L' M 1	%D %%446PQYPZ[\**66$,$;$;$@$@HM"*"C"C"E##++-$(MM!+/(,0)8$&&(		D	)LTFST))-DD //33a7'+}}':':..0==T]]T=R=R-R,8DM //33a7 **66$($7$7$<$<	11$(IIOO$;$;<TVX$Y	"&"?"?"ADKt$[[%%0 #'"?"?"ADK**Q.//1t$c1	%z  I  P  P		  |K C
 $  r7   c                    | j                          | j                          | j                          | j                          | j	                          | j                          | j                          | j                  j                  r| j                  j                          | j                          t        | 4  |i | y r  )rC  r   r   r   r   r>  r  rZ   r   rr   r  r  r/   _save_importr  s      r6   r  zCmfTask._save_import  s    &&( ..0))+""$&&??A$$&d-f-r7   c                     t         |   |      }|sD|j                  t         |   g d             |t        j                  j                  g d      z  }|S )N)r  r  r  )rP  rc   ra   )r/   import_shop_fieldsr  rE   rw   )r2   fields_namer   r5   s      r6   r  zCmfTask.import_shop_fields  sX    g(5 JJ* ,  6++>>?ghhC
r7   c                     |sTg d}t         j                  j                  j                         D ]%  }|j	                  d      s|j                  |       ' t        |   ||||      S )N)=rC   r=   r   r8  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.loginr  zattachments.namezactivity.namez
lists.namezgit_repos.namezgit_branches.namezgit_merge_requests.namezgit_commits.namezrequest_type.namerz  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   rZ   r  rh  r3  rH  rS  rH  r{  r  r  rL  r   r  r  r  r  zop_gantt_task.actual_costzop_gantt_task.actual_completez#op_gantt_task.duration_is_estimatedr   r  cf_)rE   r   rm   r  r  r   r/   export2file)r2   field_namesbqlformat_fileinclude_archivedr   r5   s         r6   r  zCmfTask.export2file  sf    ;K( %nn3388: 3
((/&&z23 w";[BRSSr7   id_listrm   c                 .   g }| j                  dd|gdg      D ]7  }|j                  |j                  j                  |      j                         9 |r:|j                  | j                  |D cg c]  }|j                   c}|             |S c c}w )NrC   r  rq  r/  r  )r0   r  r3  r  rs   r   rC   )r2   r  rm   childrenr_   rA   s         r6   r   z$CmfTask.group_changes_list_recursive*  s    HHT4$94&HI 	HDOOD,,111@FFG	HOOC<<PX=Ycff=Ybh<ij >Zs   0B	subgroupsc                     |D ]m  } | |d   |d   |d   |d         }| j                  |      }t               |d<   |d   j                         D ]  \  }}|j                  d      s||d   |<   ! o |S )Nr   rf  rc  rL   rN   r   r  r  	ui_fieldsrequired)r?  r  r   rN  )r2   r  subgroupr-  rB  r   metas          r6   r   z%CmfTask.group_changes_required_fields3  s    ! 		CH(<"8!),!7%-o%>#+M#:<G --g6L*.&H&'$0$=$C$C$E C 
D88J'>BH./
;C		C r7   c                 *   |D ]  } | |d   |d   |d   |d         }t         j                  j                  |      |d<   |d   j                  |      |d<   t         j                  j                  |d   j                  j                        |d<    |S )	Nr   rf  rc  r  r  r  )workflow_idstatus_list)rE   CmfSchemeWfcalc_schemer  CmfWorkflowget_status_listrC   rs   )r2   r  r  r-  s       r6   r   zCmfTask.group_changes_statusesA  s    ! 	tH(<"8!),!7%-o%>#+M#:<G &,%7%7%C%CG%LH[!#+K#8#F#Fw#OHZ &,&8&8&H&HU]^hUiUlUlUrUr&H&sH]#	t r7   c                     ddl m} | j                  j                  sy  || j                  j                        | _        y )Nr   )markup_html_clean)cmf.util.cmf_clean_textr  r  r   rs   )r   r  s     r6   r   zCmfTask._clean_result_textN  s0    =**,T-=-=-C-CDr7   c                 &   | j                   r| j                  sx| j                  rk| j                  ddg       | j                  j                  }|D ]<  }|j                  dk7  s|j
                  dk(  r"| j                  j                  |       > yyyy)ux   Устанавливаем для dummy task теже спринты, что и у родительской задачиzparent_task.lists.logic_prefixz#parent_task.lists.cache_status_typer^  r   N)r   r   rZ   ri   r5  r   r   )r   parent_task_listsparent_lists      r6   r   z#CmfTask._set_lists_from_parent_taskT  s    ;;tzzd.>.>>@efg $ 0 0 6 60 /,,0CC{GdGdhpGp

!!+./ /?z;r7   r  r  c                    t         j                  j                  | dg      }t         j                  j	                  dd|g      }t         j                  j	                  dd|g      }t               }|g}	 t        j                  d|         g }t         j                  j	                  g dd	d|gg d
g      }	d}
|	D ]  }|j                  |v r#t        j                  d|j                          5|j                  |j                         |
dz  }
d}|D ].  }||j                  vs|j                  j                  |       d}0 |D ].  }||j                  v s|j                  j                  |       d}0 |s|j                  d       |
dz  dk(  r
t                |j                   s|j                  |        t                |}|sy^)u  Синхронизация изменённых спринтов у подзадач

        Args:
            task_id (str): ИД родительской задачи, у которой поменялся lists
            sprints_to_add_ids (list): ИД спринтов для добавления в lists
            sprints_to_remove_ids (list): ИД спринтов для удаления из lists
        r   r  rC   r  r  Tz)deferred_job(_sync_subtask_sprints) task:)r   r  rF   rZ   r  r  r   zjob FAIL RESURSION r   F)r  rr  N)rE   r   rN  r  r0   r   logginginforC   errorrI   r   r   r  rP   r!  r  )r+  r  r  r_   r  r  processed_task_idsprev_lvl_task_listnew_lvl_task_listsub_tasks_listrg  sub_taskr  	sprint_ids                 r6   r  zCmfTask._sync_subtask_sprints^  s    ~~!!'7)!<,,T4AS4T,U"NN//dDY7Z/[ U"VLLDWINO "#^^008`:GOa9b9^9` 1 aN A* 7;;"44MM$7}"EF"&&x{{3Q!/ 'I 6 --i8"&'
 "3 'I HNN2 --i8"&'
 6r6Q;L++%,,X6578 L!2$Q r7   forcec                    d}t        |xs g       }g }d|v rdg}|j                  d       | j                  ||z         }dt        dt        fd}ddt        dt
        dt        t
           ffd |      |z   }	 ||      |k  rt        |    d|	|d	|S t        |j                               }
d
t        |
      fg}|r|j                         \  }}|
|| }|D ci c]  }|||   
 }} |      |z   }	| j                  |	      } ||      |k  rt        |    d|	|d	| ht        |      dkD  r2|||z
  dz  z   }|j                  ||f       |j                  ||f       |d
   }||   }t        |t              r|st        |    d|	|d	| t        |j                               }d
}|t        |      k  ri }|t        |      k  rT||   }i ||||   i}||i} |      |z   }| j                  |      } ||      |kD  r|rn|}|dz  }|t        |      k  rT ||i      |z   }t        |    d||d	| |t        |      k  r|r| S c c}w )u  
        Загружает поля модели с учётом лимита PostgreSQL (макс. 1600 колонок в SELECT).
        Если план запроса превышает лимит, то он дробится по верхнему уровню,
        а в случае «тяжёлого» ключа — по вложенным под-ключам.
        Поддерживается мета-параметр '--', отключающий добавление авто/служебных полей.
        i@  rq  treer  c                     d| g}}|rR|j                         }|j                         D ],  }|dz  }t        |t              s|s|j	                  |       . |rR|S )u  
            Подсчитывает общее количество узлов в плане (все ключи и под-ключи).
            Это нужно, чтобы не превысить лимит PostgreSQL в 1600 колонок.
            r   r   )popr   r   r  r   )r  totalstackdr   s        r6   count_nodesz(CmfTask.load_fields.<locals>.count_nodes  s^    
 tf5EIIK (AQJE!!T*qQ(  Lr7   planprefixc                     g }| j                         D ]J  \  }}| | }t        |t              r|r|j                   ||dz                :|j	                  |       L |S )u  
            Превращает план (dict вложенной структуры) в список строк
            вида "field.subfield.subsubfield".
            Используется для передачи в _build_load_plan и load_fields.
            r  )r   r   r  r  r   )r  r  outr   r   pflattens         r6   r  z$CmfTask.load_fields.<locals>.flatten  se     C

 "1hqcNa&1JJwq!c'23JJqM" Jr7   )rm   r  r   r   r  )r  rD   )r0   r  _build_load_planr  r   rJ   r   r/   ri   r  rm  r  r   r   )r   rm   r  r4   LIMITincoming
meta_extra	full_planr  rulestop_keysr  r   r  subset_keysr   subplanrebuiltminner
inner_keysrg  	cur_innerik
test_innertest_wrapped
test_rulestest_rebuilt	sub_rulesr  r5   s                                @r6   ri   zCmfTask.load_fields  s    
 "% "
8JOOD!
 ,0+@+@JAV+W		d 	s 		$ 	 	T#Y 	" 	"Z/y!U*7&Ke5KFKK 	()S]#$99;DAq"1Q-K0;<1q)A,<G<G$z1E++E2G7#u,#H5HH;!#Q1$aV$aV$
 AAaLEeT*%#H5HH
 ejjl+JAc*o%	#j/)#AB!=I!=r59!=J$%z?L!(!6!CJ#'#8#8#DL"<058Y *IFA #j/) $Q	N3j@	#L9ELVL c*o%G h c =s    Ic                    | j                   j                  s| j                  syt        j                  j                  dd| j                  ggg d      }|syt        j                  j                  dd| j                  gdd|ggdg      }|D ch c]  }|j                   }}t        |      |z
  }|D ]O  }|j                  d	k(  r|j                  t        j                  k7  r0t        j                  j                  ||        Q yc c}w )
u:   Создание чек-листов из шаблоновNdefault_for_logic_typesr  )r8  
view_scoper
  r/  rN   rf   from_templater^  )r   r   r   rE   CmfChecklistTemplater0   rf  CmfChecklistrC   r	  r   r  r
  rG   r~  create_checklist)r   	templatesexisting_checklistsr)  using_templatestarget_templatestemplates          r6   r   zCmfTask._calc_checklists  s   **KK//44-td6H6H5IJ6 5 
	 $1166#tww?W@OQUW`?a?c?N>O 7 Q EXXy922XXy>O;( 	IH##y0X5G5G1K[K[5[''884H	I	 Ys   Dc                 T    | j                  dg       dt        | j                        iS )Nr  approvers_count)ri   rm  r  r  s      r6   r)   zCmfTask.count_approvers,  s)    /*+!3t'9'9#:;;r7   )F)NN)NNN)r  NNr  )NNNNN)NNNN)NNNNNN)r   )Nr   )u   ДобавленоNN)FNFN)NNcsvF)NF)r  r  r  modulesr_   rm   cmf_taskr   api_methodsservicedeskrE   CmfTaskMixinclassmethodr0   r   r;   r   r   r   r#   r   r   r   r  r  r   r  r   r#  r&  r-  r   rC  rQ  r   rX  r_  rd  r   ro  rv  rx  r  r  r  r   r  r   r  r   r  r  r"   r  r  r   r  r  rt  r  r   r3  r   r>  rM  rW  r\  rd  rj   r  r  r  r  r   r  recompileASCIIr  r  r   r  r  rP   r  r  r   r  r#  r'  rl   r+  r.  ru   r!  r2  r;  rI  r=  r3  r>  r1  r<  r4  ra  r   rm  ro  rv  rz  r~  r  rj  staticmethodcmf_deferred_jobr  r  r   r  r   r  r@  r  r?  r  r  r5  r   r  r  r  r  r   r  r  r  r%   r  r  r  r  r   r+  r&   r2  rJ   r8  r?  rD  boolr   rZ  rS  rX  propertyro  r   ry  r{  r  r'   r   r  r  r  r  r  r  r  r   r  r   r   r   r   r  r   ri   r   r)   __classcell__)r5   s   @r6   r   r      s   ,,%%..66BB



$
$
-
-
:
:
F
FG

K: (, - -
 )- . .
 )- . . % %8>@ &D9
v9\x%<P:7B(&T7%%N
 , ,4*<BJEX (DC'>@,?B,45n0$jX	'(N` )VB@2G(T
H&T5$@ 2ALF,#*8o4bK?; 
>B / / ::&MrxxXU U".>.h`W~@
 2 20GCT( 9> K$. 6; I'"H;z(

7C7C/0
VL,	  ]a"y y4 ]aS S IMPT! !: ]ac c$ ]aW W W W ]ay y0 &7;>B) ' )V  ;(zl i[A B .*b   +D'bRo(	&9$=Y~&*&'!fE
39# B6 C 6    , ** **X bTTUV W 2 23 Z Z #'U_c r r   @c @d @ @ Y Y  o o ?D\a#(55]aijw|k kt kUY k k48kZ* i[Nq  HL  Mh M h3$    .4$H%T '+D  $6Y	2 	Jr K rj.   Tcf T T: $ t   T d   	d 	t 	 	E/ 7s 7 7]a 7fj 7  7rv$s) v4 vrI4<r7   r   )'dataclassesr   r   r|  collectionsr   r   decimalr   r  r  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   typingr   r   r   r   r   r  rE   r  r  r_   rm   r   rD   r7   r6   <module>r/     s~    !   #       / 0  + # * ; 7 7XH<g!!((11>>@S@S@\@\@d@d XH<r7   