
    i                     t    d dl T d dlmZ d dlmZ d dlmZ d dlmZm	Z	 d dl
mZ  G d dej                  Zd	S )
    )*fields)cmf_roadmap)aliased)funcselect)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g dddddg g g f d            Ze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_typer   
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_countr<   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)r6   r   listlenr<   rM   gdebugidr?   r   cmf_emit_event
cmf_commit)_kwargsclstotal_count
calc_countr   
real_count
event_datas          r   rA   zCmfRoadmap.recalculate_cacheS   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   FNc                  %  pqrst sfd} tfdtpqrsfd}!t                               d| d| d| d| d| d	| d
|            ||||||||	|
|||||||||||g}"t          |"          D ]A\  }#}$|$r:t          j        j                            t          j        d|$i          d         |"|#<   B| r7t          j        j                            t          j        d| i          d         } |r7t          j        j                            t          j        d|i          d         }|r7t          j        j                            t          j        d|i          d         }|                     g d           |                     g d           |                     g d           |s|                     g d           t          j        j        qt          j	        j        pt          j        j        j
        rr                                }%|duo|duo||k     o| }&d}'d}(dsqj        g})|r0 |!|          \  }*}|)|*z   })t                               d|            t          sfd|D                       pt          sfd|D                       }+ |%j        |)                     q          },|+r$|,                    pqj        pj        k              },| |"d         g}-|r|r|-                    |           r                    |-t          j        q|,          \  },}.|,                    |.          },|r | qp|,||          },|&r|,                    ||          },|,                                }'d |'D             }(t                               dt-          |(                      i }/|s|sd |(D             |/d<   np|r]t/          qd          }0t/          qd          }1t/          qd          }2t/          qd          }3t/          qd           }4t/          qd!          }5t/          qd"          }6t/          qd#          }7t/          qd$          }8t/          qd%          }9t/          qd&          }:t/          qd'          };t/          qd(          }<t/          qd)          }=t/          qd*          }>t/          qd+          }?t/          qd,          }@t/          qd-          }At/          qd.          }B|%                    qj                            d/          |0j                            d0          |1j                            d1          |2j                            d2          |3j                            d3          |4j                            d4          |5j                            d5          |6j                            d6          |7j                            d7          |8j                            d8          |9j                            d9          |:j                            d:          |;j                            d;          |<j                            d<          |=j                            d=          |>j                            d>          |?j                            d?          |@j                            d@          |Aj                            dA          |Bj                            dB                                        q                              |0|0j        qj        k                                  |1|1j        |0j        k                                  |2|2j        |1j        k                                  |3|3j        |2j        k                                  |4|4j        |3j        k                                  |5|5j        |4j        k                                  |6|6j        |5j        k                                  |7|7j        |6j        k                                  |8|8j        |7j        k                                  |9|9j        |8j        k                                  |:|:j        |9j        k                                  |;|;j        |:j        k                                  |<|<j        |;j        k                                  |=|=j        |<j        k                                  |>|>j        |=j        k                                  |?|?j        |>j        k                                  |@|@j        |?j        k                                  |A|Aj        |@j        k                                  |B|Bj        |Aj        k              }C|C                    qj                            |(                    }C|+r$|C                    pqj        pj        k              }C|r# | qp|C||          }C|C                                }DndC |(D             }Dt9          t:                    }E|DD ]K}Ft=          ddD          D ]8}G|F|Gdz
           }H|Gdk    rdn
|F|GdEz
           }I|H|H|E|G         vr|Ig|E|G         |H<   9Lt                               dFdG                    dH |E                                D                       z              t9          t:                    }J|r*t          j         j        }Kt          j!        "                    dIJ          j        }Lt9          tF                    }Mt=          dEdD          D ]}NtI          |E|Ndz
           %                                          }O|Os0|%                    |Kj&        |Kj'                                      |Kj(        dKk    |Kj)        |Lk    |Kj&                            |O                                                    }P|PD ]y\  }Q}R|Q}I|R}H|H|E|N         v r"|E|N         |H                             |I           n|Ig|E|N         |H<   |H|J|N         v r"|J|N         |H                             |I           m|Ig|J|N         |H<   z|rbtG          |J*                    |Ndz
  i           %                                          |M*                    |Ndz
  tG                                z  }S|Srqj                            tI          |S                    qj(        dKk    qj+        dKk    g}T|s|T                    qj,        dKk                |%                    qj        qj                  j        |T                                 }U|UD ]h\  }V}W|V|E|N         vr|Wg|E|N         |V<   n1|W|E|N         |V         vr!|E|N         |V                             |W           |M|N         -                    |V           it                               dLdG                    dM |J                                D                       z              t=          ddD          D ]p}Ng }XtI          |E|N         %                                          }Yg }Z|YD ]*}H|E|N         |H         D ]}[|Z                    |H|[f           +|Ndk    r@|"|Ndz
           r|X                    |"|Ndz
                      |r|X                    |           |r|Ndk    re|rcdN |/|Ndz
           D             }\g }]|J|N                                         D ]%\  }^}_|_D ]}`|`|\v r|]                    |^            n&dO|dPdQ|\gdRdQ|]gg}|X                    |           |YrE|Xs|r@|%                    qj                                      q                              qj                            |Y                    }a|+r$|a                    pqj        pj        k              }a|Xr;r                    |Xt          j        q|a          \  }a}b|a                    |b          }a|r | qp|a||          }a|a                                }cg }ZtG                      }d|cD ]M}F|Fd         }H|E|N         |H         D ]4}[|H|[f}e|e|dvr*|d-                    |e           |Z                    |e           5N|Z|/|N<   r|rt=          dSddT          D ]}f|/|f         rutG                      }g|/|f         D ]0\  }h}W|E|fdz
           |W         D ]}i|g-                    |W|if           1tI          tG          |/|fdz
                     |gz            |/|fdz
  <   t                               dUdG                    dV |/                                D                       z              |rKg }jg }k|'D ]I}Ft;                      }lt          dRg|z             D ]\  }#}m|F|#         |l|m<   |j                    |l           J t|j||k          }n|rwt=          dEdD          D ]f}N|/|N         D ][\  }H}I|kD ]S}o|I|odW         |Ndz
           v r>|o|N                             |H|If           |odW         |N         -                    |H           T\g|kD ]}o|o.                    dW           t;          |n          }/t                               dXdG                    dY |/                                D                       z              t                               dZ           |/S )[u  
        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: [...]},
        где лежат уже отфильтрованные задачи на данном уровне.

        4) Реализуем вложеную группировку, если переданы group_by_fields
        c                 Z   g }t          |          D ]
\  }}|t          |          k     r||                                         nd}|                              rV|                    dd          \  }	}
t          ||
d           }|st          ||
dz   d           }|                    |          }n't          | |d           }|st          | |dz   d           }|dk    r|                                n|                                }|	                    |           |r
 |j
        | }|S )Nasc.rN   _id)	enumeraterV   lowerr:   splitgetattrlabelrd   descappendorder_by)
task_modelgantt_task_modelquerysort_fieldssort_ordersorder_by_clausesidxfield
sort_order_related_field_namecolclausegantt_prefixs                r   	sort_rowsz=CmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.sort_rows   sO   !'44 0 0
U9<s;?O?O9O9O[-33555UZ
##L11 	G,1KKQ,?,?)A)!"24FMMC Z%&68JU8RTXYY))E**CC!*eT::C G%j%%-FF&0E&9&9sxxzz ''//// :&(89Lr   c                 x   |s|t          t                    }t          t                    |d<   |d         d                             d | D                        d | D             |d<   |                    |           |S |d         }t          t                    }| D ][}||         }t          |t                    r!|D ]}||                             |           @||                             |           \t                      }	|                                D ]\  }}
 |
|dd          |          |	|<   |	S )NmaprN   c                     h | ]
}|d          S )rY    .0items     r   	<setcomp>zVCmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.nested_grouping.<locals>.<setcomp>   s    0N0N0Nd0N0N0Nr   c                 "    g | ]}|d          dfS )rY   Nr   r   s     r   
<listcomp>zWCmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.nested_grouping.<locals>.<listcomp>   s!    $J$J$JDd4j$%7$J$J$Jr   r   )r
   rU   setupdaterm   
isinstancedictitems)r   r   final_items_groupsitems_by_levelrv   groupedr   keyelrD   	sub_itemsnested_groupings              r   r   zCCmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.nested_grouping   sb    &!,T!2!2(3C(8(8u%u%a(//0N0N0N0N0NOOO$J$JE$J$J$Jq!")).999%%1IE!$''G . .5kc4(( .! 1 1**400001 CL''----&&C")--// V VY*?9fQRRjBTUUCJr   c           	      h   g }g }| D ]&}|}|                               }|rn}|rt          j        nt          j        }|}d }	|r|                    dd          d         }t          ||          }
t          |
t          j                  rt          |
t          j	                  st          ||d           r't          ||          }	|	
                    |          }	n!t          |
t          j        t          j        f          rt          ||dz   d           }	nt          |
t          j                  r|
                                }                    |          }|j        }|
j        rd}d}nd}d}t%          t'          j        t'          j        |j        |                   d           g                              |j        |         |j        k                                              
                    |          }	|	*|                    |	           |                    |           (||fS )Nre   rN   rf   left_idright_id)r:   r6   CmfGanttTaskCmfTaskri   rj   
issubclassr   CmfStr	CmfChoicerk   CmfRelationCmfGenericRelation
CmfM2MBasem2m_model_clsdp_model	__table__leftr	   r   array_remove	array_aggcwhererY   	as_scalarrm   )query_fieldsto_be_selected_colsfinal_fieldsrv   
field_nameis_gantt_taskSaModelCmfModelaliasrz   	field_cls	m2m_modelsa_m2m_modeltblmy_id_field_namesub_id_field_name	GanttTaskTaskdata_driverr|   s                   r   select_fieldszACmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.select_fields   s@   "$L% 44 44"
 % 0 0 > >'4>))$2?S6..V^  3!KKQ//2E#He44	 i77 
9V\Vf@g@g  7E400 !'511C))E**CC ")f.@&B[-\]] %guu}dCC#Iv/@AA $-$;$;$=$=	'2';';I'F'F*4$> :/8,0:--/9,09- # $ 1$(N359J3K$L$L$(!" !"$   #U35)9#:gj#HII&Y[["U5\\  ?'..s333 ''
333&44r   z4ncget_filtered_roadmap_by_level method_start: start=z, end=z, group_by_fields=z, show_additional_tasks=z, show_sub_items=z, sort_fields=z, sort_orders=filterr   )r*   z!=ztask.gantt_project)cmf_deleted==F)is_dummyr   F)cmf_archivedr   FNzop_gantt_task.z2ncget_filtered_roadmap_by_level group_by_fields : c              3   B   K   | ]}|                               V  d S Nr:   r   fr|   s     r   	<genexpr>z=CmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.<genexpr>R  s/      RRQall<88RRRRRRr   c              3   B   K   | ]}|                               V  d S r   r   r   s     r   r   z=CmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.<genexpr>R  sT        ZK  ZKyzZ[ZfZfgsZtZt  ZK  ZK  ZK  ZK  ZK  ZKr   )	in_filtermodelsa_modelrq   c                     g | ]
}|d          S )r   r   )r   rows     r   r   z>CmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.<listcomp>k  s    >>>c3q6>>>r   z7ncget_filtered_roadmap_by_level : len(first_level_ids)=c                     g | ]}|d fS r   r   r   task_ids     r   r   z>CmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.<listcomp>r  s    #S#S#SWdO#S#S#Sr   rN   T2)r9   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_idc                     g | ]}|fd z   	S ))NNNNNNNNNNNNNNNNNNNr   r   s     r   r   z>CmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.<listcomp>  s    QQQg
\1QQQr         z-ncget_filtered_roadmap_by_level levels_dict= z, c              3   F   K   | ]\  }}d | dt          |           V  dS lvl=NrV   r   r   idss      r   r   z=CmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.<genexpr>  se        QM  QMltloqtQgWZQgQg]`ad]e]eQgQg  QM  QM  QM  QM  QM  QMr   zsystem.additional_parent)r-   Fz8ncget_filtered_roadmap_by_level additional_levels_dict= c              3   F   K   | ]\  }}d | dt          |           V  dS r   r   r   s      r   r   z=CmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.<genexpr>  sm        `g  `g  |D{~  AD`vfi`v`vlopsltlt`v`v  `g  `g  `g  `g  `g  `gr   c                     g | ]\  }}|S r   r   )r   tidrx   s      r   r   z>CmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.<listcomp>!  s    -]-]-]fc1c-]-]-]r   ORparent_task_idINrY      z3ncget_filtered_roadmap_by_level final_levels_dict= c              3   F   K   | ]\  }}d | dt          |           V  dS r   r   r   r   r   s      r   r   z=CmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.<genexpr>W  se        SY  SYpzpsuzSkY\SkSk_bch_i_iSkSk  SY  SY  SY  SY  SY  SYr   r   z*ncget_filtered_roadmap_by_level grouping: c              3   F   K   | ]\  }}d | dt          |           V  dS )zgroup(z)=Nr   r  s      r   r   z=CmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.<genexpr>u  se        NX  NXoyortyNjWZNjNj^abg^h^hNjNj  NX  NX  NX  NX  NX  NXr   z*ncget_filtered_roadmap_by_level method_end)/rW   rX   rg   r6   r   dp_get_filterrm   r   r   r   SessionrY   anyrq   select_fromjoinop_gantt_task_idcollect_filter_expr   sliceallrV   r   rk   	outerjoinr  in_r
   r   ranger   CmfRelationOptionCmfRelationTypesgetr   rU   keys
in_link_idout_link_idr   relation_type_idr8   r   r   addpop)u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include_archivedchild_task_filtershow_child_tasksshow_additional_tasksshow_sub_itemsstartendrr   rs   group_by_fieldsr}   r   filtersifltrsessionto_be_slicedfirst_level_rowsfirst_level_idsto_be_selected_fieldsadditional_fieldsneed_gantt_joinfirst_queryr   first_query_filterfinal_levels_dictr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rq   rowslevels_dictr   level_indexr   r  additional_levels_dictRelation"additional_parent_relation_type_id_linked_children_idslevelprev_level_idsresultsr  r  ids_for_childrenchild_filterchild_resultschild_id	parent_id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query_filterfiltered_ids
seen_pairspairlparent_ids_setrf   grand_parent_id
tasks_lvl1r   	task_datarv   grouped_levels_dictfinal_items_groupr   r   r   r|   r   su                                                                                                                   @@@@@r   r   z*CmfRoadmap.ncget_filtered_roadmap_by_levelo   s   b	 	 	 	 	(	 	 	 	 	4:	5 :	5 :	5 :	5 :	5 :	5 :	5 :	5x 	
 Xu X XTW X Xkz X X)>X XQ_X XozX X KVX X 	Y 	Y 	Y )
0 !)) 	` 	`GAt `#^.::6>HVZK[\\]^_
 	l$n/;;FNXWfLghhijkO 	l$n/;;FNXWfLghhijkO 	p & 1 = =fnxYjNk l lmn o 	KKKLLL;;;<<<888999 	B""#@#@#@AAA ~&'0	n'3%%''  $4$$ $#	 	  '!%	 	\1>1O1O.$9<M$M!GGZZZ[[[RRRR/RRRRR  KVY  ZK  ZK  ZK  ZK  J  ZK  ZK  ZK  WK  WK#gm%:;GGMM 	]%**9d6Ky|6[\\K$gaj1	 	.#8 	._---*5*H*H.	 +I +
 +
'' "(();<< 	\#)D)[+{[[K 	8%++E377K&??,,>>-=>>>	`#oJ^J^``aaa  e	h$9 e	h#S#S?#S#S#Sa   MRd...d...d...d...d...d...d...d...d///d///d///d///d///d///d///d///d///d///d/// MMi00I..I..I..I..I..I..I..I..Z00Z00Z00Z00Z00Z00Z00Z00Z00Z00Z00) , ![&&YrB$5$@AAYrB$5$>??YrB$5$>??YrB$5$>??YrB$5$>??YrB$5$>??YrB$5$>??YrB$5$>??YsC$6"%$?@@YsC$6#&$@AAYsC$6#&$@AAYsC$6#&$@AAYsC$6#&$@AAYsC$6#&$@AAYsC$6#&$@AAYsC$6#&$@AAYsC$6#&$@AAYsC$6#&$@AAYsC$6#&$@AAU Z TW[[%A%ABB" Y!JJy$2G9<2WXXE '%IdIuk;WWE 99;;D RQQQQ &d++K N N#(B<< N NK!+/2G-8A-=-=TT3{UVCWN*wk+>V/V/V=K<MK09	N GGDtyy  QM  QM  yD  yJ  yJ  yL  yL  QM  QM  QM  HM  HM  M  N  N  N%0%6%6"$ 7h!3<5;5K5P5PVp5P5q5q5t2 (33'7'7$"1b\\ .J .JE%)+eai*@*E*E*G*G%H%HN) ! %mmH,?AUVV]] ,5 15WW +//??  cee	  4; W W/
K)3"-"k%&888'.w7>>~NNNN;I:KK.w7"&<U&CCC259'BII.YYYYFTEV259'BB ( J,/0F0J0J5ST9VX0Y0Y0^0^0`0`,a,adxd|d|  ~C  FG  ~G  IL  IN  IN  eO  eO  -O(+ J $ 3 7 7=M8N8N O O $ 0E 9 $ 6,L
 $4 P , 3 3D4E4N O O O,^GMM$'4CV,W,W,^`l,m,q,q,s,sM7D J J 3)#+;u3E#E#EDM;K$6x$@$@%.k%6H6R%R%R$/$6x$@$G$G	$R$R$R 4U ; ? ? I I I ISVZV_V_  `g  `g  H^  Hd  Hd  Hf  Hf  `g  `g  `g  Wg  Wg  g  h  h  h
 q" ?A ?A U!3!8!8!:!:;;	(*%( M MG'25'9''B M M-44g{5KLLLLM 199uqy) 9WUQY%7888( 8%6777 # 2qyy^y-]-]@QRWZ[R[@\-]-]-]*8:5@VW\@]@c@c@e@e * *<K)<6I * * 2#59K#K#K$A$H$H$U$U$U$)E $L !+-t5GH!4)FG	+ LL111 C% C; C%mmDG44@@FFMMdgkkZcNdNdeeG& a"),,y$:OS\S_:_"`"` ?0;0N0N&+"(.%)")	 1O 1 1- #*..">">" `"+)D)WkS^"_"_#*;;==L,.)!$J+ C C"%a&+6u+=g+F C CK$+[#9D#:55 *t 4 4 4 5 < <T B B B	C ,A!%((  hr1b)) h hA(+ h),.?.B Q QNC3>q1u3Ei3P Q Q . 2 2I3O P P P PQ37<MaRSe<T8U8UXf8f3g3g)!a%0	F  SY  SY  P  V  V  X  X  SY  SY  SY  JY  JY  Y  	Z  	Z  	Z  	YJ!#' - - FF	 )4&?*B C C . .HAu'*1vIe$$!!),,,, #2/*oOa"b"b   M"1b\\ M ME3DU3K M M/1C M M--1B51I%RS)1TTT 1% 8 ? ?.@Y Z Z Z 1% 8 ? C CG L L LMM &8 - -!!%%e,,,, $%8 9 9GGADII  NX  NX  ~O  ~U  ~U  ~W  ~W  NX  NX  NX  EX  EX  X  Y  Y  Y	=>>>  r   xlsxc           	      n   |t          dd           |                    dd           st          dd           |                    dd           rt          dd           |dk    rt          d	d            | j        di |}t          t                    t          t
                    }g }t                      }t                      |                                D ]{}	|	D ]v\  }
}|rA|
||         vr6||                             |
           |         	                    |
           H|
|vr*|                    |
           |	                    |
           w|g t                      fd
|D ]} |d           t                                          |ddg||          S )Nub   Невозможно экспортировать Roadmap без настроек фильтровTr1   r   zJExporting roadmaps without insert_bql_list is unavailable in this verison.r=  z;Exporting groupped roadmaps is unavailable in this verison.ro  z3Only xlsx file format is available in this verison.c                                          |            t                    }| vr|| <   || |f<                       | g           D ]} ||dz              d S )NrN   )rm   rV   r8   )	r  rR  sequence_numberrX  children_maplevel_ofordered_idssequence_mapwalks	       r   rw  z$CmfRoadmap.export2file.<locals>.walk  s    s###!+..O,&&$3S!/4Hc?+,(,,S"55 * *Xuqy))))* *r   r   rY   r  )field_namesbqlformat_filer6  roadmap_ordered_idsroadmap_level_ofroadmap_sequence_mapr   )r>   r8   r   r
   rU   r   r   valuesr  rm   r#   export2file)r]   rx  rz  r6  filter_settingsroadmapchildren_seenroots
roots_seentuplesr   rY  root_idrs  rt  ru  rv  rw  r%   s                @@@@@r   r  zCmfRoadmap.export2file{  sK    "z  CG  H  H  H  H""#4d;; 	pbjnoooo0$77 	aS[_````&  KSWXXXX5#5HHHH"4((#C((UU
66nn&& 		. 		.F&, . ." .mI&>>>%i044W===$Y/66w???j00"w///W---. vv	* 	* 	* 	* 	* 	* 	* 	* 	*  	 	GD!ww""{(,dK'@/:4D7B4<8D # F F 	Fr   )Nro  FN)__name__
__module____qualname__	api_allowr   r   api_methodsr   r!   r$   r?   staticmethodcmf_deferred_jobrA   r   classmethodr  __classcell__)r%   s   @r   r   r   
   s       I(48Y7ZZK
3 
3 
3$ $ $_ _ _ _ _, , , , ,\ bTTUVVV  WV \4 8:6846464646464646464657575757575757575757577<8:7<<A5:,0*.242468?I! I! I! \I!V 6F 6F 6F 6F 6F [6F 6F 6F 6F 6Fr   r   N)cmf.includecmfr   modules.project.fieldsr   sqlalchemy.ormr   
sqlalchemyr   r	   collectionsr
   r   r   r   r   <module>r     s              . . . . . . " " " " " " # # # # # # # # # # # # # #h
F h
F h
F h
F h
F' h
F h
F h
F h
F h
Fr   