U
     e                     @   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d$d%d&Z fd'd(Zd)d* Zd+d, Zed-d. Zd7eeed0d1d2Zd8eed4d5d6Z  ZS )9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gZ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   Z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   rC   rD   r:   r3   u:   Целевой список для объединения u    не существуетTabort)r?   r@   r   r   r   listr*   r<   removeappendr   delete)r   target_list_idr   target_listrG   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   rU      s    

z(CmfList.get_project.<locals>.root_parent)r'   r<   r   r   rT   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 )NrE   )Zinclude_deletedr3   Fr7   rV   )r*   r   rL   rE   rM   r   r   rO   )r   rV   r
   r   mr   r   r   rO      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   rY      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INrE   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   rL   lenr*   r"   CmfTaskcountr[   r;   debugr:   r   r<   r9   )_kwargsr	   Ztotal_countZ
calc_countr   Z
real_countZ
event_datar   r   r   rB      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   r_   order_bycache_status_type!=CLOSEDtextr_   ri   r3   )r@   rS   r   r   rL   r:   )r	   Zdefault_parentZdefault_pfeedr   r   r   r   
pfeed_list   s2    


  zCmfList.pfeed_listN)release_daterP   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 )NrF   rl   Zstatus_type)r:   ZANDr]   r^   rj   rk   )r_   r3   F)r7   emit)r?   rF   get_default_statusstatusrp   r   r@   r   r   rc   rL   r]   rM   rN   )r   rp   rP   r
   r   rQ   Z
open_tasksrG   r   r   r   release   s     
zCmfList.release)rP   
do_archivec             
   O   s  | j dkrtddd | dddg g | _| jjdd	| _| j d
| _|   | ddddddg d }|d k	rt	j
j|ddddgd}| jD ]N}|j dkr|j|  |jdd q|r||jkr|j| |jdd q| jD ]}|jd| d qt	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 }|	rV|	j}
|	j}t	j| d||
dd |d!}|  qd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IN_PROGRESSuL   Завершить можно только запущенный СпринтTrJ   r   rF   favorite_forrl   rq   u    (Закрыто)members.cache_status_typemembers.listszmember.agile_story_points$members.op_gantt_task.sched_duration members.op_gantt_task.sched_workZkanban_status_columnszkanban_status_columns.statuszkanban_status_columns.work_listrI   FrW   closedtask_list_operate	task_listr   rg   counter_typer   rk   -cmf_created_atr   rn   r   )r   r   estimate_sumremaining_sum
show_charttask_operater   duration)r   r   r   r   	spent_sumr   r   r   )rj   r   r?   rx   rF   rs   rt   r   r   r@   r   r   r*   Zclosed_listsrN   rE   calc_historyCmfListHistoryOTRr   choicesr   r   CmfListHistoryRTEr   archive)r   rP   rv   r
   r   rQ   rH   r   _filterprev_sumr   r   historyr   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"   ry   zmembers.lists.cmf_archivedrj   r   rl   uT   Можно архивировать только завершенный спринтTrJ   c                 S   s
   | j dkS )Nrl   )rj   )tr   r   r   <lambda>G      z!CmfList.archive.<locals>.<lambda>Fr   )r?   r"   rj   r   r_   r*   rE   Zcmf_archivedr   r   r   )r   r
   r   rG   rv   Zlstr   r   r   r   @  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&   rx   )r*   r   r(   r0   r<   r?   addZresponsible
person_varr   rx   rN   rM   )r   resultrG   Zpersonr   r   r   r   r8   T  s    



zCmfList._process_auto_favoritec           
   	   C   s  |  dddddg | jjdd| _| jD ]}|jd| d	 q*tjjj	D ]R}tjj
| |d
gdgd}d}d}|r||j}|j}tj| d||d|d}|  qHtjj
d| d
gdgd}d}d}d}|r|j}|j}|j}tj| d||d|dd}	|	  |   dS )u-   
        Запуск спринта
        rF   zmembers.agile_story_pointsr{   r|   rz   rw   rq   startedr~   r   r   )r   r   ri   r3   r   T)r   r   r   r   r   r   r   r   r   ri   r3   )r   r   r   r   r   r   r   N)r?   rF   rs   rt   r*   r   r@   r   r   r   r   r   r   r   r   r   )
r   rG   r   r   r   r   r   Zprev_rte_historyr   Zrte_historyr   r   r   do_startj  sJ      

  

   zCmfList.do_startc                 C   s   d| j  d| j d| j S )Nra   )Z	ui_moduler#   r4   r   r   r   r   href  s    zCmfList.hrefrte-changed)task_idtimetracker_history_idr   c                 C   sX  dd }|dkrt jjd| dgddgd}t jd	d
||| d|||d	}|rZ|j|_|j|_| j|jphd7  _|j|_| j|jpd7  _|  n|dkr6t 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rjt 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p,d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p4d8  _|j|_|j	|j |_	| j|jp`d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}|rt jj|ddgd}|sDt 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r(|j|kr"| j|8  _nd|_|jrR|j|krL| j|8  _nd|_| j|8  _||_| j
|7  _
|  |rT|| n|d kr*t 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rTt 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 )Nrh   >r   rg   r:   rk   r   r   r   rn   )r@   r   rL   rh   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   r   r   r   r   r   FT)	r   currentr   rG   r   r   r   r   r   r   r}   rg   rG   r   rn   N)r   rG   r   r   r   r   r   r   r   r   r   r   r   r   r=   r_   rN   )
r   r   r   rG   r   r   r   r   r   r   r   zwork-loggedrh   rM   <)timetracker_historyr3   )r   r   r   rG   r   r   r   r   )r_   r3   ri   zstate-change)r   r   r   rG   r   r   r   z
rte-change)r   r   rG   ri   r3   )r@   r   r   r   r   r   r   r   r   r   r   bulk_updaterL   r   r   r   rN   rh   )r   r   r   r   r   estimate_durationZremaining_durationZspent_durationestimate_workZremaining_workZ
spent_workZhistory_dater   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)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krdkr|dk	r|d| |dk	r|d| |dk	r|d| |dk	r|d| ndkr
|	d| |	d| |	d| |	d| ndkr>|d| |d| |d| |d| nVdkrj|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              
      s6  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kr|j|j |_| j|j7  _| j|j7  _|j|jk r|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   rg   rG   r   r   r   rn   T)r   rG   r   r   r<   r   r   r   r   Fr   )
r@   r   r   r   r   r<   r   r   r   r   r   r<   r   cur_sum_historyr   r   r   r   r   r   r   change_history  sR       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d}|rH||_|r\|j|_|j|_|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   rg   r   r   r   rn   T)r   rG   r   r   r   r   r   r   FrG   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 gdd| ggdgdgd}t j | ddd	}|rF||_|rZ|j|_|j|_|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   rg   r   r   r   rn   TF)r   rG   r   r   r   r   r   rG   r   r   r   r   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 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   rg   rG   r   r   r   rn   FT)r   rG   r   r   r   r   r   r   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   rg   rG   r   r   r   rn   T)r   rG   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_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   r   r   r   r   r   r   r   r   r   unclose_history-  sF         z0CmfList.history_otr_add.<locals>.unclose_historyr   ZchangeNzstory-pointr   Zworkrd   rN   rM   closeZuncloser   r}   r   )r   r   r   r   Zestimate_spr   r   Zestimate_countr   r   r   r   r   r   r   r   r   r   history_otr_addt  s^    #




















zCmfList.history_otr_add)r   NNNNNNN)r   NNNN)__name__
__module____qualname__classmethodr   r   r   r%   r)   r+   r   rR   r>   rO   rY   staticmethodZ
celery_apprG   rB   ro   ru   r   r   r8   r   propertyr   strr   r   __classcell__r   r   r   r   r      sL   I
@"
              e    r   N)Zcmf.includeZmodules.project.fieldsr   Zcommon.models.cmf_active_entityr   r   r   r   r   r   <module>   s   