
    oi                    n   d dl Z d dlZd dlmZ d dl mZ d dlmZ d dlZd dlZ	d dl
Z
d dlmZ d dlmZ d dl 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:                  j<                  j>                  j@                  ejB                  jD                  j>                  jF                        Z#y)    N)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.pyr/   zCmfTask.list2   s*    h.w|T,V,,    c                J    |s|j                  dd       t        |   |i |S r+   )r-   r.   r   r0   s       r5   r   zCmfTask.count8   *    h.w}d-f--r6   c                J    |s|j                  dd       t        |   |i |S r+   )r-   r.   slistr0   s       r5   r:   zCmfTask.slist>   r8   r6   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   rB   r<   is_dummygskipcache_select_for_updateaddstr_calc_projectprojectcheck_project_role_accessparent_calc_default_fieldsave)r1   r2   r3   
dummy_tasks       r5   r   zCmfTask.create_dummy_taskE   s     ^^;;F;
$--
"
	%%))#jmm*<= 	  $ ?j&8&8&R&RScis  BG&R  'H $J!%J$$&&&( jmm$$r6   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 )NrE   
checklists   Не dummy task TabortTEXKOM_db_deleteparent_taskinclude_deletedr)   	only_datataskrZ   ORout_link==in_linkfilterrZ   )rM   rZ   r@   =rM   )rM   rZ   include_dummy)load_fieldssave_preload_fieldsrE   	cmf_alertrB   _delete_checklistsrD   r   r/   rY   rO   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                r5   r   zCmfTask.delete_dummy_taskb   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r6   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)rh   cloned_fromrM   
logic_type
is_changedr   responsibler   appendr   
alarm_datedatetimenowtimezoneutcset_now)r~   ldeadline_mins      r5   #_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##% 'r6   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 )NrS   TrT   Fu)   Выставлен код у dummy-task: )rB   r<   name	parent_id)save_preparerE   rj   rB   items
isinstancern   rl   
CmfBackrefr   _load_changed_fieldsis_newr<   cloned_from_idr   rY   is_templatevaluescolumn_historyr   rh   
class_nameis_nullrO   r   r   )r~   changed_fieldskvhistory_fieldsfieldfs          r5   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 )NrS   TrT   F)notifyemitaudit)#rE   rj   rB   rF   TEXCOM_ENABLE_GROWCACHE_HACKrJ   _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_checklistsrM   r   _do_parent_is_changedr.   rn   rD   CmfModelrO   r~   r4   s    r5   _dummy_savezCmfTask._dummy_save   su    }}(	2$? *.& ..0 	&&(!!""$&&(((*!;;!!&&( SZZ(($4EUZ4[[r6   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]+\ZrK   re   -cmf_created_atT)rd   order_byrZ   -)sget
project_idintr<   split)r~   
max_numberlasts      r5    _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r6   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   rr   r   redislockacquireexistsincrr   setrelease
exceptions	LockErrorrF   debugr   r   )r~   redis_dbsuffixkeylock_keyr   next_code_numberes           r5   r   zCmfTask.next_code_numberE  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   rM   rr   rD   
CmfProject_calc_list_plan_intervalr   r   rj   captionrn   rl   CmfDateTimer   plan_end_dater~   list_plan_start_date_minlist_plan_end_date_mins      r5   _calc_alarm_date_listzCmfTask._calc_alarm_date_listc  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!r6   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_idrM   
componentsrh   r   default_responsibledefault_owner	cmf_ownerrr   r   r   get_cache_projectr   )r~   r/   comprK   s       r5   _calc_responsiblezCmfTask._calc_responsible  sZ   !!,,T5H5H&&**&&tuJJ 	D''0@0@#'#;#; 	
 OO 	D''4+=+=++D4D4D'+'?'?D$%%%)%7%7DN	 !!""--=++DNN;G""#*#6#6  # >  "r6   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   rM   rr   r   r   r
  r   auto_alarm_dater  r   rF   import_moder   r~   rK   r4   s     r5   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; r6   c                     | j                   r&| j                  r| j                  j                          t	        |   |i |S N)r   r   r   r   r.   _save_templater~   r2   r3   r4   s      r5   r  zCmfTask._save_template  s7    ;;4++OO##%w%t6v66r6   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   rl   r   )r  r   r   rM   r   hasattrr   rr   
startswithr   r
  loadnewoldr.   r   )r~   tmp_activityr@   r4   s      r5   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"$ r6   c                      y r  rC   r~   s    r5   _calc_parentzCmfTask._calc_parent  s    r6   c                     | j                   j                  sy | j                  ry d| j                  j                  it
        j                  t        | j                        <   y )Nr   )	rK   r   r   r   rr   rF   deferred_update_task_projectrI   rB   r!  s    r5   _do_project_is_changedzCmfTask._do_project_is_changed  sE    ||&&;;$////8
&&s477|4r6   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   ra   r   rd   r   )rF   r$  r   rD   r|   bulk_updater}   rw   )r1   rollbacktask_idobj_datas       r5   "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 	 *,&r6   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[   rY   re   rM   rq   rd   rl   )rM   r  gantt_projectr   r
  r   main_gantt_projectrO   rq   task_parent_is_changed_hookrD   r   r/   )r~   child_tasksr^   s      r5   r   zCmfTask._do_parent_is_changed  s    ;;$++//);;%)"%(%:%:4>>%J%]%]"III%668nn))-d1KU]_nTo)p 	D{{dkk)"kk			r6   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 )NrM   logic_prefixtask.gantt_projectu   SimpleLogic: в задаче установлен проект равный проекту родительской задачиrM   text)r	  cmf_owner_assistantsr  r   z8responsible.primary_role.structural_project.default_listz1responsible.primary_role.structural_project_forceu   SimpleLogic: Задача добавлена в Структурный проект Главной роли исполнителяu   SimpleLogic: Проект сменен, т.к. в Главной роли исполнителя указано менять проект)tree_parentr   r   rY   rM   r   rh   r4  r   rD   r|   add_comment_auditrj   _node_parentri   primary_rolestructural_projectstructural_project_force)r~   	sl_reasonrM   struct_projectstruct_project_forces        r5   _HACK24052023_calc_parentz!CmfTask._HACK24052023_calc_parent4  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,,. (  ,<&r6   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)rM   sys_typerl   T)rZ   u   Скрываем задачу в дереве проекта, её дочерние элементы вставляем вместо неёr5  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_prefixr4  rD  )rh   r4  r9  )r@   get_tree_parents    r5   rK  z2CmfTask._calc_tree_parent.<locals>.get_tree_parent  s[    OO7HI'GG
3??#?#?Cc#c&s77??"r6   )r4  r   rM   rY   r9  r  rh   rD   	CmfFoldergetr   r   r   
tree_nodesr  rj   rO   )r~   childrK  s     @r5   _calc_tree_parentzCmfTask._calc_tree_parentu  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&r6   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   r4  r9  rD  r   ztask.subu2   У подзадач нельзя менять EpicTrT   u@   У подзадач нельзя менять Подпроект)r   r9  rr   r   rh   r4  rY   r   r  rG  rj   
subprojectr  )r~   tmp_tree_parents     r5   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'r6   c                     | j                   ry | j                  j                  sy t        j                  j                  |        y r  )r   r  r   rD   CmfTimeTrackertimetracker_task_change_statusr!  s    r5   _calc_timetrackerzCmfTask._calc_timetracker  s2    ;;{{%% 	<<TBr6   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   r9  r   rM   rY   	main_list_load_perm_fieldsr   rr   rD   CmfDocumentperm_has_aclr  r   perm_parent)r~   r]  r   s      r5   _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&r6   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)rB   r   r<   r   tags
is_checkedr   activity_id)r.   get_cache_fields_jsonr   to_jsonr`  ra  r   rb  )r~   retir4   s      r5   rc  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   rn   rl   r   r   )r~   r  r  w_lists       r5   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$')???r6   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   rj   r   )r~   r  r  self_plan_shifts       r5   _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 	r6   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   daysrr   rj   
_calc_name)r~   	date_diffs     r5   _calc_plan_nolistzCmfTask._calc_plan_nolistl  s    OO&&4??&&&0$$)=)==))doo@R@R.R  --4??4CWCW3W2]2]`b2b $*>*>>I#'??D !!""((I5(efOOr6   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   rl  rn  rs  r   s      r5   
_calc_planzCmfTask._calc_plan  s     

%%;;''22%%00;?;X;X;Z8 "8 tzz?djj33  !9;QR
 r6   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: Задача согласована автоматически, т.к. это Непроектная задачаr6  u   SimpleLogic: Задача согласована автоматически, т.к. согласование отключено в Fu   SimpleLogic: Выполнен сброс согласования, т.к. сменился Постановщик или Проектu   SimpleLogic: Задача согласована автоматически, т.к. постановщик - руководитель.ue   SimpleLogic: Задача согласована автоматически (опция списка r   )r   approvedr   r	  rM   rr   r   rD   r|   r:  _get_sl_optionssl_task_need_approvesl_controller_strrB   rF   current_person
cmf_import
is_definedr   sl_task_auto_approver   )r~   
sl_optionsr   comment_texts       r5   _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 &;r6   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	  r8  CmfProject:)r   r.   
get_ownersrh   r   rH   r	  r8  r   r  r  rM   r   rr   r  r/   )r~   r2   r3   ownerslstownerr4   s         r5   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|r6   c                     | j                   s9| j                  j                  r| j                  r| j                  j                  sy | j                  ry | j                  dk(  ry t        |           y rh  )r   waiting_forr   r   r.   _calc_waiting_forr   s    r5   r  zCmfTask._calc_waiting_for  s[    !!,,T5E5E&&11!!X-!#r6   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[   Только Владелец проекта может согласовать задачуrT   rp  openstatus_coderA   )rp  IN_PROGRESSapprove3_notassigneduh   SimpleLogic: Задачу переключили на Постановщика/Руководителя(u   ), т.к. не указан Будильник. Установите будильник, чтобы задача отобразилась у Исполнителяr6  uM   SimpleLogic: Задачу переключили на Исполнителя(u   ), т.к. указан Будильник.Установите будильник, чтобы задача отобразилась у Исполнителяr   r   rY   re   r   !=r   rd   um   Для закрытия задачи необходимо закрыть все дочерние задачиu_   Вы закрыли задачу у которой есть Открытые подзадачиrB   r  zchild_tasks.cache_status_typeu}   Родительская задача закрыта автоматически т.к. закрыты все дочерниеu_   Внимание! В задаче остались незавершенные чек-листы)rA   u   Спасибо! Статус установлен в "Подтверждение закрытия", для проверки постановщиком или владельцем проектаu   Спасибо! Статус изменен на «Закрыто» т.к установлен флаг «Без подтверждения».uO   SimpleLogic: Задачу переключили на Постановщика(u   ), т.к. статус=''r  uT   Нельзя брать в работу несогласованную задачу.um   Внимание! Вы взяли задачу без согласования с руководителем.u^   SimpleLogic: waiting_for  установлен т.к. статус снижен в in_progressui   SimpleLogic: waiting_for установлен т.к. статус перешел из open в in_progressu[   SimpleLogic: будильник установлен т.к. статус сменен на )?r  r   ry  r   r	  rM   r   r  osenvironrM  rz  r   rr   r  r   r
  r   approve_forapprove_for_placesl_only_owner_approver{  r   rE   r   r  rF   r}  r  rj   waiting_for_idr  r  r  r<   workflowget_default_statusstatus_typerD   r|   r:  r   ,sl_deny_closing_task_before_closing_subtaskshas_child_tasksr2  r  rl  r   r   %   sl_сlose_task_after_closing_subtasksrY   rB   rh   rO   .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_logicr@   has_unclosed_subtasks unclosed_subtasks_in_parent_taskin_review_statuss               r5   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    Сдвиньте крайний срок задачи если уверены.TrT   )r   r   r   agecmf_created_atrF   r}  r	  rr   r   r   rj   )r~   msgs     r5   _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 )@  'r6   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   Нельзя сдвигать крайний срок блокирующей задачи, обратитесь к постановщикуTrT   ut   Нельзя сдвигать крайний срок задачи, обратитесь к постановщику)rr  r  )r.   r   r  r   rM   r   r   r   rz  rF   r}  system_personr	  r8  r  r   rj   )sl_allow_executor_change_nofatal_deadlinesl_deadline_shiftr   r   r   r   r   r  r  rr   )r~   r  
days_shiftshiftr   r4   s        r5   r   zCmfTask._calc_deadline8  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   (>r6   c                    | j                  ddg       t        j                  j                  |ddg      }|| j                  v r| j                  j                  |       || j                  v r| j                  j                  |       | S )Nr   fix_versionsrB   
members.idr  )rh   rD   CmfListrM  r   remover  )r~   src_list_idr2   r3   src_lists        r5   remove_from_listzCmfTask.remove_from_list  sx    '>23>>%%k4:N%Otzz!JJh't((($$X.r6   c                     | j                  dg       t        j                  j                  |ddg      }| j                  j                  |       | S )Nr   rB   r  r  )rh   rD   r  rM  r   r   )r~   dst_list_idr2   r3   dst_lists        r5   r   zCmfTask.copy_to_list  sG    '#>>%%k4:N%O

(#r6   c                 d    t         j                  j                  |      j                  |        | S )Nr@   )rD   CmfActiveEntityFilterrM  add_active_entity)r~   	filter_ids     r5   apply_filterzCmfTask.apply_filter  s)    $$((3EE$EOr6   c                     t         j                  j                  |ddg      }|j                  r7| j                  j                  |j                         | j                  d       | S )Nr   
filter_tagr  Tr[   )rD   r  rM  r  r`  r  rO   )r~   r  active_entity_filters      r5   remove_from_filterzCmfTask.remove_from_filter  s\    %;;??	SVXdRe?f  **II1<<=III%r6   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   rY   zparent_task.nameu   Укажите from_idTrT   u   Укажите to_idu*   Не могу переместить из r   rB   rl   u5   Нельзя переместить задачу в "u/   ", так как она находится в ""u(   Не могу переместить в )rh   rj   r	   get_cls_by_tuuid_strrD   r  r  r  r  r   rY   rB   rr   r   r  rM  r   )r~   from_idto_idr2   r3   from_clsto_clstarget_tasks           r5   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r6   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)lstriprD   CmfTagrM  r`  r  r   )r~   	only_namectxr  tags        r5   _process_tag_tokenzCmfTask._process_tag_token  s    /01W,)009 mm Wo6gO+<B'?@ 9   
 			3dii'	IIS!r6   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  rD   CmfLogicTyperM  r   )r~   r  r  r  lts        r5   _process_logic_type_tokenz!CmfTask._process_logic_type_token  s    /01W,)009   $$ Wo6gO+<B'?@ 9 % 
 i DOr6   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_localra   Tr_   r   r  %loginr  T)r  r  rl  rD   	CmfPersonrM  r   )r~   r  r  r  _filterpersons         r5   _process_responsible_tokenz"CmfTask._process_responsible_token  s    /0))*;<)009!#-67a/@,BCW/):!&<=?@ !!%%W%5)%Dr6   c                 b    |j                         }|j                         }|d| d| d| fv S )Nr  r  r  )lower)r~   stringhashtags      r5   hashtag_cmpzCmfTask.hashtag_cmp+  s<    --/Qvh<3vh1VHFFFr6   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  rr  )cmfutil	RU_MONTHSr   r  r   r   r  r   r   r   r   replacemonthr   r  rr   yearr   )	r~   r  r  r  	month_idxr  r  r  r   s	            r5   _process_month_tokenzCmfTask._process_month_token1  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r6   c                 $    | j                          y)uG    Ф-я вызывается из базового класса
        N)_calc_from_namer!  s    r5   rs  zCmfTask._calc_name[  s     	r6   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+   Отсутствует имя задачи!TrT    z.,;:?!r~   r   .)r  r  r  	tags.namerE  1EpiczEpic zEpic 1rC   )!r   r   r  r`  r   rE   r  rj   rr   r   r  striplocalsr   r   r  r  r  extendrl  rstripr  
differencerh   r/   r  r4  r   rM   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                 r5   r  zCmfTask._calc_from_name`  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)rF  gantt)rE  ztask.gantt_subprojectr/   z
pfeed.basepost)r   r   r   r4  ui_view_formui_namer  r!  s    r5   r   zCmfTask._calc_ui_view_form  st    **;;  33 'D"HH &D,. &D $ 2 2 4Dr6   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   r/  rY   r4  )zgantt_project.op_gantt_taskr4  rq   r5  z main_gantt_project.op_gantt_task)rh   r/  rY   r4  r   r
  r   r0  r~   rK   s     r5   _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!r6   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  rE  rF  r5  u_   task.epic, task.subproject и task.gantt_project не могут быть без ПроектаTrT   r   )r   r   r   r4  rr   r  rj   rM   r   rq   rD   CmfGanttTaskcreate_gantt_taskr  disable_acl)r~   rq   s     r5   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   rq   r  task_status_is_changed_hookr  r  r  r   rM  r   affect_gantt_tasktask_plan_dates_is_changed_hook)r~   r3   r  s      r5   _calc_op_gantt_task_countersz$CmfTask._calc_op_gantt_task_counters  s     ;;!!##%::4;;??DKKOO\**d.@.@.K.KvzzZrtyOzzz ((&&++-&&FFH	 P{r6   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   Редактирование запрещено, так как задача в статусе CLOSEDTrT   r   cache__idrM   rK   r?   )r@   use_new_projectzPPP-TSK-MOVEr  r   zPPP-TSK-ASSIGNzPPP-TSK-ASSIGNABLE)userr@   r	  zPPP-TSK-MODIFY-OWNERrY   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   rz  sl_readonly_closed_taskrF   	api_scopemark_commentmarkrj   r   rE   r.   check_edit_permr   r   r   r   project_perm_allow_fieldsr  endswithrH   rM   rK   r   r
  rL   r  r  r  r   rr   r	  r   rF  _changes)	r~   r  changed_fields_to_checkr   rK   change_action
change_obj_r4   s	           r5   rL  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= #r6   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)r7  r   r	  r   r   rF  zPPP-TSK-DELETEr  )rh   r7  r   r	  rF   current_userr   r   r
  rL   r.   check_delete_permr  s     r5   rV  zCmfTask.check_delete_permv  sw     ? 	@ 99		T^^q~~%E //@112B1M)+ &Fr6   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_idra   r_   )r7  ra   r  )r7  ra   Nr  N)
r   r   r   r  rD   	CmfNotifyr/   rB   r7  rO   )r~   task_notifys     r5   _update_empty_task_notifyz!CmfTask._update_empty_task_notify  s     {{tyy33DIIMMdii%//444))+?@=4   # $(99   "# OXM3{r6   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  r4  r   rj   r  )r~   
add_sprintappended_listcurrent_sprints
cur_sprints        r5   _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)		*r6   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   rb  scheme_wf_idrE   cmf_modified_atcmf_modified_by_idr  r  perm_security_level_idzworkflow.save_eval_codeparent_logic_prefixrequest_type.idr   r   Tr@  r   )r   r4  r  r7  )r7  r4  r  perm_encryptr   )r   r4  r  zparent_task.parent_id.responsible.primary_role.structural_project_id3responsible.primary_role.structural_project_list_idzstatus.textr  ry  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  r4  zcloned_from.idr   lists.affect_gantt_taskry  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  ry  r  r   r   r  r  r  r  r	  rp  rq  r  r  )rp  rq  r  r   r   ry  r  r   r   r  r  r  r  r	  )4rE   zparent.project_typezparent.auto_alarm_datezparent.logic_prefixz"parent.task_allow_multiple_sprintsrY   parent_task.logic_prefixzparent_task.is_templater9  rp  rq  lists.ordernozlists.perm_has_aclzlists.sys_typero  rr  zlists.default_task_logic_typerY  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  rR  rG  r/  rq   ry  r4  z!scheme_wf.default_task_logic_typez$scheme_wf.default_subtask_logic_typezstatus.need_approver   r   agile_story_pointsr  r   ry  rj  r  rk  r  r  rm  rn  zlists.sl_task_auto_approvers  )r/   cache_cluster_fieldsr   keysr.   ri   )r~   required_fieldsr   rl   r4   s       r5   ri   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3r6   c                     t         j                  j                  | d       d| _        | j	                  d       t        j
                  j                  | dg|i | y )Nr   approve4Tr[   approve_started)rD   
CmfApprovestart_approve_processr  rO   CmfEventdo_eventr~   r2   r3   s      r5   start_approvezCmfTask.start_approve^  sM    //a8!+		D	!  '8J4J6Jr6   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)	rh   r  trans_approved	status_tor  rO   rD   r  r  r!  s    r5   _approve_approvedzCmfTask._approve_approvedd  sN    fgkk00::		  '=>r6   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)	rh   r  trans_rejectedr  r  rO   rD   r  r  r!  s    r5   _approve_rejectedzCmfTask._approve_rejectedk  sh    fg>Bkk>X>Xdkk00::^b^i^i			-  '9:r6   c                     | j                  g d       | j                  j                  j                  | _        g | _        y )N)zstatus.trans_updatedzstatus.trans_updated.status_tor  )rh   r  trans_updatedr  r  r!  s    r5   _approve_updatedzCmfTask._approve_updateds  s0    dekk//99r6   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_grouprz  r7  ry  )approver_levelre   masteraccepted)r  r  r  r  )r@   r  approverapprove_typerd   r  Tr[   approve_success_onerC   )rM  dictrF   rU  rD   r  _approve_onerh   r  r  rO   r  r  )r~   r3   r  rz  r7  master_filterparamsapproves           r5   r   zCmfTask.approve_onex  s   

?3ZZ-
zz&! #=M#>M'^^!	
 ,F8##''1&1 G  5d5f5/*+>>T///%%ann5III%  '<=r6   c                 8    dt         _        t        |   |i |S )NT)rF   r   r.   create)r1   r2   r3   r4   s      r5   r  zCmfTask.create  s    )-&w~t.v..r6   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<   INrK   rd   rl   r   )_TASK_CODE_SEARCH_REfindallrB   rD   r   r/   )r1   r7  rl   projectsr   codesfilter_rK   s           r5   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   rh   r4  r   r  )r~   r!   r@   s      r5   r   zCmfTask._calc_fix_versions  s?    KK((JJ!!;;$++669:;D(( %##~5KK$%  '!!((-

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

!!#&!!((-. 0r6   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*  r3   r  )r/   r   r  r  rI   rB   schedule_deferred_jobrD   r  recalculate_count_cacherecalculate_cacher   r   r  r   rO  rH   )r~   from_deleter   r   ids_setrS  rR  s          r5   _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"   , попробуйте позже.TrT   )r   r   r   r  r  r4  r   r   r   r   get_lock_keyrj   )r~   r`  s     r5   _check_sprintszCmfTask._check_sprints 	  s    zz$$ 03tzz~~3FF 	WM))-@@||!!(()C)C)EFWXeWf  gI  J  RV  W		Wr6   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  r6  ut   SimpleLogic: Задача добавлена в Обязательный список для Новых задач "r   Fu   Пожалуйста, воспользуйтесь контекстным меню (троеточие) в панели инструментов задачиrT   uK   Нельзя добавлять задачу в eё же подзадачиrelation_type.codera   zsystem.additional_parentr_   r`   ra   rb   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: множество не закрытых спринтов
                r4  r   r]  r   )r   rh   r4  r   rH   rB   )r   sprints_idslist_s      r5   get_correct_sprintsz)CmfTask.save.<locals>.get_correct_sprints	  si     "e" .E%%~7J&KL))-@@ ..(: OOEHH-. #"r6   )r*  sprints_to_add_idssprints_to_remove_idsr  )r^   r/   r-  r,  rD  u   Вид отображения uk    временно не поддерживается, используйте "task", "list", "post", "gantt"spectators_changeduj   DEV: WARNING: У задачи после сохранения совпадает код и id task.values=z, request.url=z, request.data=r  )r  rM   r`  r   r  ry  rE  r   r4  us   DEV: Недопустимое перемещение простой задачи в структуру дереваr*  rC   )}r  r   r   rE   rF   r   rM   r   rr   r   r   r
  r   default_list_if_emptyr   r   rD   r|   r:  default_listr   r   r   r   r   r   r   r   r   r  need_approver  r7  r  rw  r   r   r   r   r   r   r.   rO   r   CmfBackbonePeerobj_after_save_hookr   rl  result_textrj   rY   rG  rv   r   r  r[  r   rW  _calc_estimate_workrB  rY  r   r  r  r4  rh   r  r  r   rc  rM  r  r/   anyr   _sync_subtask_sprintsapplyrB   _calc_logic_type_change_guard_calc_agile_story_pointsr.  _calc_structural_listrE  r  r  _sdesk_before_super_saver<   printr   requesturldatar   staff_control_blocked_personsr  calc_staff_control_blockedr=  r   rq   task_logic_type_is_changed_hookr/  "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_countr`  r   r   hook_task_tags_changed_calc_hide_closed_task_notifiesr9  r   rF  r{   sync_task_resourcesrI   )r~   r2   r3   rK   	audit_msginstr  removed_listr   r`  project_oldold_default_list_if_emptyold_default_listr  sprints_newsprints_oldsprints_to_addsprints_to_removeself_instancer  r   r4   s                        r5   rO   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_idrX  )r   r   rI   rF   r}  rB   "deferred_hide_closed_task_notifiesr!  s    r5   r  z'CmfTask._calc_hide_closed_task_notifiesI
  sc    !!,,1G1G81S !!1!1!4!45dgg,BA00TWW> 2T,r6   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  closedrX  ra   r   r   r'  r  r  r  )rF   r  r   rD   rY  r(  r   )r1   r)  r+  r  s       r5   (apply_deferred_hide_closed_task_notifiesz0CmfTask.apply_deferred_hide_closed_task_notifiesS
  s    35A033<<CCE 	VH1HdHXDV3WXG ((Q(PNNKx/DEF((8@T(U	V 02,r6   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   rq   r  sched_duration
sched_workrh   rr   actual_workr   history_otr_addrB   history_rte_addr   r  
time_spentremaining_estimateend_date)r~   r  	task_listtimetracker_historyr  r	  r  r  r  r  appendedr  r  s                r5   r   zCmfTask.calc_historyl
  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]1r6   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 )NrM   rq   rY   re   r.  )rM   r0  r  r/  rY   rh   rq   rD   r   r/   rO   )r~   rl   r2  r^   s       r5    _change_parent_and_gantt_projectz(CmfTask._change_parent_and_gantt_project
  s    &&++-![[;;##((*O, !!+/;;+I+I(nn))-d1KTZ)[ 	D{{dkk)"kk			r6   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^   ra   r/  Trc   r]   r`   rb   )rD   r5  r/   restoreru   rv   )r~   r  
gantt_taskr   r   s        r5   _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	r6   rV   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]   rW   )r/  rZ   r_   r^   ra   r/  rc   )rW   from_task_deleter`   rb   )rq   rO   rD   CmfTaskCodeHistoryr/   rt   r   r/  r5  ru   rv   )
r~   rW   r2   r3   r<   r^   r  r!  r   r   s
             r5   _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r6   c                 d    | j                   sy | j                   D ]  } |j                  |i |  y r  )rR   rt   )r~   r2   r3   	checklists       r5   rk   zCmfTask._delete_checklists%  s4     	.IId-f-	.r6   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^   rZ   r   rW   )r@   rZ   )rD   rx   r/   rt   ry   rz   )r~   rW   r2   r3   r   s        r5   _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r6   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   )r@   r,  )rD   rx   r/   r   ry   rz   )r~   r2   r3   r   s       r5   _restore_historyzCmfTask._restore_history4  s    ))..DdVfUg.h 	'AAIIt&v&	'))..DdVfUg.h 	'AAIIt&v&	'((--$D-I 	'AAIIt&v&	'r6   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)r7  rK   r	  sdesk_sla_cyclesr4  rY   r   r  r   rF  rR   T)r  rE  )rh   r/  rt   _delete_task_resourcesr*  _delete_timetracker_history_delete_subtasksr&  rk   r.   r  #_update_additional_parent_relationsrY   r4  r  r  rD   r   r  child_task_deleter  obj_after_delete_hook)r~   r2   r3   sdesk_sla_cycler   r4   s        r5   rt   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:
r6   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)rq   rY   zproject.default_gantt_task_typer4  r  	recursiveFrM   rE  Tr[   parent_task.has_child_taskszparent_task.parent_taskrC   )r.   r   rh   r3  rM  _restore_timetracker_history_restore_task_resourcesr-  r"  r4  _restore_epics_subtasks_restore_subtasksr  rO   rY   ri   _calc_cache_branch_gantt_path_recalc_gantt_path)r~   r2   r3   r   rM   r4   s        r5   r   zCmfTask.restore`  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	)
r6   c                     |j                  dd      }d|d<   t        j                  j                  | |      }|D ]  } |j                  |i |  y )NrW   Fr8  r   rZ   )rM  rD   rw   r/   rt   )r~   r2   r3   rW   r   r   s         r5   r1  z#CmfTask._delete_timetracker_history  s\    !::&8%@#{ 66;;d\l;m" 	(CCJJ''	(r6   c                 t    t         j                  j                  | d      }|D ]  }|j                           y )NTrA  )rD   rw   r/   r   )r~   r   r   s      r5   r:  z$CmfTask._restore_timetracker_history  s6     66;;d\`;a" 	CKKM	r6   c                 6   |j                  dd      }t        j                  j                  | |      }|D ]@  }t        j                  j	                  |j
                  |      s/ |j                  |i | B t        j                  j                  | d       y )NrW   FrG  rZ   )rB   rZ   !   Подзадачи удаленыr6  )	rM  rD   r   r/   r   rB   rt   r|   r:  r~   r2   r3   rW   
tasks_listr^   s         r5   _delete_epics_subtaskszCmfTask._delete_epics_subtasks  s    !::&8%@^^((dDT(U
 	-D~~""dgg?O"PT,V,	-
 	++4 	, 	7r6   c                     t         j                  j                  | d      }|D ]  } |j                  |i |  t         j                  j                  | d       y )NTrD  -   Подзадачи восстановленыr6  rD   r   r/   r   r|   r:  r~   r2   r3   rG  r^   s        r5   r<  zCmfTask._restore_epics_subtasks  s_    ^^((dD(I
 	*DDLL$)&)	* 	++@ 	, 	Cr6   c                     |j                  dd      }t        j                  j                  | ||      }|D ]  } |j                  |i |  t        j
                  j                  | d       y )NrW   FrX   rE  r6  )rM  rD   r   r/   rt   r|   r:  rF  s         r5   r2  zCmfTask._delete_subtasks  st    !::&8%@^^((TK[l|(}
 	)DDKK((	) 	++4 	, 	7r6   c                     t         j                  j                  | d      }|D ]  } |j                  |i |  t         j                  j                  | d       y )NT)rY   rZ   rJ  r6  rK  rL  s        r5   r=  zCmfTask._restore_subtasks  s_    ^^((T4(P
 	*DDLL$)&)	* 	++@ 	, 	Cr6   c                     |j                  dd      }t        j                  j                  dd| g|      }|D ]  } |j                  |i |  y )NrW   FrM   ra   rc   )rM  rD   r{   r/   rt   )r~   r2   r3   rW   assignments
assignments         r5   r0  zCmfTask._delete_task_resources  s[    !::&8%@--228T4:Pbr2s% 	/JJt.v.	/r6   c                 ~    t         j                  j                  dd| gd      }|D ]  } |j                  |i |  y )NrM   ra   Trc   )rD   r{   r/   r   )r~   r2   r3   rP  rQ  s        r5   r;  zCmfTask._restore_task_resources  sI    --228T4:Pbf2g% 	0JJ//	0r6   c                     t         j                  j                  g ddd| ggdg      }|D ](  }|j                  j                  }|j                          * y )Nr  r`   ra   zin_link.op_gantt_taskr.  )rD   rv   r/   rb   rq   *additional_children_relations_changed_hook)r~   !additional_parent_tasks_relationsrelationadditional_parent_gantt_tasks       r5   r3  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r6   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)rM   rj  cmf_author_idr   Tr[   project.servicedesk)r   r   )rh   	log_levelrE   rF   r  rg  r   rU  r~  r   is_recursion_saverO   rj  privaterD   CmfSDeskSlaTriggertask_changed_hookr  r  r.   _comment_save_hook)r~   r   r2   r3   r4   s       r5   r`  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Kr6   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   ra   )rl  r  Tr  r  )rD   r|   r/   rB   rt   r}   )r~   r2   r3   commentsr   cattachmentsr   s           r5   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  r4  r  )r]  r  r  r_   )rI  r  trash)rI  ra   Nr   re   rI  rM   object_fieldsrd   rl   r   )rM  r   r.   field_options_list)
r1   relation_field_namerh  rd   rl   r   filter_by_projectr3   r   r4   s
            r5   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r6   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   re   r_   )r4  re   r]  )r4  re   r  rg  )rM  rl  )r1   rj  rh  rd   rl   r   r3   s          r5   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r6   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   re   searchr_   )r4  re   rE  )r4  re   rF  )rh  rd   rl   r   slicer   r   )r4  r  rE  rg  )rM  r.   ri  rl  )r1   rj  rh  rd   rl   r   rq  r3   epicsend_cnt	not_epicsr4   s              r5   parent_task_options_listz CmfTask.parent_task_options_list.  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  r6   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_hiddenre   F)rw  re   Nr   re   rp  r   r  r  r7  r  r  rC   )rM  rD   CmfComponentr/   )r1   rj  rh  rd   rl   r   r3   rp  s           r5   components_options_listzCmfTask.components_options_listL  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br6   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)r4  re   r5  rp  r   re   Tinclude_hiddenrg  rM  r.   ri  )	r1   rj  rh  rd   rl   r   r3   rp  r4   s	           r5   gantt_project_options_listz"CmfTask.gantt_project_options_list_  s     FEFHd+-M,=,=k4,P{C1B1B;1OPQF#' w)*=  W]cirx  DL  W  PV  W  	Wr6   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   re  re   rg  r|  r1   rj  rh  rd   rl   r   r3   r4   s          r5   request_type_option_listz CmfTask.request_type_option_listo  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r6   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   rg  )r  affected_versionsrY  rY   r  r/  request_type)	rl  releases_options_listrn  ru  ry  r}  r  r.   ri  r  s          r5   ri  zCmfTask.field_options_listw  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r6   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<   rl   r   zAuto task reopenu'   Переоткрываем задачуr6  Ndefault_projectr  zNew auto task for r   z
) project 
r  )r<   r   r7  r   r	  r   rM   r   )r  hashlibmd5encode	hexdigestrD   r   rM  r   r  r  r  r   r   r|   rO   r  rn   rl   r	   get_obj_by_tuuid_strr   r<   rB   rr   )r   r7  
extra_textr   r  cmf_owner_idr   _kwargstask_key	task_hash	task_coder^   r   r	  rM   s                  r5   	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}}r6   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   ra   r  r  ra   )in_progressr   )
rD   r  r/   rB   r  r   r:   r   r-   rr   )r1   rd   r2   r3   personsin_progress_filtercount_filterr  resultin_progress_countr   s              r5   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 r6   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   rM   r4  r  r   r   r   rY  	scheme_wfcalc_workflowr!  s    r5   r   zCmfTask._calc_workflow  s    MM$${{%%  ++}}''{{zz$$))~~(( ==## 44T:r6   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 )Nr5  ua   Нельзя изменить Логический тип задачи на Гант-проектTrT   uT   Нельзя изменить Логический тип у Гант-проекта)r   r   r4  r  rj   r!  s    r5   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8r6   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 )Nr4  rD  r*  r  )rY   r   r   r4  r  r   r  r>  r  rD   r   _recalc_gantt_path_deferredrB   rr   r!  s    r5   r   zCmfTask._calc_gantt_path  s    ''OO..**.dd --115UU		$$)=)=**,fnnHHR[\`\c\c\i\iQjkr6   r*  )	only_onceonly_once_argsc                     t         j                  j                  | g d      }|sy |j                  |j                         |j                  d       y )N)rY   rG  rR  r4  cache_branch_gantt_pathr  Tr[   )rD   r   rM  r?  rY   rO   )r*  ts     r5   r  z#CmfTask._recalc_gantt_path_deferred  sJ     NN' 3N O	Q]]+	r6   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 > 100TrT   )rG  rR  r4  r/  rF  rE  )r  rG  rR  rY   r4  r  r/  rM   rY   rl   Fr[   r   )rY   r_count)rj   rh   rG  rR  r4  rD   r   r/   r  r>  r  r  r  rO   r?  _check_relations)r~   rY   r  ch	need_saves        r5   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	*r6   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   rB   r   )rM   r   r  authoru   Вложение u    было изменено)r[  
cmf_authorr7  rM   )yamlrD   CmfRFilers   data_driverget_rdr  pathjoinconfig
DIRTY_PATHrM  io
io_iterdirr  	safe_loadreadr}   r   r|   r   rO   )r1   rX  r  rdisk
dirty_pathr@   	file_pathr   	file_dataattachr   s              r5   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 )Nr4  #parent_task.cache_branch_gantt_pathr{  zODEV: WARNING: _calc_cache_branch_gantt_path: if cache_branch_gantt_path is NoneTrT   )rB   r<   r   r4  rB   ul   Произошло зацикливание! Попытка добавить дочернюю задачу "uK   ", которая уже является родительской для "r  )r  r4  r  rY   r   r  rh   rr   rj   rB   r<   r   )r~   rY   r  r  s       r5   r>  z%CmfTask._calc_cache_branch_gantt_pathK  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  rB   z&cmf_task._check_relations, task_code: z, parent_tasks: r  r  zsystem.finish:startzsystem.finish:finishr_   rb   ra   r`   r.  u   Невозможно перенести задачу из-за того, что существует связь ОН/ОО у задачи "z" u?   . Удалите связь и попробуйте снова.TrT   r  )z,out_link.parent_task.cache_branch_gantt_pathz out_link.cache_branch_gantt_pathzout_link.has_child_tasksrl   rd   )
gantt_path)r   rh   rY   r  r  rH   rB   rr   rF   r   r<   rD   rv   r/   r`   rb   rj   r   _check_additional_relations)r~   rY   r  r  r  _fieldsr   r^   additional_child_filteradditional_child_fieldsadditonal_child_relationadditional_childs               r5   r  zCmfTask._check_relationsm  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 > 100TrT   )rY   r  )r  r  r  r  r   )r  r  )rj   r   r  rY   rD   r   r/   r  r  rB   rr   )r~   r  r  child_fieldsrO  s        r5   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r6   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  r4  rY   re   rB   r  r  FTr[   N)rh   rD   r   r   rB   r  r>  rO   )r~   rO  have_childrens      r5   r4  zCmfTask.child_task_delete  sy     	+^<=++]C4QTXZ^`e`h`hSi3j+k#(D ..0III% r6   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
        Nr9  zparent_task.op_gantt_taskTr[   )rY   r   ri  rh   r  r>  rO   rq   $task_has_child_tasks_is_changed_hookr  r4  r!  s    r5   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r6   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\  rI  r4  zresponsible.primary_role.uU   SimpleLogic: Задача добавлена в структурный список "uG   " т.к. он указан в должности исполнителяr6  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_idrh   structural_project_listr   r   rD   r|   r:  r  r   rB   r  r  rM   )r~   append_structural_project_listr=  r   r  old_responsibleremove_structural_project_lists          r5   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   rM   r   r  rr   r   rD   r   r   r
  r   default_agile_story_pointsr1  s     r5   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;r6   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[   )rh   rl  r  r  r  r   rO   r!  s    r5   has_related_tasks_hookzCmfTask.has_related_tasks_hook  sR    PQ!$T]]!3!Js4>>7J!!,,III% -r6   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, когда существует базовый Гант-планTrT   r  
const_work)
r  r   rh   bp_gantt_taskr  rj   rq   r  r  rO   r!  s    r5   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r6   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   Задача создана из шаблона r6  )rY   r   include_templatesrY   rC   )rh   create_from_templater   r   r   strftimer   rM   r   r   rO   rD   r|   r:  r<   r   r/   r   rB   rr   )r~   r  new_tasknow_datechild_tmpltchild_task_ids         r5   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 {{   r6   c                 f    | j                  dg       | j                  dk(  ryt        |          S )uB    Шаблон уведомлений для разных workflow r4  r  ztask.ticketzhelpdesk_mail_notification.html)rh   r4  r.   +get_default_mail_notification_template_namer   s    r5   r  z3CmfTask.get_default_mail_notification_template_name^  s6     01-4wBDDr6   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   rC   )rE   rD   CmfFullSearch
mark_cleanrB   rr   rh   full_search_preload_fields
strip_htmlr  r   r   r  rF  rI   r.   full_search_index)r~   r3   rr4   s      r5   r  zCmfTask.full_search_indexe  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  )rE   r.   mark_full_searchr  s      r5   r  zCmfTask.mark_full_searchq  s"    ==w'888r6   c                     |t         j                  }n0t        |t              r t        j
                  j                  |      }t        j                  j                  | |||||      }| j                  d|       |S )Nr  )
start_dater	  r  )r  )
rF   rU  r   rI   rD   r  rM  rU  timetracker_task_change_timer   )r~   r  r  r7  dater	  r  s          r5   r$   zCmfTask.timetracker_change_timew  s    I	3'((,,	,:I$33PPQUWaBTVZgkLU Q W 	-=PQ""r6      )r  r  r   c                 B    t         j                  j                  |        y r  )rD   r   _recalculate_codes)r   r  s     r5   recalculate_codes_celeryz CmfTask.recalculate_codes_celery  s     	))*5r6   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      TrK   re   r<   )rd   rl   rq  rZ   r)   )from_recalculater[   )rD   r   r/   rK   
_calc_coderO   commit_with_event)r   rf  limit
task_slicer^   s        r5   r  zCmfTask._recalculate_codes  s     ,,!3
3!6*%'l $# - J JA" *||6		D	)	*
 ! r6   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<   )rK   rl   u   Всего задач: c                 (    	 t        |       S #  Y yxY w)Nr   )r   )rf  s    r5   tryintz:CmfTask.reindex_project_tasks_code_numbers.<locals>.tryint  s    q6Ms   
 c                 `     | j                   j                  j                  d      d         S )Nr   r  )r<   rr   
rpartition)r  r  s    r5   <lambda>z<CmfTask.reindex_project_tasks_code_numbers.<locals>.<lambda>  s&    qvv||?V?VWZ?[\]?^8_ r6   )r   r   r   u'   Обрабатываем задачу: )r^   r   re   Trc   u   Код u    занятr[   )r  disable_notifyrD   r   rM  r  r   r/   rl  sortedr%  rt   r<   rr   r  r   rO   )	r   with_history_deleterK   r  rf  r^   histnew_coder  s	           @r5   "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   rE  r  )r4  rl   r   rY   re   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)rD   r   r/   r   r  rF   r   rB   rO   rr   cmf_emit_event
cmf_commit)r  r1   total_count
calc_countcmf_epic
real_count
event_datas          r5   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r6   	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_childrenr9  rY   r   r&  r'  )r   rh   rY   unionget_all_followersr.   )r~   r'  r2   r3   r   r4   s        r5   r*  zCmfTask.get_all_followers  su    e p 	q))D,,>>UV>WXCw($N)NvNTTUXYYr6   inline_save)tmp_objcreate_formui_form_moderl   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,  rE   r  T)rl   rZ   rZ  r+  )r,  r.  r-  rl   )r.  r-  rl   )r   rK   r4  r.   r%   rE   )r1   r,  r-  r.  rl   r2   r3   r4   s          r5   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qr6   c                     t         |   |      }t        |dd       rXt        j                  j                  |j                  j                        }t        j                  j                  |      |_        |S )Nrq   r  )r.   get_automation_ui_formr  rD   r5  r   rq   rB   )r1   r@   ui_formrq   r4   s       r5   r1  zCmfTask.get_automation_ui_form   sc    '05 3."//448I8I8L8L4MM$*$7$7$N$N}$]G!r6   
ui_form_idc                 @    t         j                  j                  |      S r  )rD   	CmfUiFormget_ui_group_fields)r1   r3  s     r5   _get_ui_group_fieldszCmfTask._get_ui_group_fields
  s    33J??r6   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 )NrZ  zui_form_view_inner.ui_form_jsonr  )tmp_is_public_formtmp_ui_view_formr-  r2  )r   r
  rI   r   rE   r4  request_type_idrD   CmfSDeskRequestTyper   ui_form_view_innerr.   _build_ui_form)	r1   r,  r9  r:  r-  r2  tmp_projectr  r4   s	           r5   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r6   c                 H    t         j                  j                  ddgd      S )u   
        Экран по умолчанию если нет никаких правил и схем экранов

        Returns:
            CmfUiForm: системный экран по умолчанию
        zui_form.task:defaultui_form_jsonT)r<   rl   cache_inmemory)rD   r5  rM  r!  s    r5   _get_default_ui_formzCmfTask._get_default_ui_form  s'     ##)?HXim#nnr6   )copy_attachmentscopy_relationscopy_subtaskscopy_alldeferred
new_parentlevel
copy_listsr   rD  rE  rF  rG  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   rD  rE  rF  rG  new_parent_idr  zcopy_task: task_id: z	, level: T)**zattachments.urlr`  r   rF  rE  r  r  zattachments.url_previewzattachments.url_preview_imgr   r  ztmplt_document.text_renderrR   )r   rD  rp  r
  zsystem.clone)r<   rB  relation_typer  r`   ra   rN  r.  )from_task_copyrb   )r`   rb   rO  r  Fr   rY   )rd   r  u    Копияr   )r   copy_attachmentrE  rF  rG  rH  rI  rJ  r   r*  ),rB   rr   r  copy_task_with_subtasksrF   r   rh   r.   r   r   r  r  r  rz  rD   CmfRelationTyperM  rv   r/   cloner`   rO   rb   tmplt_documentri  text_renderr7  r  _clone_op_gantt_taskrY   r   r   r   r  r   r   r   rq   task_copy_hookr{   r  rI   rR   _copy_checklists)r~   r   rD  rE  rF  rG  rH  rI  rJ  rK  r2   r3   rM  new_obj
clone_typer  rV  new_relation
tmplt_textr@   subtasksr   subtask_namer4   s                          r5   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 )Nrf   )rR   r   )r~   rM   r(  s      r5   rY  zCmfTask._copy_checklists  s#     	*INN&N)	*r6   u!   Копирование задач)r  r  descriptionshow_bg_progressbarc           	          t         j                  j                  dd| g      }|j                  |j	                                t         j                  j                  |      }|j                  ||||||d       y )NrB   ra   r  r  T)r   rD  rE  rF  rG  rI  rH  )rD   r   rM  rh   ri   r   )	r*  r   rD  rE  rF  rG  rM  r^   rI  s	            r5   rR  zCmfTask.copy_task_with_subtasks  ss     ~~!!$g)>!?1134^^''='9
		t.>~ -Zbf 	 	hr6   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 )NrN  r   z0.00Tr[   )rq   rh   rT  r  agregat_workr  actual_durationactual_completeactual_myself_workactual_start_dateactual_finish_dater   actual_costactual_myself_costr^   rY   rO   )r~   rZ  rI  s      r5   rW  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"2r6   c                     | j                  dg       | j                  dk(  rd| j                   d| j                   S t        |   S )Nr4  rF  zproject/r  )rh   r4  r/  r<   r.   hrefr   s    r5   rn  zCmfTask.href  sH    .)* 11dll^1TYYK88w|r6   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  )--rB   zlists.idr   )rd   rl   rq  )r   r   r:   r   rB   rl  )	r1   rd   r  r  page	page_sizer  r^   r  s	            r5   r   zCmfTask.count_tasks_by_lists  s    S!			&>tI~X\]^X^`iWiFj " lI! *!ZZ *E588$)$** 9~	) AID r6   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_prefixrh   r   r
  r   obj_code_prefixr  task_code_use_logic_type_prefixtask_code_prefixrr   r1  s     r5   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''---r6   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<   re   Trc   r   u8   Превышен лимит поиска кода limit=z model=uA   , возможно надо отключить def gen_code: passz$!!! --- gen_code::duration too long z.1fz sec, r   z, r   )r.   gen_codetimerD   r%  r   r   r  rB   rl   r<   )r~   r<   r{  startr  rf  durationr4   s          r5   rz  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],^ r6   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^   rK   T)r<   rK   r   r   r.   r
  r  r   r   r
  r  rB   rx  rr   r   rD   r%  r   rO   r   rv  )r~   r	  rK   r  
new_prefix	prev_codecode_historyr4   s          r5   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 <  &r6   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)r/   _acl_check_readr   CmfPermissionError)r1   rl   rd   r2   r3   res_uncheckedr   r  s           r5   r&   zCmfTask.public_listD  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_executorsrC   )r.   r   )r~   r3   r4   s     r5   r   zCmfTask.all_relation_personsW  s.     ',"#&+"#w+5f55r6   c                 &   | j                   j                  j                          | j                   j                  j                  }| j	                  | j
                  j                  |        | j	                  | j
                  j                  |       y r  )rq   r  r  rr   #_update_actual_work_for_all_parentsrY   r  r  )r~   actual_work_times     r5   _update_actual_workzCmfTask._update_actual_work_  so    &&++---99??001A1A1E1EHXGXY001A1A1E1EGWXr6   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)rq   r  r  rO   )r~   r^   r  s      r5   r  z+CmfTask._update_actual_work_for_all_parentse  s    !&&++-&&*::&))A--.D*51r6   c                 z    | j                   j                  dd      }|s| j                   j                  d      S |S )Nr  Fr  rp  )r  r  )r~   default_statuss     r5   _get_default_open_statusz CmfTask._get_default_open_statusp  s:    99fZ_9`==33F;;r6   z@hourly)r  r  schedulec                  @   t         j                  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-                          |j+                  d       t         j                  d|        |j.                  dv r|j(                  j0                  dkD  rl|j$                  j2                  }|j-                          |j$                  r |j$                  |j(                  kD  r||_        |j(                  j0                  dkD  rl|j                  j                  r|j                  j                  |_        |j4                  r+|j                  j2                  j7                  dd      |_        |j                         |_        |j+                          %|j                  j8                  dk(  s@|j                         |_        |j                   j0                  dk  r|j                   j#                          |j+                           y )Nz(Run CmfPerson.cron_celery_check_periodicr_   )status.coder  r  )r   r  r  )period_create_newre   T)rs  r  Nperiod_next_datez<=r   )r|  rp  r  r  r  period_clear_checkboxr7  r  r  rs  r   r   r  r   rl  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  pause)rF   r   r   r   r   r   rD   r   r/   r  r  rU  ri  r7  r  r  r   r   r   rs  r  rO   _cacl_next_periodr   r  rr   r  r  r<   )r  r^   r  old_deadlines       r5   cron_celery_check_periodicz"CmfTask.cron_celery_check_periodicv  sx    	
:;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)&&(		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IIK[[%%0 #'"?"?"ADK**Q.//1IIKc1	 r6   c                    | j                          | j                          | j                          | j                          | j	                          | j                          | j                          | j                  j                  r| j                  j                          | j                          t        | 4  |i | y r  )rB  r   r   r   r   r=  r  rY   r   rq   r  r  r.   _save_importr  s      r5   r  zCmfTask._save_import  s    &&( ..0))+""$&&??A$$&d-f-r6   c                     t         |   |      }|sD|j                  t         |   g d             |t        j                  j                  g d      z  }|S )N)r  r  r  )rO  rb   r`   )r.   import_shop_fieldsr  rD   rv   )r1   fields_namer   r4   s      r5   r  zCmfTask.import_shop_fields  sX    g(5 JJ* ,  6++>>?ghhC
r6   c                     |sTg d}t         j                  j                  j                         D ]%  }|j	                  d      s|j                  |       ' t        |   ||||      S )N)=rB   r<   r   r7  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.namery  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   rY   r  rg  r2  rG  rR  rG  rz  r  r  rK  r   r  r  r  r  zop_gantt_task.actual_costzop_gantt_task.actual_completez#op_gantt_task.duration_is_estimatedr   r  cf_)rD   r   rl   r  r  r   r.   export2file)r1   field_namesbqlformat_fileinclude_archivedr   r4   s         r5   r  zCmfTask.export2file  sf    ;K( %nn3388: 3
((/&&z23 w";[BRSSr6   id_listrl   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 )NrB   r  rp  r.  r  )r/   r  r2  r  rr   r   rB   )r1   r  rl   childrenr^   r@   s         r5   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   re  rb  rK   rM   r   r  r  	ui_fieldsrequired)r>  r  r   rM  )r1   r  subgroupr,  rA  r   metas          r5   r   z%CmfTask.group_changes_required_fields  s    ! 		CH(<"8!),!7%-o%>#+M#:<G --g6L*.&H&'$0$=$C$C$E C 
D88J'>BH./
;C		C r6   c                 *   |D ]  } | |d   |d   |d   |d         }t         j                  j                  |      |d<   |d   j                  |      |d<   t         j                  j                  |d   j                  j                        |d<    |S )	Nr   re  rb  r  r  r  )workflow_idstatus_list)rD   CmfSchemeWfcalc_schemer  CmfWorkflowget_status_listrB   rr   )r1   r  r  r,  s       r5   r   zCmfTask.group_changes_statuses  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 r6   c                     ddl m} | j                  j                  sy  || j                  j                        | _        y )Nr   )markup_html_clean)cmf.util.cmf_clean_textr  r  r   rr   )r~   r  s     r5   r   zCmfTask._clean_result_text#  s0    =**,T-=-=-C-CDr6   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   rY   rh   r4  r   r   )r~   parent_task_listsparent_lists      r5   r   z#CmfTask._set_lists_from_parent_task)  s    ;;tzzd.>.>>@efg $ 0 0 6 60 /,,0CC{GdGdhpGp

!!+./ /?z;r6   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  rB   r  r  Tz)deferred_job(_sync_subtask_sprints) task:)r   r  rE   rY   r  r  r   zjob FAIL RESURSION r   F)r  rq  N)rD   r   rM  r  r/   r   logginginforB   errorrH   r   r   r  rO   r   r  )r*  r  r  r^   r  r  processed_task_idsprev_lvl_task_listnew_lvl_task_listsub_tasks_listrf  sub_taskr  	sprint_ids                 r5   r  zCmfTask._sync_subtask_sprints3  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 r6   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@  rp  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        r5   count_nodesz(CmfTask.load_fields.<locals>.count_nodes  s^    
 tf5EIIK (AQJE!!T*qQ(  Lr6   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         r5   r  z$CmfTask.load_fields.<locals>.flatten  se     C

 "1hqcNa&1JJwq!c'23JJqM" Jr6   )rl   r  r   r   r  )r  rC   )r/   r  _build_load_planr  r   rI   r   r.   rh   r  rl  r  r   r   )r~   rl   r  r3   LIMITincoming
meta_extra	full_planr  rulestop_keysr  r   r  subset_keysr   subplanrebuiltminner
inner_keysrf  	cur_innerik
test_innertest_wrapped
test_rulestest_rebuilt	sub_rulesr  r4   s                                @r5   rh   zCmfTask.load_fieldsn  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  )r7  
view_scoper	  r.  rM   re   from_templater]  )r   r   r   rD   CmfChecklistTemplater/   re  CmfChecklistrB   r  r   r  r	  rF   r}  create_checklist)r~   	templatesexisting_checklistsr(  using_templatestarget_templatestemplates          r5   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)rh   rl  r  r  s      r5   r(   zCmfTask.count_approvers  s)    /*+!3t'9'9#:;;r6   )F)NN)NNN)r  NNr  )NNNNN)NNNN)NNNNNN)r   )Nr   )u   ДобавленоNN)FNFN)NNcsvF)NF)__name__
__module____qualname__modulesr^   rl   cmf_taskr   api_methodsservicedeskrD   CmfTaskMixinclassmethodr/   r   r:   r   r   r   r"   r   r   r   r  r  r   r  r   r"  r%  r,  r   rB  rP  r   rW  r^  rc  r   rn  ru  rw  r  r  r  r   r  r   r  r   r  r  r!   r  r  r  r  r  rs  r  r   r2  r   r=  rL  rV  r[  rc  ri   r  r  r  r  r   r  recompileASCIIr  r  r   r  r  rO   r  r  r   r  r"  r&  rk   r*  r-  rt   r   r1  r:  rH  r<  r2  r=  r0  r;  r3  r`  r   rl  rn  ru  ry  r}  r  ri  staticmethodcmf_deferred_jobr  r  r   r  r   r  r?  r  r>  r  r  r4  r   r  r  r  r  r   r  r  r  r$   r  r  r  r  r   r*  r%   r1  rI   r7  r>  rC  boolr   rY  rR  rW  propertyrn  r   rx  rz  r
  r&   r   r  r  r  r  r  r  r  r   r  r   r   r   r   r  r   rh   r   r(   __classcell__)r4   s   @r5   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@  K @ X.   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<r6   r   )$r   r{  collectionsr   r   decimalr   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  rD   r   r  r^   rl   r   rC   r6   r5   <module>r     sx      #      / 0  + # * ; 7 7oG<g!!((11>>@S@S@\@\@d@d oG<r6   