
    	/j                     t    d dl T d dlmZ d dlmZ d dlmZ d dlmZm	Z	 d dl
mZ  G d dej                  Zd	S )
    )*fields)cmf_roadmap)aliased)funcselect)defaultdictc            !       8    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                 8    fd | j         j                  S )Nc                     | sd S | j         dk    r| S | j                                          | j        j                  S )N
CmfProject)
class_nametree_parentloadvalue)childroot_parents    './modules/project/models/cmf_roadmap.pyr   z,CmfRoadmap._calc_parent.<locals>.root_parent   sN     t<//!&&((("{5#4#:;;;    )r   r   )selfr   s    @r   _calc_parentzCmfRoadmap._calc_parent   s4    	< 	< 	< 	< 	< {4+1222r   c                 >    | j         j        s	| j        sd S d| _        d S )Ngantt)
logic_type
is_changedis_newui_view_form)r   s    r   _calc_ui_view_formzCmfRoadmap._calc_ui_view_form   s,    * 	;	F#r   c                 N    t                                                      ddgz   S )Nzmembers.responsibleztree_parent.activity)supersave_preload_fields)r   	__class__s    r   r$   zCmfRoadmap.save_preload_fields"   s%    ww**,,0EG]/^^^r   c                    | j         s|                                 | _         | j         r| j                             g d           | j        s6| j        r/| j        j                                        r| j        j        | _        | j        s6| j         r/| j         j                                        r| j         j        | _        | j        s&t          j                            dd          | _        | j	        r| j         r| j         j
        s| j        pd | _        n`| j        r| j        j                            d          s:| j         r"| j         j        dk    rd	| j        pd | _        nd
| j        pd | _        | j        r)| j        j        s| j        j        rt'          dd            t)                      j        |i |}| j        j        rt-          t          j        j                   | j         j        rN| j         rG| j        D ]?}|j                                         | j         k    r| j         |_          |j        |ddi| @|S )N)	cmf_ownercmf_owner_assistantsactivitylogic_prefixadd_object_typer   
productionT)codecache_inmemory1)Roadmapu   Дорожная картаzproject.baseu   Дорожная карта zRoadmap uL   Нельзя изменять memrers и tasks у корневого RoadmapabortnotifyF)parentr   load_fieldsr)   r   r   modelsCmfActivitygetr   r+   namer   
startswithr*   systemmembersr   tasks	cmf_alertr#   saveschedule_deferred_jobr   recalculate_cache)r   argskwargsresmemberr%   s        r   r?   zCmfRoadmap.save%   st   { 	.++--DK; 	K##kkk $   
 } 	6!1 	6d6F6O6T6T6V6V 	6 ,5DM} 	1 	11E1J1J1L1L 	1 K0DM} 	[".22UY2ZZDM; 	>{ >4;#> >#y/C1		Y >dio&@&@Ak&l&l >; >4;#;~#M#M Qty?OC Q QDII =49+; = =DI ; 	v|& v$**? vhptuuuuegglD+F++<" 	G!&"3"EFFF ;! 	?dk 	?, ? ?=%%''4;66$(KFMFK>e>v>>>
r   <      )	only_oncesoft_time_limit
system_jobpriorityc            	      *   t           j        }d}d}|                    ddg          D ]}|dz  }t          |j                  }|j        |k    r|dz  }t                              d|j         d| d|j                    ||_         |j	        d	
           |j        j
        |j        j
        d}t          d|j         |           t          d|           |dz  dk    rt                       t                              d| d| d           |S )u;   Актуализация кеша кол-ва членов.r   cache_members_countr<   r      zUpdate cache_members_count z ->  T)	only_data)node_idelements_countztree-node-count-changes-ztree-node-count-changes2   zRecalculate /z roadmaps caches)r6   r   listlenr<   rM   gdebugidr?   r   cmf_emit_event
cmf_commit)_kwargsclstotal_count
calc_countr   
real_count
event_datas          r   rA   zCmfRoadmap.recalculate_cacheS   sE    
88,A9+M8NN 	 	K1K[011J.*<<a
xk6Uxx[exxhshvxxyyy2</  40000)4)=Q\QpQvww
J+.JJJWWW9:FFFB!##	IzIIKIIIJJJr   c                    |s|t          t                    }t          t                    |d<   |d         d                             d | D                        d | D             |d<   |                    |           |S |d         }t          t                    }| D ]y}||         }t          |t                    r?|r!|D ]}||                             |           B|d                             |           ^||                             |           zt                      }	|                                D ],\  }}
t          	                    |
|dd         |          |	|<   -|	S )un   Строит рекурсивные группы Roadmap без потери задач с пустыми M2M.maprN   c                     h | ]
}|d          S )rY    .0items     r   	<setcomp>z.CmfRoadmap._nested_grouping.<locals>.<setcomp>t   s    ,J,J,JDT$Z,J,J,Jr   c                 "    g | ]}|d          dfS )rY   Nre   rf   s     r   
<listcomp>z/CmfRoadmap._nested_grouping.<locals>.<listcomp>u   s!     F F F$t*d!3 F F Fr   r   N)
r
   rU   setupdateappend
isinstancedictitemsr   _nested_grouping)rq   group_fieldsfinal_items_groupsitems_by_levelfieldgroupedrh   keyelrD   	sub_itemss              r   rr   zCmfRoadmap._nested_groupingn   s     	"(..N$/$4$4N5!5!!$++,J,JE,J,J,JKKK F F F F FN1%%n555!!Qd## 	* 	*Du+C#t$$ 	* /! 1 1**400001
 DM((....##D))))ff%mmoo 	d 	dNC!229l122>NPbccCHH
r   c                 (    fd| D             }|p| S )uz   Возвращает корни экспорта, предпочитая вложенное положение задач.c                     g | ]}|v|	S re   re   )rg   root_id	child_idss     r   rk   z4CmfRoadmap._roadmap_export_roots.<locals>.<listcomp>   s$    *d*d*dw7ZcKcKc7KcKcKcr   re   )rootsr~   roots_without_nested_duplicatess    ` r   _roadmap_export_rootsz CmfRoadmap._roadmap_export_roots   s+     +e*d*d*d%*d*d*d'.7%7r   FNc                  '  stuvw t           j        } vfd}!stuvfd}"t                              d| d| d| d| d| d| d	|            ||||||||	|
|||||||||||g}#t	          |#          D ]A\  }$}%|%r:t
          j        j                            t
          j        d
|%i          d         |#|$<   B| r7t
          j        j                            t
          j        d
| i          d         } |r7t
          j        j                            t
          j        d
|i          d         }|r7t
          j        j                            t
          j        d
|i          d         }| 	                    g d           | 	                    g d           | 	                    g d           |s| 	                    g d           t
          j        j
        tt
          j        j
        st
          j        j        j        uu                                }&|duo|duo||k     o| }'d}(d})dvtj        g}*|r0 |"|          \  }+}|*|+z   }*t                              d|            t          vfd|D                       pt          vfd|D                       }, |&j        |*                     t          }-|,r$|-                    stj        sj        k              }-| |#d         g}.|r|r|.	                    |           u                    |.t
          j        t|-          \  }-}/|-                    |/          }-|r |!ts|-||          }-|'r|-                    ||          }-|-                                }(d |(D             })t                              dt1          |)                      i }0|s|sd |)D             |0d<   n|r]t3          td          }1t3          td          }2t3          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-          }C|&                    tj                            d.          |1j                            d/          |2j                            d0          |3j                            d1          |4j                            d2          |5j                            d3          |6j                            d4          |7j                            d5          |8j                            d6          |9j                            d7          |:j                            d8          |;j                            d9          |<j                            d:          |=j                            d;          |>j                            d<          |?j                            d=          |@j                            d>          |Aj                            d?          |Bj                            d@          |Cj                            dA                                        t                              |1|1j        tj        k                                  |2|2j        |1j        k                                  |3|3j        |2j        k                                  |4|4j        |3j        k                                  |5|5j        |4j        k                                  |6|6j        |5j        k                                  |7|7j        |6j        k                                  |8|8j        |7j        k                                  |9|9j        |8j        k                                  |:|:j        |9j        k                                  |;|;j        |:j        k                                  |<|<j        |;j        k                                  |=|=j        |<j        k                                  |>|>j        |=j        k                                  |?|?j        |>j        k                                  |@|@j        |?j        k                                  |A|Aj        |@j        k                                  |B|Bj        |Aj        k                                  |C|Cj        |Bj        k              }D|D                    tj                            |)                    }D|,r$|D                    stj        sj        k              }D|r |!ts|D||          }D|D                                }EndB |)D             }Et=          t>                    }F|ED ]K}GtA          ddC          D ]8}H|G|Hdz
           }I|Hdk    rdn
|G|HdDz
           }J|I|I|F|H         vr|Jg|F|H         |I<   9Lt                              dEdF                    dG |F!                                D                       z              t=          t>                    }K|r*t
          j"        j
        }Lt
          j#        $                    dHI          j        }Mt=          tJ                    }NtA          dDdC          D ]}OtM          |F|Odz
           '                                          }P|Ps0|&                    |Lj(        |Lj)                                      |Lj*        dJk    |Lj+        |Mk    |Lj(                            |P                                                    }Q|QD ]y\  }R}S|R}J|S}I|I|F|O         v r"|F|O         |I         	                    |J           n|Jg|F|O         |I<   |I|K|O         v r"|K|O         |I         	                    |J           m|Jg|K|O         |I<   z|rbtK          |K,                    |Odz
  i           '                                          |N,                    |Odz
  tK                                z  }T|Trtj                            tM          |T                    tj*        dJk    tj-        dJk    g}U|s|U	                    tj.        dJk                |&                    tj        tj                  j        |U                                 }V|VD ]h\  }W}X|W|F|O         vr|Xg|F|O         |W<   n1|X|F|O         |W         vr!|F|O         |W         	                    |X           |N|O         /                    |W           it                              dKdF                    dL |K!                                D                       z              tA          ddC          D ]p}Og }YtM          |F|O         '                                          }Zg }[|ZD ]*}I|F|O         |I         D ]}\|[	                    |I|\f           +|Odk    r@|#|Odz
           r|Y	                    |#|Odz
                      |r|Y	                    |           |r|Odk    re|rcdM |0|Odz
           D             }]g }^|K|O         !                                D ]%\  }_}`|`D ]}a|a|]v r|^	                    |_            n&dN|dOdP|]gdQdP|^gg}|Y	                    |           |ZrE|Ys|r@|&                    tj                                      t                              tj                            |Z                    }b|,r$|b                    stj        sj        k              }b|Yr;u                    |Yt
          j        t|b          \  }b}c|b                    |c          }b|r |!ts|b||          }b|b                                }dg }[tK                      }e|dD ]M}G|Gd         }I|F|O         |I         D ]4}\|I|\f}f|f|evr*|e/                    |f           |[	                    |f           5N|[|0|O<   r|rtA          dRddS          D ]}g|0|g         stK          |0|gdz
                     }hg }i|0|g         D ]K\  }j}X|F|gdz
           |X         D ]4}k|X|kf}f|f|hvr*|h/                    |f           |i	                    |f           5L|is}|0|gdz
           |iz   |0|gdz
  <   |r t=          tL                    w|0|gdz
           D ] \  }I}Jw|I         	                    |J           !|&                    tj                                      t                              tj                            tM          w                              }l|,r$|l                    stj        sj        k              }l |!ts|l||          }lwfdT|l                                D             |0|gdz
  <   t                              dUdF                    dV |0!                                D                       z              |rKg }mg }n|(D ]I}Gt?                      }ot	          dQg|z             D ]\  }$}p|G|$         |o|p<   |m	                    |o           J | |m||n          }q|rwtA          dDdC          D ]f}O|0|O         D ][\  }I}J|nD ]S}r|J|rdW         |Odz
           v r>|r|O         	                    |I|Jf           |rdW         |O         /                    |I           T\g|nD ]}r|r0                    dW           t?          |q          }0t                              dXdF                    dY |0!                                D                       z              t                              dZ           |0S )[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||                                         nd}|                              rX|                    dd          \  }	}
t          ||
d           }|st          ||
dz   d           }||                    |          }n't          | |d           }|st          | |dz   d           }|E|dk    r|                                n|                                }|	                    |           t                              d|            /|r
 |j        | }|S )Nasc.rN   _idup   ERROR ncget_filtered_roadmap_by_level не смогли применить сортировку для поля )	enumeraterV   lowerr:   splitgetattrlabelr   descrn   rW   rX   order_by)
task_modelgantt_task_modelquerysort_fieldssort_ordersorder_by_clausesidxrv   
sort_order_related_field_namecolclausegantt_prefixs                r   	sort_rowsz=CmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.sort_rows   s   !'44 X X
U9<s;?O?O9O9O[-33555UZ
##L11 
G,1KKQ,?,?)A)!"24FMMC Z%&68JU8RTXYY!ii..!*eT::C G%j%%-FF?*4*=*=SWWYYY388::F$++F3333GG  W  PU  W  W  X  X  X  X :&(89Lr   c           	      h   g }g }| D ]&}|}|                               }|rn}|rt          j        nt          j        }|}d }	|r|                    dd          d         }t          ||          }
t          |
t          j                  rt          |
t          j	                  st          ||d           r't          ||          }	|	
                    |          }	n!t          |
t          j        t          j        f          rt          ||dz   d           }	nt          |
t          j                  r|
                                }                    |          }|j        }|
j        rd}d}nd}d}t%          t'          j        t'          j        |j        |                   d           g                              |j        |         |j        k                                              
                    |          }	|	*|                    |	           |                    |           (||fS )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_scalarrn   )query_fieldsto_be_selected_colsfinal_fieldsrv   
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 44"
 % 0 0 > >'4>))$2?S6..V^  3!KKQ//2E#He44	 i77 
9V\Vf@g@g  7E400 !'511C))E**CC ")f.@&B[-\]] %guu}dCC#Iv/@AA $-$;$;$=$=	'2';';I'F'F*4$> :/8,0:--/9,09- # $ 1$(N359J3K$L$L$(!" !"$   #U35)9#:gj#HII&Y[["U5\\  ?'..s333 ''
333&44r   z4ncget_filtered_roadmap_by_level method_start: start=z, end=z, group_by_fields=z, show_additional_tasks=z, show_sub_items=z, sort_fields=z, sort_orders=filterr   )r*   z!=ztask.gantt_project)cmf_deleted==F)is_dummyr   F)cmf_archivedr   FNop_gantt_task.z2ncget_filtered_roadmap_by_level group_by_fields : c              3   B   K   | ]}|                               V  d S Nr:   rg   fr   s     r   	<genexpr>z=CmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.<genexpr>e  s/      RRQall<88RRRRRRr   c              3   B   K   | ]}|                               V  d S r   r   r   s     r   r   z=CmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.<genexpr>e  sT        ZK  ZKyzZ[ZfZfgsZtZt  ZK  ZK  ZK  ZK  ZK  ZKr   )	in_filtermodelsa_modelr   c                     g | ]
}|d          S r   re   )rg   rows     r   rk   z>CmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.<listcomp>~  s    >>>c3q6>>>r   z7ncget_filtered_roadmap_by_level : len(first_level_ids)=c                     g | ]}|d fS r   re   rg   task_ids     r   rk   z>CmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.<listcomp>  s    #S#S#SWdO#S#S#Sr   rN   T2)r9   T3T4T5T6T7T8T9T10T11T12T13T14T15T16T17T18T19T20lvl1_idlvl2_idlvl3_idlvl4_idlvl5_idlvl6_idlvl7_idlvl8_idlvl9_idlvl10_idlvl11_idlvl12_idlvl13_idlvl14_idlvl15_idlvl16_idlvl17_idlvl18_idlvl19_idlvl20_idc                     g | ]}|fd z   	S ))NNNNNNNNNNNNNNNNNNNre   r   s     r   rk   z>CmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.<listcomp>  s    QQQg
\1QQQr         z-ncget_filtered_roadmap_by_level levels_dict= z, c              3   F   K   | ]\  }}d | dt          |           V  dS lvl=NrV   rg   r  idss      r   r   z=CmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.<genexpr>  se        QM  QMltloqtQgWZQgQg]`ad]e]eQgQg  QM  QM  QM  QM  QM  QMr   zsystem.additional_parent)r-   Fz8ncget_filtered_roadmap_by_level additional_levels_dict= c              3   F   K   | ]\  }}d | dt          |           V  dS r  r  r  s      r   r   z=CmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.<genexpr>  sm        `g  `g  |D{~  AD`vfi`v`vlopsltlt`v`v  `g  `g  `g  `g  `g  `gr   c                     g | ]\  }}|S re   re   )rg   tidr   s      r   rk   z>CmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.<listcomp>4  s    -]-]-]fc1c-]-]-]r   ORparent_task_idINrY      c                 F    g | ]}|d                   D ]}|d          |fS r   re   )rg   r   r  parents_by_ids      r   rk   z>CmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.<listcomp>  sR     4 4 4 #2?A2G4 4 !/ !V^44 4 4 4r   z3ncget_filtered_roadmap_by_level final_levels_dict= c              3   F   K   | ]\  }}d | dt          |           V  dS r  r  rg   r  rq   s      r   r   z=CmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.<genexpr>  se        SY  SYpzpsuzSkY\SkSk_bch_i_iSkSk  SY  SY  SY  SY  SY  SYr   rc   z*ncget_filtered_roadmap_by_level grouping: c              3   F   K   | ]\  }}d | dt          |           V  dS )zgroup(z)=Nr  r  s      r   r   z=CmfRoadmap.ncget_filtered_roadmap_by_level.<locals>.<genexpr>  se        NX  NXoyortyNjWZNjNj^abg^h^hNjNj  NX  NX  NX  NX  NX  NXr   z*ncget_filtered_roadmap_by_level method_end)1r   rr   rW   rX   r   r6   r   dp_get_filterrn   r   r   r   SessionrY   anyr   select_fromjoinop_gantt_task_idcollect_filter_expr   sliceallrV   r   r   	outerjoinr  in_r
   rp   rangerq   CmfRelationOptionCmfRelationTypesgetrl   rU   keys
in_link_idout_link_idr   relation_type_idr8   r   r   addpop)x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final_levels_dictr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rowslevels_dictr   level_indexr   r  additional_levels_dictRelation"additional_parent_relation_type_id_linked_children_idslevelprev_level_idsresultsr'  r(  ids_for_childrenchild_filterchild_resultschild_id	parent_idconds	level_idslevel_ids_with_parentparent_taskprevious_level_idsadditonal_tasks_of_prev_leveladd_task_idadd_task_parent_idsadd_task_parent_idquery_nquery_filterfiltered_ids
seen_pairspairllevel_pairsadded_pairsr   grand_parent_idresort_query
tasks_lvl1rt   	task_datarv   grouped_levels_dictfinal_items_groupr   r   r   r   r  sx                                                                                                                      @@@@@r   r   z*CmfRoadmap.ncget_filtered_roadmap_by_level   s<   b %5	 	 	 	 	0:	5 :	5 :	5 :	5 :	5 :	5 :	5 :	5x 	
 Xu X XTW X Xkz X X)>X XQ_X XozX X KVX X 	Y 	Y 	Y )
0 !)) 	` 	`GAt `#^.::6>HVZK[\\]^_
 	l$n/;;FNXWfLghhijkO 	l$n/;;FNXWfLghhijkO 	p & 1 = =fnxYjNk l lmn o 	KKKLLL;;;<<<888999 	B""#@#@#@AAA ~&'0	n'3%%''  $4$$ $#	 	  '!%	 	\1>1O1O.$9<M$M!GGZZZ[[[RRRR/RRRRR  KVY  ZK  ZK  ZK  ZK  J  ZK  ZK  ZK  WK  WK#gm%:;GGMM 	]%**9d6Ky|6[\\K$gaj1	 	.#8 	._---*5*H*H.	 +I +
 +
'' "(();<< 	\#)D)[+{[[K 	8%++E377K&??,,>>-=>>>	`#oJ^J^``aaa  A	$9 A	#S#S?#S#S#Sa   MRd...d...d...d...d...d...d...d...d///d///d///d///d///d///d///d///d///d///d/// MMi00I..I..I..I..I..I..I..I..Z00Z00Z00Z00Z00Z00Z00Z00Z00Z00Z00) , ![&&YrB$5$@AAYrB$5$>??YrB$5$>??YrB$5$>??YrB$5$>??YrB$5$>??YrB$5$>??YrB$5$>??YsC$6"%$?@@YsC$6#&$@AAYsC$6#&$@AAYsC$6#&$@AAYsC$6#&$@AAYsC$6#&$@AAYsC$6#&$@AAYsC$6#&$@AAYsC$6#&$@AAYsC$6#&$@AAYsC$6#&$@AAU Z TW[[%A%ABB" Y!JJy$2G9<2WXXE X%IdIuk;WWEyy{{ RQQQQ &d++K N N#(B<< N NK!+/2G-8A-=-=TT3{UVCWN*wk+>V/V/V=K<MK09	N GGDtyy  QM  QM  yD  yJ  yJ  yL  yL  QM  QM  QM  HM  HM  M  N  N  N%0%6%6"$ 7h!3<5;5K5P5PVp5P5q5q5t2 (33'7'7$"1b\\ .J .JE%)+eai*@*E*E*G*G%H%HN) ! %mmH,?AUVV]] ,5 15WW +//??  cee	  4; W W/
K)3"-"k%&888'.w7>>~NNNN;I:KK.w7"&<U&CCC259'BII.YYYYFTEV259'BB ( J,/0F0J0J5ST9VX0Y0Y0^0^0`0`,a,adxd|d|  ~C  FG  ~G  IL  IN  IN  eO  eO  -O(+ J $ 3 7 7=M8N8N O O $ 0E 9 $ 6,L
 $4 P , 3 3D4E4N O O O,^GMM$'4CV,W,W,^`l,m,q,q,s,sM7D J J 3)#+;u3E#E#EDM;K$6x$@$@%.k%6H6R%R%R$/$6x$@$G$G	$R$R$R 4U ; ? ? I I I ISVZV_V_  `g  `g  H^  Hd  Hd  Hf  Hf  `g  `g  `g  Wg  Wg  g  h  h  h
 q" ?A ?A U!3!8!8!:!:;;	(*%( M MG'25'9''B M M-44g{5KLLLLM 199uqy) 9WUQY%7888( 8%6777 # 2qyy^y-]-]@QRWZ[R[@\-]-]-]*8:5@VW\@]@c@c@e@e * *<K)<6I * * 2#59K#K#K$A$H$H$U$U$U$)E $L !+-t5GH!4)FG	+ LL111 C% C; C%mmDG44@@FFMMdgkkZcNdNdeeG& a"),,y$:OS\S_:_"`"` ?0;0N0N&+"(.%)")	 1O 1 1- #*..">">" `"+)D)WkS^"_"_#*;;==L,.)!$J+ C C"%a&+6u+=g+F C CK$+[#9D#:55 *t 4 4 4 5 < <T B B B	C ,A!%((  #r1b)) " "A,Q/ ! "%&7A&>"?"?K"$K*;A*> 9 9Y/:1q5/A)/L 9 9O$-#?D#;66 + 5 5 5 + 2 24 8 8 8	9 ' ! /@Q/G+/U%a!e,"  )4D(9(97HQ7O J J3G^)'299.IIII'.}}TW'='='I'I$'O'O'V'VW[W^WbWbcghucvcvWwWw'x'x* o+7+<+<YH]ajamHm+n+nL'0yy,P[]h'i'i4 4 4 4'3'7'7'9'94 4 4)!a%0 	
F  SY  SY  P  V  V  X  X  SY  SY  SY  JY  JY  Y  	Z  	Z  	Z  	YJ!#' - - FF	 )4&?*B C C . .HAu'*1vIe$$!!),,,, #2/*oOa"b"b   M"1b\\ M ME3DU3K M M/1C M M--1B51I%RS)1TTT 1% 8 ? ?.@Y Z Z Z 1% 8 ? C CG L L LMM &8 - -!!%%e,,,, $%8 9 9GGADII  NX  NX  ~O  ~U  ~U  ~W  ~W  NX  NX  NX  EX  EX  X  Y  Y  Y	=>>>  r   xlsxc           	      B    |t          dd           |                    dd           st          dd           |dk    rt          dd             j        di |}d  fd	d
 dfd	|                    d          pg }|r ||          }g t                      }i t	          |d          D ]M\  }	}
|
d         dk    r|
d         }||vr/|                    |                               |           |	|<   Nt                                          |ddg|||          S t          t                    t          t                    }t                      }g }t                      }t                      |                                D ]}|D ]\  }}|rV|                    |           |||         vr6||                             |           |                             |           ]||vr*|                    |           |                    |           g t                      fd                     ||          D ]} |d           t                                          |ddg||          S )Nub   Невозможно экспортировать Roadmap без настроек фильтровTr1   r,  zJExporting roadmaps without insert_bql_list is unavailable in this verison.r~  z3Only xlsx file format is available in this verison.c                     t          | t                    o*t          d |                                 D                       S )u   Проверяет лист сгруппированного Roadmap: словарь уровней со списками задач.c              3   @   K   | ]}t          |t                    V  d S r   )ro   rU   )rg   rq   s     r   r   z@CmfRoadmap.export2file.<locals>.is_level_dict.<locals>.<genexpr>  s,      2g2gu:eT3J3J2g2g2g2g2g2gr   )ro   rp   r  values)r   s    r   is_level_dictz-CmfRoadmap.export2file.<locals>.is_level_dict  s;    eT**gs2g2gX]XdXdXfXf2g2g2g/g/ggr   c                 x  	
 t          t                    	t          t                    }t                      }g }t                      }t          d |                                 D                       D ]}| |         D ]\  }}|rV|                    |           |||         vr6||                             |           	|                             |           ]||vr*|                    |           |                    |           g 
	
fd                    ||          D ]} |           
S )us   Возвращает плоский порядок задач для XLSX, сохраняя parent-before-children.c              3   D   K   | ]}t          |t                    |V  d S r   )ro   int)rg   r_  s     r   r   zSCmfRoadmap.export2file.<locals>.ordered_task_ids_from_level_dict.<locals>.<genexpr>  s3      ``%TY[^I_I_```````r   c                 z                         |                                | g           D ]} |           dS )u~   Добавляет задачу перед дочерними, сохраняя порядок отображения Roadmap.N)rn   r8   )r  re  children_mapordered_idswalks     r   r  zNCmfRoadmap.export2file.<locals>.ordered_task_ids_from_level_dict.<locals>.walk  sO    ""3''' , 0 0b 9 9 # #HDNNNN# #r   )r
   rU   rl   sortedr&  r*  rn   r   )rY  children_seenr~   r   
roots_seenr_  r   rf  r}   r  r  r  r]   s            @@@r    ordered_task_ids_from_level_dictz@CmfRoadmap.export2file.<locals>.ordered_task_ids_from_level_dict  st   &t,,L',,MIEJ``;3C3C3E3E````` 
2 
2*5e*< 	2 	2&GY  2!g..."-	*BBB))488AAA(3::7CCC"*44&NN7333!LL111	2 K# # # # # # # 44UIFF  Wr   c           	         |ddg fv rdS | st          |          S |                     d          r|                     dd          d         n| } t          t          j        | d          }|rht          |t          j                  rN|j	        
                    ||j	        
                    t          |          t          |                              S |rOt          |t          j                  r5|j	        
                    t          |          t          |                    S |rt          |t          j        t          j        t          j        f          rt          |dd          }|st          |dd          r|j        d	         }|r|d
k    r5t          |t                     r d|v r|                    dd          d	         }|rmt!          t          |          rX	 t          t          |          
                    |dg          }n"# t"          j        j        t(          f$ r Y dS w xY w|r|j        S dS t          |          S )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   ro   hasattrcmf
base_errorCmfErrorLookupErrorr9   )r   rx   	field_obj
model_nameobjs        r   group_labelz+CmfRoadmap.export2file.<locals>.group_label  sR   tRn$$ 10  3xx8B8M8MN^8_8_o))#q11!44eoJ
DAAI ]Z	63FGG ] (,,S)2C2G2GCRUVYRZRZ2[2[\\\ AZ	63CDD A (,,SXXs3xx@@@ 1Z	F4FHacict3uvv 1$Y>>
! 5gi4&H&H 5!*!1!!4J" 6jK&?&?ZPSUXEYEY&?^aeh^h^h!$3!2!21!5J ('&*"="= (9%fj99==c6(=SSN3[A 9 9 9  9889  ("x00s88Os   +H
 
H)(H)r   c           	      F    	|           rd  
|           D             S g }|t          |          k     r||         nd}|                                 D ]K\  }}|                    d ||          |d           |                     |||dz                        L|S )u  Строит плоский поток строк XLSX с group-header строками вместо UI-дерева.

            Подпись группы намеренно попадает в `name`/«Наименование», потому что
            Excel не имеет дерева, а иерархию нужно сохранить в плоской выгрузке.
            c                     g | ]}d |dS )task)typerY   re   r   s     r   rk   zMCmfRoadmap.export2file.<locals>.build_grouped_export_rows.<locals>.<listcomp>
  s     oooGw77ooor   Ngroup)r  r9   depthrN   )rV   rq   rn   extend)r   rs   r  rX  group_field	group_keynested_valuebuild_grouped_export_rowsr  r  r  s          r   r  z9CmfRoadmap.export2file.<locals>.build_grouped_export_rows  s     }U## pooGgGghmGnGnooooD16\9J9J1J1J,u--PTK+0;;== ^ ^'	< Wkk+y6Y6Ydijjkkk55lLRWZ[R[\\]]]]Kr   rI  rN   )rG  r  r  rY   r  )field_namesbqlformat_filerB  roadmap_ordered_idsroadmap_sequence_maproadmap_export_rowsc                                          |            t                    }| vr|| <   || |f<                       | g           D ]} ||dz              d S )NrN   )rn   rV   r8   )	r  r_  sequence_numberre  r  level_ofr  sequence_mapr  s	       r   r  z$CmfRoadmap.export2file.<locals>.walkD  s    s###!+..O,&&$3S!/4Hc?+,(,,S"55 * *Xuqy))))* *r   )r  r  r  rB  r  roadmap_level_ofr  re   r   )r>   r8   r   rl   r   r*  rn   r#   export2filer
   rU   rp   r  r   )r]   r  r  rB  filter_settingsroadmaprs   r  seen_idsseq
export_rowr   r  r~   r   r  tuplesrf  r}   r  r  r  r  r  r  r  r  r  r%   s   `                  @@@@@@@@@r   r  zCmfRoadmap.export2file  s    "z  CG  H  H  H  H""#4d;; 	pbjnoooo&  KSWXXXX5#5HHHH	h 	h 	h	 	 	 	 	B$	 $	 $	L	 	 	 	 	 	 	 	 	$ '**+<==C 	";";G\"R"RKuuHL#,-@#J#J#J 0 0Zf%//$T*(**LL)))&&w///,/L)77&&'4-'!1$/%1$7 '    #4((#C((EE	UU
66nn&& 
	. 
	.F&, 	. 	." .MM'***mI&>>>%i044W===$Y/66w???j00"w///W---	. vv	* 	* 	* 	* 	* 	* 	* 	* 	* 00	BB 	 	GD!ww""{(,dK'@/:4D7B4<8D # F F 	Fr   )Nr~  FN)__name__
__module____qualname__	api_allowr   r   api_methodsr   r!   r$   r?   staticmethodcmf_deferred_jobrA   rr   r   r   classmethodr  __classcell__)r%   s   @r   r   r   
   s       I(48Y7ZZK
3 
3 
3$ $ $_ _ _ _ _, , , , ,\ bTTUVVV  WV \2   \@ 8 8 \8 8:6846464646464646464657575757575757575757577<8:7<<A5:,0*.242468?Q! Q! Q! \Q!f kF kF kF kF kF [kF kF kF kF kFr   r   N)cmf.includer  r   modules.project.fieldsr   sqlalchemy.ormr   
sqlalchemyr   r	   collectionsr
   r   re   r   r   <module>r     s              . . . . . . " " " " " " # # # # # # # # # # # # # #LF LF LF LF LF' LF LF LF LF LFr   