
    Bfi	<                    \    d dl m Z  d dl d dlmZ d dlmZ  G d dej                        Zy)    )datetime)*)cmf_list)CmfActiveEntityc                       e Zd Zej                  j
                  g dz   Ze fd       Zd Zd Z	d Z
 fdZ fdZd Zd	 Ze ed
dddgd      dededefd              Z fdZd Zd ZdeddddfdZddd fd
Z fdZe eddddg       dKd"              Ze edd#dd$dg%      d&               Zed'        Zd!d!d(d)Zd* Ze ed+dd,d-      d.               ZdLd/Z dd0 fd1
Z!d2 Z"d3 Z#d4 Z$e ed+dd5d-      deded6efd7              Z%d8 Z&e'd9        Z(	 	 	 dMded:ed;efd<Z)	 	 dNded;efd=Z* fd>Z+ fd?Z,edK fd@	       Z-dA Z.dB Z/dC Z0dD Z1dE Z2dF Z3e edGdH      dI               Z4 fdJZ5 xZ6S )OCmfList)ui_get
pfeed_listarchive
move_tasksall_relation_personssprint_completereleasedo_startapprove_one
public_getclose_simple_board_periodc                 &    t        |   |i |}|S N)superget)clsargskwargsres	__class__s       $./modules/project/models/cmf_list.pyr   zCmfList.get   s    gk4*6*
    c                 p    | j                   ry | j                  j                   j                         | _         y r   )default_task_workflow	scheme_wfloadselfs    r   _calc_default_workflowzCmfList._calc_default_workflow   s-    
 %% &*^^%I%I%N%N%P"r   c                    | j                   j                  sy | j                  sy | j                   s.d | j                  _        | j                  j	                  d       y d| j
                   }| j                  j                  j                          | j                  j                  }|r+d|_         |j	                  d       d|j
                   d| }| | j                  _        | j                  j	                  d       t        |       y )NT	only_datau`   Все новые задачи проекта будут добавляться в список FuW   Сбросили галочку Список по умолчанию у спринта z. )is_default_list
is_changedparentdefault_listsavenamer"   	cmf_alert)r$   msgcurrent_default_lists      r   _calc_is_default_listzCmfList._calc_is_default_list(   s   ##..{{##'+DKK$KKt,pquqzqzp{|  %%'#{{7738 0 %%%5k  mA  mF  mF  lG  GI  JM  IN  OC#' 4(#r   c                 @   | j                   j                  s| j                  s| j                  ry | j                  j                  r| j                  ry | j                  dv rd| _        y | j                  dk(  rd| _        y | j
                  j                         | _        y )N)list.agile_sprintlist
list.pfeedpfeed)
logic_typer*   is_newui_view_formlogic_prefixui_namelowerr#   s    r   _calc_ui_view_formzCmfList._calc_ui_view_formB   s~    **;;((''D,=,= 55 &D,. 'D $ 2 2 4Dr   c                 *    t         |          g dz   S )N)tree_parentr    auto_favoriteaffect_gantt_tasksl_task_auto_approvezparent.cmf_project_adminszparent.cmf_owner_assistants)r   save_preload_fieldsr$   r   s    r   rD   zCmfList.save_preload_fieldsP   s     w*, 0D D 	Dr   c                 (    t         |          dgz   S )Nmembers)r   project_perm_allow_fieldsrE   s    r   rH   z!CmfList.project_perm_allow_fieldsT   s    13ykAAr   c                 "   | j                   j                  r| j                  dk7  ry| j                   j                  j                  dk(  r'| j                   j                  dk7  rt        dd       y| j                   j                  j                  dk(  r'| j                   j                  dk7  rt        dd       y| j                   j                  j                  d	k(  r'| j                   j                  dk(  rt        d
d       y| j                   j                  j                  d	k(  r| j                   j                  dk(  rt        j                  j                  dd| gg      dk  r| j                          yt        d       t        | j                  | j                  j                  t        j                  j                  j                  | j                   j                  j                  d       | j                   j                  | _         yyy)u[   
        Запускаем или останавливаем Agile спринты
        r4   NIN_PROGRESSCLOSEDue   Agile спринты можно только завершить, нельзя переоткрыть.Tabortu9   Agile спринты нельзя переоткрыть.OPENu1   Agile надо сначала запустить.listsINfilter2   un   Запуск спринта займет несколько минут, ожидайте оповещения.)list_idnotify_person_idnew_status_idr   )statusr*   r;   oldstatus_typer/   modelsCmfTaskcountprocess_sprint_startschedule_deferred_jobsprint_start_jobidvaluegcurrent_personr#   s    r   _check_statuszCmfList._check_statusW   s    {{%%):):>Q)Q;;??&&-7DKK<S<SW_<_}  FJ  K;;??&&(2t{{7N7NRZ7ZQY]^;;??&&&0T[[5L5LPX5XIQUV;;??&&&0T[[5L5LP]5]~~##GTD6+B#CbH))+  K  L%))'+ww}}()(8(8(;(;(A(A%)[[^^%9%9; #kkoo 6^0r   c                    | j                   j                  sy g }| j                  rG|t        | j                  j                        z  }|j                  | j                  j                         t        j                  j                  r|j                  t        j                         t        j                  |vrt        dd       y y )Nu   Включать автоподтверждение может только владелец проекта или его заместителиTrL   )rC   r*   r+   r5   cmf_owner_assistantsappend	cmf_ownerrc   rd   is_adminr/   )r$   allowed_personss     r   _check_sl_task_auto_approvez#CmfList._check_sl_task_auto_approvet   s    ((33;;tDKK$D$DEEO""4;;#8#89$$""1#3#34?2  i  qu  v 3r   u9   Обновление плановых дат спискаTrT      )descriptionshow_bg_progressbar	only_onceonly_once_argsprioritylist_affect_gantt_taskrU   c                    t         j                  j                  | g d      }g }|j                  D ]  }	 d|_        |j
                  j                          d|j
                  _        |j                  s|j                  sd |_        d |_        |j                  d|       |j                  j                           |st         j"                  rsd}d}|r|dj%                  |       z   }t         j"                  r#|dj%                  t         j"                         z   }t         j&                  j)                  |||dd	
       y y # t        $ r?}|j                  j                          |j                  t        |             Y d }~Td }~ww xY w)N)zmembers.*, members.listsplan_start_dateplan_end_datera   fieldsTF)notifyrs   uN   Ошибки при обновлении плановых дат списка.u^   Обнаружены ошибки при изменении следующих задач</br>z</br>rm   )personr.   r0   force_notify_current_personrr   )r[   r   r   rG   r*   rO   r"   ru   rv   r-   dpcommitCmfAbortErrorrollbackrh   strrc   alertjoin	CmfNotifyplace_notify)	rT   rs   rU   r   task_errorstaskenotify_name
notify_msgs	            r   _process_plan_dateszCmfList._process_plan_dates   sU    >>%%9y%z$$ 	+D+"&

!(,

%  //8N8N+/D()-D& 		?U	V 	+$ !''jKyJ'W\\+-F,GH
ww'W\\!''-B,CD
))' ,0 *  "	 ! +  """3q6**+s   BE	F4FFc                 d   | j                          t        d| j                   dt        j                  j
                  j                  it        j                  g       | j                  d      D cg c]  }|j                   c}dgk(  r't        t        j                  j                  | 6  di |S | j                  s?| j                         | _        | j                  r| j                  j!                  g d       | j"                  sK| j$                  r?| j$                  j"                  j'                         r| j$                  j"                  | _        | j"                  sK| j                  r?| j                  j"                  j'                         r| j                  j"                  | _        | j"                  s&t        j(                  j+                  d	d
      | _        | j,                  r| j.                  dk(  r| j                  r| j                  j!                  dg       | j                  r-| j                  j0                  s| j2                  xs d | _        nI| j2                  r%| j2                  j                  j5                  d      sd| j2                  xs d | _        | j,                  r4| j.                  dk(  r%t        j6                  j+                  d      | _        | j;                          | j=                          | j>                  rT| j>                  j@                  s| j,                  r1| j>                  jB                  r| j>                  jB                  jD                  j'                         r| j>                  jB                  j!                  dg       | j>                  jB                  jF                  jH                  | j>                  jJ                  k(  r%tM        d| j>                  j2                   dd       | jO                          | j>                  jD                  j'                         r-tP        jS                         5  | jU                          d d d        | j,                  s)| j                  j@                  r| jV                  rd| _+        | j,                  s\| jV                  j@                  rF| jV                  r:tY        t        jZ                  j\                  | j                  j                  g       t        | 4  |i |}| j^                  j@                  r;tY        t        jZ                  j`                  dtc        | j                        gi       | j,                  s| jd                  j@                  s8| jf                  j@                  s"| jh                  j@                  rg| jh                  r[tY        | jj                  | j                  j                  | jh                  t        j                  j                  j                  d       | j                  rn| j                  j@                  rX| j!                  dg       | j^                  D ]7  }| j                  |_        |jm                           |j                  |ddi| 9 | jn                  j@                  ru| jn                  ri| j!                  dg       | j^                  D ]H  }|jp                  rd |_9        |jm                          |ju                           |j                  |i | J |S c c}w # 1 sw Y   xY w)Nzlist-changes-person_code)event_personsTr*   rG   )ri   rg   activityrx   business)codecache_inmemoryr4   add_object_type1SprintzSprint r6   zpfeed.base:default)r   ztrans_approved.status_tou   В статус uo    можно перейти только после завершения процесса утвержденияrL   F)r   list_idsrW   )rT   rs   rU   ry    );_process_auto_favoritecmf_emit_eventra   rc   rd   r   rb   values
class_namer   cmfr[   CmfModelr-   r+   get_projectload_fieldsr   r@   r"   CmfActivityr   r9   r;   r   r.   
startswithCmfLogicTypedefault_task_logic_typer2   re   rX   r*   rY   need_approvetrans_approved	status_tonewr/   cancel_approvecmfutildisable_aclstart_approverC   r_   r   set_task_auto_approve_jobrG   recalculate_cacher   ru   rv   rB   r   save_preparer    is_templateworkflow_calc_workflow)r$   r   r   ir   memberr   r   s          r   r-   zCmfList.save   sK   ##%twwi0=!BRBRBWBWB]B]2^opoo  oA  	B"&+++">?QALL?I;N,,d8B6BB{{**,DK{{''/`'a }}!1!1d6F6F6O6O6T6T6V ,,55DM}}1E1E1J1J1L KK00DM}}"..22
SW2XDM;;  $77;;KK++4E3F+G;;t{{'B'B#'99#3"4DI$))//*D*DX*N")$))*:s); <DI ;;4,,</5/B/B/F/FL`/F/a,""$;;DKK22dkk{{4;;??#?#?#D#D#F++-G,HI;;??11;;t{{N 01A1A0B  Cr  s  {  @##%{{'',,.((* )&&() {{t{{55$:S:S(-D%{{t88CCHaHa!&.."J"JRVRYRYR_R_Q`aglD+F+<<"" "&.."B"BJY\]a]d]dYeXfKgh
 {{ 4 4 ? ?4CUCUC`C`&&11d6L6L!$":":59WW]]DHDZDZ>?>N>N>Q>Q>W>W*YZ ;;4;;11i[),, ; $##%T:%:6:;
 %%00T5O5Oi[) 	+## $!!###% 		4*6*	+ 
o @P) )s   4\ \%%\/c                    | j                  dg       t        j                  j                  |g d      }|st	        d| dd       t        | j                  j                        D ]8  }| j                  j                  |       |j                  j                  |       : |j                          | j                          | j                          | S )	NrG   r   )rG   ru   rv   rw   u:   Целевой список для объединения u    не существуетTrL   )r   r[   r   r   r/   r5   rG   rb   removerh   r-   delete)r$   target_list_idr   target_listr   s        r   r   zCmfList.move_tasks  s    ,nn((NCr(sRSaRbb|}  FJ  K++, 	-DLL%&&t,	- 			r   c                 F    fd | j                   j                        S )Nc                     | sy | j                   dk(  r| S | j                  j                           | j                  j                        S )N
CmfProject)r   r@   r"   rb   )childroot_parents    r   r   z(CmfList.get_project.<locals>.root_parent  sE    </!!&&("5#4#4#:#:;;r   )r@   rb   )r$   r   s    @r   r   zCmfList.get_project  s!    	< 4++1122r   r.   period_startr   
period_endc                    | j                   j                         dvrt        dd       t        j	                  || d      }|j                  d       t        j                  j                  d	d
| ggg ddd|gdd|gg      }|D ]J  }|j                  j                  |        |j                  j                  |       |j                  d       L |S )N)z	list.basez
list.boarduV   Периоды можно закрывать только у Простой доскиTrL   kanban)r.   r@   r:   Fry   rO   rP   )zstatus.code=closedstatus_closed_atz>=z<=rQ   )r;   r"   r/   r[   r   r-   r\   r5   rO   r   rh   )	r$   r.   r   r   r   r   closed_period_tasksclosed_tasksr   s	            r   r   z!CmfList.close_simple_board_period!  s     !!#+FFnvz{$nn$DW_n`   . ~~**dTF#*|4z2	3
*  ! 	$DJJd#JJ12IIUI#	$
 #"r   FTEXKOM_db_deleteforcec                x   | j                   j                  |dgd       t        | j                         D ]K  }|j                  j	                  |        |j                  d|       | j                   j	                  |       M |rt        j                  j                  | |      D ].  }t        j                  d|         |j                  |d|i| 0 t        j                  j                  | |      D ].  }t        j                  d|         |j                  |d|i| 0 t        | (  |||d	|S )
NrO   T)include_deletedrx   r   F)ry   r(   )	task_listr   u   Удаляем r   r   )rG   r"   r5   rO   r   r-   r[   CmfListHistoryOTRrc   debugr   CmfListHistoryRTEr   )r$   r   r   r   r   mhr   s          r   r   zCmfList.delete=  s5   *:G9TXYdll# 	#AGGNN4 FF%5F1LL"	#
 --22TSc2d M/!-.$L1ALVLM --22TSc2d M/!-.$L1ALVLM w~t6Fe^W]^^r   c                 D    t        |   |fdd| j                   di|S )Nmsg_urlz/project/List/z/kanban)r   create_eventr   )r$   event_personr   r   s      r   r   zCmfList.create_eventQ  s,    w#LhN499+U\:]haghhr   r   task_id)rp   
system_jobrq   Nc                 D   |rt         j                  j                  |dddg      }t               }|j                  r|j                  |j                         |j                  r|j                  |j                         |D ch c]  }t        |j                         } }| sy t         j                  j                  dd| gg d      }|D ]  }d}|j                  d	k(  rd}t         j                  j                  |d|j                  ggd
g      }d|_        d|_        d|_        d|_        |D ]U  }|j                  d
      }	|j                  d      }
|	dk(  r|
|_        |	dk(  r|
|_        |	dk(  r|
|_        |	dk(  sO|
|_        W |j!                  d        y c c}w )NTrO   fix_versions)ra   r   rx   ra   rP   )	r;   count_tasks_opencount_tasks_in_progresscount_tasks_in_reviewcount_tasks_closedz--	parent_idr   r.   rR   rx   list.releasecache_status_type)rR   group_byr   r]   rN   rJ   	IN_REVIEWrK   r'   )r[   r\   r   r5   rO   extendr   r   ra   r   r;   r]   r   r   r   r   r-   )r   r   r   rO   llst
field_namecounterscrZ   r]   s              r   recalculate_count_cachezCmfList.recalculate_count_cacheU  s    >>%%$PWYgOh%iDFEzzTZZ(  T../+01aADD	1H1##$) $ 
  	%C J/+
~~++Jsvvh3O[nZo+pH#$C *+C'()C%%&C" 
3ee$78g&(+0C(-/27C/+-05C-(*-2C*
3 HHtH$-	% 2s   F<      )rp   soft_time_limitr   rr   rq   c           	         d}d}t         j                  j                  ddgdd| g      D ]  }|dz  }t         j                  j	                  dd	d|ggd
d|gg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 )uI   Актуализация кеша кол-ва задач в списке.r   cache_members_countr;   ra   rP   )rx   rR   rm   ORr   rO   rQ   zUpdate cache_members_count z ->  Tr'   )node_idelements_countztree-node-count-changes-ztree-node-count-changesrS   zRecalculate /z lists caches)r[   r   r5   r\   r]   r   rc   r   ra   r-   rb   r   
cmf_commit)r   total_count
calc_countr   
real_count
event_datas         r   r   zCmfList.recalculate_cache  s`   
 
++4I>3Zdhjnpxcy+z 	H1K
  --d7EthZ6X7>xj6Q6S- TJ ++z9a
5h6R6R5SSWXbWccdemepepdqrs/9, -)1):):hNjNjNpNpq
!9(++GT!8:F B!#-	. 	
,zl!K=FGr   c                    t         j                  j                  d      }g }|rnt         j                  j	                  dgdd|j
                  gg dgdg      }t         j                  j	                  g dg d	dd
|j
                  ggdgdg      }n*t         j                  j	                  g dg d	gdgdg      }g ||S )NT)
is_defaultr+   r   ==)	list_typer   r7   cmf_created_at)rx   rR   order_byr   !=rK   r  textrR   r  rx   )r[   r   r   r   r5   ra   )r   default_parentdefault_pfeedr   s       r   r
   zCmfList.pfeed_list  s      **..$.?"NN//z9DdNL]L]8^8T8V:J9K 0 MM ..%%4=$dN,=,=> !8* & 6C ..%%4= !8*	 & 6C
 &%%%r   )release_dater   c                   | j                  dg       | j                  j                  d      | _        || _        | j                          |rt        j                  j                  |      }t        j                  j                  ddd| ggg dgdg	      }|D ]K  }|j                  j                  |        |j                  j                  |       |j                  d
d
       M y y )Nr   rK   rZ   ra   ANDr   rP   r  r   F)ry   emit)r   r   get_default_statusrX   r  r-   r[   r   r   r\   r5   r   r   rh   )r$   r  r   r   r   r   
open_tasksr   s           r   r   zCmfList.release  s    *&mm6686L(		 ..,,,?K,,U9GPTv8V8]5_ 6D4D - FJ # 4!!((.!!((5		U	34 r   c                 6
   dd l }| j                  g d       g | _        | j                  j	                  d      | _        | j                   d| _        | j                          | j                  g d       d }|#t        j                  j                  |g d      }t        | j                        }d}t               }| j                  D ]  }	 |d	z  }|d
z  dk(  rt        j                  d| d| d       |j                   dk(  rK|j"                  j%                  |        t&        j)                         5  |j                  d       d d d        nZ|rX||j*                  vrJ|j*                  j%                  |       t&        j)                         5  |j                  d       d d d         |rAt5        dj7                  |j9                         D 
cg c]  \  }
}d|
 d|  c}}
            t        j                  d       d}| j                  D ]?  }	 |d	z  }|d
z  dk(  rt        j                  d| d| d       |j;                  d|        A |rAt5        dj7                  |j9                         D 
cg c]  \  }
}d|
 d|  c}}
            t        j                  d       t        j<                  j>                  j@                  D ]}  }dd| gd d|gg d!g}t        j<                  j                  |d"gd#g$      }d}d}|r|jB                  }|jD                  }t        j=                  | d||dd |%      }|j                           dd| gg d&g d!g}t        jF                  j                  |d"gd#g$      }d}d}d}|r$|jB                  }|jD                  }|jH                  }t        jG                  | d|||dd d'(      }|j                          |r:t        j                  d)       | jK                          t        j                  d*       |S # 1 sw Y   wxY w# 1 sw Y   xY w# t,        $ rb}	t        j                  d| d|j/                          d       |	 d|j/                          ||j0                  j2                  <   Y d }	~	d }	~	ww xY wc c}}
w # t,        $ rb}	t        j                  d| d|j/                          d       |	 d|j/                          ||j0                  j2                  <   Y d }	~	d }	~	ww xY wc c}}
w )+Nr   )r.   r   favorite_forrK   r
  u    (Закрыто))members.cache_status_typemembers.listszmember.agile_story_pointsz$members.op_gantt_task.sched_duration members.op_gantt_task.sched_workr  r  kanban_status_columnszkanban_status_columns.statuszkanban_status_columns.work_listrw   rm      zprocess_sprint_complete Move  of z members complete...Fr   u)   Ошибка переноса задчи : Tr   z: 
 
u)   Ошибка преноса задачи z)process_sprint_complete Move members donez%process_sprint_complete calc_history r   task_list_operater   u6   Ошибка записи истории задачи u:   Ошибка подсчета истории задачи z)process_sprint_complete calc_history doner   r   counter_type)r  r  r   -cmf_created_atr   r  )r   r  estimate_sumremaining_sum
show_charttask_operater  r  r   durationr%  )r   r  r   r!  	spent_sumr"  r#  r  z%process_sprint_complete archive startz$process_sprint_complete archive done)&	tracebackr   r  r   r  rX   r.   r-   r[   r   r   lenrG   dictrc   r   r   closed_listsrh   r   r   rO   	Exception
format_excr   rb   CmfErrorr   itemscalc_historyr   r  choicesr!  r   r   r&  r   )r$   r   
do_archiver'  r   members_lenr   errorsr   r   keyvalr  _filterprev_sumr!  r   historyr&  s                      r   process_sprint_completezCmfList.process_sprint_complete  s9   => mm6686Lyyk!23			 w 	x % ..,, Hk, lK $,,'ll 	PFPQr6Q;GG;A3d;-Ocde++x7''..t4 ,,. 2512 2 #{&,,'F"LL//<!(!4!4!6 : &5 9:	P" 499ntnznzn|%}cjcfgj(QRUQVVXY\X]&^%}~	;=ll 	PFPQr6Q;GGCA3d;-Wklm##h$#O	P 499  @F  @L  @L  @N  &Ot{twx{(bcfbggijmin&o  &O  P  Q  Q	;="44AAII 	L#T40>42VX}~G//337N_M`jmin3oHML ( 6 6'44..QYht:GTX9=L / ZG LLN	  t,.PRwx++//wJ[I\fiej/k	$22M#00L **I**TXdp:GS\im9=J + X 	GG;=LLNGG:< {2 2
: : PCF82iNbNbNdMefnrs/0cy7K7K7M6N,Ov{{(()P &~  PPQWPXXZ[d[o[o[qZrs{  A/0cy7K7K7M6N,Ov{{(()P &Osp   A'P36P	AP3P&$P3R!<R';TP#	P3&P0	+P33	R<ARR'	T0ATT   u#   Завершение спринта)rr   rp   rn   ro   c           	         dd l }t        j                  j                  | dg      }t        j
                  j                  j                  |j                               }|5  	 |j                  ||       t        j                  j                  g ddd|j                  ggdg      }|r<|j                  s-t        j                  d	      |_        |j                  d
       |}	n|}	d|j                   d}
d}t        j,                  j/                  |	||
|dd       d d d        y # t         $ r;}t#                t        j                  j                  | dg      }	d}
| }Y d }~md }~wt$        $ ru}t#                t        j                  j                  | dg      }	d}
| d|j'                          }t(        j+                  d|j'                          d       Y d }~d }~ww xY w# 1 sw Y   y xY w)Nr   r+   rw   )report_typer   agile_sprintr   tmp_bql_filterr   u/   Фильтр отчета по спринтам)r.   Fr      Спринт "uX   " успешно завершен. Доступен отчет для просмотраu+   Создан отчет по спринтуu,   Ошибка закрытия спринтаr  u.   Ошибка закрытия спринта: Tr  rm   objrz   r.   r0   r{   rr   )r'  r[   r   r   APPREDIS_DBredislockget_lock_keyr9  CmfTaskReportr+   r>  CmfBqlFilterr-   r.   r-  rollback_purge_eventr+  r,  rc   r   r   r   )rT   r   r1  rU   _kwargsr'  r   rE  task_report
notify_objr   r   r   s                r   sprint_complete_jobzCmfList.sprint_complete_job,  s    	NN&&'8*&E	||!!&&y'='='?@ (	o11.*M$2266@8SR[RbRbBcd,- 7  &555;5H5HN5H  6A2#(((6 "-J!*J .y~~.>  ?W  XJ
 ))' ,0 * C(	 (	*  $$&#^^//7H:/N
L !s
 o$&#^^//7H:/N
L !s"Y%9%9%;$<=
HI]I]I_H`aimnno5(	 (	sJ    G*"BD'9%G*'	G'01E&!G*&G'2A+G"G*"G''G**G3c                    | j                  ddg       | j                  dk7  rt        dd       y | j                  dk7  rt        dd       t        j
                  j                  d	d
| gg      dk  r| j                  ||      S t        d       t        | j                  | j                  j                  ||t        j                  j                  j                  d       d }|#t        j                  j                  |g d      }|S )Nr;   r   r4   6   Это метод только для спринтовTrL   rJ   uL   Завершить можно только запущенный СпринтrO   rP   rQ   rS   u   Завершение спринта займет несколько минут. После окончания процесса, вы получите уведомление с отчетом.)rT   r   r1  rU   rW   r  rw   )r   r;   r/   r   r[   r\   r]   r9  r_   rM  ra   rb   rc   rd   r   r   )r$   r   r1  rJ  r   s        r   r   zCmfList.sprint_complete\  s"   .*=>? 33NVZ[!!]2dlpq>>v'>?"D//
KK I J!((#'77==Nbl  CD  CS  CS  CV  CV  C\  C\  ]^ K)$nn00N Lo0 p r   )archive_projectc                   | j                  g d       | j                  dk(  r|s| j                  dk(  st        dd       |r| j                  nt        d | j                        }|D ]G  }d}|j                  D ]  }|| k7  s	|j                  rd} n |s/d|_        |j                  d	       I t        | (  |d
|i| | S )N)r;   r  zmembers.lists.cmf_archivedr   r4   rK   uT   Можно архивировать только завершенный спринтTrL   c                      | j                   dk(  S )NrK   )r   )ts    r   <lambda>z!CmfList.archive.<locals>.<lambda>{  s    !J]J]aiJi r   Fr'   rP  )r   r;   r   r/   rG   rR   rO   cmf_archivedr-   r   r   )	r$   rP  r   r   tasksr   r1  r   r   s	           r   r   zCmfList.archivet  s    yz 33"4+A+AX+Mpx|}$3DLL@ikokwkw9xE .!
:: Cd{3+;+;%*
 (,D%III-. 	II&Ir   c                 b   | j                   j                  s| j                  j                  sy| j                  j                  rt               }| j	                  ddg       | j
                  rB| j
                  j                  r,| j
                  j                  D ]  }|j                  |        | j                   D ]R  }|j                  s|j                  j                  s'|j                  j                  D ]  }|j                  |        T |D ]E  }| j                  r| j                  j                  |       +| j                  j                  |       G y| j                   j                  r| j                  rt               }| j                   j                  D ]  ^}}}|dk7  r|j	                  dg       |j                  rB|j                  j                  r,|j                  j                  D ]  }|j                  |        |D ]  }| j                  j                  |         yyy)up   
        Всем участникам задач добавляем список в избранное
        Nzmembers.responsible.person_varzcmf_owner.person_varrh   zresponsible.person_var)rG   r*   rA   setr   ri   
person_varaddresponsibler  rh   r   _changes)r$   resultvr   rY  change_action
change_obj_s           r   r   zCmfList._process_auto_favorite  s    ||&&$*<*<*G*G ((UF>@VWX~~$..";";22 "AJJqM" &##(8(8(C(C!--88 &

1&& % 9
%%%%,,Z8%%,,Z8	9
  <<""t'9'9UF151F1F 9-zA H,&&(@'AB))j.D.D.O.O'33>> &

1&"( 9J%%,,Z899  (:"r   c                      d| j                    S )Nzlock-r  r#   s    r   rF  zCmfList.get_lock_key  s    twwi  r   c           	         t         j                  j                  d| j                  d dddddd       | j	                  g d	       t        | j                        }d
}| j                  D ]>  }|dz  }|dz  d
k(  rt        j                  d| d| d       |j                  d|        @ t        j                  d       t         j                  j                  j                  D ]p  }d
}d
}t         j                  j                  | |dgdg      }|r|j                  }|j                  }t         j                  | d||d|      }|j!                          r d
}d
}d
}	t         j"                  j                  | ddgdg      }
|
r$|
j                  }|
j                  }|
j$                  }	t         j#                  | d||d|	d      }|j!                          y )Nspint_startu   Запущен спринтr^   infoprocokFrm   operatecmf_model_namer+   
audit_dataresult_statusignore_transactionsecurity_level)r.   r   zmembers.agile_story_pointsz1members.listsmembers.op_gantt_task.sched_durationr  r   r  z"process_sprint_start calc_history r  z tasks complete ...startedr  z&process_sprint_start calc_history doner  r   )r   r  r  rx   T)r   r  r   r!  r"  r  r%  )r   r  r   r!  r"  r&  r  )r[   CmfAuditaudit_eventr   r   r(  rG   rc   r   r/  r   r  r0  r   r!  r   r-   r   r&  )r$   number_tasks
task_countr   r  r!  r   r7  r8  r&  prev_rte_historyrte_historys               r   r^   zCmfList.process_sprint_start  s	   ##M$//#'=Zdz4{*.5YZ 	$ 	\ 	 f 	g 4<<(
LL 	KD!OJB!#<ZL\NZmno	TJ		K
 	
89 #44AAII 
	LML//33dQ]>O=PZ]Y^ 4 `H ( 6 6'44..QZiu=JW[jv / xGLLN
	 	!3377$U_BSAT^a]b 8 d,::M+88L(22I..QZiu=JW[gp<F / H 	r   u   Запуск спринтаrV   c           
         t         j                  j                  |       }t        j                  j
                  j                  |j                               }|5  	 |j                          ||_	        |j                  d       t         j                  j                  ddd dddd	d
d       |}d}d|j                   d|j                   d}t         j"                  j%                  ||||dd       d d d        y # t        $ r;}t!                t         j                  j                  | dg      }d}| }Y d }~md }~ww xY w# 1 sw Y   y xY w)Nr  Tr'   rd  r   u,   Запущен спринт (фоновый)r`   re  rh  Frm   ri  u   Спринт запущенr?  z" (u   ) запущенr+   rw   u*   Ошибка запуска спринтаr@  )r[   r   r   rB  rC  rD  rE  rF  r^   rX   r-   rq  rr  r.   r   r+  rI  r   r   )	rT   rU   rV   r   rE  rL  r   r   r   s	            r   r`   zCmfList.sprint_start_job  sQ    NN&&'&2	||!!&&y'='='?@ 	$..0#0	 .++MR['+Ao  zL  9M.2u]^ , ` '
;-inn-=S@PP`a
 ))' ,0 * %	 	  $$&#^^//7H:/N
J !s
	$	 	s7   EA3C=%E=	E1D<7E<EEEc                 $   | j                  g d       | j                  dk7  rt        dd       yt        j                  j                  |       rt        dd       y| j                  j                  d	
      | _        | j                          | S )u-   
        Запуск спринта
        )r;   r   zstatus.workflowr4   rO  TrL   N)r   uG   Спринт уже был запущен! Создайте новый.rJ   r
  )
r   r;   r/   r[   r   r]   r   r  rX   r-   r#   s    r   r   zCmfList.do_start  s     	HI 33NVZ[ ##))D)9_gklmm66=6Q		r   c                 R    | j                    d| j                   d| j                   S )Nr   )	ui_moduler<   r   r#   s    r   hrefzCmfList.href  s&    ..!4<<.$))==r   timetracker_history_idr#  c                 f   d }| j                  ddg       | j                  dk(  s?| j                  dk(  s0| j                  j                  r| j                  j                  dk(  sy|dk(  rt
        j                  j                  d| j                  j                  d	gd
dg      }t
        j                  dd||| d|||	      }|r"|j                  |_
        |j                  |_        |xj                  |j                  xs dz  c_
        |j                  |_        |xj                  |j                  xs dz  c_        |j                          y|dk(  rt
        j                  j                  dd| j                  j                  gdd|gg dgd	gd
g      }t
        j                  | |||j                   |j                  |j                  |j"                  |j                  |j                  dddd      }t
        j                  j%                  ddidd|gdd| j                  j                  gg dg       |j                          y|dk(  rt
        j                  j'                  d| d	gd
dg      }t
        j                  dd||| d||||
      }|r3|j                  |_
        |j                  |_        |j                   |_        |xj                  |j                  xs dz  c_
        |j                  |_        t
        j                  j)                  dd|gdd| gg dg dgdgd
g      }|D ]2  }|xj*                  |j*                  z  c_        |j                  |_        4 |j                   |j*                  z   |_        |xj                  |j                  xs dz  c_        t
        j                  j%                  ddidd|gdd| gg dg       |j                          y|d k(  rt
        j                  j'                  d| d	gd
dg      }t
        j                  dd||| d||||
      }|r3|j                  |_
        |j                  |_        |j                   |_        t
        j                  j)                  dd|gdd| gg dg dgdgd
g      }|D ]2  }|xj,                  |j*                  z  c_        |j                  |_        4 |xj                  |j                  xs dz  c_
        |j                  |_        |j                   |j,                  z
  |_        |xj                  |j                  xs dz  c_        t
        j                  j%                  ddidd|gdd| gg dg       |j                          y|rh|d!k(  rbg ddd| gdd"|gg}t
        j                  j'                  |d	gd
g      }|j1                  dd|g       t
        j                  j'                  |d	gd
g      }d}|rt
        j                  j'                  |d
dg#      }|st
        j                  dd||| ||d$      }||_        ||_        |j                   |z   |_        |j                  |_        |j                  |j.                  z
  |_
        ||_        |j                  |_        ||_        |j"                  |z   |_        t
        j                  j%                  ddidd|gdd| gg dg       |j                          nt
        j                  j'                  dd| gdd|gg dgd
dgdg%      }|r|j                  r,|j                  |kD  r|xj                  |z  c_        nd|_        |j                  r,|j                  |kD  r|xj                  |z  c_
        nd|_
        |xj                  |z  c_        ||_        |xj"                  |z  c_        |j                          |r	 ||       yy|d&k(  rt
        j                  j'                  d| d	gd
g      }t
        j                  dd||| |d'      }|j                  |_
        |j                   |_        |j                  |_        ||_        ||_        ||_        t
        j                  j%                  ddidd|gdd| gg dg       |j                          y|d(k(  rt
        j                  j'                  d| d	gd
g      }t
        j                  j'                  d| |d	gd
g)      }t
        j                  dd||| |d'      }||_        |j                  |j                  kD  r|j                  |j                  z
  |j"                  z
  |_        |j                  |j                  z   |_
        |j                  |j                  z   |_        |j                  |j                  z   |_        n|j"                  |j                  z   |j                  z
  |_        |j                  |j.                  z
  |_
        |j                  |j.                  z
  |_        |j                  |j.                  z
  |_        |j"                  |_        |j                   |_        t
        j                  j%                  ddidd|gdd| gg dg       |j                          yy)*zDhttps://bcrm.carbonsoft.ru/project/Document/DOC-011865#spec-011844-bc                    | }t         j                  j                  dd|j                  gdd|j                  gdd|j
                  gg dgdgddg	      D ]  }|j                  |j                  z   |_        |j                  |j                  z   |j                  z
  |_        |j                  |j                  z   |j                  z
  |_        |j                  | j                  k(  ri| j                  |_        | j                  |j                  z   |j                  z
  |_        | j                   |j                  z   |j                  z
  |_        |} |j#                          |} y )
Nr   >r   r   ra   r  r$  r   r  )r[   r   r5   r   r   ra   r   estimate_valuer&  	spent_inc	spent_decr!  rem_increm_decr   spent_valueremaining_valuer-   )task_historyprev_historyr8  s      r   recalc_historyz/CmfList.history_rte_add.<locals>.recalc_history  sY   'L!3388BRTWYeYtYtAuBMtUaUkUkAlBFlooA^AcAe DTBT^acn]o	 9 q '
 (4'@'@7CYCY'Y$$0$:$:W=N=N$NQXQbQb$b!(4(B(BW__(TW^WfWf(f%??l&:&::-9-H-HG**6*B*BWEVEV*VY`YjYj*jG'.:.J.JW__.\_f_n_n.nG+#*L&'r   r;   r   r4   rJ   Nrp  r%  r  r   r   )r  task_list_idr  rx   FT)	r"  currentr  r   r   r  r  r  r  r   r   r  r   r   r$  r  )r   r   r  r&  r!  r   r  r  r  r#  r  r"  r  r  r   rR   rh   )r  r   r  rx   )
r"  r  r  r   r   r  r  r  r  r#  r   )r#  r   work-loggedr   r   r  <)timetracker_historyrx   )r"  r  r  r   r   r  r#  r  )rR   rx   r  zstate-change)r"  r  r  r   r   r#  r  z
rte-change)r  r   r   r  rx   )r   r;   r   r*   rY   r[   r   sgetra   rb   r!  r   r  r  r  r-   r&  r  bulk_updater   r5   r  r  r  rh   r   )r$   r   r|  r#  r  estimate_durationremaining_durationspent_durationestimate_workremaining_work
spent_workhistory_dater   r  r  r8  prev_histories_taskphr6  prev_history_taskprev_history_sums                        r   history_rte_addzCmfList.history_rte_add  sn   	'" 	.*=>?!!%88))]:**55$:P:P:T:TXe:e 	)!3388j_c_f_f_l_lCTBUADk@R 9 TL ..%6Ggae1;4F3D0> / @G (4(B(B%'3'@'@$!!W%<%<%AA!%55GO  G$:$:$?a? LLN(*!3388.RVX\X_X_XeXeAfBKTSZA[AcAe DUBU_b^c 9 eL
 ..5<Pa:F:P:P>J>X>X=I=W=W<H<T<T@L@\@\?K?Z?Z=A=GTYcg / 	iG $$00E8J:CT79S:H$PTPWPWP]P]9^9[9] 1 ^ LLNX%!3377Z[_k|j}@C[?Q 8 SL..$6Ggae1;4F3D0>1= / ?G (4(B(B%'3'@'@$$0$:$:!!!W%<%<%AA!%55GO"(":":"?"?QUW^H_ITVZ\`HaHmHjHl K[I[ehdi	 #@ #k
 * ;!!R\\1!)+):):&; !( 1 1G4E4E EG  G$:$:$?a? $$00E8J>DdG=TWbdhjnVo=_=a 1 b LLNX%!3377Z[_k|j}@C[?Q 8 SL..$6Ggae1;4F3D0>1= / ?G (4(B(B%'3'@'@$$0$:$:!"(":":"?"?QUW^H_ITVZ\`HaHmHjHl K[I[ehdi	 #@ #k
 * ;!!R\\1!)+):):&; !!W%<%<%AA!%55GO ' 1 1G4E4E EG  G$:$:$?a? $$00E8J>DdG=TWbdhjnVo=_=a 1 b LLN#m(C9#T40(#|<>G "3377wBSAT^a]b 8 dLNNFD'23 & 8 8 < <GGXFYcfbg != !iG  2266Kaknp{j|6}$66$PT:KRYei<R5A5?	 7 AG
 %3!"0$0$:$:^$K!'3'@'@$(4(B(BW__(T%)5&)5)D)D&*<'&2&>&>&O#((44Y<N>DdG=TWbdhjnVo=_=a 5 b  !2266TSW?X@Fg?V?a?cloq|k}AQ@R 7 T ++"//.@#00NB034G0,,"00>A#11^C145G1**n<*.@G+''>9'LLNw' .0!3377Z[_k|j}  HK  GL7  ML..$:KRYei5A5? / AG %1$>$>G! , 6 6G#/#<#<G %6G"&8G#"0G$$00E8J>DdG=TWbdhjnVo=_=a 1 b LLN,.%77;;_cBSAT^a]b  <  d!3377Z[_fmBSAT^a]b 8 dL..$:KRYei5A5? / AG &7G"%%(C(CC")"8"8<;V;V"VYeYqYq"q(8(F(F(X%*6*F*F*X''7'D'Dw'V$".":":\=Y=Y"Y\c\s\s"s(8(F(F(X%*6*F*F*X''7'D'Dw'V$".":":G 0 : :G$$00E8J>DdG=TWbdhjnVo=_=a 1 b LLN5 /r   c	                      fd}	 fd}
 fd} fd} fd} fd} fd} j                  dd	g        j                  d
k(  s? j                  dk(  s0 j                  j                  r j                  j                  dk(  sydk(  rԉdk(  r-|	 |	d|       |	 |	d|       |	 |	d|       | |	d|       ydk(  r% |
d|        |
d|        |
d|        |
d|       ydk(  r% |d|        |d|        |d|        |d|       ydk(  r! |d        |d        |d        |d       ydk(  r! |d        |d        |d        |d       yyydk(  r% |d|        |d|        |d|        |d|       ydk(  r! |d        |d        |d        |d       yy)u  https://bcrm.carbonsoft.ru/project/Document/DOC-011865#spec-011844-b

        Args:
            task_id (str): ид задачи
            task_operate (str): Операция по задаче
            estimate_sp (_type_, optional): _description_. Defaults to None.
            remaining_sp (_type_, optional): _description_. Defaults to None.
            spent_sp (_type_, optional): _description_. Defaults to None.
            estimate_duration (_type_, optional): _description_. Defaults to None.
            remaining_duration (_type_, optional): _description_. Defaults to None.
            spent_duration (_type_, optional): _description_. Defaults to None.
            estimate_work (_type_, optional): _description_. Defaults to None.
            remaining_work (_type_, optional): _description_. Defaults to None.
            spent_work (_type_, optional): _description_. Defaults to None.
            estimate_count (_type_, optional): _description_. Defaults to None.
            remaining_count (_type_, optional): _description_. Defaults to None.
            spent_count (_type_, optional): _description_. Defaults to None.
        c                    t         j                  j                  ddgddgdd| ggdgdg      }t         j                  j                  ddgdd| ggdgdg      }t         j                  	
|| dd	k7  
      }|r"|j                  |_        |j                  |_        |j
                  |j
                  kD  rY|j
                  |j
                  z
  }d	k7  r||_        |xj                  |j                  z  c_        |xj                  |z  c_        |j
                  |j
                  k  rY|j
                  |j
                  z
  }d	k7  r||_        |xj                  |j                  z  c_        |xj                  |z  c_        t         j                  j                  ddiddgddgdd| gg dg       |j                          y )Nr   r   r   r  r  r   r  TrK   r   r   r  r#  rb   r  r  r"  r  Fr  r   Tr  )
r[   r   r   r!  r   rb   r  r  r  r-   )r  rb   r  cur_sum_historyr8  deltar$   rZ   r   r  r#  s         r   change_historyz/CmfList.history_otr_add.<locals>.change_history  s   !3377dTX@YAGw@WAOQUWc@d@f CTAT^a]b 8 dL
 %66::KQUW[C\ESUY[gDhCjFWEXbeaf ; hO ..5<Pa=I6;=I8<;F(;R / TG (7(E(E%'6'C'C$}}|111(:(::(*&+GO%%8%$$-$}}|111$**W]]:(*&+GO%%8%$$-$$$00E8J%0$$=!'w 7!/| D 7$9 1 :
 LLNr   c           
      "   t         j                  j                  ddgdd| ggdgdg      }t         j                  | ddk7  	      }|r||_        |r"|j                  |_        |j
                  |_        dk7  r|j                  |_        |xj                  |j                  z  c_        |xj
                  |j                  z  c_        t         j                  j                  d
diddgddgdd| gg dg       |j                          y )Nr   r   r  r  r   r  TrK   )r   r   r  r#  r  r  r"  r  Fr   r  r  	r[   r   r   rb   r!  r   r  r  r-   )	r  rb   r  r8  r$   rZ   r   r  r#  s	       r   append_historyz/CmfList.history_otr_add.<locals>.append_historyB  s5   $66::KQUW[C\ESUY[gDhCjFWEXbeaf ; hO ..5<Pa=I=I8<;F(;R / TG  %(7(E(E%'6'C'C$h&")--!!W__4!  GMM1 $$00E8J1<dD0I-3T7,C-;T<,P,C0E 1 F
 LLNr   c                 j   t         j                  j                  ddj                  j                  gdd| ggdgdg      }t         j                  | dd	      }|r||_        |r"|j
                  |_        |j                  |_        d
k7  r|j                  |_        |xj
                  |j                  z  c_        |xj                  |j                  z  c_        t         j                  j                  ddiddj                  j                  gddgdd| gg dg       |j                          y )Nr  r   r  r  r   r  TF)r   r   r  r  r  r"  rK   r  r   r  r  )
r[   r   r  ra   rb   r!  r   r  r  r-   )r  rb   r  r8  r$   rZ   r   r  s       r   start_sprintz-CmfList.history_otr_add.<locals>.start_sprint_  sG   $66;;^UY[_[b[b[h[hDiESUY[gDhDjFWEXbeaf < hO ..5<Pa=I8<;@	 / BG
  %(7(E(E%'6'C'C$h&")--!!W__4!  GMM1 $$00E8J:H$PTPWPWP]P]9^:CT79S:H$P\9]9P9R 1 S
 LLNr   c           
      f   t         j                  j                  ddgddgdd| ggdgdg      }t         j                  j                  ddgdd| ggdgdg      }t         j                  || dd	      }|r"|j                  |_        |j                  |_        |r|j
                  |_        |xj                  |j                  z  c_        |xj                  |j                  z  c_        t         j                  j                  d
diddgddgdd| gg dg       |j                          y )Nr   r   r   r  r  r   r  Tr  r  Fr  r  )	r[   r   r   r!  r   r  r  r  r-   )	r  rb   r  r  r8  r$   r   r  r#  s	        r   remove_historyz/CmfList.history_otr_add.<locals>.remove_history|  s{   !3377dTX@YAGw@WAOQUWc@d@f CTAT^a]b 8 dL
 %66::KQUW[C\ESUY[gDhCjFWEXbeaf ; hO ..5<Pa=I6;=I8<;? / AG (7(E(E%'6'C'C$"."6"6!!W__4!  GOO3 $$00E8J1<dD0I-3T7,C-;T<,P,C0E 1 F
 LLNr   c           
         t         j                  j                  ddj                  j                  gddgdd| ggdgdg      }t         j                  |j                  d | dd	
      }t         j                  j                  ddiddj                  j                  gddgdd| gg dg       |j                          y )Nr  r   r   r  r  r   r  FT)r   r   r  r!  r#  r  r"  r  r  r  r  )r[   r   r  ra   rb   r  r-   )r  r  r8  r$   r   r  s      r   close_sprintz-CmfList.history_otr_add.<locals>.close_sprint  s    !3388.RVX\X_X_XeXeAfBKTSZA[BPRVXdAeAg DUBU_b^c 9 eL ..5<Pa>J>P>P=A=IV[ei	 / kG
 $$00E8J:H$PTPWPWP]P]9^:CT79S:H$P\9]9P9R 1 S
 LLNr   c           
      8   t         j                  j                  ddgddgdd| ggdgdg      }t         j                  j                  ddgdd| ggdgdg      }t         j                  |j                  | dd	      }|r"|j                  |_        |j
                  |_        |j                  |_        |xj                  |j                  z  c_        t         j                  j                  d
diddgddgdd| gg dg       |j                          y Nr   r   r   r  r  r   r  T)r   r   r  r#  rb   r  r"  r  r  Fr  r  )	r[   r   r   rb   r!  r   r  r  r-   r  r  r  r8  r$   r   r  r#  s       r   close_historyz.CmfList.history_otr_add.<locals>.close_history  i   !3377dTX@YAGw@WAOQUWc@d@f CTAT^a]b 8 dL
 %66::KQUW[C\ESUY[gDhCjFWEXbeaf ; hO ..5<Pa=I6B6H6H=IVZdh	 / jG
 (7(E(E%'6'C'C$*00GO!!W__4!$$00E8J1<dD0I-3T7,C-;T<,P,C0E 1 F
 LLNr   c           
      8   t         j                  j                  ddgddgdd| ggdgdg      }t         j                  j                  ddgdd| ggdgdg      }t         j                  |j                  | dd	      }|r"|j                  |_        |j
                  |_        |j                  |_        |xj                  |j                  z  c_        t         j                  j                  d
diddgddgdd| gg dg       |j                          y r  r  r  s       r   unclose_historyz0CmfList.history_otr_add.<locals>.unclose_history  r  r   r;   r   r4   rJ   Nchangedchangezstory-pointr%  workr]   rh   r   closeuncloserp  r   )r   r;   r   r*   rY   )r$   r   r#  r  estimate_spr  r  estimate_countrZ   r  r  r  r  r  r  r  s   ````    `       r   history_otr_addzCmfList.history_otr_add  s   (&	 &	P	 	:	:	@	$	6	6 	.*=>?!!%88))]:**55$:P:P:T:TXe:e	)x'*"=+>$0":/@A ,"6=9!-"7N;)}k:z+<=v}5w7)}k:z+<=v}5w7(m,j)f%g&*.
+'(	 +) .4 )+4%67/.1(*'$ ! +r   c                    | j                   st        | 	         S t        j	                  | j                         }t               }| j                  d      D ]r  }|j                  | j                         vs |j                  j                  d      r<|j                  j                  d      rX|j                  |j                         t |r~| j                  dk(  r|j                  d| j                         n;| j                  dk(  r|j                  d	| j                         nt        | 	          d
|v r| j                          y y y )NTr   cache__idr4   PPP-SPRINT-EDITrA  r   PPP-RELEASE-EDITrC   )
project_idr   check_edit_permrB  get_cache_projectrX  r   r   rH   r   endswithrZ  r;   check_project_role_accessr+   rl   )r$   projectchanged_fields_to_checkfieldr   s       r   r  zCmfList.check_edit_perm  s   7*,,''8"%%[[D[1 	>E$$D,J,J,LL!,,77A!,,55e<'++E,<,<=	> #  $77112C1U""n4112D$++1V')%)@@002 A #r   c                 H   | j                   st        | 	         S t        j	                  | j                         }| j
                  dk(  r|j                  d| j                         y | j
                  dk(  r|j                  d| j                         y t        | 	          y )Nr4   r  r  r   r  )r  r   check_delete_permrB  r  r;   r  r+   )r$   r  r   s     r   r  zCmfList.check_delete_perm2  s    7,..''8 33--.?T[[-Q.0--.@dkk-RG%'r   c                 H   |sg }|dk(  r
|g dg dg}n||dk(  r
|g dg dg}nm|dk(  r2|g dg}|j                  dd       rP|d	d
|j                  dd       ggz  }n6|dk(  r1|g dg}|j                  dd       r|d	d
|j                  dd       ggz  }t        |   |f||d|S )Nrelease_member_of_cross)r;   r   r   )is_cross_releaser   Tcross_my_releases)r  r   Frelease_my_sprints)r;   r   r4   r   r+   r   sprint_member_of_releases)rR   object_fields)r   r   field_options_list)r   relation_field_namerR   r  r   r   s        r   r  zCmfList.field_options_list?  s    F";;CEdeF $77CEefF $88HIF  d3Hc=+<+<[$+OPQQ $??CDF  d3Hc=+<+<[$+OPQQw)*=tf\itmsttr   c                     t         j                  j                  | d       t        j                  j                  | dg|i | y )Nr   approve_started)r[   
CmfApprovestart_approve_processCmfEventdo_event)r$   r   r   s      r   r   zCmfList.start_approveS  s9    //a8 	  '8J4J6Jr   c                     | j                  g d       | j                  j                  j                  | _        | j	                  d       t
        j                  j                  | d       y )N)zstatus.trans_approvedzstatus.trans_approved.status_toapprovers_forTr'   approve_success_full)r   rX   r   r   r-   r[   r  r  r#   s    r   _approve_approvedzCmfList._approve_approvedY  sM    fgkk00:: 			D	!  '=>r   c                     | j                  g d       | j                  j                  j                  | _        | j	                  d       t
        j                  j                  | d       y )N)zstatus.trans_rejectedzstatus.trans_rejected.status_tor  Tr'   approve_rejected)r   rX   trans_rejectedr   r-   r[   r  r  r#   s    r   _approve_rejectedzCmfList._approve_rejecteda  sM    fgkk00:: 			D	!  '9:r   c                 t    | j                  g d       | j                  j                  j                  | _        y )N)zstatus.trans_updatedzstatus.trans_updated.status_tor  )r   rX   trans_updatedr   r#   s    r   _approve_updatedzCmfList._approve_updatedi  s(    dekk//99r   c                    |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| t        j                  j                  | d       y )Napprove_group
resolutionr  approved)approver_levelr   masteraccepted)r  r  r  rz   )rA  r  approverapprove_typerR   approve_success_oner   )	r   r)  rc   current_userr[   r  _approve_oner  r  )r$   r   r  r  r  master_filterparamsapproves           r   r   zCmfList.approve_oneo  s    

?3ZZ-
zz&! #=M#>M'^^!	
 ,F8##''1&1 G  5d5f5  '<=r   c                 B    t         j                  j                  |        y r   )r[   r  cancel_approve_processr#   s    r   r   zCmfList.cancel_approve  s    006r   uO   Установка опции согласовано руководителем)rn   rp   c                 N   t         j                  j                  | g d      }|j                  sy |j                  }|D ]d  }|j
                  |j
                  k7  rd|_        |j                          d|j                   d}t         j                  j                  ||       f y )N)rC   r.   rG   rw   Tue   SimpleLogic: Задача согласована автоматически (опция списка ))r+   r  )r[   r   r   rC   rG   r+   r  r-   r.   
CmfCommentadd_comment_audit)r  r   rV  r   comment_texts        r   r   z!CmfList.set_task_auto_approve_job  s     NN&&,?j&k	--!! 	PD{{i... DMIIK C  DM  DR  DR  CS  ST  UL//t,/O	Pr   c                     t        |   |i | | j                  dg       | j                  D ]!  }|j                  s |j                  |i | # | S )Nzmembers.cmf_archivedr   )r   archive_restorer   rG   rU  )r$   r   r   r   r   s       r   r  zCmfList.archive_restore  sb    00!7 89ll 	8F""&&&77	8 r   )NN)NF)zrte-changedNNNNNNN)r  NNNNrN   )7__name__
__module____qualname__r   r   api_methodsclassmethodr   r%   r2   r>   rD   rH   re   rl   staticmethodcmf_deferred_jobr   boolr   r-   r   r   r   r   r   r   r   r
   r   r9  rM  r   r   r   rF  r^   r`   r   propertyr{  r  r  r  r  r  r   r  r  r  r   r   r   r  __classcell__)r   s   @r   r   r   	   s   "".. 2
 
K  	Q45DB.:v "]sw $i[1N"S "$ "Y\ "N "H[z3## !# 	#8 .3% _(i zS\F]^+% _ +%Z bTTUgqfrs t > & &. +/t 4"\| qD>cy}~,  ,\0 .3 *%N!+^ qD>[quv#  S  w <& > > o|Y]`dis iC iWZ iX AEMSR"s R"# R"h30( u u&K?;:>:7 "s  @D  EP E P  r   r   N)r   cmf.includemodules.project.fieldsr   common.models.cmf_active_entityr   r   r   r   r   <module>r     s%      + ;_h _r   