
    Si{                     x    d dl  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y	)
    )*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                 F    fd | j                   j                        S )Nc                     | sy | j                   dk(  r| S | j                  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   sE    </!!&&("5#4#4#:#:;;    )r   r   )selfr   s    @r   _calc_parentzCmfRoadmap._calc_parent   s!    	< 4++1122r   c                 X    | j                   j                  s| j                  sy d| _        y )Ngantt)
logic_type
is_changedis_newui_view_form)r   s    r   _calc_ui_view_formzCmfRoadmap._calc_ui_view_form   s!    **;;#r   c                 *    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    w*,0EG]/^^^r   c                    | j                   s| j                         | _         | j                   r| j                   j                  g d       | j                  sK| j                  r?| j                  j                  j                         r| j                  j                  | _        | j                  sK| j                   r?| j                   j                  j                         r| j                   j                  | _        | j                  s&t        j                  j                  dd      | _        | j                  r| j                   r-| j                   j                  s| j                  xs d | _        n| j                  r%| j                  j                  j                  d      sV| j                   r2| j                   j                  dk(  rd	| j                  xs d | _        nd
| j                  xs d | _        | j                  r9| j                   j"                  s| j$                  j"                  rt'        dd       t)        | T  |i |}| j                   j"                  r#t-        t        j.                  j0                         | j                   j"                  rj| j                   r^| j                   D ]O  }|j                   j                         | j                   k7  s+| j                   |_          |j*                  |ddi| Q |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%   s-   {{++-DK;;KK##k $ 
 }}!1!1d6F6F6O6O6T6T6V ,,55DM}}1E1E1J1J1L KK00DM}}"..22UY2ZDM;;{{4;;#>#>#yy/C0	YYdiioo&@&@Ak&l;;4;;#;#;~#M">tyy?OC>P QDI"*499+;*< =DI ;;||&&$***?*?hptuglD+F+<<""!&"3"3"E"EF ;;!!dkk,, ?==%%'4;;6$(KKFMFKK>e>v>? 
r   <      )	only_oncesoft_time_limit
system_jobpriorityc            	      V   t         j                  }d}d}|j                  ddg      D ]  }|dz  }t        |j                        }|j
                  |k7  r|dz  }t        j                  d|j
                   d| d|j                          ||_         |j                  d	
       |j                  j                  |j
                  j                  d}t        d|j                   |       t        d|       |dz  dk(  st                 t        j                  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   s-    
88,A9+M8N 	K1K[001J..*<a
5k6U6U5VVZ[eZffghshvhvgwxy2</   40)4)=)=Q\QpQpQvQvw
!9+..9IJJW!8:FB!#	  	
,zl!K=8HIJr   FNc                  B!  mnopq pfd} qfdqmnopfd}!t         j                  d| d| d| d| d| d	| d
|        ||||||||	|
|||||||||||g}"t        |"      D ]H  \  }#}$|$s	t        j                  j
                  j                  t        j                  d|$i      d   |"|#<   J | r=t        j                  j
                  j                  t        j                  d| i      d   } |r=t        j                  j
                  j                  t        j                  d|i      d   }|r=t        j                  j
                  j                  t        j                  d|i      d   }| j                  g d       | j                  g d       | j                  g d       |s| j                  g d       t        j                  j                  nt        j                  j                  mt        j                  j
                  j                  ooj                         }%|duxr |duxr
 ||k  xr | }&d}'d}(dpnj                  g})|r( |!|      \  }*}|)|*z   })t         j                  d|        t        pfd|D              xs t        pfd|D              }+ |%j                  |) j                  n      },|+r)|,j!                  mnj"                  mj                  k(        },| |"d   g}-|r|r|-j                  |       oj%                  |-t        j                  n|,      \  },}.|,j'                  |.      },|r | nm|,||      },|&r|,j)                  ||      },|,j+                         }'|'D /cg c]  }/|/d   	 }(}/t         j                  dt-        |(              i }0|s|s|(D 1cg c]  }1|1df c}1|0d<   nj|rwt/        nd      }2t/        nd      }3t/        nd      }4t/        nd      }5t/        nd      }6t/        nd      }7t/        nd       }8t/        nd!      }9t/        nd"      }:t/        nd#      };t/        nd$      }<t/        nd%      }=t/        nd&      }>t/        nd'      }?t/        nd(      }@t/        nd)      }At/        nd*      }Bt/        nd+      }Ct/        nd,      }D|%j                  nj                  j1                  d-      |2j                  j1                  d.      |3j                  j1                  d/      |4j                  j1                  d0      |5j                  j1                  d1      |6j                  j1                  d2      |7j                  j1                  d3      |8j                  j1                  d4      |9j                  j1                  d5      |:j                  j1                  d6      |;j                  j1                  d7      |<j                  j1                  d8      |=j                  j1                  d9      |>j                  j1                  d:      |?j                  j1                  d;      |@j                  j1                  d<      |Aj                  j1                  d=      |Bj                  j1                  d>      |Cj                  j1                  d?      |Dj                  j1                  d@            j                  n      j3                  |2|2j4                  nj                  k(        j3                  |3|3j4                  |2j                  k(        j3                  |4|4j4                  |3j                  k(        j3                  |5|5j4                  |4j                  k(        j3                  |6|6j4                  |5j                  k(        j3                  |7|7j4                  |6j                  k(        j3                  |8|8j4                  |7j                  k(        j3                  |9|9j4                  |8j                  k(        j3                  |:|:j4                  |9j                  k(        j3                  |;|;j4                  |:j                  k(        j3                  |<|<j4                  |;j                  k(        j3                  |=|=j4                  |<j                  k(        j3                  |>|>j4                  |=j                  k(        j3                  |?|?j4                  |>j                  k(        j3                  |@|@j4                  |?j                  k(        j3                  |A|Aj4                  |@j                  k(        j3                  |B|Bj4                  |Aj                  k(        j3                  |C|Cj4                  |Bj                  k(        j3                  |D|Dj4                  |Cj                  k(        }E|Ej'                  nj                  j7                  |(            }E|+r)Ej!                  mnj"                  mj                  k(        }E|r0 | nmE||      }E|Ej+                         }Fn|(D 1cg c]  }1|1fdAz   
 }F}1t9        t:              }GFD ]>  }/t=        ddB      D ]-  }H|/|Hdz
     }1|Hdk(  rdn|/HdCz
     }I|1|1GH   vs%IgGH   |1<   / @ t         j                  dDdEj!                  dF Gj?                         D              z          t9        t:              }J|rt        j@                  j                  }Kt        jB                  jE                  dGH      j                  }Lt=        dCdB      D ]  }MtG        G|Mdz
     jI                               }N|Ns%|%j                  KjJ                  |KjL                        j'                  |KjN                  dIk(  |KjP                  Lk(  |KjJ                  j7                  N            j+                         }O|OD ]Y  \  }P}Q|P}I|Q}1|1GM   v rGM   |1   j                  I       n	IgGM   |1<   |1JM   v rJM   |1   j                  I       QIgJM   |1<   [  t         j                  dJdEj!                  dK Jj?                         D              z          t=        ddB      D ]-  }Mg }RtG        G|M   jI                               }Sg }T|SD ]"  }1GM   |1   D ]  }UTj                  |1|Uf        $ MdkD  r2|"Mdz
     rRj                  |"Mdz
            |rRj                  |       |ryMdkD  rc|ra|0Mdz
     D VWcg c]  \  }V}W|V	 }X}V}Wg }YJM   j?                         D ]#  \  }Z}[|[D ]  }\|\Xv sYj                  Z        # % dL|dMdNXgdOdNYgg}Rj                  |       Sr)Rs|r$|%j                  nj                        j                  n      j'                  nj                  j7                  S            }]|+r)]j!                  mnj"                  mj                  k(        }]Rr7oj%                  Rt        j                  n]      \  }]}^|]j'                  |^      }]|r | nm]||      }]]j+                         }_g }TtS               }`|_D ]?  }/|/d   }1GM   |1   D ]-  }U|1|Uf}a|a`vs`jU                  a       Tj                  |a       / A T|0M<   0 |rut=        dPddQ      D ]e  }b|0|b   s	tS               }c|0b   D ](  \  }d}eGbdz
     |e   D ]  }fcjU                  e|ff        * tG        tS        |0bdz
           cz        |0|bdz
  <   g t         j                  dRdEj!                  dS |0j?                         D              z          |rg }gg }h|'D ]<  }/t;               }it        dOg|z         D ]  \  }#}j|/|#   i|j<    gj                  i       >  qg|h      }k|r`t=        dCdB      D ]Q  }M|0|M   D ]G  \  }1}IhD ]=  }lI|ldT   Mdz
     v slM   j                  |1If       |ldT   |M   jU                  |1       ? I S hD ]  }l|ljW                  dT        t;        k      }0t         j                  dUdEj!                  dV |0j?                         D              z          t         j                  dW       |0S c c}/w c c}1w c c}1w c c}W}Vw )Xu  
        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                    g }t        |      D ]  \  }}|t        |      k  r||   j                         nd}|j                        rF|j	                  dd      \  }	}
t        ||
d       }|st        ||
dz   d       }|j                  |      }nt        | |d       }|st        | |dz   d       }|dk(  r|j                         n|j                         }|j                  |        |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   s   !'4 0
U9<s;?O9O[-335UZ
##L1,1KKQ,?)A)!"24FMC%&68JU8RTXY))E*C!*eT:C%j%%-F&0E&9sxxz ''/0  &(89Lr   c                 ,   |stt        t              }t        t              |d<   |d   d   j                  | D ch c]  }|d   	 c}       | D cg c]	  }|d   d f c}|d<   |j	                  |       |S |d   }t        t              }| D ]G  }||   }t        |t              r|D ]  }||   j	                  |        4||   j	                  |       I t               }	|j                         D ]  \  }}
 |
|dd  |      |	|<    |	S c c}w c c}w )NmaprN   rY   r   )r
   rU   setupdaterm   
isinstancedictitems)r   r   final_items_groupsitems_by_levelitemrv   groupedkeyelrD   	sub_itemsnested_groupings              r   r   zCCmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.nested_grouping   s/   !,T!2(3C(8u%u%a(//0Nd0NODI$JDd4j$%7$Jq!")).9%%1IE!$'G .5kc4(! 1**401 CL''-. &C")--/ VY*9fQRjBTUCV J) 1O$Js   DDc           	      2   g }g }| D ]	  }|}|j                        }|rn}|rt        j                  nt        j                  }|}d }	|r|j	                  dd      d   }t        ||      }
t        |
t        j                        rt        |
t        j                        st        ||d       rt        ||      }	|	j                  |      }	nt        |
t        j                  t        j                  f      rt        ||dz   d       }	nt        |
t        j                        r|
j                         }j                  |      }|j                   }|
j"                  rd}d}nd}d}t%        t'        j(                  t'        j*                  |j,                  |         d       g      j/                  |j,                  |   |j0                  k(        j3                         j                  |      }	|	|j5                  |	       |j5                  |        ||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"
 % 0 0 >'4)$2?6..V^^ !KKQ/2E#He4	 i7
9V\VfVf@g 7E40!'51C))E*C ")f.@.@&B[B[-\]%guu}dC#Iv/@/@A$-$;$;$=	'2';';I'F*44$>>/8,0:-/9,09- # $ 1 1$(NN3559J3K$L$(!"$  #U355)9#:gjj#HI&Y["U5\  ?'..s3 ''
3i44l '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   @   K   | ]  }|j                          y wNr:   .0fr|   s     r   	<genexpr>z=CmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.<genexpr>R  s     RQall<8R   c              3   @   K   | ]  }|j                          y wr   r   r   s     r   r   z=CmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.<genexpr>R  s'       ZKyzZ[ZfZfgsZt  ZKr   )	in_filtermodelsa_modelrq   z7ncget_filtered_roadmap_by_level : len(first_level_ids)=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_id)NNNNNNNNNNNNNNNNNNN      z-ncget_filtered_roadmap_by_level levels_dict= z, c              3   D   K   | ]  \  }}d | dt        |         ywlvl=NrV   r   r   idss      r   r   z=CmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.<genexpr>  s8       QMltloqtSVWZV[[\]`ad]e\fQg  QM    zsystem.additional_parent)r-   Fz8ncget_filtered_roadmap_by_level additional_levels_dict= c              3   D   K   | ]  \  }}d | dt        |         ywr   r   r   s      r   r   z=CmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.<genexpr>  s@       `g  |D{~  ADbefiejjklopsltku`v  `gr   ORparent_task_idINrY      z3ncget_filtered_roadmap_by_level final_levels_dict= c              3   D   K   | ]  \  }}d | dt        |         ywr   r   r   r   r   s      r   r   z=CmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.<genexpr>=  s8       SYpzpsuzUXY\X]]^_bch_i^jSk  SYr   r   z*ncget_filtered_roadmap_by_level grouping: c              3   D   K   | ]  \  }}d | dt        |         yw)zgroup(z)=Nr   r   s      r   r   z=CmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.<genexpr>[  s8       NXoyortyPVWZV[[]^abg^h]iNj  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sgetrU   keys
in_link_idout_link_idr   relation_type_idr   addpop)r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rowfinal_levels_dicttask_idr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rq   rowslevels_dictlevel_indexr   additional_levels_dictRelation"additional_parent_relation_type_idlevelprev_level_idsresultsr  r  conds	level_idslevel_ids_with_parentparent_tasktidrx   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   	parent_idgrand_parent_id
tasks_lvl1r   	task_datarv   grouped_levels_dictfinal_items_groupr   r   r   r|   r   sr                                                                                                                @@@@@r   r   z*CmfRoadmap.ncget_filtered_roadmap_by_levelo   s   b	(	4:	5x 	
FugVTWSXXjkzj{ |))>(??PQ_P``nozn{  |J  KV  JWX 	Y )
0 !) 	`GAt#^^..::6>>HVZK[\]^_
	` $nn//;;FNNXWfLghijkO$nn//;;FNNXWfLghijkO & 1 1 = =fnnxYjNk lmn o 	KL;<89""#@A ~~&&''00	nn''33%%'  $4$$ $#	 	  '!%	1>1O.$9<M$M!GGHHYZ[R/RR  KVY  ZK  J  ZK  WK#gmm%:;GGM%**9d6K6Ky||6[\K$gaj1	#8_-*5*H*H..	 +I +
'' "(();<#D)[+{[K%++E37K&??,-=>c3q6>>	I#oJ^I_`a $9CR#SWdO#Sa d.d.d.d.d.d.d.d.d/d/d/d/d/d/d/d/d/d/d/ MMi0I.I.I.I.I.I.I.I.Z0Z0Z0Z0Z0Z0Z0Z0Z0Z0Z0), ![&YrB$5$5$@AYrB$5$5$>?YrB$5$5$>?YrB$5$5$>?YrB$5$5$>?YrB$5$5$>?YrB$5$5$>?YrB$5$5$>?YsC$6$6"%%$?@YsC$6$6#&&$@AYsC$6$6#&&$@AYsC$6$6#&&$@AYsC$6$6#&&$@AYsC$6$6#&&$@AYsC$6$6#&&$@AYsC$6$6#&&$@AYsC$6$6#&&$@AYsC$6$6#&&$@AYsC$6$6#&&$@AU Z TWW[[%AB"!JJy$2G2G9<<2WXE%dIuk;WE 99;D BQQg
\1QQ &d+K N#(B< NK!+/2G-8A-=T3{UVCWN*wk+>V/V=K<MK09	NN GGCtyy  QM  yD  yJ  yJ  yL  QM  HM  M  N%0%6"$!33<<5;5K5K5P5PVp5P5q5t5t2"1b\ WE%)+eai*@*E*E*G%HN) %mmH,?,?AUAUV]] ,,5 115WW ++//? ce	  4; W/
K)3"-"k%&88'.w7>>~N;I:KK.w7"&<U&CC259'BII.YFTEV259'BWW4 RVZV_V_  `g  H^  Hd  Hd  Hf  `g  Wg  g  h
 q" ?A U!3!8!8!:;	(*%( MG'25'9''B M-44g{5KLMM 19uqy)WUQY%78(%67 #qy^@QRWZ[R[@\-]fc1c-]*-]8:5@VW\@]@c@c@e *<K)<6I * 2#59K#K$A$H$H$U$)** !+-t5GH!4)FG	+ LL1%;%mmDGG4@@FMMdggkkZcNdeG&"),,y$:O:OS\S_S_:_"`0;0N0N&+"(..%)")	 1O 1- #*..">""+D)WkS^"_#*;;=L,.)!$J+ C"%a&+6u+=g+F CK$+[#9D#:5 *t 4 5 < <T B	CC ,A!%(?AD r1b) hA(+),.?.B QNC3>q1u3Ei3P Q . 2 2I3O PQQ 48<MaRSe<T8UXf8f3g)!a%0h 	
E  SY  P  V  V  X  SY  JY  Y  	Z J!#' - F	 )4&?*B C .HAu'*1vIe$.!!),	- #2*oOa"b  "1b\ ME3DU3K M/1C M--1B51I%RS)1TT 1% 8 ? ?.@Y Z 1% 8 ? C CG LMMM &8 -!!%%e,- !%%8 9GG@DII  NX  ~O  ~U  ~U  ~W  NX  EX  X  Y	<>  i ? $T^ RL .^s   0AB)AB:ABABc           	         |t        dd       |j                  dd       st        dd       |j                  dd       rt        dd       |dk7  rt        d	d        | j                  di |}t        t              t        t
              }g }t               }t               |j                         D ]f  }	|	D ]_  \  }
}|r1|
||   vs||   j                  |
       |   j                  |
       9|
|vs>|j                  |
       |j                  |
       a h 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.r1  z;Exporting groupped roadmaps is unavailable in this verison.xlsxz3Only xlsx file format is available in this verison.c                     j                  |        t              }| vr|| <   || |f<   j                  | g       D ]  } ||dz           y )NrN   )rm   rV   r8   )	rN  rG  sequence_numberchild_idchildren_maplevel_ofordered_idssequence_mapwalks	       r   rj  z$CmfRoadmap.export2file.<locals>.walk  sf    s#!+.O,&$3S!/4Hc?+,(,,S"5 *Xuqy)*r   r   rY   r   )field_namesbqlformat_filer*  roadmap_ordered_idsroadmap_level_ofroadmap_sequence_map )r>   r8   r   r
   rU   r   r   valuesr  rm   r#   export2file)r]   rk  rm  r*  filter_settingsroadmapchildren_seenroots
roots_seentuplesr@  r[  root_idrf  rg  rh  ri  rj  r%   s                @@@@@r   rs  zCmfRoadmap.export2filea  s    "z  CG  H""#4d;bjno0$7S[_`& KSWX5#55HH"4(#C(U
6nn& 		.F&, ."mI&>>%i044W=$Y/66w?j0"w/W-.		. v	* 	*  	G!	 w"{(,dK'@/:4D7B4<8D # F 	Fr   )Nrb  FN)__name__
__module____qualname__	api_allowr   r   api_methodsr   r!   r$   r?   staticmethodcmf_deferred_jobrA   r   classmethodrs  __classcell__)r%   s   @r   r   r   
   s    I((448Y7ZZK
3$_,\ bTTUV W 4 8:6846464646464646464657575757575757575757577<8:7<<A5:,0*.242468?o! o!b 6F 6Fr   r   N)cmf.includecmfr   modules.project.fieldsr   sqlalchemy.ormr   
sqlalchemyr   r	   collectionsr
   r   rq  r   r   <module>r     s-      . " # #N
F'' N
Fr   