U
    xDe%                     @   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j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(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ddg S )Nmembers.responsiblezmembers.cmf_owner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+   E   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| _| jrJ| jdkrJ| jr| jj
dgd | jr| jjs| jpd | _n,| jr6| jjdsJd| jpBd | _| jrn| jdkrntjjdd| _|   t j||}| jjrttjj | j js| j!jr| jD ]D}d|_d|j"_| j s| j!sd |_ d |_!|j|ddi| q| jr>| jjr>| jr>| jD ]"}| j|_|j|ddi| q| j#jr| j#r| jD ](}d |_$|%  |&  |j|| qV|S )Nzlist-changes-Zperson_code)Zevent_personsc                 S   s   g | ]
}|j qS r   )
class_name).0ir   r   r   
<listcomp>L   s     z CmfList.save.<locals>.<listcomp>T)r   r*   	cmf_ownerZcmf_owner_assistantsactivityfieldsZbusiness)coder   add_object_type1ZSprintzSprint r   zpfeed.base:defaultnotifyF)'_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   r   r   r*   r   cmf_deferred_taskr   recalculate_cacheplan_start_dateplan_end_datelistsr   workflowZsave_prepareZ_calc_workflow)r   r
   r   r   taskmemberr   r   r   r   H   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 )
Nr*   r2   rE   rF   r:   r3   u:   Целевой список для объединения u    не существуетTabort)r@   rA   r   r   r   listr*   r=   removeappendr   delete)r   target_list_idr   target_listrI   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   rW      s    

z(CmfList.get_project.<locals>.root_parent)r'   r=   r   r   rV   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 )NrG   )Zinclude_deletedr3   Fr7   rX   )r*   r   rN   rG   rO   r   r   rQ   )r   rX   r
   r   mr   r   r   rQ      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   r[      s    zCmfList.create_eventT<   )Z	only_onceZsoft_time_limitZsystem_taskc               	   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"   r2      zlist.releasefix_versionsINrG   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)rA   r   rN   lenr*   r"   CmfTaskcountr]   r;   debugr:   r   r=   r9   )_kwargsr	   Ztotal_countZ
calc_countr   Z
real_countZ
event_datar   r   r   rD      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)r3   rb   order_bycache_status_type!=CLOSEDtextrb   rl   r3   )rA   rU   r   r   rN   r:   )r	   Zdefault_parentZdefault_pfeedr   r   r   r   
pfeed_list   s2    


  zCmfList.pfeed_listN)release_daterR   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 )NrH   ro   status_typer:   ZANDr_   r`   rm   rn   )rb   r3   F)r7   emit)r@   rH   get_default_statusstatusrs   r   rA   r   r   rf   rN   r_   rO   rP   )r   rs   rR   r
   r   rS   Z
open_tasksrI   r   r   r   release   s     
zCmfList.releasec              
   C   s  |  ddddddg d }|d k	r:tjj|ddddgd	}| jD ]N}|jd
krh|j|  |jdd q@|r@||j	kr@|j	| |jdd q@| jD ]}|j
d| d qtjjjD ]p}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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}
|
  |r|   |S )N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_listrK   ro   FrY   closedtask_list_operate	task_listr   rj   counter_typer   rn   -cmf_created_atr   rq   r   T)r   r   estimate_sumremaining_sum
show_charttask_operater   duration)r   r   r   r   	spent_sumr   r   r   )r@   rA   r   r   r*   rm   Zclosed_listsrP   r   rG   calc_historyCmfListHistoryOTRr   choicesr   r   CmfListHistoryRTEr   archive)r   rR   
do_archiverS   rJ   r   _filterprev_sumr   r   historyr   r   r   r   process_sprint_complete   sp    
  




  

   zCmfList.process_sprint_completec                 O   sD   t jj| d}||| t jj|tjdd| d| dd d S )Nrv   u   Спринт закрытu   Спринт закрыт r^   )objpersonr   r   rp   priority)rA   r   r   r   Z	CmfNotifyZplace_notifyr;   r<   )list_idrR   r   r
   r   r   r   r   r   sprint_complete_job6  s    zCmfList.sprint_complete_job)rR   r   c                O   s   |  ddg | jdkr(tddd d S | jdkr>tddd |  d	d
dg g | _| jjdd| _| j d| _| 	  t
jjdd| ggddk r| ||S td t| j| jj||dd d }|d k	rt
jj|ddddgd}|S d S )Nr"   rm   r   6   Это метод только для спринтовTrL   IN_PROGRESSuL   Завершить можно только запущенный Спринтr   rH   favorite_forro   rt   u    (Закрыто)rG   r`   ra   2   ur   Закрытие спринта займет несколько минут, ожидайте оповещения.)r   rR   r   )r   r{   r   r   r   rK   )r@   r"   r   rm   r   rH   rx   ry   r   r   rA   rf   rg   r   rC   r   r:   r=   r   r   )r   rR   r   r
   r   rS   r   r   r   sprint_completeC  s8    



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_archivedrm   r   ro   uT   Можно архивировать только завершенный спринтTrL   c                 S   s
   | j dkS )Nro   )rm   )tr   r   r   <lambda>j      z!CmfList.archive.<locals>.<lambda>Fr   )r@   r"   rm   r   rb   r*   rG   Zcmf_archivedr   r   r   )r   r
   r   rI   r   Zlstr   r   r   r   c  s    


zCmfList.archivec                 C   s   | j js| jjsdS | jjh}| ddg | j D ]}||jj q2|D ]F}|rJ|j	  |jD ],}| jrz| j
| qb| jjrb| j
| qbqJdS )up   
        Всем участникам задач добавляем список в избранное
        Nr&   r   )r*   r   r(   r0   r=   r@   addZresponsible
person_varr   r   rP   rO   )r   resultrI   r   r   r   r   r   r8   w  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-   
        Запуск спринта
        rH   zmembers.agile_story_pointsr}   r~   r|   r"   r   r   TrL   Nr   rt   )r   uG   Спринт уже был запущен! Создайте новый.startedr   r   r   )r   r   rl   r3   r   )r   r   r   r   r   r   r   r   r   rl   r3   )r   r   r   r   r   r   r   )r@   r"   r   rH   rx   ry   rA   r   rg   r   r*   r   r   r   r   r   r   r   r   )
r   rI   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 )Nrd   )Z	ui_moduler#   r4   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	| 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rptjjdd| 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| 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|_q(|j|j |_| j	|jpfd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|_q>| j|j
pnd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!}|s~t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	rb|j	|kr\| j	|8  _	nd|_	|jr|j|kr| j|8  _nd|_| j|8  _||_
| j|7  _|  |r|| n|d$krdt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 )Nrk   >r   rj   r:   rn   r   r   r   rq   )rA   r   rN   rk   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_history  s&    

 
z/CmfList.history_rte_add.<locals>.recalc_historyr"   rm   r   r   Nr   r   r   r   r   r   FT)	r   currentr   rI   r   r   r   r   r   r   r   rj   rI   r   rq   )r   rI   r   r   r   r   r   r   r   r   r   r   r   r   r>   rb   rP   )
r   r   r   rI   r   r   r   r   r   r   r   zwork-loggedrk   rO   <)timetracker_historyr3   )r   r   r   rI   r   r   r   r   )rb   r3   rl   zstate-change)r   r   r   rI   r   r   r   z
rte-change)r   r   rI   rl   r3   )r@   r"   rm   r   oldrA   r   r   r   r   r   r   r   r   r   r   bulk_updaterN   r   r   r   rP   rk   )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   rj   rI   r   r   r   rq   Tro   r   rI   r   r   r=   r   r   r   r   Fr   )
rA   r   r   r   r   r=   r   r   r   r   )r   r=   r   cur_sum_historyr   Zdeltar   ru   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   rj   r   r   r   rq   Tro   )r   rI   r   r   r   r   r   r   FrI   r   	rA   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 gdd| ggdgdgd}t j | ddd	}|rF||_|rZ|j|_|j|_d
krj|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   rj   r   r   r   rq   TF)r   rI   r   r   r   r   ro   r   rI   r   r   r   )r   ru   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   rj   rI   r   r   r   rq   Tr   r   Fr   )	rA   r   r   r   r   r   r   r   r   )r   r=   r   r   r   r   r   r   r   r   r   remove_history  sH       z/CmfList.history_otr_add.<locals>.remove_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d	d
}t jjddidd gddgdd| gddd	ggd |  d S )Nr   rj   rI   r   r   r   rq   FT)r   rI   r   r   r   r   r   r   r   r   )rA   r   r   r=   r   r   )r   r   r   )r   r   r   r   r   close_sprint8  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   rj   rI   r   r   r   rq   T)r   rI   r   r   r=   r   r   r   r   Fr   )	rA   r   r   r=   r   r   r   r   r   r   r   r   r   r   r   r   close_historyK  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_historyf  sF         z0CmfList.history_otr_add.<locals>.unclose_historyr"   rm   r   r   Nr   Zchangezstory-pointr   Zworkrg   rP   rO   closeZuncloser   r   )r@   r"   rm   r   r   )r   r   r   r   Zestimate_spr   r   Zestimate_countru   r   r   r   r   r   r   r   r   r   r   history_otr_add  sp    (

























zCmfList.history_otr_add)r   NNNNNNN)r   NNNNr   )!__name__
__module____qualname__classmethodr   r   r   r%   r)   r+   r   rT   r?   rQ   r[   staticmethodZ
celery_apprI   rD   rr   rz   r   r   r   r   r8   r   propertyr   strr   r   __classcell__r   r   r   r   r      sV   I
6 )
              k      r   N)Zcmf.includeZmodules.project.fieldsr   Zcommon.models.cmf_active_entityr   r   r   r   r   r   <module>   s   