
    *.+h@                     X    d dl T d dlmZ d dlmZ d dlmZ  G d dej                  ZdS )    )*)cmf_roadmap)aliased)defaultdictc                        e Zd ZdZej        j        dgz   Zd Zd Z fdZ	 fdZ
e e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 ddfd            Z xZS )
CmfRoadmapTncget_filtered_roadmap_by_levelc                 8    fd | j         j                  S )Nc                     | sd S | j         dk    r| S | j                                          | j        j                  S )N
CmfProject)
class_nametree_parentloadvalue)childroot_parents    './modules/project/models/cmf_roadmap.pyr   z,CmfRoadmap._calc_parent.<locals>.root_parent   sN     t<//!&&((("{5#4#:;;;    )r   r   )selfr   s    @r   _calc_parentzCmfRoadmap._calc_parent   s4    	< 	< 	< 	< 	< {4+1222r   c                 >    | j         j        s	| j        sd S d| _        d S )Ngantt)
logic_type
is_changedis_newui_view_form)r   s    r   _calc_ui_view_formzCmfRoadmap._calc_ui_view_form   s,    * 	;	F#r   c                 N    t                                                      ddgz   S )Nzmembers.responsibleztree_parent.activity)supersave_preload_fields)r   	__class__s    r   r    zCmfRoadmap.save_preload_fields    s%    ww**,,0EG]/^^^r   c                    | j         s|                                 | _         | j         r| j                             g d           | j        s6| j        r/| j        j                                        r| j        j        | _        | j        s6| j         r/| j         j                                        r| j         j        | _        | j        s&t          j                            dd          | _        | j	        r| j         r| j         j
        s| j        pd | _        n`| j        r| j        j                            d          s:| j         r"| j         j        dk    rd	| j        pd | _        nd
| j        pd | _        | j        r)| j        j        s| j        j        rt'          dd            t)                      j        |i |}| j        j        rt-          t          j        j                   | j         j        rN| j         rG| j        D ]?}|j                                         | j         k    r| j         |_          |j        |ddi| @|S )N)	cmf_ownercmf_owner_assistantsactivitylogic_prefixadd_object_typefields
productionT)codecache_inmemory1)Roadmapu   Дорожная картаzproject.baseu   Дорожная карта zRoadmap uL   Нельзя изменять memrers и tasks у корневого Roadmap)abortnotifyF)parentr   load_fieldsr%   r   r   modelsCmfActivitygetr   r'   namer   
startswithr&   systemmembersr   tasks	cmf_alertr   saveschedule_deferred_jobr   recalculate_cache)r   argskwargsresmemberr!   s        r   r<   zCmfRoadmap.save#   st   { 	.++--DK; 	K##kkk $   
 } 	6!1 	6d6F6O6T6T6V6V 	6 ,5DM} 	1 	11E1J1J1L1L 	1 K0DM} 	[".22UY2ZZDM; 	>{ >4;#> >#y/C1		Y >dio&@&@Ak&l&l >; >4;#;~#M#M Qty?OC Q QDII =49+; = =DI ; 	v|& v$**? vhptuuuuegglD+F++<" 	G!&"3"EFFF ;! 	?dk 	?, ? ?=%%''4;66$(KFMFK>e>v>>>
r   <      )	only_oncesoft_time_limit
system_jobpriorityc            	      *   t           j        }d}d}|                    ddg          D ]}|dz  }t          |j                  }|j        |k    r|dz  }t                              d|j         d| d|j                    ||_         |j	        d	
           |j        j
        |j        j
        d}t          d|j         |           t          d|           |dz  dk    rt                       t                              d| d| d           |S )u;   Актуализация кеша кол-ва членов.r   cache_members_countr9   r(      zUpdate cache_members_count z ->  T)	only_data)node_idelements_countztree-node-count-changes-ztree-node-count-changes2   zRecalculate /z roadmaps caches)r3   r   listlenr9   rJ   gdebugidr<   r   cmf_emit_event
cmf_commit)_kwargsclstotal_count
calc_countr   
real_count
event_datas          r   r>   zCmfRoadmap.recalculate_cacheQ   sE    
88,A9+M8NN 	 	K1K[011J.*<<a
xk6Uxx[exxhshvxxyyy2</  40000)4)=Q\QpQvww
J+.JJJWWW9:FFFB!##	IzIIKIIIJJJr   Fc                    ||||||||	|
|||||||||||g}t           j        j        }t           j        j        j        }|                                }t          |d          }t          |d          }t          |d          }t          |d          }t          |d          } t          |d          }!t          |d          }"t          |d	          }#t          |d
          }$t          |d          }%t          |d          }&t          |d          }'t          |d          }(t          |d          })t          |d          }*t          |d          }+t          |d          },t          |d          }-t          |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              }/|                    | |d)         gt           j        ||/*          \  }/}0|/                    |0          }/|/                                }1t!          t"                    }2|1D ]K}3t%          d+d,          D ]8}4|3|4d+z
           }5|4d+k    rd-n
|3|4d.z
           }6|5|5|2|4         vr|6g|2|4         |5<   9Lt!          t"                    }7|ret           j        j        }8t           j                            d/0          j        }9t%          d.d,          D ]}:t-          |2|:d+z
                                                     };|;s0|                    |8j        |8j                                      |8j        d1k    |8j        |9k    |8j                            |;                                                    }<|<D ]y\  }=}>|=}6|>}5|5|2|:         v r"|2|:         |5                             |6           n|6g|2|:         |5<   |5|7|:         v r"|7|:         |5                             |6           m|6g|7|:         |5<   zi }?t%          d+d,          D ]}:g }@|2|:                                         }Ag }B|AD ]*}5|2|:         |5         D ]}C|B                    |5|Cf           +|:d+k    r)||:d+z
           r|@                    ||:d+z
                      |r|:d+k    re|rcd2 |?|:d+z
           D             }Dg }E|7|:                                         D ]%\  }F}G|GD ]}H|H|Dv r|E                    |F            n&d3|d4d5|Dgd6d5|Egg}|@                    |           |@r|                    |j                                      |j                            |A                    }I|                    |@t           j        ||I*          \  }I}0|I                    |0          }I|I                                }Jt?                      }B|JD ]6}3|2|:         |3d)                  D ]}C|B                     |3d)         |Cf            7t-          |B          }B|B|?|:<   |rt%          d7d+d8          D ]}K|?|K         rut?                      }L|?|K         D ]0\  }M}N|2|Kd+z
           |N         D ]}O|L                     |N|Of           1t-          t?          |?|Kd+z
                     |Lz            |?|Kd+z
  <   |?S )9u8  
        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)r6   T3T4T5T6T7T8T9T10T11T12T13T14T15T16T17T18T19T20lvl1_idlvl2_idlvl3_idlvl4_idlvl5_idlvl6_idlvl7_idlvl8_idlvl9_idlvl10_idlvl11_idlvl12_idlvl13_idlvl14_idlvl15_idlvl16_idlvl17_idlvl18_idlvl19_idlvl20_idr   )	in_filtermodelsa_modelqueryrK      N   zsystem.additional_parent)r+   Fc                     g | ]\  }}|S  r   ).0tid_s      r   
<listcomp>z>CmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.<listcomp>8  s    )Y)Y)Y&#q#)Y)Y)Yr   ORparent_task_idINrV      )!r3   CmfTaskdp_modeldpdata_driverSessionr   r   rV   labelselect_from	outerjoinr   collect_filter_expfilterallr   dictrangeCmfRelationOptionCmfRelationTypesgetrR   keys
in_link_idout_link_idcmf_deletedrelation_type_idin_appenditemssetadd)Pinsert_bql_listglobal_bql_listlvl1_bql_listlvl2_bql_listlvl3_bql_listlvl4_bql_listlvl5_bql_listlvl6_bql_listlvl7_bql_listlvl8_bql_listlvl9_bql_listlvl10_bql_listlvl11_bql_listlvl12_bql_listlvl13_bql_listlvl14_bql_listlvl15_bql_listlvl16_bql_listlvl17_bql_listlvl18_bql_listlvl19_bql_listlvl20_bql_listshow_additional_tasksshow_sub_itemsfiltersTaskr   sessionr`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   r   query_filterrowslevels_dictrowlevel_indextask_idr   additional_levels_dictRelation"additional_parent_relation_type_idlevelprev_level_idsresultsr   r   final_levels_dictconds	level_idslevel_ids_with_parentparent_taskprevious_level_idsadditonal_tasks_of_prev_leveladd_task_idadd_task_parent_idsadd_task_parent_idquery_nfiltered_idslparent_ids_set_id	parent_idgrand_parent_idsP                                                                                   r   r	   z*CmfRoadmap.ncget_filtered_roadmap_by_levelm   s"   N )
0 ~&n'3%%'' d&&&d&&&d&&&d&&&d&&&d&&&d&&&d&&&d'''d'''d'''d'''d'''d'''d'''d'''d'''d'''d''' MMi((I&&I&&I&&I&&I&&I&&I&&I&&Z((Z((Z((Z((Z((Z((Z((Z((Z((Z((Z(() , [YrB-899YrB-677YrB-677YrB-677YrB-677YrB-677YrB-677YrB-677YsC."%788YsC.#&899YsC.#&899YsC.#&899YsC.#&899YsC.#&899YsC.#&899YsC.#&899YsC.#&899YsC.#&899YsC.#&899U 	X *<<&
3.	 = 
 
| \**yy{{ "$'' 	J 	JC$Q|| J JkAo.)4)9)9s;QR??S&7+k:R+R+R9G8IK,W5	J "-T!2!2  	S/8H171G1L1LRl1L1m1m1p.q" S S!%k%!)&<&A&A&C&C!D!D% !--(;X=QRRYY(E1-1SS'++N;;  #%%	  07 S S+J%/N)G+e"444#E*73::>JJJJ7E6GE*73"8"???.u5g>EEnUUUUBPAR.u5g>>S  1b\\ 5	= 5	=EE#E*//11I$&!$ I I#.u#5g#> I IK)00';1GHHHHI qyy519% 5LL!3444  .1999)Y)Y<MeVWi<X)Y)Y)Y&461<RSX<Y<_<_<a<a & &8%82E & &.15GGG = D D[ Q Q Q %  H ')41CDt%BC	'O _--- D!--0077GKK	**  )4(F(F# .!!	 )G ) )% "..66&{{}}(+%' I IC'25'9#a&'A I I-113q6;2GHHHHI )--B(C(C%'<e$$  	d2q"%% d d$Q' d%(UUN*;A*> M MY/:1q5/A)/L M MO*..	?/KLLLLM/3C8I!a%8P4Q4QTb4b/c/c%a!e,  r   )__name__
__module____qualname__	api_allowr   r   api_methodsr   r   r    r<   staticmethodcmf_deferred_jobr>   r	   __classcell__)r!   s   @r   r   r      s:       I(48Y7ZZK
3 
3 
3$ $ $_ _ _ _ _, , , , ,\ bTTUVVV  WV \4 8:684646464646464646465757575757575757575757<A5:/y! y! y! \y! y! y! y! y!r   r   N)cmf.includemodules.project.fieldsr   sqlalchemy.ormr   collectionsr   r   r   r   r   <module>r      s        . . . . . . " " " " " " # # # # # #_! _! _! _! _!' _! _! _! _! _!r   