
    "j                     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d        Ze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   c                 r   |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 ]^  }||   }t        |t              r3|r|D ]  }||   j	                  |        6|d   j	                  |       K||   j	                  |       ` t               }	|j                         D ]"  \  }}
t        j                  |
|dd |      |	|<   $ |	S c c}w c c}w )un   Строит рекурсивные группы Roadmap без потери задач с пустыми M2M.maprN   rY   Nr   )
r
   rU   setupdateappend
isinstancedictitemsr   _nested_grouping)ri   group_fieldsfinal_items_groupsitems_by_levelitemfieldgroupedkeyelrD   	sub_itemss              r   rj   zCmfRoadmap._nested_groupingn   sL    (.N$/$4N5!5!!$++E,JDT$Z,JK@E F$t*d!3 FN1%%n5!!Qd# 	*Du+C#t$! 1**401
 DM((.##D)	* f%mmo 	dNC!229l12>NPbcCH	d 
3 -K Fs   D/D4c                 @    | D cg c]	  }||vs| }}|xs | S c c}w )uz   Возвращает корни экспорта, предпочитая вложенное положение задач. )roots	child_idsroot_idroots_without_nested_duplicatess       r   _roadmap_export_rootsz CmfRoadmap._roadmap_export_roots   s3     CH*dw7ZcKc7*d'*d.7%7 +es   	FNc                  #  stuv t         j                  } vfd}!stuvf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                  tt
        j                  j                  st
        j                  j                  j                  uuj                         }&|duxr |duxr
 ||k  xr | }'d}(d})dvtj                  g}*|r( |"|      \  }+}|*|+z   }*t        j                  d|        t        vfd|D              xs t        vfd|D              }, |&j                   |* j#                  t      }-|,r)|-j%                  stj&                  sj                  k(        }-| |#d   g}.|r|r|.j                  |       uj)                  |.t
        j                  t|-      \  }-}/|-j+                  |/      }-|r |!ts|-||      }-|'r|-j-                  ||      }-|-j/                         }(|(D 0cg c]  }0|0d   	 })}0t        j                  dt1        |)              i }1|s|s|)D 2cg c]  }2|2df c}2|1d<   n|rwt3        td      }3t3        td      }4t3        td      }5t3        td      }6t3        td      }7t3        td      }8t3        td      }9t3        td       }:t3        td!      };t3        td"      }<t3        td#      }=t3        td$      }>t3        td%      }?t3        td&      }@t3        td'      }At3        td(      }Bt3        td)      }Ct3        td*      }Dt3        td+      }E|&j!                  tj                  j5                  d,      |3j                  j5                  d-      |4j                  j5                  d.      |5j                  j5                  d/      |6j                  j5                  d0      |7j                  j5                  d1      |8j                  j5                  d2      |9j                  j5                  d3      |:j                  j5                  d4      |;j                  j5                  d5      |<j                  j5                  d6      |=j                  j5                  d7      |>j                  j5                  d8      |?j                  j5                  d9      |@j                  j5                  d:      |Aj                  j5                  d;      |Bj                  j5                  d<      |Cj                  j5                  d=      |Dj                  j5                  d>      |Ej                  j5                  d?            j#                  t      j7                  |3|3j8                  tj                  k(        j7                  |4|4j8                  |3j                  k(        j7                  |5|5j8                  |4j                  k(        j7                  |6|6j8                  |5j                  k(        j7                  |7|7j8                  |6j                  k(        j7                  |8|8j8                  |7j                  k(        j7                  |9|9j8                  |8j                  k(        j7                  |:|:j8                  |9j                  k(        j7                  |;|;j8                  |:j                  k(        j7                  |<|<j8                  |;j                  k(        j7                  |=|=j8                  |<j                  k(        j7                  |>|>j8                  |=j                  k(        j7                  |?|?j8                  |>j                  k(        j7                  |@|@j8                  |?j                  k(        j7                  |A|Aj8                  |@j                  k(        j7                  |B|Bj8                  |Aj                  k(        j7                  |C|Cj8                  |Bj                  k(        j7                  |D|Dj8                  |Cj                  k(        j7                  |E|Ej8                  |Dj                  k(        }F|Fj+                  tj                  j;                  |)            }F|,r)Fj%                  stj&                  sj                  k(        }F|r |!tsF||      }FFj/                         }Gn|)D 2cg c]  }2|2fd@z   
 }G}2t=        t>              }HGD ]>  }0tA        ddA      D ]-  }I|0|Idz
     }2|Idk(  rdn|0IdBz
     }J|2|2HI   vs%JgHI   |2<   / @ t        j                  dCdDj%                  dE HjC                         D              z          t=        t>              }K|rt
        jD                  j                  }Lt
        jF                  jI                  dFG      j                  }Mt=        tJ              }NtA        dBdA      D ]>  }OtM        H|Odz
     jO                               }P|Ps&|&j!                  LjP                  |LjR                        j+                  |LjT                  dHk(  |LjV                  Mk(  |LjP                  j;                  P            j/                         }Q|QD ]Y  \  }R}S|R}J|S}2|2HO   v rHO   |2   j                  J       n	JgHO   |2<   |2KO   v rKO   |2   j                  J       QJgKO   |2<   [ |stK        KjY                  Odz
  i       jO                               NjY                  |Odz
  tK                     z  }T|TsMtj8                  j;                  tM        T            tjT                  dHk(  tjZ                  dHk(  g}U|sUj                  tj\                  dHk(          |&j!                  tj                  tj8                        j*                  U j/                         }V|VD ]K  \  }W}X|WHO   vr
XgHO   W<   n!XHO   W   vrHO   W   j                  X       NO   j_                  W       M A t        j                  dIdDj%                  dJ KjC                         D              z          tA        ddA      D ]-  }Og }YtM        H|O   jO                               }Zg }[|ZD ]"  }2HO   |2   D ]  }\[j                  |2|\f        $ OdkD  r2|#Odz
     rYj                  |#Odz
            |rYj                  |       |ryOdkD  rc|ra|1Odz
     D ]^cg c]  \  }]}^|]	 }_}]}^g }`KO   jC                         D ]#  \  }a}b|bD ]  }c|c_v s`j                  a        # % dK|dLdM_gdNdM`gg}Yj                  |       Zr)Ys|r$|&j!                  tj                        j#                  t      j+                  tj                  j;                  Z            }d|,r)dj%                  stj&                  sj                  k(        }dYr7uj)                  Yt
        j                  td      \  }d}e|dj+                  |e      }d|r |!tsd||      }ddj/                         }fg }[tK               }g|fD ]?  }0|0d   }2HO   |2   D ]-  }\|2|\f}h|hgvsgj_                  h       [j                  |h       / A [|1O<   0 |rutA        dOddP      D ]e  }i|1|i   s	tK               }j|1i   D ](  \  }k}XHidz
     |X   D ]  }ljj_                  X|lf        * tM        tK        |1idz
           jz        |1|idz
  <   g t        j                  dQdDj%                  dR |1jC                         D              z          |rg }mg }n|(D ]<  }0t?               }ot	        dNg|z         D ]  \  }$}p|0|$   o|p<    mj                  o       >  | m|n      }q|r`tA        dBdA      D ]Q  }O|1|O   D ]G  \  }2}JnD ]=  }rJ|rdS   Odz
     v srO   j                  |2Jf       |rdS   |O   j_                  |2       ? I S nD ]  }r|rja                  dS        t?        q      }1t        j                  dTdDj%                  dU |1jC                         D              z          t        j                  dV       |1S c c}0w c c}2w c c}2w c c}^}]w )Wu  
        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                        rH|j	                  dd      \  }	}
t        ||
d       }|st        ||
dz   d       }|1|j                  |      }nt        | |d       }|st        | |dz   d       }|7|dk(  r|j                         n|j                         }|j                  |       t        j                  d|         |r |j                  | }|S )Nasc.rN   _idup   ERROR ncget_filtered_roadmap_by_level не смогли применить сортировку для поля )	enumeraterV   lowerr:   splitgetattrlabelr}   descrf   rW   rX   order_by)
task_modelgantt_task_modelquerysort_fieldssort_ordersorder_by_clausesidxro   
sort_order_related_field_namecolclausegantt_prefixs                r   	sort_rowsz=CmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.sort_rows   s7   !'4 X
U9<s;?O9O[-335UZ
##L1,1KKQ,?)A)!"24FMC%&68JU8RTXY!ii.!*eT:C%j%%-F?*4*=SWWY388:F$++F3GG  O  PU  OV  W  X#X$  &(89Lr   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 )Nr~   rN   r   left_idright_id)r:   r6   CmfGanttTaskCmfTaskr   r   
issubclassr   CmfStr	CmfChoicer   CmfRelationCmfGenericRelation
CmfM2MBasem2m_model_clsdp_model	__table__leftr	   r   array_remove	array_aggcwhererY   	as_scalarrf   )query_fieldsto_be_selected_colsfinal_fieldsro   
field_nameis_gantt_taskSaModelCmfModelaliasr   	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   FN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>e  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>e  s'       ZKyzZ[ZfZfgsZt  ZKr   )	in_filtermodelsa_modelr   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   ri   s      r   r   z=CmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.<genexpr>j  s8       SYpzpsuzUXY\X]]^_bch_i^jSk  SYr   rc   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)1r   rj   rW   rX   r   r6   r   dp_get_filterrf   r   r   r   SessionrY   anyr   select_fromjoinop_gantt_task_idcollect_filter_expr   sliceallrV   r   r   	outerjoinr   in_r
   rh   rangeri   CmfRelationOptionCmfRelationTypesgetrd   rU   keys
in_link_idout_link_idr   relation_type_idr8   r   r   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_additional_tasksshow_sub_itemsstartendr   r   group_by_fieldsnested_groupingr   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   r   rowslevels_dictlevel_indexr   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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pairlparent_ids_setr   grand_parent_id
tasks_lvl1rl   	task_dataro   grouped_levels_dictfinal_items_groupr   r   r   r   sw                                                                                                                      @@@@r   r   z*CmfRoadmap.ncget_filtered_roadmap_by_level   s%   b %55	0:	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yy{ 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 (33'7$"1b\ .J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  (,/0F0J0J5ST9VX0Y0^0^0`,adxd|d|  ~C  FG  ~G  IL  IN  eO  -O(+ $ 3 3 7 7=M8N O $ 0 0E 9 $ 6,L
 $4 , 3 3D4E4E4N O,^GMM$''4CVCV,W,^,^`l,m,q,q,sM7D J 3)#+;u3E#EDM;K$6x$@%.k%6H6R%R$/$6x$@$G$G	$R 4U ; ? ? IJS.J` 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	<>  ] ? $T^ R@ .^s   :AG*3AG/AG42AG9c           	      <    |t        dd       |j                  dd       st        dd       |dk7  rt        dd         j                  di |}d  fd	d
 dfd	|j                  d      xs g }|r ||      }g t               }i t	        |d      D ]?  \  }	}
|
d   dk7  r|
d   }||vs|j                  |       j                  |       |	|<   A t         !  |ddg|||      S t        t              t        t              }t               }g }t               }t               |j                         D ]w  }|D ]p  \  }}|rB|j                  |       |||   vs!||   j                  |       |   j                  |       J||vsO|j                  |       |j                  |       r y g t               fd j                  ||      D ]  } |d        t         !  |ddg||      S )Nub   Невозможно экспортировать Roadmap без настроек фильтровTr1   r  zJExporting roadmaps without insert_bql_list is unavailable in this verison.xlsxz3Only xlsx file format is available in this verison.c                 f    t        | t              xr  t        d | j                         D              S )u   Проверяет лист сгруппированного Roadmap: словарь уровней со списками задач.c              3   <   K   | ]  }t        |t                y wr   )rg   rU   )r   ri   s     r   r   z@CmfRoadmap.export2file.<locals>.is_level_dict.<locals>.<genexpr>  s     2gu:eT3J2gs   )rg   rh   r  values)r   s    r   is_level_dictz-CmfRoadmap.export2file.<locals>.is_level_dict  s)    eT*gs2gX]XdXdXf2g/ggr   c                    	
 t        t              	t        t              }t               }g }t               }t        d | j	                         D              D ]z  }| |   D ]p  \  }}|rB|j                  |       |||   vs!||   j                  |       	|   j                  |       J||vsO|j                  |       |j                  |       r | g 
	
fdj                  ||      D ]
  } |        
S )us   Возвращает плоский порядок задач для XLSX, сохраняя parent-before-children.c              3   B   K   | ]  }t        |t              s|  y wr   )rg   int)r   rR  s     r   r   zSCmfRoadmap.export2file.<locals>.ordered_task_ids_from_level_dict.<locals>.<genexpr>  s     `%TY[^I_`s   c                 f    j                  |        j                  | g       D ]
  } |        y)u~   Добавляет задачу перед дочерними, сохраняя порядок отображения Roadmap.N)rf   r8   )r^  rX  children_mapordered_idswalks     r   r|  zNCmfRoadmap.export2file.<locals>.ordered_task_ids_from_level_dict.<locals>.walk  s4    ""3' , 0 0b 9 #HN#r   )r
   rU   rd   sortedr  r  rf   rz   )rL  children_seenrw   rv   
roots_seenrR  rJ  rY  rx   rz  r{  r|  r]   s            @@@r    ordered_task_ids_from_level_dictz@CmfRoadmap.export2file.<locals>.ordered_task_ids_from_level_dict  s   &t,L',MIEJ`;3C3C3E`` 
2*5e*< 	2&GY !g."-	*BB))488A(3::7C"*4&NN73!LL1	2
2 K# 44UIF W r   c           	      *   |ddg fv ry| st        |      S | j                  d      r| j                  dd      d   n| } t        t        j
                  | d      }|rbt        |t        j                        rH|j                  j                  ||j                  j                  t        |      t        |                  S |rHt        |t        j                        r.|j                  j                  t        |      t        |            S |rt        |t        j                  t        j                  t        j                  f      rt        |dd      }|st        |dd      r|j                  d	   }|r|d
k(  r)t        |t               rd|v r|j                  dd      d	   }|rAt!        t        |      r1	 t        t        |      j                  |dg      }|r|j*                  S yt        |      S # t"        j$                  j&                  t(        f$ r Y yw xY w)u   Возвращает подпись группы; пустые/недоступные relation значения дают «Не назначено».N u   Не назначеноr   r~   rN   r   r6   r   	CmfEntity:r9   r   )strr:   r   r   r6   r   r   r   CmfChoiceIntchoicesr8   r   r   r   r   rg   hasattrcmf
base_errorCmfErrorLookupErrorr9   )r   rq   	field_obj
model_nameobjs        r   group_labelz+CmfRoadmap.export2file.<locals>.group_label  s   tRn$ 13x8B8M8MN^8_))#q1!4eoJ
DAIZ	63F3FG ((,,S)2C2C2G2GCRUVYRZ2[\\Z	63C3CD ((,,SXs3x@@Z	F4F4FHaHacictct3uv$Y>
!gi4&H!*!1!1!!4J"jK&?ZPSUXEY^aeh^h!$3!21!5J'&*"=9%fj9==c6(=S
 "xx0s8O  NN33[A 9  99s   0"G, ,#HHr   c           	      "    
|       r |       D cg c]  }d|d	 c}S g }|t        |      k  r||   nd}| j                         D ]=  \  }}|j                  d 	||      |d       |j                   |||dz                ? |S c c}w )u  Строит плоский поток строк XLSX с group-header строками вместо UI-дерева.

            Подпись группы намеренно попадает в `name`/«Наименование», потому что
            Excel не имеет дерева, а иерархию нужно сохранить в плоской выгрузке.
            task)typerY   Ngroup)r  r9   depthrN   )rV   ri   rf   extend)r   rk   r  rJ  rK  group_field	group_keynested_valuebuild_grouped_export_rowsr  ru  r  s           r   r  z9CmfRoadmap.export2file.<locals>.build_grouped_export_rows  s     U#GghmGnoGw7ooD16\9J1J,u-PTK+0;;= ^'	< Wk+y6Ydijk5lLRWZ[R[\]	^
 K ps   Br:  rN   )r8  r  r  rY   r  )field_namesbqlformat_filer3  roadmap_ordered_idsroadmap_sequence_maproadmap_export_rowsc                     j                  |        t              }| vr|| <   || |f<   j                  | g       D ]  } ||dz           y )NrN   )rf   rV   r8   )	r^  rR  sequence_numberrX  rz  level_ofr{  sequence_mapr|  s	       r   r|  z$CmfRoadmap.export2file.<locals>.walk(  sf    s#!+.O,&$3S!/4Hc?+,(,,S"5 *Xuqy)*r   )r  r  r  r3  r  roadmap_level_ofr  ru   )r   )r>   r8   r   rd   r   r  rf   r#   export2filer
   rU   rh   rt  rz   )r]   r  r  r3  filter_settingsroadmaprk   r  seen_idsseq
export_rowrJ  r~  rw   rv   r  tuplesrY  rx   r  rz  r  ru  r  r{  r  r  r|  r%   s   `                  @@@@@@@@@r   r  zCmfRoadmap.export2file  s    "z  CG  H""#4d;bjno& KSWX5#55HH	h	B$	L	 	$ '**+<=C";G\"RKuHL#,-@#J 0Zf%/$T*(*LL)&&w/,/L)0 7&'4-'!1$/%1$7 '   #4(#C(E	U
6nn& 
	.F&, 	."MM'*mI&>>%i044W=$Y/66w?j0"w/W-	.
	. v	* 	* 00	B 	G!	 w"{(,dK'@/:4D7B4<8D # F 	Fr   )Nrq  FN)__name__
__module____qualname__	api_allowr   r   api_methodsr   r!   r$   r?   staticmethodcmf_deferred_jobrA   rj   rz   r   classmethodr  __classcell__)r%   s   @r   r   r   
   s   I((448Y7ZZK
3$_,\ bTTUV W 2  @ 8 8 8:6846464646464646464657575757575757575757577<8:7<<A5:,0*.242468?u! u!n kF kFr   r   N)cmf.includer  r   modules.project.fieldsr   sqlalchemy.ormr   
sqlalchemyr   r	   collectionsr
   r   ru   r   r   <module>r     s-      . " # #pF'' pFr   