U
    Yh#/                    @   sB   d dl m Z  d dlT d dlmZ d dlmZ G dd dejZdS )    )datetime)*)cmf_list)CmfActiveEntityc                       sV  e Zd Zejjddddddddd	d
g
 Ze fddZdd Zdd Z	dd Z
 fddZ fddZdd Zeeddddgddeeeddd Z fd!d"Zd#d$ Zd%d& Zed'd'd(d)d*Zd+d+d, fd-d.
Z fd/d0Zeeddd1gd2d3d4 Zeedd5dd6d7d8d9 Zed:d; Zd<d<d=d>d?Zd@dA ZeedBddCddDdEdF ZdudGdHZd+dI fdJdK
Z dLdM Z!dNdO Z"dPdQ Z#eedBddRddDeeedSdTdUZ$dVdW Z%e&dXdY Z'dveeed[d\d]Z(dweed`dadbZ) fdcddZ* fdedfZ+edx fdgdh	Z,didj Z-dkdl Z.dmdn Z/dodp Z0dqdr Z1dsdt Z2  Z3S )yCmfList
pfeed_listarchive
move_tasksZall_relation_personssprint_completereleasedo_startapprove_oneZ
public_getclose_simple_board_periodc                    s   t  j||}|S N)superget)clsargskwargsres	__class__ $./modules/project/models/cmf_list.pyr      s    zCmfList.getc                 C   s   | j r
d S | jj  | _ d S r   )default_task_workflowZ	scheme_wfloadselfr   r   r   _calc_default_workflow   s    zCmfList._calc_default_workflowc                 C   s   | j jsd S | jsd S | j s6d | j_| jjdd d S d| j }| jj  | jj}|r~d|_ |jdd d|j d| }| | j_| jjdd t| d S )NT	only_datau`   Все новые задачи проекта будут добавляться в список FuW   Сбросили галочку Список по умолчанию у спринта z. )Zis_default_list
is_changedparentZdefault_listsavenamer   	cmf_alert)r   msgZcurrent_default_listr   r   r   _calc_is_default_list'   s$    zCmfList._calc_is_default_listc                 C   s^   | j js| js| jrd S | jjr*| jr*d S | jdkr<d| _n| jdkrNd| _n| j | _d S )N)list.agile_sprintlist
list.pfeedpfeed)Z
logic_typer!   is_newui_view_formlogic_prefixui_namelowerr   r   r   r   _calc_ui_view_formA   s    

zCmfList._calc_ui_view_formc                    s   t   ddddg S )Ntree_parentr   auto_favoriteaffect_gantt_task)r   save_preload_fieldsr   r   r   r   r5   O   s    zCmfList.save_preload_fieldsc                    s   t   dg S )Nmembers)r   project_perm_allow_fieldsr   r   r   r   r7   R   s    z!CmfList.project_perm_allow_fieldsc                 C   s  | j jr| jdkrdS | j jjdkr@| j jdkr@tddd dS | j jjdkrj| j jdkrjtddd dS | j jjd	kr| j jdkrtd
dd dS | j jjd	kr| j jdkrtjjdd| ggddk r| 	  n8td t
| j| jjtjjj| j jjdd | j j| _ dS )u[   
        Запускаем или останавливаем Agile спринты
        r(   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   r   r   r   _check_statusU   s.    
zCmfList._check_statusu9   Обновление плановых дат спискаTrC      )descriptionshow_bg_progressbar	only_onceonly_once_argspriorityrC   list_affect_gantt_taskrD   c           	      C   s  t jj| dddgd}g }|jD ]}zLd|_|j  d|j_|jsV|jsVd |_d |_|j	d|d |j
  W q  tk
r } z|j
  |t| W 5 d }~X Y q X q |stjrd}d	}|r|d
|  }tjr|d
tj  }t jj|||ddd d S )Nzmembers.*, members.listsplan_start_dateplan_end_daterP   fieldsTF)notifyr\   uN   Ошибки при обновлении плановых дат списка.u^   Обнаружены ошибки при изменении следующих задач</br>z</br>rU   )personr$   r&   force_notify_current_personrZ   )rJ   r   r   r6   r!   r=   r   r]   r^   r#   ZdpZcommitZCmfAbortErrorZrollbackappendstrrR   Zalertjoin	CmfNotifyplace_notify)	rC   r\   rD   r   Ztask_errorstaskenotify_name
notify_msgr   r   r   _process_plan_datesr   s:    


"zCmfList._process_plan_datesc              	      sF  |    td| j dtjjjitjgd dd | jddD dgkr^tt	j
j| jf |S | js|  | _| jr| jjd	d
dgd | js| jr| jj r| jj| _| js| jr| jj r| jj| _| jst
jjddd| _| jr`| jdkr`| jr| jjdgd | jr4| jjs4| jp,d | _n,| jrL| jjds`d| jpXd | _| jr| jdkrt
jjdd| _|   |   | jr8| jjs| jr8| jj r| jj j! r| jj dg | jj j"j#| jj$krt%d| jj ddd | &  | jj! r8t'(  | )  W 5 Q R X t j||}| j*jr\t+t
j,j- | j.js| j/js| j0jr| j0rt+| j1| jj| j0tjjjdd | jr| jjr| dg | j*D ]*}| j|_|2  |j|ddi| q| j3jrB| j3rB| dg | j*D ](}d |_4|2  |5  |j|| q|S )Nzlist-changes-Zperson_code)Zevent_personsc                 S   s   g | ]
}|j qS r   )
class_name).0ir   r   r   
<listcomp>   s     z CmfList.save.<locals>.<listcomp>Tr!   r6   	cmf_ownerZcmf_owner_assistantsactivityr`   Zbusiness)codeZcache_inmemoryr(   add_object_type1ZSprintzSprint r*   zpfeed.base:default)rv   ztrans_approved.status_tou   В статус uo    можно перейти только после завершения процесса утвержденияr:   r[   rF   ra   F)6_process_auto_favoritecmf_emit_eventrP   rR   rS   rv   rQ   valuesr   ZcmfrJ   ZCmfModelr#   r"   get_projectload_fieldsrt   r2   r   ZCmfActivityr   r,   r.   rw   r$   
startswithZCmfLogicTypeZdefault_task_logic_typer'   rT   rG   r!   rH   Zneed_approvetrans_approved	status_tonewr%   cancel_approvecmfutildisable_aclstart_approver6   rN   r   recalculate_cacher]   r^   r4   rm   Zsave_preparer   workflowZ_calc_workflow)r   r   r   r   memberri   r   r   r   r#      s~    $






zCmfList.savec                 K   s   | j dgd tjj|dddgd}|s<td| ddd	 t| jjD ]}| j| |j	| qH|
  | 
  |   | S )
Nr6   ru   r]   r^   r_   u:   Целевой список для объединения u    не существуетTr:   )r}   rJ   r   r   r%   r)   r6   rQ   removerd   r#   delete)r   target_list_idr   target_listri   r   r   r   r	      s    zCmfList.move_tasksc                    s    fdd  | j jS )Nc                    s0   | sd S | j dkr| S | j   | jjS d S )N
CmfProject)rn   r2   r   rQ   )childroot_parentr   r   r      s    

z(CmfList.get_project.<locals>.root_parent)r2   rQ   r   r   r   r   r|      s    zCmfList.get_projectr   )r$   period_start
period_endc           	      O   s   | j  dkrtddd tj|| dd}|jdd tjjd	d
| ggdddgdd|gdd|ggd}|D ](}|j	|  |j
| |jdd qj|S )N)z	list.basez
list.boarduV   Периоды можно закрывать только у Простой доскиTr:   Zkanban)r$   r2   r-   Fra   r=   r>   zstatus.code=closedZstatus_closed_atz>=z<=r?   )r.   r   r%   rJ   r   r#   rK   r)   r=   r   rd   )	r   r$   r   r   r   r   Zclosed_period_tasksZclosed_tasksri   r   r   r   r     s    
z!CmfList.close_simple_board_periodFTEXKOM_db_deleteforcec                   s   | j j|dgdd t| j D ]*}|j|  |jd|d | j | q|rtjj| |dD ](}t	d|  |j
|d|i| q^tjj| |dD ](}t	d|  |j
|d|i| qt j
|||d	|S )
Nr=   T)include_deletedr`   r   F)ra   r    )	task_listr   u   Удаляем r   r   )r6   r   r)   r=   r   r#   rJ   CmfListHistoryOTRrR   debugr   CmfListHistoryRTEr   )r   r   r   r   r   mhr   r   r   r   #  s    zCmfList.deletec                    s"   t  j|fdd| j di|S )NZmsg_urlz/project/List/z/kanban)r   create_eventrv   )r   Zevent_personr   r   r   r   r   7  s    zCmfList.create_eventlist_ids)rX   
system_jobrY   c              	   C   s   | sd S t jjdd| gddddddd	gd
}|D ]}d}|jdkrFd}t jj|d|jggdgd}d|_d|_d|_	d|_
|D ]P}|d}|d}|dkr||_|dkr||_|dkr||_	|dkr~||_
q~|jdd q0d S )NrP   r>   r.   count_tasks_opencount_tasks_in_progresscount_tasks_in_reviewcount_tasks_closedz--	parent_idr@   r`   r=   list.releasefix_versionscache_status_type)r@   Zgroup_byr   rL   r<   r8   Z	IN_REVIEWr9   Tr   )rJ   r   r)   r.   rK   rL   rP   r   r   r   r   r   r#   )r   r=   lstZ
field_nameZcounterscrI   rL   r   r   r   recalculate_count_cache;  sB        


zCmfList.recalculate_count_cache<      )rX   Zsoft_time_limitr   rZ   c               	   K   s  t j}d}d}|jdddgdD ]}|d7 }t|j}|jdkrf|t jjdd	|ggd
d|gggd7 }|j|kr|d7 }t	
d|j d| d|j  ||_|jdd |jj|jjd}td|j | td| |d dkr t  q t	
d| d| d |S )uI   Актуализация кеша кол-ва задач в списке.r   cache_members_countr6   r.   ru   rU   r   r   r>   r=   zNOT INr?   zUpdate cache_members_count z ->  Tr   )Znode_idZelements_countztree-node-count-changes-ztree-node-count-changesrA   zRecalculate /z lists caches)rJ   r   r)   lenr6   r.   rK   rL   r   rR   r   rP   r#   rQ   rz   Z
cmf_commit)_kwargsr   Ztotal_countZ
calc_countr   Z
real_countZ
event_datar   r   r   r   _  s,    




 
zCmfList.recalculate_cachec                 C   s   t jjdd}g }|rpt jjdgdd|jgdddggdgd	}t jjdddgd
ddgdd|jggdgdgd}n&t jjdddgd
ddggdgdgd}||S )NT)Z
is_defaultr"   r   ==Z	list_typer+   cmf_created_at)r`   r@   order_byr   !=r9   textr@   r   r`   )rJ   r   r   r   r)   rP   )r   Zdefault_parentZdefault_pfeedr   r   r   r   r   ~  s2    


  zCmfList.pfeed_listN)release_dater   c                O   s   |  dg | jjdd| _|| _|   |rtjj|d}tj	j
ddd| ggdd	dggdgd
}|D ]*}|j|  |j| |jddd qfd S )Nr   r9   rI   rP   ZANDr   r>   r   r   r   F)ra   emit)r}   r   get_default_statusrG   r   r#   rJ   r   r   rK   r)   r   r   rd   )r   r   r   r   r   r   Z
open_tasksri   r   r   r   r     s     
zCmfList.releasec                 C   s  dd l }| dddg g | _| jjdd| _| j d| _|   | dd	d
ddd	g d }|d k	r~tj	j
|ddddgd}t| j}d}t }| jD ]
}z|d7 }|d dkrtd| d| d |jdkr|j|  t  |jdd W 5 Q R X n>|rD||jkrD|j| t  |jdd W 5 Q R X W q tk
r }	 z<tjd| d|  dd |	 d|  ||jj< W 5 d }	~	X Y qX q|rtddd | D td  d}| jD ]}z@|d7 }|d dkrtd!| d| d |jd"| d# W n\ tk
r| }	 z<tjd$| d|  dd |	 d|  ||jj< W 5 d }	~	X Y nX q|rtdd%d | D td& tjjj D ]r}
d'd(| gd)d(|
gd*d+d"gg}tjj
|d,gd-gd.}d}d}|r|j!}|j"}tj| d"||dd |
d/}|  qd'd(| gd)d(d0gd*d+d"gg}tj#j
|d,gd-gd.}d}d}d}|r|j!}|j"}|j$}tj#| d"|||dd d0d1}|  |rtd2 | %  td3 |S )4Nr   r$   r   favorite_forr9   r   u    (Закрыто)members.cache_status_typezmembers.listszmember.agile_story_pointsz$members.op_gantt_task.sched_duration members.op_gantt_task.sched_workkanban_status_columnskanban_status_columns.statuskanban_status_columns.work_listr_   rU      zprocess_sprint_complete Move  of z members complete...Fr   u)   Ошибка переноса задчи : Tr   z: 
 
c                 S   s    g | ]\}}d | d| qS )u)   Ошибка преноса задачи r   r   ro   keyvalr   r   r   rq     s     z3CmfList.process_sprint_complete.<locals>.<listcomp>z)process_sprint_complete Move members donez%process_sprint_complete calc_history r   task_list_operater   u6   Ошибка записи истории задачи c                 S   s    g | ]\}}d | d| qS )u:   Ошибка подсчета истории задачи r   r   r   r   r   r   rq     s     z)process_sprint_complete calc_history doner   r   counter_typer   r   -cmf_created_atr   r   )r   r   estimate_sumremaining_sum
show_charttask_operater   duration)r   r   r   r   	spent_sumr   r   r   z%process_sprint_complete archive startz$process_sprint_complete archive done)&	tracebackr}   r   r   r   rG   r$   r#   rJ   r   r   r   r6   dictrR   r   r   Zclosed_listsrd   r   r   r=   	Exception
format_excrv   rQ   CmfErrorrf   itemscalc_historyr   r   choicesr   r   r   r   r   )r   r   
do_archiver   r   Zmembers_lenrp   errorsr   rj   r   _filterprev_sumr   r   historyr   r   r   r   process_sprint_complete  s    
  



.

0

  
   

zCmfList.process_sprint_complete   u#   Завершение спринта)rZ   rX   rV   rW   c                 K   s|  dd l }tjj| dgd}tjj| }|@ zt|	|| tj
jdddgdd|jggdgd}|r|jstjd	d
|_|jdd |}	n|}	d|j d}
d}W n tk
r } z&t  tjj| dgd}	d}
| }W 5 d }~X Y nj tk
rT } zJt  tjj| dgd}	d}
| d|  }tjd|  dd W 5 d }~X Y nX tjj|	||
|ddd W 5 Q R X d S )Nr   r"   r_   Zreport_typer   Zagile_sprinttmp_bql_filterr   u/   Фильтр отчета по спринтам)r$   Fr      Спринт "uX   " успешно завершен. Доступен отчет для просмотраu+   Создан отчет по спринтуu,   Ошибка закрытия спринтаr   u.   Ошибка закрытия спринта: Tr   rU   objrb   r$   r&   rc   rZ   )r   rJ   r   r   APPREDIS_DBredislockget_lock_keyr   ZCmfTaskReportr"   r   ZCmfBqlFilterr#   r$   r   rollback_purge_eventr   r   rR   r   rg   rh   )rC   r   r   rD   r   r   r   r   Ztask_report
notify_objrk   rl   rj   r   r   r   sprint_complete_job  sJ    *zCmfList.sprint_complete_jobc                 K   s   |  ddg | jdkr(tddd d S | jdkr>tddd tjjd	d
| ggddk rd| ||S td t| j	| j
j||tjj
jdd d }|d k	rtjj|ddddgd}|S d S )Nr.   r   r(   6   Это метод только для спринтовTr:   r8   uL   Завершить можно только запущенный Спринтr=   r>   r?   rA   u   Завершение спринта займет несколько минут. После окончания процесса, вы получите уведомление с отчетом.)rC   r   r   rD   rF   r   r   r   r   r_   )r}   r.   r%   r   rJ   rK   rL   r   rN   r   rP   rQ   rR   rS   r   r   )r   r   r   r   r   r   r   r   r
   5  s*    


zCmfList.sprint_complete)archive_projectc                   s   |  ddddg | jdkr|s6| jdks6tddd	 |r@| jntd
d | j}|D ]@}d}|jD ]}|| krb|jsbd} q~qb|rTd|_|jdd qTt	 j
|d|i| | S )Nr.   r   zmembers.lists.cmf_archivedr   r(   r9   uT   Можно архивировать только завершенный спринтTr:   c                 S   s
   | j dkS )Nr9   )r   )tr   r   r   <lambda>T      z!CmfList.archive.<locals>.<lambda>Fr   r   )r}   r.   r   r%   r6   r@   r=   Zcmf_archivedr#   r   r   )r   r   r   r   Ztasksri   r   r   r   r   r   r   M  s     

zCmfList.archivec                 C   sD  | j js| jjsdS | jjrt }| ddg | jrV| jjrV| jjD ]}|| qF| j D ]*}|jr\|jjr\|jjD ]}|| qvq\|D ]$}| jr| j	
| q| j	| qdS | j jr@| jr@t }| j jD ]d^}}}|dkrq|dg |jr"|jjr"|jjD ]}|| q|D ]}| j	
| q&qdS dS )up   
        Всем участникам задач добавляем список в избранное
        Nzmembers.responsible.person_varzcmf_owner.person_varrd   zresponsible.person_var)r6   r!   r3   setr}   rs   
person_varaddZresponsibler   rd   r   Z_changes)r   resultvri   r   Zchange_actionZ
change_obj_r   r   r   ry   b  s:    
zCmfList._process_auto_favoritec                 C   s   d| j  S )Nzlock-r   r   r   r   r   r     s    zCmfList.get_lock_keyc              	   C   sR  t jjd| jd ddddddd | d	d
dddg t| j}d}| jD ]>}|d7 }|d dkrztd| d| d |j	d| d qJtd t j
jjD ]R}d}d}t j
j| |dgdgd}|r|j}|j}t j
| d||d|d}|  qd}d}d}	t jj| ddgdgd}
|
r.|
j}|
j}|
j}	t j| d||d|	dd}|  d S )Nspint_startu   Запущен спринтrM   infoprocokTrU   ZoperateZcmf_model_namer"   Z
audit_dataZresult_statusZcurrent_transactionZsecurity_levelr$   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   r`   )r   r   r   r   r   r   r   )r   r   r   r   r   r   r   )rJ   CmfAuditaudit_eventrn   r}   r   r6   rR   r   r   r   r   r   r   r   r   r#   r   r   )r   Znumber_tasksZ
task_countri   r   r   r   r   r   r   Zprev_rte_historyZrte_historyr   r   r   rM     sh       



 
  

 
  zCmfList.process_sprint_startu   Запуск спринтаrB   c           	      C   s   t jj| d}tjj| }| z\|  ||_	|j
dd t jjddd dddd	dd
d |}d}d|j d|j d}W nD tk
r } z&t  t jj| dgd}d}| }W 5 d }~X Y nX t jj||||dd
d W 5 Q R X d S )Nr   Tr   r   r   u,   Запущен спринт (фоновый)rO   r   r  rU   r  u   Спринт запущенr   z" (u   ) запущенr"   r_   u*   Ошибка запуска спринтаr   )rJ   r   r   r   r   r   r   r   rM   rG   r#   r  r  r$   rv   r   r   rg   rh   )	rC   rD   rE   r   r   r   rk   rl   rj   r   r   r   rO     s<    
   zCmfList.sprint_start_jobc                 C   sd   |  dddg | jdkr*tddd dS tjj| d	rHtd
dd dS | jjdd| _| 	  | S )u-   
        Запуск спринта
        r.   r   zstatus.workflowr(   r   Tr:   N)r   uG   Спринт уже был запущен! Создайте новый.r8   r   )
r}   r.   r%   rJ   r   rL   r   r   rG   r#   r   r   r   r   r     s    
zCmfList.do_startc                 C   s   | j  d| j d| j S )Nr   )Z	ui_moduler/   rv   r   r   r   r   href  s    zCmfList.hrefrte-changed)task_idtimetracker_history_idr   c                 K   s  dd }|  ddg | jdksB| jdksB| jjr>| jjdksBdS |dkrtjjd	| jj	d
gddgd}tjdd||| d	|||d	}|r|j
|_
|j|_| j
|jpd7  _
|j|_| j|jpd7  _|  n|dkr|tjjdd| jj	gdd|gddd	ggd
gdgd}tj| |||j|j
|j
|j|j|jdd	ddd}tjjddidd|gdd| jj	gddd	ggd |  n|dkrtjjd	| d
gddgd}tjdd||| d	||||d
}|r|j
|_
|j|_|j|_| j
|jpd7  _
|j|_tjjdd|gdd| gddd gddd	ggd!gdgd}|D ]}| j|j7  _|j|_q4|j|j |_| j|jprd7  _tjjddidd|gdd| gddd	ggd |  n|d"krtjjd	| d
gddgd}tjdd||| d	||||d
}|r|j
|_
|j|_|j|_tjjdd|gdd| gddd gddd	ggd!gdgd}|D ]}| j|j7  _|j|_qJ| j
|jpzd8  _
|j|_|j|j |_| j|jpd8  _tjjddidd|gdd| gddd	ggd |  n|r|d krddd	gdd| gd!d#|gg}tjj|d
gdgd}|dd|g tjj|d
gdgd}d}|rtjj|ddgd$}|stjdd||| ||d	d%}||_||_|j| |_|j|_|j
|j |_
||_|j|_||_|j| |_tjjddidd|gdd| gddd	ggd |  ntjjdd| gdd|gddd	ggddgd!gd&}|r|jrn|j|krh| j|8  _nd|_|j
r|j
|kr| j
|8  _
nd|_
| j|8  _||_| j|7  _|  |r|| n|d'krptjjd	| d
gdgd}tjdd||| |d	d(}|j
|_
|j|_|j|_||_||_||_tjjddidd|gdd| gddd	ggd |  n*|d)krtjjd	| d
gdgd}tjjd	| |d
gdgd*}tjdd||| |d	d(}||_|j|jkr|j|j |j |_|j
|j |_
|j|j |_|j|j |_n>|j|j |j |_|j
|j |_
|j|j |_|j|j |_|j|_|j|_tjjddidd|gdd| gddd	ggd |  dS )+zDhttps://bcrm.carbonsoft.ru/project/Document/DOC-011865#spec-011844-bc                 S   s   | }t jjdd|jgdd|jgdd|jgdddggdgd	dgd
D ]}|j|j |_|j|j	 |j
 |_|j|j |j |_|j| jkr| j|_| j|j	 |j
 |_| j|j |j |_|} |  |}qBd S )Nr   >r   r   rP   r   r   r   r   r   )rJ   r   r)   r   r   rP   r   estimate_valuer   	spent_inc	spent_decr   rem_increm_decr
  spent_valueremaining_valuer#   )Ztask_historyprev_historyr   r   r   r   recalc_history  s&    

 
z/CmfList.history_rte_add.<locals>.recalc_historyr.   r   r(   r8   Nr  r   r   r   r   )r   task_list_idr   r`   FT)	r   currentr   ri   r   r   r  r  r  r   r   r  r   r
  r   r   )r   ri   r   r   r   r   r  r  r  r   r   r   r  r  r{   r@   rd   )r   r   r   r`   )
r   r  r   ri   r   r   r  r  r  r   ri   r   zwork-loggedr   r   <)timetracker_historyr`   )r   r  r   ri   r   r  r   r   )r@   r`   r   zstate-change)r   r  r   ri   r   r   r   z
rte-change)r   r   ri   r   r`   )r}   r.   r   r!   rH   rJ   r   sgetrP   rQ   r   r   r  r  r  r#   r   r  bulk_updater   r)   r  r  r  rd   r   )r   r
  r  r   r   estimate_durationZremaining_durationZspent_durationestimate_workZremaining_workZ
spent_workZhistory_dater   r  r  r   Zprev_histories_taskphr   Zprev_history_taskZprev_history_sumr   r   r   history_rte_add  s    

  
    

   
       

  

    zCmfList.history_rte_addchangedr<   )r
  r   c	                    s>   fdd}	 fdd}
 fdd} fdd} fd	d
} fdd} fdd}  ddg  jdks jdks jjr jjdksdS dkr܈dkr|dk	r|	d| |dk	r|	d| |dk	r|	d| |dk	r|	d| ndkrP|
d| |
d| |
d| |
d| ndkr|d| |d| |d| |d| nVdkr|d |d |d |d n*dkr:|d |d |d |d n^dkr|d| |d| |d| |d| n*dkr:|d |d |d |d dS ) 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              
      sP  t jjdd gddgdd| ggdgdgd}t jjdd gdd| ggdgdgd}t j || dd	kd
}|r|j|_|j|_|j|jkr|j|j }d	kr||_| j|j7  _| j|7  _|j|jk r|j|j }d	kr||_| j|j8  _| j|8  _t jjddidd gddgdd| gdddggd |	  d S )Nr   r   ri   r   r   r   r   Tr9   r   ri   r   r   rQ   r   r  r   r  Fr  )
rJ   r   r   r   r   rQ   r  r  r  r#   )r   rQ   r  cur_sum_historyr   Zdeltar   rI   r
  r   r   r   r   change_history  sZ       z/CmfList.history_otr_add.<locals>.change_historyc              	      s   t jjdd gdd| ggdgdgd}t j | ddkd	}|rL||_|r`|j|_|j|_dkrp|j|_| j|j7  _| j|j7  _t jjd
didd gddgdd| gd
ddggd |  d S )Nr   r   r   r   r   r   Tr9   )r   ri   r   r   r   r  r   r  Fri   r  	rJ   r   r   rQ   r   r   r  r  r#   r   rQ   r#  r   r$  r   r   append_history  s>      z/CmfList.history_otr_add.<locals>.append_historyc                    s   t jjdd jjgdd| ggdgdgd}t j | ddd	}|rJ||_|r^|j|_|j|_d
krn|j|_| j|j7  _| j|j7  _t jjddidd jjgddgdd| gdddggd |	  d S )Nr  r   r   r   r   r   TF)r   ri   r   r   r  r   r9   r  r
  r  )
rJ   r   r  rP   rQ   r   r   r  r  r#   r'  )r   rI   r
  r   r   r   start_sprint8  s<      z-CmfList.history_otr_add.<locals>.start_sprintc              
      s   t jjdd gddgdd| ggdgdgd}t jjdd gdd| ggdgdgd}t j || ddd	}|r|j|_|j|_|r|j|_| j|j8  _| j|j8  _t jjd
didd gddgdd| gd
ddggd |  d S )Nr   r   ri   r   r   r   r   Tr"  r  Fr  )	rJ   r   r   r   r   r  r  r  r#   )r   rQ   r  r#  r   r   r
  r   r   r   r   remove_historyU  sJ       z/CmfList.history_otr_add.<locals>.remove_historyc              
      s   t jjdd jjgddgdd| ggdgdgd}t j |jd | dd	d
}t jjddidd jjgddgdd| gddd	ggd |  d S )Nr  r   r
  r   r   r   r   FT)r   ri   r   r   r   r   r   r  r  r  )rJ   r   r  rP   rQ   r  r#   )r   r  r   )r   r
  r   r   r   close_sprintu  s0        z-CmfList.history_otr_add.<locals>.close_sprintc              
      s   t jjdd gddgdd| ggdgdgd}t jjdd gdd| ggdgdgd}t j |j| ddd	}|r|j|_|j|_|j|_| j|j8  _t jjd
didd gddgdd| gd
ddggd |  d S Nr   r   ri   r   r   r   r   T)r   ri   r   r   rQ   r   r   r  r  Fr  )	rJ   r   r   rQ   r   r   r  r  r#   r   r  r#  r   r*  r   r   close_history  sF         z.CmfList.history_otr_add.<locals>.close_historyc              
      s   t jjdd gddgdd| ggdgdgd}t jjdd gdd| ggdgdgd}t j |j| ddd	}|r|j|_|j|_|j|_| j|j7  _t jjd
didd gddgdd| gd
ddggd |  d S r-  r&  r.  r*  r   r   unclose_history  sF         z0CmfList.history_otr_add.<locals>.unclose_historyr.   r   r(   r8   Nr!  Zchangezstory-pointr   ZworkrL   rd   r   closeZuncloser  r   )r}   r.   r   r!   rH   )r   r
  r   r   Zestimate_spr  r  Zestimate_countrI   r%  r(  r)  r+  r,  r/  r0  r   r$  r   history_otr_add  sp    ( 

























zCmfList.history_otr_addc                    s   | j st  S t }| jddD ]6}|j|  kr"|jds"|jds"|	|j q"|r| j
dkr|| j jd| jd n(| j
dkr| j jd	| jd n
t   d S )
NTrr   Zcache_Z_idr(   PPP-SPRINT-EDITr   r   PPP-RELEASE-EDIT)projectr   check_edit_permr   r{   rn   r7   r~   endswithr   r.   check_project_role_accessr"   )r   Zchanged_fields_to_checkZfieldr   r   r   r7    s"    




zCmfList.check_edit_permc                    sf   |  dg | jst  S | jdkr:| jjd| jd n(| jdkrX| jjd| jd n
t   d S )Nr6  r(   r3  r4  r   r5  )r}   r6  r   check_delete_permr.   r9  r"   r   r   r   r   r:    s    


zCmfList.check_delete_permc                    s   |sg }|dkr(|dddgdddgg}n|dkrH|dddgdddgg}nv|d	kr|ddd
gg}| dd r|dd| dd gg7 }n:|dkr|dddgg}| dd r|dd| dd gg7 }t j|f||d|S )NZrelease_member_of_crossr.   r   r   Zis_cross_releaseTZcross_my_releasesFZrelease_my_sprintsr(   r   r"   Zsprint_member_of_releases)r@   object_fields)r   r   field_options_list)r   Zrelation_field_namer@   r;  r   r   r   r   r<    s    zCmfList.field_options_listc                 O   s(   t j| d t jj| df|| d S )Nr   Zapprove_started)rJ   
CmfApproveZstart_approve_processCmfEventdo_event)r   r   r   r   r   r   r   '  s    zCmfList.start_approvec                 C   s:   |  dddg | jjj| _| jdd tj| d d S )Nzstatus.trans_approvedzstatus.trans_approved.status_toapprovers_forTr   Zapprove_success_full)r}   rG   r   r   r#   rJ   r>  r?  r   r   r   r   _approve_approved-  s    zCmfList._approve_approvedc                 C   s:   |  dddg | jjj| _| jdd tj| d d S )Nzstatus.trans_rejectedzstatus.trans_rejected.status_tor@  Tr   Zapprove_rejected)r}   rG   Ztrans_rejectedr   r#   rJ   r>  r?  r   r   r   r   _approve_rejected5  s    zCmfList._approve_rejectedc                 C   s    |  dddg | jjj| _d S )Nzstatus.trans_updatedzstatus.trans_updated.status_tor@  )r}   rG   Ztrans_updatedr   r   r   r   r   _approve_updated=  s    zCmfList._approve_updatedc                 K   s   | d}| d}| d}g }|dkr4dddg}|dkrFdd	dg}t| |tjd
d}|rd||d< tjj f |}|r|jf d|i| tj| d d S )Napprove_group
resolutionr   ZapprovedZapprover_levelr   ZmasterZacceptedr   rb   )r   rD  ZapproverZapprove_typer@   Zapprove_success_one)	r   r   rR   Zcurrent_userrJ   r=  Z_approve_oner>  r?  )r   r   rD  rE  r   Zmaster_filterparamsZapprover   r   r   r   C  s(    




zCmfList.approve_onec                 C   s   t j|  d S r   )rJ   r=  Zcancel_approve_processr   r   r   r   r   `  s    zCmfList.cancel_approve)NF)r	  NNNNNNN)r!  NNNNr<   )NN)4__name__
__module____qualname__r   r   Zapi_methodsclassmethodr   r   r'   r1   r5   r7   rT   staticmethodZcmf_deferred_jobre   boolrm   r#   r	   r|   r   r   r   r   r   r   r   r   r   r
   r   ry   r   rM   rO   r   propertyr  r   r2  r7  r:  r<  r   rA  rB  rC  r   r   __classcell__r   r   r   r   r   	   s     $T"
^.
'/
              m        r   N)r   Zcmf.includeZmodules.project.fieldsr   Zcommon.models.cmf_active_entityr   r   r   r   r   r   <module>   s   