
    Уi+                        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 ej                  ej                  ej                  ej                  ej                   ej"                  ej$                  f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_cache]   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                  J#  rstuv ufd} vfdvrstuf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                  st        j                  j                  rt        j                  j
                  j                  ttj                         }%|duxr |duxr
 ||k  xr | }&d}'d}(dusj                  g})|r( |!|      \  }*}|)|*z   })t         j                  d|        t        ufd|D              xs t        ufd|D              }+ |%j                  |) j                  s      },|+r)|,j!                  rsj"                  rj                  k(        },| |"d   g}-|r|r|-j                  |       tj%                  |-t        j                  s|,      \  },}.|,j'                  |.      },|r | sr|,||      },|&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<   nb|rwt/        sd      }2t/        sd      }3t/        sd      }4t/        sd      }5t/        sd      }6t/        sd      }7t/        sd       }8t/        sd!      }9t/        sd"      }:t/        sd#      };t/        sd$      }<t/        sd%      }=t/        sd&      }>t/        sd'      }?t/        sd(      }@t/        sd)      }At/        sd*      }Bt/        sd+      }Ct/        sd,      }D|%j                  sj                  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                  s      j3                  |2|2j4                  sj                  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'                  sj                  j7                  |(            }E|+r)Ej!                  rsj"                  rj                  k(        }E|r0 | sr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                  |dG   H      }L|LrLj                  nd}M|jG                  dIdJ      }N|jG                  dKdL      }O|Mrt=        dCdB      D ]  }P|Pdz
  }Q|QOkD  rtI        GPdz
     jK                               }R|Rs1NdMk(  r|%j                  KjL                  |KjN                        j'                  |KjP                  dNk(  |KjR                  Mk(  |KjL                  j7                  R            j+                         }S|SD TUcg c]	  \  }T}U|T|Uf }V}T}Un|%j                  KjN                  |KjL                        j'                  |KjP                  dNk(  |KjR                  Mk(  |KjN                  j7                  R            j+                         }S|SD UTcg c]	  \  }U}T|U|Tf }V}U}TVD ]j  \  }I}1|1GP   v r"IGP   |1   vr!GP   |1   j                  I       n	IgGP   |1<   |1JP   v r#IJP   |1   vsJJP   |1   j                  I       bIgJP   |1<   l  t         j                  dOdEj!                  dP Jj?                         D              z          t=        ddB      D ]-  }Pg }WtI        G|P   jK                               }Xg }Y|XD ]"  }1GP   |1   D ]  }ZYj                  |1|Zf        $ PdkD  r2|"Pdz
     rWj                  |"Pdz
            |rWj                  |       |ryPdkD  rc|ra|0Pdz
     D [\cg c]  \  }[}\|[	 }]}[}\g }^JP   j?                         D ]#  \  }_}`|`D ]  }a|a]v s^j                  _        # % dQ|dRdS]gdTdS^gg}Wj                  |       Xr)Ws|r$|%j                  sj                        j                  s      j'                  sj                  j7                  X            }b|+r)bj!                  rsj"                  rj                  k(        }bWr7tj%                  Wt        j                  sb      \  }b}c|bj'                  |c      }b|r | srb||      }bbj+                         }dg }YtU               }e|dD ]?  }/|/d   }1GP   |1   D ]-  }Z|1|Zf}f|fevsejW                  f       Yj                  |f       / A Y|0P<   0 |rut=        dLddU      D ]e  }g|0|g   s	tU               }h|0g   D ](  \  }i}jGgdz
     |j   D ]  }khjW                  j|kf        * tI        tU        |0gdz
           hz        |0|gdz
  <   g t         j                  dVdEj!                  dW |0j?                         D              z          |rg }lg }m|'D ]<  }/t;               }nt        dTg|z         D ]  \  }#}o|/|#   n|o<    lj                  n       >  vl|m      }p|r`t=        dCdB      D ]Q  }P|0|P   D ]G  \  }1}ImD ]=  }qI|qdX   Pdz
     v sqP   j                  |1If       |qdX   |P   jW                  |1       ? I S mD ]  }q|qjY                  dX        t;        p      }0t         j                  dYdEj!                  dZ |0j?                         D              z          t         j                  d[       |0S c c}/w c c}1w c c}1w c c}U}Tw c c}T}Uw c c}\}[w )\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                    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           	      
   g }g }| D ]  }|}|j                        }|rn}|rt        j                  nt        j                  }|}d }	|r|j	                  dd      d   }t        ||      }
t        |
t              st        d| dd       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   u&   Группировка по полю "u#   " не поддерживаетсяTr1   rf   right_idleft_id)r:   r6   CmfGanttTaskCmfTaskri   rj   
issubclassALLOWED_GROUP_TYPESr>   rk   r   CmfRelationCmfGenericRelation
CmfM2MBasem2m_model_clsdp_model	__table__rightr	   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% 34"
 % 0 0 >'4)$2?6..V^^ !KKQ/2E#He4	!)-@A FzlRuv  C  D 7E40!'51C))E*C ")f.@.@&B[B[-\]%guu}dC#Iv/@/@A$-$;$;$=	'2';';I'F*44$??/9,09-/8,0:- # $ 1 1$(NN3559J3K$L$(!"$  #U355)9#:gjj#HI&Y["U5\  ?'..s3 ''
3g34j '44r   z4ncget_filtered_roadmap_by_level method_start: start=z, end=z, group_by_fields=z, show_linked_items=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>[  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>[  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    relation_type_code)r-   	directionoutlevel_to   inFz8ncget_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>Y  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>w  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sgetr8   rU   keys
in_link_idout_link_idr   relation_type_idr   addpop)w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_linked_items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rtrt_idr   r   levelparent_levelprev_level_idsresultsin_idout_idpairs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   sw                                                                                                                     @@@@@r   r   z*CmfRoadmap.ncget_filtered_roadmap_by_levely   s   b	(	49	5v 	
FugVTWSXXjkzj{ |%%6$77HHXXfgrfs  tB  CN  BOP 	Q )
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	#4_-*5*H*H..	 +I +
'' "(();<#D)[+{[K%++E37K&??,-=>c3q6>>	I#oJ^I_`a $5CR#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<<++006GH\6]0^!#-11+uE	,00R@!&q" &Z',qy'(2$)-k%!).D.I.I.K)L-$$,&-mmH4G4GI]I]&^&e&e ( 4 4 = ( 9 9U B ( 3 3 7 7 G' "ce	 $
 KR$ReV_$RE$R '.mmH4H4H(J]J]&^&e&e ( 4 4 = ( 9 9U B ( 4 4 8 8 H' "ce	 $
 KR$Rfe_$RE$R7< Z3NG&+e*<<#1U9KG9T#T$/$6w$?$F$F~$V?M>NE 27 ;&*@*GG#19OPU9VW^9_#_$:5$A'$J$Q$QR`$aJXIY 6u =g FZ7&ZP 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	<>  O ? $T^ RP %S %SR .^s*   0AF)AF	:AFAF+AFAF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.r5  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   )	rW  rL  sequence_numberchild_idchildren_maplevel_ofordered_idssequence_mapwalks	       r   rs  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]   rt  rv  r.  filter_settingsroadmapchildren_seenroots
roots_seentuplesrD  rd  root_idro  rp  rq  rr  rs  r%   s                @@@@@r   r|  zCmfRoadmap.export2file}  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   )Nrk  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((448Y7ZZK
3$_,\ bTTUV W 4 8:6846464646464646464657575757575757575757577<8:7<8<5:,0*.242468?A! A!F 6F 6Fr   r   N)cmf.includecmfr   modules.project.fieldsr   sqlalchemy.ormr   
sqlalchemyr   r	   collectionsr
   	CmfChoiceCmfChoiceIntCmfBoolCmfDater   r   r   r   r   rz  r   r   <module>r     sr      . " # # 

NN
NN


 `
F'' `
Fr   