U
    ce                     @   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                       s4  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dddd Zedd  Zd!d!d"d#d$Zd%d& Zee d'd( Zd<d)d*Z fd+d,Zd-d. Zd/d0 Zed1d2 Zd=eeed4d5d6Zd>eed9d:d;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   simple_perm_allow_fieldsr   r   r   r   r*   C   s    z CmfList.simple_perm_allow_fieldsc                    s  |    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| _|   t j||}| jjrttjj | j js| j!jr| 
dg | jD ]D}d|_d|j"_| j s| j!sd |_ d |_!|j|ddi| q| jrX| jjrX| jrX| 
dg | jD ]"}| j|_|j|ddi| q4| j#jr| j#r| 
dg | jD ](}d |_$|%  |&  |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)r3   notifyF)'_process_auto_favoritecmf_emit_eventidgcurrent_personr3   valuevaluesr   get_projectload_fieldsr0   r&   r   modelsZCmfActivityr   r!   r"   r4   r   
startswithZCmfLogicTypeZdefault_task_logic_typer   r   r   r)   r   schedule_deferred_jobr   recalculate_cacheplan_start_dateplan_end_datelistsr   workflowZsave_prepareZ_calc_workflow)r   r
   r   r   taskmemberr   r   r   r   F   sd    $






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)   r1   rD   rE   r9   r2   u:   Целевой список для объединения u    не существуетTabort)r?   r@   r   r   r   listr)   r<   removeappendr   delete)r   target_list_idr   target_listrH   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   rV      s    

z(CmfList.get_project.<locals>.root_parent)r&   r<   r   r   rU   r   r>      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 )NrF   )Zinclude_deletedr2   Fr6   rW   )r)   r   rM   rF   rN   r   r   rP   )r   rW   r
   r   mr   r   r   rP      s    zCmfList.deletec                    s"   t  j|fdd| j di|S )NZmsg_urlz/project/List/z/kanban)r   create_eventr3   )r   Zevent_personr   r   r   r   rZ      s    zCmfList.create_eventT<      )Z	only_onceZsoft_time_limitZ
system_job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| q t	
d| d| d |S )uI   Актуализация кеша кол-ва задач в списке.r   cache_members_countr)   r"   r1      zlist.releasefix_versionsINrF   zNOT INfilterzUpdate cache_members_count z ->  Tr   )Znode_idZelements_countztree-node-count-changes-ztree-node-count-changeszRecalculate /z lists caches)r@   r   rM   lenr)   r"   CmfTaskcountr^   r:   debugr9   r   r<   r8   )_kwargsr	   Ztotal_countZ
calc_countr   Z
real_countZ
event_datar   r   r   rC      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   Z	parent_id==Z	list_typer    cmf_created_at)r2   rc   order_bycache_status_type!=CLOSEDtextrc   rm   r2   )r@   rT   r   r   rM   r9   )r	   Zdefault_parentZdefault_pfeedr   r   r   r   
pfeed_list   s2    


  zCmfList.pfeed_listN)release_daterQ   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 )NrG   rp   status_typer9   ZANDr`   ra   rn   ro   )rc   r2   F)r6   emit)r?   rG   get_default_statusstatusrt   r   r@   r   r   rg   rM   r`   rN   rO   )r   rt   rQ   r
   r   rR   Z
open_tasksrH   r   r   r   release   s     
zCmfList.releasec              
   C   s  |  dddg g | _| jjdd| _| j d| _|   |  ddd	d
ddg d }|d k	rvtjj	|ddddgd}t
| j}d}| jD ]z}|d7 }|d dkrtd| d| d |jdkr|j|  |jdd q|r||jkr|j| |jdd qtd d}| jD ]B}|d7 }|d dkrLtd| d| d |jd| d q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&}|  qrdd| gddd'g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 d'd(}|  |rtd) |   td* |S )+Nr   rG   favorite_forrp   ru   u    (Закрыто)members.cache_status_typemembers.listszmember.agile_story_points$members.op_gantt_task.sched_duration members.op_gantt_task.sched_workkanban_status_columnskanban_status_columns.statuskanban_status_columns.work_listrJ   r   r_      zprocess_sprint_complete Move z of z members complete...FrX   z)process_sprint_complete Move members donez%process_sprint_complete calc_history closedtask_list_operate	task_listz)process_sprint_complete calc_history doner   rk   counter_typer   ro   -cmf_created_atr   rr   T)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)r?   r|   rG   ry   rz   r   r   r@   r   r   rf   r)   r:   ri   rn   Zclosed_listsrO   rF   calc_historyCmfListHistoryOTRr   choicesr   r   CmfListHistoryRTEr   archive)r   rQ   
do_archiverR   Zmembers_lenr-   rI   r   _filterprev_sumr   r   historyr   r   r   r   process_sprint_complete  s    
  







  
   

zCmfList.process_sprint_completec                 K   s   t jj| d}z||| W nB tk
r` } z$t jj||d| | dd |W 5 d }~X Y nX t jj||dd| d| dd d S )Nrw   u,   Ошибка закрытия спринтаr_   )objZpersonr   r   rq   r]   u   Спринт закрытu   Спринт закрыт )r@   r   r   r   	ExceptionZ	CmfNotifyZplace_notify)list_idrQ   r   notify_person_idrj   r   er   r   r   sprint_complete_jobM  s*    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"   rn   r   6   Это метод только для спринтовTrK   IN_PROGRESSuL   Завершить можно только запущенный СпринтrF   ra   rb   2   ur   Закрытие спринта займет несколько минут, ожидайте оповещения.)r   rQ   r   r   )r   r}   r   r   r   rJ   )r?   r"   r   rn   r@   rg   rh   r   rB   r   r9   r<   r:   r;   r   r   )r   rQ   r   rj   rR   r   r   r   sprint_completef  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_archivedrn   r   rp   uT   Можно архивировать только завершенный спринтTrK   c                 S   s
   | j dkS )Nrp   )rn   )tr   r   r   <lambda>      z!CmfList.archive.<locals>.<lambda>Fr   )r?   r"   rn   r   rc   r)   rF   Zcmf_archivedr   r   r   )r   r
   r   rH   r   Zlstr   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_varrO   zresponsible.person_var)r)   r   r'   setr?   r/   
person_varaddZresponsibler|   rO   rN   Z_changes)r   resultvrH   r   Zchange_actionZ
change_obj_r   r   r   r7     s:    
zCmfList._process_auto_favoritec           
   	   C   s>  |  ddddddg | jdkr0tdd	d
 dS | jjdd| _tjj| dr^tdd	d
 dS | 	  | j
D ]}|jd| d qltjjjD ]R}tjj| |dgdgd}d}d}|r|j}|j}tj| d||d	|d}|	  qtjjd| dgdgd}d}d}d}|r|j}|j}|j}tj| d||d	|dd}	|		  dS )u-   
        Запуск спринта
        rG   zmembers.agile_story_pointsr   r   r~   r"   r   r   TrK   Nr   ru   )r   uG   Спринт уже был запущен! Создайте новый.startedr   r   r   )r   r   rm   r2   r   )r   r   r   r   r   r   r   r   r   rm   r2   )r   r   r   r   r   r   r   )r?   r"   r   rG   ry   rz   r@   r   rh   r   r)   r   r   r   r   r   r   r   r   )
r   rH   r   r   r   r   r   Zprev_rte_historyr   Zrte_historyr   r   r   do_start  sX       


  

   zCmfList.do_startc                 C   s   d| j  d| j d| j S )Nre   )Z	ui_moduler#   r3   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 )Nrl   >r   rk   r9   ro   r   r   r   rr   )r@   r   rM   rl   r   r9   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"   rn   r   r   Nr   r   r   r   r   )r   task_list_idrm   r2   FT)	r   currentr   rH   r   r   r   r   r   r   r   r   rk   r   r   rr   )r   rH   r   r   r   r   r   r   r   r   r   r   r   r   r=   rc   rO   r   )
r   r   r   rH   r   r   r   r   r   r   rH   r   zwork-loggedrl   rN   <)timetracker_historyr2   )r   r   r   rH   r   r   r   r   )rc   r2   rm   zstate-change)r   r   r   rH   r   r   r   z
rte-change)r   r   rH   rm   r2   )r?   r"   rn   r   oldr@   r   sgetr9   r<   r   r   r   r   r   r   r   r   bulk_updater   rM   r   r   r   rO   rl   )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changedOPEN)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   rk   rH   r   r   r   rr   Trp   r   rH   r   r   r<   r   r   r   r   Fr   )
r@   r   r   r   r   r<   r   r   r   r   )r   r<   r   cur_sum_historyr   Zdeltar   rv   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   rk   r   r   r   rr   Trp   )r   rH   r   r   r   r   r   r   FrH   r   	r@   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   rk   r   r   r   rr   TF)r   rH   r   r   r   r   rp   r   r   r   )
r@   r   r   r9   r<   r   r   r   r   r   r   )r   rv   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|_|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   rk   rH   r   r   r   rr   Tr   r   Fr   )	r@   r   r   r   r   r   r   r   r   )r   r<   r   r   r   r   r   r   r   r   r   remove_historyG  sH       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   rk   r   r   r   r   rr   FT)r   rH   r   r   r   r   r   r   r   r   )r@   r   r   r9   r<   r   r   )r   r   r   )r   r   r   r   r   close_sprinte  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   rk   rH   r   r   r   rr   T)r   rH   r   r   r<   r   r   r   r   Fr   )	r@   r   r   r<   r   r   r   r   r   r   r   r   r   r   r   r   close_historyw  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"   rn   r   r   Nr   Zchangezstory-pointr   Zworkrh   rO   rN   closeZuncloser   r   )r?   r"   rn   r   r   )r   r   r   r   Zestimate_spr   r   Zestimate_countrv   r   r   r   r   r   r   r   r   r   r   history_otr_add  sp    (

























zCmfList.history_otr_add)NF)r   NNNNNNN)r   NNNNr   ) __name__
__module____qualname__classmethodr   r   r   r%   r(   r*   r   rS   r>   rP   rZ   staticmethodZcmf_deferred_jobrC   rs   r{   r   r   r   r   r7   r   propertyr   strr   r   __classcell__r   r   r   r   r      sV   L
L
')
              m      r   N)Zcmf.includeZmodules.project.fieldsr   Zcommon.models.cmf_active_entityr   r   r   r   r   r   <module>   s   