U
    yb$h5                     @   sB   d dl T d dlmZ d dlmZ d dlmZ G dd dejZdS )    )*)cmf_roadmap)aliased)defaultdictc                       s   e Zd ZdZejjdg Zdd Zdd Z fddZ	 fd	d
Z
eeddddddd Zeg g g g g g g g g g g g g g g g g g g g g g fddZ  ZS )
CmfRoadmapTget_filtered_roadmap_by_levelc                    s    fdd  | j jS )Nc                    s0   | sd S | j dkr| S | j   | jjS d S )NZ
CmfProject)
class_nametree_parentloadvalue)childroot_parent './modules/project/models/cmf_roadmap.pyr      s    

z,CmfRoadmap._calc_parent.<locals>.root_parent)r	   r   selfr   r   r   _calc_parent   s    zCmfRoadmap._calc_parentc                 C   s   | j js| jsd S d| _d S )NZgantt)Z
logic_type
is_changedis_newZui_view_formr   r   r   r   _calc_ui_view_form   s
    zCmfRoadmap._calc_ui_view_formc                    s   t   ddg S )Nzmembers.responsibleztree_parent.activity)supersave_preload_fieldsr   	__class__r   r   r       s    zCmfRoadmap.save_preload_fieldsc                    s  | j s|  | _ | j r.| j jdddddgd | jsP| jrP| jj rP| jj| _| jsr| j rr| j j rr| j j| _| jstjjddd	| _| j	r| j r| j j
s| jpd
 | _nL| jr| jjds| j r| j jdkrd| jpd
 | _nd| jpd
 | _| jr"| jjs| jjr"tddd t j||}| jjrFttjj | j jr| j r| jD ]4}|j  | j kr^| j |_ |j|ddi| q^|S )NZ	cmf_ownerZcmf_owner_assistantsactivitylogic_prefixadd_object_typeZfieldsZ
productionT)codeZcache_inmemory1)ZRoadmapu   Дорожная картаzproject.baseu   Дорожная карта zRoadmap uL   Нельзя изменять memrers и tasks у корневого Roadmap)abortnotifyF)parentr   Zload_fieldsr   r	   r
   modelsZCmfActivitygetr   r   namer   
startswithr   systemmembersr   ZtasksZ	cmf_alertr   saveZschedule_deferred_jobr   recalculate_cache)r   argskwargsresmemberr   r   r   r*   #   s>    




zCmfRoadmap.save<      )Z	only_onceZsoft_time_limitZ
system_jobpriorityc               	   K   s   t j}d}d}|jddgdD ]}|d7 }t|j}|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 )u;   Актуализация кеша кол-ва членов.r   cache_members_countr)   r      zUpdate cache_members_count z ->  T)Z	only_data)Znode_idZelements_countztree-node-count-changes-ztree-node-count-changes2   zRecalculate /z roadmaps caches)r$   r   listlenr)   r3   gdebugidr*   r   Zcmf_emit_eventZ
cmf_commit)_kwargsclsZtotal_countZ
calc_countr   Z
real_countZ
event_datar   r   r   r+   Q   s$    

 
zCmfRoadmap.recalculate_cachec           ;         s8  ||||||||	|
|||||||||||g}t jj}t jjj}| }t|dd}t|dd}t|dd}t|dd}t|dd}t|dd}t|dd} t|d	d}!t|d
d}"t|dd}#t|dd}$t|dd}%t|dd}&t|dd}'t|dd}(t|dd})t|dd}*t|dd}+t|dd},||j	d|j	d|j	d|j	d|j	d|j	d|j	d| j	d|!j	d|"j	d|#j	d|$j	d |%j	d!|&j	d"|'j	d#|(j	d$|)j	d%|*j	d&|+j	d'|,j	d(
|||j|jk||j|jk||j|jk||j|jk||j|jk||j|jk| | j|jk|!|!j| jk|"|"j|!jk|#|#j|"jk|$|$j|#jk|%|%j|$jk|&|&j|%jk|'|'j|&jk|(|(j|'jk|)|)j|(jk|*|*j|)jk|+|+j|*jk|,|,j|+jk}-|j| |d) gt j||-d*\}-}.|-|.}-|- }/tt|/D ]b}0td+d,D ]P}1|0|1d+  }2|1d+krd-n
|0|1d.  }3|2d-k	r||2|1 kr||3|1 |2< q|qni }4td+d,D ]g }5  }6fd/d0|6D }7d+kr2|d+  r2|5|d+   |rnd+krdd1|d2d3d4d0 |4d+  D gg}|5| |5r||j|j|6}8|j|5t j||8d*\}8}.|8|.}8|8 }9fd5d0|9D }7|7|4< q|r4td6d+d7D ]H |4  r fd8d9|4  D }:tt|4 d+  |:B |4 d+ < q|4S ):u8  
        1) Делаем большой запрос с 20 JOIN (T1..T20) и узнаём, какие задачи есть на каждом уровне.
        Сохраняем в levels_dict = {1: {id: parent_id, ...}, 2: {id: parent_id, ...}, ...}.

        2) Для каждого уровня (1..20) делаем новый запрос, где:
        - Условие: CmfTask.id IN (levels_dict[level])
        - Плюс фильтр по уровню — если он задан
        - Плюс глобальный фильтр — если он задан

        3) Результат: словарь {1: [(id_1, parent_id_1), (id_1, parent_id_2), ...], 2: [...], ..., 20: [...]},
        где лежат уже отфильтрованные задачи на данном уровне.
        T2)r&   T3T4T5T6T7T8T9T10T11T12T13T14T15T16T17T18T19T20Zlvl1_idZlvl2_idZlvl3_idZlvl4_idZlvl5_idZlvl6_idZlvl7_idZlvl8_idZlvl9_idZlvl10_idZlvl11_idZlvl12_idZlvl13_idZlvl14_idZlvl15_idZlvl16_idZlvl17_idZlvl18_idZlvl19_idZlvl20_idr   )Z	in_filterZmodelZsa_modelqueryr4      N   c                    s   g | ]}|  | fqS r   r   ).0task_idlevellevels_dictr   r   
<listcomp>	  s     z<CmfRoadmap.get_filtered_roadmap_by_level.<locals>.<listcomp>ORparent_task_idINc                 S   s   g | ]\}}|qS r   r   )rU   tid_r   r   r   rZ     s     c                    s$   g | ]}|d    |d   fqS )r   r   )rU   rowrW   r   r   rZ   $  s        c                    s$   h | ]\}}| d   | fqS )r4   r   )rU   Z_idZ	parent_id)lrY   r   r   	<setcomp>-  s     z;CmfRoadmap.get_filtered_roadmap_by_level.<locals>.<setcomp>)r$   ZCmfTaskZdp_modelZdpdata_driverZSessionr   rR   r<   Zlabelselect_fromZ	outerjoinr\   Zcollect_filter_expfilterallr   dictrangekeysappendZin_r8   set);Zinsert_bql_listZglobal_bql_listZlvl1_bql_listZlvl2_bql_listZlvl3_bql_listZlvl4_bql_listZlvl5_bql_listZlvl6_bql_listZlvl7_bql_listZlvl8_bql_listZlvl9_bql_listZlvl10_bql_listZlvl11_bql_listZlvl12_bql_listZlvl13_bql_listZlvl14_bql_listZlvl15_bql_listZlvl16_bql_listZlvl17_bql_listZlvl18_bql_listZlvl19_bql_listZlvl20_bql_listfiltersZTaskre   Zsessionr?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   Zquery_filterZrowsr`   Zlevel_indexrV   r\   Zfinal_levels_dictZcondsZ	level_idsZlevel_ids_with_parentZquery_nZfiltered_idsZparent_ids_setr   )rc   rX   rY   r   r   m   sX   %




















 
 
 
 
 
 
 
 
 
  
! 
" 
# 
$ 
% 
& 
' 
( 
) 
,




"




$z(CmfRoadmap.get_filtered_roadmap_by_level)__name__
__module____qualname__Z	api_allowr   r   Zapi_methodsr   r   r   r*   staticmethodZcmf_deferred_jobr+   r   __classcell__r   r   r   r   r      sB   .r   N)Zcmf.includeZmodules.project.fieldsr   Zsqlalchemy.ormr   collectionsr   r   r   r   r   r   <module>   s   