
    iLZ                     l    d dl mZmZmZ d dlmZ d dl  G d dej                  j                        Z
y)    )ListLiteralDefaultDict)defaultdict)*c                   <   e Zd ZdZdZdZdZej                  j                  j                  g dz   Z
ed        Zed        Zed&d	ee   d
eee      fd       Zedddedeeeed   f      deee      fd       Zed        Zed        Zed        Ze	 d'ded   dedeedf   fd       Ze	 	 d(dededed
efd       Zedefd       Z edefd       Z!edefd        Z"ed!        Z#ed"        Z$e	 d&d	ee   d
edeeed   f   fd#       Z%ed$        Z&ed%        Z'y))CmfMenuTreeMenuTreeevarootMNTu   Корень меню)get_parents_listpublic_get_treetree_menu_in_rootget_nodeget_treec                  v    t         j                  j                         j                  t        j
                  v ryy)NTF)modelsCmfPersonGroupsharelink_groupidgcurrent_person__member_of      ./common/models/cmf_menu_tree.py_allow_add_sharelinkz CmfMenuTree._allow_add_sharelink   s-       002559T9TTr   c                    g }t         j                  |      }|j                  dd|gg ddg      }| j                         }|D ]  }t	               }|j
                   |_        |j                  |_        |j                   |_        |j                  j                  |_        |j                  j                  xs d|_
        |j                   |_        |j                  j                  |_        |j                  j                  |_        |j                  r)t         j                  |j                        j                  n|j                  |_        |j                  |_        t!        |d|j                  j#                               |_        d|_        |j(                  |_        |r|j*                  |_        nd	|_        |j-                  |        |S )
Ntree_parent_id==)ordernotree_node_is_branchr   	parent_idsharelink_hashui_view_formsys_typer    )filterfieldsorderby@B r$   TNOACCESS)cmfutilget_model_by_idlistr   CmfUiMenuNoder   
class_namecoder!   valuer    namer   r"   	ui_moduleui_namegetattrlowervf
allow_mover%   r#   append)clsr   	node_listmodelobj_listadd_sharelinkvnodes           r   class_node_listzCmfMenuTree.class_node_list   sw   	''7::&6n%M K   002 	#A ?DDGllDO66(DI'('<'<'B'BD$99??5gDL66(DI"#"2"2"8"8D[[..DNOP{{W44Q[[AKK`a`k`kDN99DLa1BCDG"DOJJDM&'&6&6#&0#T"+	#, r   Ntree_parent_idsorder_byc           	      L   t         j                  |d         }g d}i }i }|&|D ]  }|j                  d      sd||dd  <    d|<   |rm|j                  dd|gd	g d
g dgg||j	                         D cg c]  }d| 	 c}z   d      }	|	D ]$  }
| j                  |
||      }|||
j                  <   & |S |j                  dd|gg||j	                         D cg c]  }d| 	 c}z         }	|	D ]$  }
| j                  |
||      }|||
j                  <   & |S c c}w c c}w )Nr   )ztree_nodes.ordernoztree_nodes.is_publicztree_nodes.ui_view_formztree_nodes.systemztree_nodes.has_tree_nodesztree_nodes.tree_node_is_branchr"   ztree_nodes.parent_idztree_nodes.tree_hiddencache_members_countcache_select_countcache_child_tasks_countztree_nodes.sharelink_hashztree_nodes.sys_typeztree_nodes.logic_prefixr%   r   tree_nodes.cmf_archived tree_nodes.has_children_archivedhas_children_archivedztree_nodes.obj_modelztree_nodes.cmf_ver_cur-desc   ascr   INOR)rH   r   T)rI   r   Tztree_nodes.T)r&   r'   include_archived)r&   r'   )r+   get_obj_by_id
startswithslistkeys_build_nodesr   )r:   rB   only_archivedrC   r<   query_fieldsparent_nodes_childrenssort_by_fieldssort_by_fieldparent_nodesparent_noder;   s               r   obj_node_listzCmfMenuTree.obj_node_list@   s   %%oa&89

 "$<>!) 6 ++C08>N=#456 16}- ;;41?H $ZhZmZmZo&p]O'D&pp!% ' L  , C,,[-X	9B&{~~6C *){{412#ZhZmZmZo&p]O'D&pp # 
 ( 	?K((m^TI5>";>>2	? &%% 'q 'qs   6DD!r]   zmodels.BaseModelrW   rZ   )rN   rL   returnc                 D   | j                         }g }||j                  y |j                  D cg c]  }|j                  dk(  r|j                  r|! c}|_        |j                  D ]  }t	        |j
                  | xr |j                  |xr |j                   xr |j                   f      rJt        j                  |j                        }t               }	|j                   |	_        |j                  |	_        |j                  |	_        |j                   |	_        t        |d      r!|j                  dk(  r|j                  |	_        n|j                  |	_        |j                   xs d|	_        d|j"                  v r|j$                  |	_        d|j"                  v r|j(                  |	_        d|j"                  v r|j*                  |	_        d|j"                  v r|j,                  |	_        |j.                   |	_        |j                  d	k(  rd
|j.                   |	_        |j                   |	_        |j2                   |	_        |j2                  r)t        j5                  |j2                        j6                  n|j6                  |	_        |j8                  |	_        d|	_        t=        |dd       |	_        t=        |dd      |	_        t=        |d|j8                  jA                               |	_!        t=        |dd       |	_"        ||	_#        t        |d      r|r|jH                  |	_$        nd|	_$        |jK                  |	        |r<tM        |jO                               D ]  \  }
|jQ                  fd|
dk(           |S |jQ                  d        |S c c}w )NCmfReqr%   archiver)   rE   rF   rG   	obj_modelCmfComponentu   ▣ TsystemFr$   logic_prefixr#   r*   c                     t        | d       S N)r5   )xr[   s    r   <lambda>z*CmfMenuTree._build_nodes.<locals>.<lambda>   s    WQt-L r   rL   )keyreversec                     | j                   S rh   r    ri   s    r   rj   z*CmfMenuTree._build_nodes.<locals>.<lambda>   s
    		 r   rk   ))r   
tree_nodesr/   cmf_ver_curanytree_hiddencmf_archivedrJ   r+   get_model_by_namer.   r   r0   hasattrr%   r!   r    __dict__rE   children_countrF   rG   rc   r2   r   r"   r,   r3   r4   r8   r5   re   r6   r7   rf   rW   r#   r9   reverseditemssort)r:   r]   rW   rZ   r>   r;   	tree_noder?   r<   r@   	directionr[   s              @r   rV   zCmfMenuTree._build_nodesv   s(   
 002	+"8"8"@ (3'='="
#YEYEY]eEe$$ "

 '' 0	#A""5q~~Uq~~#5Ua>U>U:U 
 --all;E ?DDG !DllDO66(DIq*%!**	*A+6+L+L(+,+@+@(99/DL$

2&'&;&;##qzz1&'&:&:#(AJJ6&'&?&?#ajj(!"66(DI||~-"166(O	%0^^$4D !}DNOP{{W44Q[[AKK`e`o`oDN ==DL"DO#Az48DM!!Xu5DKa1D1D1FGDG '>4 @D!.Dq*+&'&6&6#&0#T"a0	#f  -5^5I5I5K,L k(y#LV_ciVijk
  NN1N2C"
s   $Nc                     d|v r!t         j                  |      }|j                  S t         j                  |dg      j                  }|sy | S )N:Classr   r'   )r+   r,   menu_tree_parent_idrR   r   )r:   r   r<   r   s       r   tree_parent_id_getzCmfMenuTree.tree_parent_id_get   sS    r>++B/E,,, ..r;K:L.M\\ !"r   c                 |    |sg S g }|}||k7  r.| j                  |      }|s|rg S |j                  |       ||k7  r.|S rh   )r   r9   )r:   node_idr   rescur_node_ids        r   
get_walkupzCmfMenuTree.get_walkup   sU    
 I^+00=K>	JJ{# ^+ 
r   c                 &     | j                   |i |S rh   )r   )r:   argskwargss      r   r   zCmfMenuTree.public_get_tree   s     s||T,V,,r   nodeszmodels.CmfUiMenuNode
is_archivec                     t        t              }| D ]H  }|j                  dk(  |k7  rt        j	                  |j
                        }||   j                  |       J |S )Nrb   )r   r-   r%   r+   get_class_name_by_idr   r9   )r   r   
data_nodesr@   klasss        r   _aggregate_nodes_by_modelz%CmfMenuTree._aggregate_nodes_by_model   s`    
 !&
 	+D*z9009Eu$$T*		+ r   r   levelexpand_nodesc           	         |rd|vrt         j                  |      sy |it               }|r]|D ]X  }|r	|dk(  sd|vrt         j                  |      s%| j                  ||      }|j	                  |       |j                  |       Z | j                  |g||      |   }	g }
|	D ]  }|
j                  ||dz
  |f        |
r|
D cg c]  }|d   	 }}| j                  |      }| j                  |d      }i }|j                         D ]=  }|j	                  | j                  |D cg c]  }|j                   c}d	|             ? |j                         D ]=  }|j	                  | j                  |D cg c]  }|j                   c}d|             ? g }|
D ]  }|\  }}}|j                  |j                  g       }|j                  d
k(  r-||_        d|_        |D ]  }|j                  ||dz
  df        a|j                  sn|dkD  s|j                  |v s||_        |D ]  }|j                  ||dz
  |f         |}
|
r|	S c c}w c c}w c c}w )Nr   null:rW   rC   rM   r   T)r   Frb   )r+   rR   setr   updateaddr;   r9   r   valuesr   getr%   rq   rW   r!   )r:   r   r   r   
expand_allrW   rC   r   walkup
root_nodesstackr@   	node_datastack_nodesaggregate_nodesaggregate_nodes_archiveaggregate_nodes_childrensr   	new_stack	root_node	cur_levelcur_only_archivedchildrenchilds                           r   r   zCmfMenuTree.get_tree   s   
 N*73H3H3XJ+ 	,G"g&73g;M "009  ^^G^DF%%f-NN7+	, ]]N#3=[c]dest
 	;DLL$	=9:	; 9>?I9Q<?K?!;;KHO&)&C&CK\`&C&a#(*%(//1 )00MM-23T3&+!) "  1779 )00MM-23T3&*!) "  I" T	5>2i!2488"E==I-&.DO)-D&!) G!((%Q)EFG --9q=DGGzDY&.DO!) T!((%Q@Q)RSTT  EQ T S @ 4 4s   I(I8Ic                     |s|S |j                   s|j                  |       |S |j                  |       t        j                  |j                   |      }| j	                  |||      S )N)r   r'   )r   r9   r+   rR   _check_parents)r:   objresultr'   s       r   r   zCmfMenuTree._check_parents?  s`    M##MM#MMM#''3+=+=f'MC%%c66::r   c                     g }|s|S ddg}|D ]  }||vs|j                  |        t        j                  ||      }| j                  |||      }|S )u  
        Получить совокупный список из id родителей и самого объекта
        :param str id: id обекта, родителей которого нужно узнать
        :param fields: перечень полей, которые дудут присутствовать у объектов в результирующем списке

        :return: Список из id.
        r   r   r   )r9   r+   rR   r   )r:   r   r'   r   required_parametersir   s          r   r   zCmfMenuTree.get_parents_listK  so     M#%56$ 	!Aa 	! ##Bv#6##C8r   c                 r   d|v rd}|S | j                         }t        j                  |g d      }|syt               }|j                   |_        |j
                  |_        |j                   |_        |j                  j                  |_        |j                  j                  xs d|_	        d|j                  v r|j                  j                  |_        d|j                  v r|j                  j                  |_        d|j                  v r|j                  j                  |_        |j                   |_        |j                    |_        |j"                   |_        |j"                  r)t        j%                  |j"                        j&                  n|j&                  |_        |j(                  |_        d	|_        |j,                  |_        |j.                  |_        t1        |d
d      |_        t1        |d|j(                  j5                               |_        |r|j8                  |_        |S d|_        |S )u@   
        Получить CmfUiMenuNode для ноды
        r   N)r    r%   re   r!   r"   r   rE   rF   rG   r#   r0   r2   cmf_owner_idperm_effective_acl_idr$   r   r)   rE   rF   rG   Tre   Fr$   r*   )r   r+   rR   r.   r   r/   r0   r!   r1   r    rx   rE   ry   rF   rG   r2   r   r"   r,   r3   r4   r8   r   r   r5   re   r6   r7   r#   )r:   r   r@   r>   r?   s        r   r   zCmfMenuTree.get_node_  s   
 r>DH E  446M%%b 2k% lA  ?DDGllDO66(DI'('<'<'B'BD$99??5gDL$

2&'&;&;&A&A##qzz1&'&:&:&@&@#(AJJ6&'&?&?&E&E#66(DI%&%5%5$6D !}DNOP{{W44Q[[AKK`a`k`kDN99DL"DO !D)*)@)@D&!!Xu5DKa1BCDG&'&6&6#  '1#r   c           
         |D ]  }t         j                  j                  j                  |dg      }|s2|g}	 |}g }ddlm} |j                         D ]e  }|j                  dd|D 	cg c]  }	|	j                   c}	gdgd      }
||
D 	cg c]  }	|	j                   c}	v r|c c S |j                  |
       g |st        j                  d	t        |               y c c}	w c c}	w )
Nr   r   Tr   )CmfActiveEntityr   rO   )r&   r'   include_templatesz)Iter public_tree_menu_in_root to_process:)cmfincluder+   rR   common.models.cmf_active_entityr   iter_subclassesrT   r   extendr   debuglen)r:   r   r   root_node_tuuidr   children_newr   r   	model_clscchildrens_iters              r   r   zCmfMenuTree.tree_menu_in_root  s
     * 	YO++%%33OTF3SC5L'!K!0!@!@!B 8I &/__,d84LaQTT4L  !%v*. &5 &N "@A144"@@.. ''78 $CCDUCVWX+ 	Y:  5M #As   'C"C'
c                    t         j                  j                  |g d      }g }|D ]3  }t        j	                  |j
                        }t               }|j                   d|_        |j                  |_        |j                   d|_	        |j                  |_        |j                  |_        |j                  xs |j                  |_        |j                   |_        |j"                  |_        |j$                  |_        d |_        t)        |d|j$                  j+                               |_        |j.                  |_        d|_        |j3                  |       6 |S )N)	obj_id_idr   r    r$   )r   r'   r   r$   F)r   CmfMenuTreeItemr-   r+   r,   r   r.   r/   r   r0   menu_tree_node_is_branchr!   r    verbose_name_pluralverbose_namer2   r   r3   r4   r"   r5   r6   r7   r%   r8   r9   )r:   r   
menu_itemsretitemr<   r@   s          r   menu_item_listzCmfMenuTree.menu_item_list  s)   ++008r 1 t
 	D++DNN;E ?D))*&1DG#..DO ++,F3DI','E'ED$<<DL11GU5G5GDI"&"5"5D #__DN ==DL!DNdNEMM4G4G4IJDG!NNDM#DOJJt/	0 
r   c                 l   i }g }|D ]  }d|v rnt         j                  |      }t        |d      r|j                         }n| j	                  |      }|||<   | j                  |      }	||   j                  |	       u|j                  |        | j                  |||      }
|j                  |
       |S )Nr   menu_class_node_listr   )
r+   rR   rw   r   rA   r   r   r9   r^   r   )r:   rB   rW   rC   all_nodes_dataobj_nodes_idsr   r<   r   r   	obj_nodess              r   r;   zCmfMenuTree.node_list  s     - 	5N>)--n=5"89!668E//?E16~. //?
~.55jA$$^4	5 %%m=[c%d	i(r   c                    g }t         j                         D ]#  }t        |d      s|j                  |j                  |k(  s.t	               }|j
                   d|_        |j
                   d|_        |j
                  |_        |j                  |_	        |j                  |_        |j                  xs |j                  |_        |j                  |_        |j                   |_        |j"                  |_        d |_        |j"                  j'                          |_        d|_        |j-                  |       & |j/                  d        |S )Nr   r   Fc                     | j                   S rh   rn   ro   s    r   rj   z2CmfMenuTree.helper_subclass_list.<locals>.<lambda>  s
    AII r   rp   )r+   iter_modelsrw   r   r.   r/   r   r0   r   r!   menu_tree_ordernor    r   r   r2   r   r3   r4   r"   r6   r7   r8   r9   r|   )r:   r   r;   r<   r@   s        r   helper_subclass_listz CmfMenuTree.helper_subclass_list  s%   	((* 	'E%!6722>22nD$"--.f5$//07	"'"2"2+0+I+I($66!55K9K9K	&+&?&?# "'$}}!%"]]0023"'  &/	'0 	-.r   c                 @    t         j                  j                  d      S )NzCmfMenuTree:Class)r   r	   r   )r:   s    r   r   z CmfMenuTree.menu_class_node_list	  s    !!667JKKr   )FN)F)2   NNFN)(__name__
__module____qualname__r4   r3   code_prefixr   r   r   	CmfEntityapi_methodsstaticmethodr   classmethodrA   r   strOptionalr^   boolDictr   r.   rV   r   r   r   r   r   intr-   r   r   r   r   r   r   r;   r   r   r   r   r   r	   r	      s   GIK*L**&&22 6
 
K   ! !F 3&DI 3&V^_cdg_hVi 3& 3&j L,L=AL c7=+A&A!BCL 
$}%	&L L\ # #  " - -
  !*+ 
S00	1  HL?CG G),GAEG8<G GR 	;D 	; 	; T  & )] ) )V " "J  < OS"3iHL	c4.//	0 2  < L Lr   r	   N)typingr   r   r   collectionsr   cmf.includer   r   r   r	   r   r   r   <module>r      s+    - - # CL#**&& CLr   