
    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 d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)defaultdict   c                   \    e Zd ZdZej
                  j                  dgz   Zd Zd Z fdZ	 fdZ
dd fd	
Z fd
Ze edddd      d               Zed        Zed        Zed        Zed        Zed        Zed        Ze	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d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                  r>t        j,                  j/                  |        t        j0                  j/                  |        | j                   j"                  r#t3        t        j4                  j6                         | 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CmfRoadmapQuickTransformscaffold_defaultsCmfRoadmapViewschedule_deferred_jobr   recalculate_cache)r   argskwargsresmemberr&   s        r   r@   zCmfRoadmap.save1   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+;;++==dC!!33D9<<""!&"3"3"E"EF ;;!!dkk,, ?==%%'4;;6$(KKFMFKK>e>v>? 
r   F)skip_owner_checkc                
   t         j                  j                  |       D ]  } |j                  |ddi|  t         j                  j                  |       D ]  } |j                  |ddi|  t        |   |d|i|S )N)r5   rJ   T)r7   rA   listdeleterC   r$   )r   rJ   rF   rG   qtviewr&   s         r   rM   zCmfRoadmap.deletec   s    1166d6C 	>BBIIt=d=f=	>))..d.; 	@DDKK???	@w~tQ6FQ&QQr   c                    t        |   |i |}t        j                  j	                  | d      D ]  } |j                  |i |  t        j
                  j	                  | d      D ]  } |j                  |i |  |S )NT)r5   include_deleted)r$   restorer7   rA   rL   rC   )r   rF   rG   rH   rN   rO   r&   s         r   rR   zCmfRoadmap.restorej   s    got.v.1166dTX6Y 	(BBJJ''	())..dD.Q 	*DDLL$)&)	*
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)r7   r   rL   lenr=   rZ   gdebugidr@   r   cmf_emit_event
cmf_commit)_kwargsclstotal_count
calc_countr   
real_count
event_datas          r   rE   zCmfRoadmap.recalculate_cacher   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   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%        j&                  t%        j(                  |j*                  |         d       }t-        |g      j/                  |j*                  |   |
j0                  k(        j3                         j                  |      }||j5                  |       |j5                  |        ||fS )
N.r[   u&   Группировка по полю "u#   " не поддерживаетсяTr2   _idright_idleft_id)r;   r7   CmfGanttTaskCmfTasksplitgetattr
issubclassALLOWED_GROUP_TYPESr?   labelr   CmfRelationCmfGenericRelation
CmfM2MBasem2m_model_clsdp_model	__table__rightr   array_remove	array_aggcr	   wherere   	as_scalarappend)query_fieldsgantt_prefixsa_task_modelsa_gantt_modeldata_driverto_be_selected_colsfinal_fieldsfield
field_nameis_gantt_taskSaModelCmfModelaliascol	field_cls	m2m_modelsa_m2m_modeltblmy_id_field_namesub_id_field_nameaggs                        r   _select_group_fieldszCmfRoadmap._select_group_fields   s    ! +	0EJ!,,\:M(5n=G.;v**HECC+A.%0Ii)<=B:,Nqrz~ wt,gu-ii& i&*<*<f>W>W)XY!'55=$?C	6+<+<= ) 7 7 9I#.#7#7	#BL&00C +5(,5)+4(,6)++DNN355AR;S,TVZ[C!3%=..suu5E/F'**/TU%IKe  #**3/##J/W+	0Z #L00r   c                 D   |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 ]"  \  }}
t        j                  |
|dd  |      |	|<   $ |	S c c}w c c}w )Nmapr[   re   r   )
r
   rL   setupdater   
isinstancedictitemsr   _nested_grouping)r   r   final_items_groupsitems_by_levelitemr   groupedkeyelrH   	sub_itemss              r   r   zCmfRoadmap._nested_grouping   s4   (.N$/$4N5!5!!$++E,JDT$Z,JK@E F$t*d!3 FN1%%n5!!q	d# 	*Du+C#t$ -BBK&&t,- ##D)	* f%mmo 	^NC!229fQRjJ\]CH	^ 
) -K Fs   DD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ascro   r[   rp   )	enumeraterb   lowerr;   ru   rv   ry   r   descr   order_by)
task_modelgantt_task_modelquerysort_fieldssort_ordersr   order_by_clausesidxr   
sort_order_related_field_namer   clauses                 r   
_sort_rowszCmfRoadmap._sort_rows   s   #K0 	,JC583{;K5KS)//1QVJ-(-C(;%%.0BDI!"24F4NPTUCii&j%6!*eemTBC","5SWWY388:F##F+	, "ENN$45Er   c           	         i }d}t        dt        dz         D ]B  }g }t        ||   j                               }|s ng }|D ]"  }||   |   D ]  }|j	                  ||f        $ |dkD  r2||dz
     r|j	                  ||dz
            |r|j	                  |       |ry|dkD  rc|ra||dz
     D cg c]  \  }}|	 }}}g }||   j                         D ]#  \  }}|D ]  }||v s|j	                  |        # % d|dd|gdd|gg}|j	                  |       |r7|s|	r2| j                  |j                        j                  |      j                  |j                  j                  |            }|r)|j                  ||j                  |j                  k(        }|r7|j                  |t        j                  ||      \  }}|j                  |      }|	rt         j#                  ||||	|
|      }|j%                         }g }t'               } |D ]?  }!|!d   }||   |   D ]-  }||f}"|"| vs| j)                  |"       |j	                  |"       / A |||<   |}E |rut        |dd      D ]e  }#||#   s	t'               }$||#   D ](  \  }%}&||#dz
     |&   D ]  }'|$j)                  |&|'f        * t        t'        ||#dz
           |$z        ||#dz
  <   g ||fS c c}}w )	Nr   r[   ORparent_task_idINre   	in_filtermodelsa_modelr   )range
MAX_LEVELSrL   keysr   r   r   re   select_fromfilterin_joinop_gantt_task_idcollect_filter_expr7   rt   r   r   allr   add)(sessionTask	GanttTaskr   levels_dictadditional_levels_dictfiltersglobal_bql_listchild_task_filterr   r   show_sub_itemsneed_gantt_joinr   final_levels_dict	max_levellevelconds	level_idslevel_ids_with_parenttask_idparent_tasktidr   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rowpairlparent_ids_setrp   	parent_idgrand_parent_ids(                                           r   _filter_levelszCmfRoadmap._filter_levels   s   
 	1j1n- C	EE[/4467I %'!$ I#.u#5g#> IK)00';1GHII qy519%LL!34$LL!23 19<MeVWi<X)Y&#q#)Y&)Y461<RSX<Y<_<_<a &8%82E &.15GG = D D[ Q %&& ')41CDt%BC	'O _-e{!--0<<TBII$''++V_J`a"%ll9d6K6Ky||6[\G,7,J,J"'$nn!%%	 -K -)G\ &nn\:G(33D)Wk[fhtuG&{{}(*% U
' ?C!!fG'25'9''B ? '5z1&NN40188>	?? (=e$IGC	L 9a, d$Q'%(UN*;A*> MY/:1q5/A)/L MO*..	?/KLMM 04C8I!a%8P4QTb4b/c%a!e,d !)++o *Zs   3Kc           	         t         j                  j                  }t        t              }t        t
              }t        dt        dz         D ]4  }	t        ||	dz
     j                               }
|
s&|D ]  }|	|j                  dt              kD  r|d   }|j                  dd      }|dk(  r| j                  |j                  |j                        j                  |j                  dk(  |j                   |k(  |j                  j#                  |
            j%                         }|D cg c]	  \  }}||f }}}n| j                  |j                  |j                        j                  |j                  dk(  |j                   |k(  |j                  j#                  |
            j%                         }|D cg c]	  \  }}||f }}}|D ]j  \  }}|||	   v r"|||	   |   vr!||	   |   j'                  |       n	|g||	   |<   |||	   v r#|||	   |   vsJ||	   |   j'                  |       b|g||	   |<   l  |st        |j                  |	dz
  i       j                               |j                  |	dz
  t                     z  }|sC|j(                  j#                  t        |            |j                  dk(  |j*                  dk(  g}|s|j'                  |j,                  dk(          | j                  |j.                  |j(                        j                  | j%                         }|D ]K  \  }}|||	   vr
|g||	   |<   n!|||	   |   vr||	   |   j'                  |       ||	   j1                  |       M 7 t2        j5                  d	d
j7                  d |j9                         D              z          |S c c}}w c c}}w )up   Насыщает levels_dict связанными задачами, возвращает additional_levels_dict.   r[   level_torelation_type_id	directionoutinFz8ncget_filtered_roadmap_by_level additional_levels_dict= , c              3   D   K   | ]  \  }}d | dt        |         ywlvl=Nrb   .0r   idss      r   	<genexpr>z3CmfRoadmap._process_linked_items.<locals>.<genexpr>  s8       X_s{svx{Z]^a]bbcdghkdlcmXn  X_    )r7   CmfRelationOptionr~   r
   r   r   r   r   rL   r   r9   r   
in_link_idout_link_idr   cmf_deletedr   r   r   r   r   is_dummycmf_archivedre   r   rc   rd   r   r   )r   r   r   show_linked_itemsshow_child_tasksinclude_archivedRelationr   _linked_children_idsr   prev_level_idsrelation_typert_idr   resultsin_idout_idpairsr   r   ids_for_childrenchild_filterchild_resultschild_idr   s                            r   _process_linked_itemsz CmfRoadmap._process_linked_itemsK  s!    ++44!,T!2*3/1j1n- ;	BE!+eai"8"="="?@N!!2  R=,,ZDD%&89)--k5A	$%mmH,?,?AUAUV]] ,,5 11U: ++//? ce	 
 CJJeV_JEJ%mmH,@,@(BUBUV]] ,,5 11U: ,,00@ ce	 
 CJJfe_JEJ/4 R+NG+e"44)U1CG1LL'.w7>>~N7E6FE*73"8"??)1G1Nw1WW259'BII.YBPAQ.u5g>R+ RH  $'(>(B(B519b(Q(V(V(X$Y\p\t\tuz}~u~  AD  AF  ]G  %G #++//5E0FG((E1.$L
 ,$++D,=,=,FG$VGMM$''4;N;N$O$V$VXd$e$i$i$kM/< B+)#;u+==<E;K.x8&k%.@.JJ'.x8??	J,U377ABm;	Bz 	
Jdii  X_  @V  @\  @\  @^  X_  O_  _  	`%%[ K Ks   +O
:O
c	                    |r\|gt        dt        dz         D 	cg c]  }	t        |d|	        c}	z   }
 | j                  t	        |
d      D 	cg c]$  \  }	}|j
                  j                  d|	 d      & c}}	 j                  |      }t        dt        |
            D ]7  }	|j                  |
|	   |
|	   j                  |
|	dz
     j
                  k(        }9 |j                  |j
                  j                  |            }|r)|j                  ||j                  |j
                  k(        }|rt        j!                  ||||||      }|j#                         }n|D cg c]  }|fdt        dz
  z  z    }}t%        t&              }|D ]E  }t        dt        dz         D ]-  }||dz
     }|dk(  rd n||dz
     }||||   vs%|g||   |<   / G |S c c}	w c c}}	w c c}w )Nr   r[   T)r:   r   rp   N)r   r   r   r   r   re   ry   r   rb   	outerjoinr   r   r   r   r   r   r   r   r
   r   )r   r   r   first_level_idsr   r   r   r  r   ialiasesar   rowsr   r   r   level_indexr   s                      r   _build_levels_dictzCmfRoadmap._build_levels_dict  s    fU1j[\nE]^Qqc7 ;^^G "GMM7@!7LMtq!!$$**s1#S\*Mk$  1c'l+ d
GAJ4M4MQXYZ]^Y^Q_QbQb4bcd LL_!=>E

9d.C.Cy||.ST"--dIukS^`lm99;D L[[WJJN!;;[D[ "$' 	JC$Q
Q7 JkAo.)4)9s;QR??S&7+k:R+R9G8IK,W5	J	J =  _ N \s   G)G
$G#c                    A | xs g } |xs g }|xs g }|xs g }|xs g }|xs g }t         j                  d| d| d| d| d| d| d|        |r;t               } |D ],  }!|!d   }"|"| v rt        d	|" d
       | j	                  |"       . ||||||||	|
|||||||||||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                  }&t        j                  j                  }'t        j                  j                  j                  }(|(j                         })|duxr |duxr
 ||k  xr | }*d}+d},dA|&j                  g}-|r:t         j#                  |A|&|'|(      \  }.}|-|.z   }-t         j                  d|        t%        Afd|D              xs t%        Afd|D              }/ |)j&                  |- j)                  |&      }0|/r)|0j+                  |'|&j,                  |'j                  k(        }0| |#d   g}1|r|r|1j                  |       |(j/                  |1t        j                  |&|0      \  }0}2|0j1                  |2      }0|rt         j3                  |&|'|0||A      }0|*r|0j5                  ||      }0|0j7                         }+|+D 3cg c]  }3|3d   	 },}3t         j                  dt9        |,              i }4|s|s|,D 5cg c]  }5|5df c}5|4d<   nt         j;                  |)|&|'|,|/|||A	      }6t         j                  ddj+                  d |6j=                         D              z          t?        t@              }7|rt         jC                  |)|&|6|||      }7t         jE                  |)|&|'|(|6|7|#||||||/A      \  }4}8t         j                  ddj+                  d |4j=                         D              z          |r g }9g }:|+D ]<  }3tA               };t        d g|z         D ]  \  }$}<|3|$   |;|<<    |9j                  |;       > t         jG                  |9||:      }=|rctI        d!8dz         D ]Q  }>|4|>   D ]G  \  }5}?|:D ]=  }@|?|@d"   |>dz
     v s@|>   j                  |5|?f       |@d"   |>   j	                  |5       ? I S |:D ]  }@|@jK                  d"        tA        |=      }4t         j                  d#dj+                  d$ |4j=                         D              z          t         j                  d%       |4S c c}3w c c}5w )&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
        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=r   u+   Дублирование relation_type_id: Tr2   r   r   )r+   z!=ztask.gantt_project)r
  ==F)r  r*  F)r  r*  FNzop_gantt_task.)r   r   r   r   z2ncget_filtered_roadmap_by_level group_by_fields : c              3   @   K   | ]  }|j                          y wr   r;   r  fr   s     r   r  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/  r   z7ncget_filtered_roadmap_by_level : len(first_level_ids)=r[   z-ncget_filtered_roadmap_by_level levels_dict= r   c              3   D   K   | ]  \  }}d | dt        |         ywr   r  r  s      r   r  z=CmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.<genexpr>K  s8       PLksknpsRUVYUZZ[\_`c\d[ePf  PLr  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       RXoyortyTWX[W\\]^abg^h]iRj  RXr  re   r   r   z*ncget_filtered_roadmap_by_level grouping: c              3   D   K   | ]  \  }}d | dt        |         yw)zgroup(z)=Nr  r3  s      r   r  z=CmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.<genexpr>z  s7       MWnxnqsxvVYUZZ\]`af]g\hMi  MWr  z*ncget_filtered_roadmap_by_level method_end)&rc   rd   r   r?   r   r   r7   rt   dp_get_filterr   r~   rs   r   Sessionre   r   r   anyr   r   r   r   r   r   r   slicer   rb   r(  r   r
   r   r  r   r   r   pop)Binsert_bql_listr   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_listr  r   r  r  r   startendr   r   group_by_fieldsseenr   r  r   r#  fltrr   r   r   r   to_be_slicedfirst_level_rowsr"  to_be_selected_fieldsadditional_fieldsr   first_queryr   first_query_filterr   r   r   r   r   r   
tasks_lvl1r   	task_datar   grouped_levels_dictr   r   final_items_groupr   sB                                                                    @r   r   z*CmfRoadmap.ncget_filtered_roadmap_by_level  sf   B */R)/R-3!'R!'R)/R	FugVTWSXXjkzj{ |%%6$77HHXXfgrfs  tB  CN  BOP 	Q 5D)  /0D= KE7S[_`	  =-=-NNNNNNNN	
 !) 	`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;1P1Pl"9+ 2Q 2. %:<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 +
'' "(();<$//ik[fhtuK%++E37K&??,-=>c3q6>>	I#oJ^I_`a $5CR#SWdO#Sa $77y/k ,K
 GGCdii  PL  xC  xI  xI  xK  PL  GL  L  M%0%6" )3)I)IT;0A$&6*& ,6+D+Dy+{&!;	,(y 	
E		  RX  ~O  ~U  ~U  ~W  RX  IX  X  	Y J!#' - F	 )4&?*B C .HAu'*1vIe$.!!),	- #-"="=j/[m"n  "1i!m4 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@499  MW  }N  }T  }T  }V  MW  DW  W  X	<=  C ? $Ts   YY
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 без настроек фильтровTr2   r;  zJExporting roadmaps without insert_bql_list is unavailable in this verison.rR  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 )Nr[   )r   rb   r9   )	r   r   sequence_numberr  children_maplevel_ofordered_idssequence_mapwalks	       r   rg  z$CmfRoadmap.export2file.<locals>.walk  sf    s#!+.O,&$3S!/4Hc?+,(,,S"5 *Xuqy)*r   r   re   r   )field_namesbqlformat_filer  roadmap_ordered_idsroadmap_level_ofroadmap_sequence_map )r?   r9   r   r
   rL   r   r   valuesr   r   r$   export2file)ri   rh  rj  r  filter_settingsroadmapchildren_seenroots
roots_seentuplesr   r   root_idrc  rd  re  rf  rg  r&   s                @@@@@r   rp  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   ) NNNNNNNNNNNNNNNNNNNNNNFNFNFNNNNN)Nr`  FN)__name__
__module____qualname__	api_allowr   r   api_methodsr   r"   r%   r@   rM   rR   staticmethodcmf_deferred_jobrE   r   r   r   r   r  r(  r   classmethodrp  __classcell__)r&   s   @r   r   r      s^   I((448Y7ZZK
3$_0d .3 R bTTUV W 4 11 11f  4  ( V, V,p E& E&N # #J 8<8< GK HL LP LP9>:>9>:>7<.2,048488<D! D!L 6F 6Fr   r   N)cmf.includecmfr   modules.project.fieldsr   sqlalchemy.ormr   
sqlalchemyr   r	   collectionsr
   r   	CmfChoiceCmfChoiceIntCmfBoolCmfDaterz   r{   r|   rx   r   rn  r   r   <module>r     sw      . " # #
 

NN
NN


 a
F'' a
Fr   