U
    S2f                    @   s6   d dl T d dlmZ d dlmZ G dd dejZdS )    )*)cmf_list)CmfActiveEntityc                       s  e Zd Ze fddZdd Zdd Zdd Z fd	d
Z fddZ	 fddZ
dd Zdd Zdd fdd
Z fddZeedddgddd Zeeddddd d!d" Zed#d$ Zd%d%d&d'd(Zd)d* Zeed+dd,dd-d.d/ ZdZd0d1Z fd2d3Zd4d5 Zd6d7 Zeed+dd8dd-d9d: Zd;d< Zed=d> Zd[eeed@dAdBZ d\eedEdFdGZ! fdHdIZ" fdJdKZ#ed] fdLdM	Z$dNdO Z%dPdQ Z&dRdS Z'dTdU Z(dVdW Z)dXdY Z*  Z+S )^CmfListc                    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Z	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_sprintZkanban
list.pfeedpfeed)Z
logic_typer   is_newZui_view_formlogic_prefixui_namelowerr   r   r   r   _calc_ui_view_form2   s    

zCmfList._calc_ui_view_formc                    s   t   dddg S )Ntree_parentr   auto_favorite)r   save_preload_fieldsr   r   r   r   r(   @   s    zCmfList.save_preload_fieldsc                    s   t   dg S )Nmembers)r   project_perm_allow_fieldsr   r   r   r   r*   C   s    z!CmfList.project_perm_allow_fieldsc              	      sN  |    td| j dtjjjitjgd dd | jddD dgkrLd S | jsv| 	 | _| jrv| 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rL| jdkrL| jr| jj
dgd | jr | jjs | jpd | _n,| jr8| jjdsLd| jpDd | _| jrp| jdkrptjjdd| _|   | jr| jjs| jr| jjr| jjj r| jj
dg | jjjj| jjkrt d| jj ddd | !  | jj rt"#  | $  W 5 Q R X t% j&||}| j'jr@t(tj)j* | j+jsT| j,jr| 
dg | j'D ]D}d|_d|j-_| j+s| j,sd |_+d |_,|j&|ddi| qf| jr| jjr| 
dg | j'D ]*}| j|_|.  |j&|ddi| q| j/jrJ| j/rJ| 
dg | j'D ](}d |_0|.  |1  |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>J   s     z CmfList.save.<locals>.<listcomp>Tr   r)   	cmf_ownerZcmf_owner_assistantsactivityfieldsZbusiness)codeZcache_inmemoryr   add_object_type1ZSprintzSprint r   zpfeed.base:default)r4   ztrans_approved.status_tou   В статус uo    можно перейти только после завершения процесса утвержденияabortnotifyF)2_process_auto_favoritecmf_emit_eventidgcurrent_personr4   valuevaluesr   get_projectload_fieldsr1   r&   r   modelsZCmfActivityr   r!   r"   r5   r   
startswithZCmfLogicTypeZdefault_task_logic_typer   statusr   oldZneed_approvetrans_approved	status_tonewr   cancel_approveZcmfutilZdisable_aclstart_approver   r   r)   schedule_deferred_jobr   recalculate_cacheplan_start_dateplan_end_datelistsZsave_preparer   workflowZ_calc_workflow)r   r
   r   r   taskmemberr   r   r   r   F   sx    $







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 )
Nr)   r2   rN   rO   r<   r3   u:   Целевой список для объединения u    не существуетTr7   )rB   rC   r   r   r   listr)   r?   removeappendr   delete)r   target_list_idr   target_listrR   r   r   r   
move_tasks   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)r+   r&   r   r?   )Zchildroot_parentr   r   r^      s    

z(CmfList.get_project.<locals>.root_parent)r&   r?   r   r   r]   r   rA      s    zCmfList.get_projectF)TEXKOM_db_deletec                   s\   | j j|dgd t| j D ](}|j|  |jdd | j | qt j|d|i|S )NrP   )Zinclude_deletedr3   Fr9   r_   )r)   r   rU   rP   rV   r   r   rX   )r   r_   r
   r   mr   r   r   rX      s    zCmfList.deletec                    s"   t  j|fdd| j di|S )NZmsg_urlz/project/List/z/kanban)r   create_eventr4   )r   Zevent_personr   r   r   r   rb      s    zCmfList.create_eventTlist_ids)	only_once
system_jobZonly_once_argsc                 C   s   | sd S t jjdd| gdddddgd}|D ]}d	}|jd
krBd}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rz||_
qz|  q,d S )Nr<   INr"   count_tasks_opencount_tasks_in_progresscount_tasks_in_reviewcount_tasks_closedfilterr3   rP   list.releasefix_versionscache_status_type)rl   Zgroup_byr   countOPENIN_PROGRESSZ	IN_REVIEWCLOSED)rC   r   rU   r"   CmfTaskrp   r<   rg   rh   ri   rj   r   r   )rc   rP   lstZ
field_nameZcounterscstatus_typerp   r   r   r   recalculate_count_cache   s4    


zCmfList.recalculate_count_cache<      )rd   Zsoft_time_limitre   priorityc               	   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_countr)   r"   r2      rm   rn   rf   rP   zNOT INrl   zUpdate cache_members_count z ->  Tr   )Znode_idZelements_countztree-node-count-changes-ztree-node-count-changes2   zRecalculate /z lists caches)rC   r   rU   lenr)   r"   rt   rp   r|   r=   debugr<   r   r?   r;   Z
cmf_commit)_kwargsr	   Ztotal_countZ
calc_countr   Z
real_countZ
event_datar   r   r   rM      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   	parent_id==Z	list_typer    cmf_created_at)r3   rl   order_byro   !=rs   textrl   r   r3   )rC   r\   r   r   rU   r<   )r	   Zdefault_parentZdefault_pfeedr   r   r   r   
pfeed_list  s2    


  zCmfList.pfeed_listN)release_daterY   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 )NrQ   rs   rw   r<   ZANDrn   rf   ro   r   rk   F)r9   emit)rB   rQ   get_default_statusrE   r   r   rC   r   r   rt   rU   rn   rV   rW   )r   r   rY   r
   r   rZ   Z
open_tasksrR   r   r   r   release  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|  |jdd n*|r||jkr|j| |jdd W q tk
rv }	 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rtd!| d| d |jd"| d# W n\ tk
rP }	 z<tjd$| d|  dd |	 d|  ||jj< W 5 d }	~	X Y nX q|rxt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}|rV|j}|j }|j"}tj!| d"|||dd d0d1}|  |rtd2 | #  td3 |S )4Nr   r   rQ   favorite_forrs   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_listrT   r}      zprocess_sprint_complete Move  of z members complete...Fr`   u)   Ошибка переноса задчи : Tforcez: 
 
c                 S   s    g | ]\}}d | d| qS )u)   Ошибка преноса задачи r   r   r,   keyvalr   r   r   r.   W  s     z3CmfList.process_sprint_complete.<locals>.<listcomp>z)process_sprint_complete Move members donez%process_sprint_complete calc_history closedtask_list_operate	task_listu6   Ошибка записи истории задачи c                 S   s    g | ]\}}d | d| qS )u:   Ошибка подсчета истории задачи r   r   r   r   r   r   r.   f  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)$	tracebackrB   r   rQ   r   rE   r   r   rC   r   r   r   r)   dictr=   r   ro   Zclosed_listsrW   rP   	Exception
format_excr4   r?   CmfErrorjoinitemscalc_historyCmfListHistoryOTRr   choicesr   r   CmfListHistoryRTEr   archive)r   rY   
do_archiver   rZ   Zmembers_lenr-   errorsrS   er   _filterprev_sumr   r   historyr   r   r   r   process_sprint_complete/  s    
  



.

0

  
   

zCmfList.process_sprint_complete   u#   Завершение спринта)r{   rd   descriptionZshow_bg_progressbarc              
   K   st  dd l }tjj| dgd}z||| tjjdddgdd|jggddgd	}|r|jsrtjd
d|_|j	dd |g|j_
|jj
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
rV } 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 d S )Nr   r   rT   Zreport_type=Zagile_sprint
tmp_filterztmp_filter.ft_sprintsrk   u/   Фильтр отчета по спринтам)r   Fr`      Спринт "uX   " успешно завершен. Доступен отчет для просмотраu+   Создан отчет по спринтуu,   Ошибка закрытия спринтаr   u.   Ошибка закрытия спринта: Tr   r}   objpersonr   r   Zforce_notify_current_personr{   )r   rC   r   r   r   ZCmfTaskReportr   r   ZCmfTaskFilterr   Z
ft_sprintsr   r   rollback_purge_eventr   r   r=   r   	CmfNotifyplace_notify)list_idrY   r   notify_person_idr   r   r   Ztask_report
notify_objnotify_name
notify_msgr   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"   ro   r   6   Это метод только для спринтовTr7   rr   uL   Завершить можно только запущенный СпринтrP   rf   r~   r   u   Завершение спринта займет несколько минут. После окончания процесса, вы получите уведомление с отчетом.)r   rY   r   r   r   r   r   r   r   rT   )rB   r"   r   ro   rC   rt   rp   r   rL   r   r<   r?   r=   r>   r   r   )r   rY   r   r   rZ   r   r   r   sprint_complete  s*    


zCmfList.sprint_completec                    s   |  ddddg | jdkr| jdks2tddd	 td
d | jD ]@}d}|jD ]}|| krP|jsPd} qlqP|rBd|_|jdd qBt	 j
|| | S )Nr"   r   zmembers.lists.cmf_archivedro   r   rs   uT   Можно архивировать только завершенный спринтTr7   c                 S   s
   | j dkS )Nrs   )ro   )tr   r   r   <lambda>      z!CmfList.archive.<locals>.<lambda>Fr   )rB   r"   ro   r   rl   r)   rP   Zcmf_archivedr   r   r   )r   r
   r   rR   r   ru   r   r   r   r     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_varrW   zresponsible.person_var)r)   r   r'   setrB   r0   
person_varaddZresponsibler   rW   rV   Z_changes)r   resultvrR   r   Zchange_actionZ
change_obj_r   r   r   r:     s:    
zCmfList._process_auto_favoritec              	   C   sH  |  dddddg t| j}d}| jD ]>}|d7 }|d dkrXtd	| d
| d |jd| d q(t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}|  q|d}d}d}	tjj
| ddgdgd}
|
r|
j}|
j}|
j}	tj| d||d|	dd}|  | jjdd| _|   d S )Nr   rQ   zmembers.agile_story_pointsz1members.listsmembers.op_gantt_task.sched_durationr   r   r}   r   z"process_sprint_start calc_history r   z tasks complete ...startedr   z&process_sprint_start calc_history doner   r   )r   r   r   r3   T)r   r   r   r   r   r   r   )r   r   r   r   r   r   r   rr   r   )rB   r   r)   r=   r   r   rC   r   r   r   r   r   r   r   r   r   rQ   r   rE   )r   Znumber_tasksZ
task_countrR   r   r   r   r   r   r   Zprev_rte_historyZrte_historyr   r   r   process_sprint_start  s^    



 
  

 
  zCmfList.process_sprint_startu   Запуск спринтаc              
   C   s   t jj| d}z*|  |}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 d S )Nr   u   Спринт запущенr   z" (u   ) запущенr   rT   u*   Ошибка запуска спринтаTr}   r   )
rC   r   r   r   r   r4   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   sprint_start_job9  s&    zCmfList.sprint_start_jobc                 C   s   |  dg | jdkr&tddd dS tjj| drDtddd dS tjjd	d
| ggddk rh|   n&td t| j	| j
jtjj
jdd | S )u-   
        Запуск спринта
        r"   r   r   Tr7   N)r   uG   Спринт уже был запущен! Создайте новый.rP   rf   r~   r   un   Запуск спринта займет несколько минут, ожидайте оповещения.)r   r   r   )rB   r"   r   rC   r   rp   rt   r   rL   r   r<   r?   r=   r>   r   r   r   r   do_startT  s    

zCmfList.do_startc                 C   s   d| j  d| j d| j S )Nr   )Z	ui_moduler#   r4   r   r   r   r   hrefm  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   r<   r   r   r   r   r   )rC   r   rU   r   r   r<   r   estimate_valuer   	spent_inc	spent_decr   rem_increm_decr   spent_valueremaining_valuer   )Ztask_historyprev_historyr   r   r   r   recalc_historyu  s&    

 
z/CmfList.history_rte_add.<locals>.recalc_historyr"   ro   r   rr   Nr   r   r   r   r   )r   task_list_idr   r3   FT)	r   currentr   rR   r   r   r   r   r   r   r   r   r   r   r   r   )r   rR   r   r   r   r   r   r   r   r   r   r   r   r   r@   rl   rW   )r   r   r   r3   )
r   r   r   rR   r   r   r   r   r   r   rR   r   zwork-loggedr   rV   <)timetracker_historyr3   )r   r   r   rR   r   r   r   r   )rl   r3   r   zstate-change)r   r   r   rR   r   r   r   z
rte-change)r   r   rR   r   r3   )rB   r"   ro   r   rF   rC   r   sgetr<   r?   r   r   r   r   r   r   r   r   bulk_updater   rU   r   r   r   rW   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_addq  s    

  
    

   
       

  

    zCmfList.history_rte_addchangedrq   )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   rR   r   r   r   r   Trs   r   rR   r   r   r?   r   r   r   r   Fr   )
rC   r   r   r   r   r?   r   r   r   r   )r   r?   r   cur_sum_historyr   Zdeltar   rw   r   r   r   r   r   change_historyq  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   Trs   )r   rR   r   r   r   r   r   r   FrR   r   	rC   r   r   r?   r   r   r   r   r   r   r?   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   rR   r   r   r   r   rs   r   r   r   )
rC   r   r   r<   r?   r   r   r   r   r   r  )r   rw   r   r   r   r   start_sprint  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   rR   r   r   r   r   Tr   r   Fr   )	rC   r   r   r   r   r   r   r   r   )r   r?   r   r   r   r   r   r   r   r   r   remove_history  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   rR   r   r   r   r   r   r   r   r   )rC   r   r   r<   r?   r   r   )r   r   r   )r   r   r   r   r   close_sprint  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   rR   r   r   r   r   T)r   rR   r   r   r?   r   r   r   r   Fr   )	rC   r   r   r?   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"   ro   r   rr   Nr   Zchangezstory-pointr   Zworkrp   rW   rV   closeZuncloser   r   )rB   r"   ro   r   rF   )r   r   r   r   Zestimate_spr   r   Zestimate_countrw   r   r  r  r  r  r	  r
  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 )
NTr/   Zcache_Z_idr   PPP-SPRINT-EDITr   rm   PPP-RELEASE-EDIT)projectr   check_edit_permr   r@   r+   r*   rD   endswithr   r"   check_project_role_accessr   )r   Zchanged_fields_to_checkZfieldr   r   r   r  q  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 )Nr  r   r  r  rm   r  )rB   r  r   check_delete_permr"   r  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   rm   Zis_cross_releaseTZcross_my_releasesFZrelease_my_sprintsr   r   r   Zsprint_member_of_releases)rl   object_fields)r   r   field_options_list)r	   Zrelation_field_namerl   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)rC   
CmfApproveZstart_approve_processCmfEventdo_event)r   r
   r   r   r   r   rK     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)rB   rE   rG   rH   r   rC   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)rB   rE   Ztrans_rejectedrH   r   rC   r  r  r   r   r   r   _approve_rejected  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  )rB   rE   Ztrans_updatedrH   r   r   r   r   _approve_updated  s    zCmfList._approve_updatedc                 K   s^   | d}| d}| d}tjj | |tjdd}|rL|jf d|i| tj| d d S )Napprove_group
resolutionr   r   )r   r  ZapproverZapprove_typeZapprove_success_one)r   rC   r  r=   Zcurrent_userZ_approve_oner  r  )r   r   r  r  r   Zapprover   r   r   approve_one  s    



 zCmfList.approve_onec                 C   s   t j|  d S r   )rC   r  Zcancel_approve_processr   r   r   r   rJ     s    zCmfList.cancel_approve)NF)r   NNNNNNN)r   NNNNrq   )NN),__name__
__module____qualname__classmethodr   r   r   r%   r(   r*   r   r[   rA   rX   rb   staticmethodZcmf_deferred_jobrx   rM   r   r   r   r   r   r   r:   r   r   r   propertyr   strr   r  r  r  r  rK   r  r  r  r   rJ   __classcell__r   r   r   r   r      s|   X
\-
',
              m        r   N)Zcmf.includeZmodules.project.fieldsr   Zcommon.models.cmf_active_entityr   r   r   r   r   r   <module>   s   