
    #Xia                         d dl mZmZmZ d dlmZ d dl d dlmZ d dl	m
Z
  G d dej                  j                        Zy)	    )ListLiteralDefaultDict)defaultdict)*)simple_timeit)CmfTreeNodec                   F   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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           	      ^   t         j                  |d         }i }i }|&|D ]!  }|j                  d      r	d||dd  <   d||<   # |j                  dd|gg d|j	                         D cg c]  }d	| 	 c}z   
      }|D ]$  }	| j                  |	||      }
|
||	j                  <   & |S c c}w )Nr   -desc   ascr   IN)r"   
tree_nodesz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.parentztree_nodes.parent.codez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.perm_policy_anonymousztree_nodes.perm_policy_guestztree_nodes.logic_prefixr'   r    ztree_nodes.cmf_archivedz tree_nodes.has_children_archivedhas_children_archivedztree_nodes.obj_modelztree_nodes.cmf_ver_curztree_nodes.)r(   r)   )r-   get_obj_by_id
startswithslistkeys_build_nodesr   )r<   rD   only_archivedrE   r>   parent_nodes_childrenssort_by_fieldssort_by_fieldparent_nodesparent_noder=   s              r   obj_node_listzCmfMenuTree.obj_node_listB   s    %%oa&89!#<>!) : ++C08>N=#4549N=1	: {{$0 IWH[H[H]^}{=/2^_ # " ( 	?K((m^TI5>";>>2	? &% _s   )B*r[   zmodels.BaseModelrV   rX   )rJ   rH   returnc                 	   | j                         }g }||j                  y |j                  D cg c]  }|j                  dk(  r|j                  r|! c}|_        t        j                         D cg c]  }t        |t              s| }}|j                  dk(  r|j                  dk(  rg }	|D ]y  }
|
j                  dk(  rg d}ng }dg dg dgddd	|j                  gdd	|j                  ggd
d|j                  gg}||g}|
j                  |dg d      }|	j                  |       { |	|_        |j                  D ]O  }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|j0                  |_        d|j.                  v r|j4                  |_        d|j.                  v r|j6                  |_        d|j.                  v r|j8                  |_        |j:                   |_        |j                  dk(  rd|j:                   |_        |j                   |_	        |j<                   |_        |j>                  r|j>                  j&                   nd |_         |j<                  r)t        jC                  |j<                        jD                  n|jD                  |_"        |jF                  |_#        d|_$        tK        |dd       |_        |jL                  |_&        |jN                  |_'        tK        |dd        |_(        tK        |dd        |_)        tK        |dd      |_*        tK        |d|jF                  jW                               |_,        tK        |dd       |_-        ||_.        t)        |d      r|r|j^                  |_/        nd|_/        |ja                  |       R |r<tc        |je                               D ]  \  }|jg                  fd|d k(  !         |S |jg                  d" #       |S c c}w c c}w )$NCmfReq	CmfFolderarchive)cmf_ver_curr!   TOR)cmf_archivedr!   T)rP   r!   Ttree_parentr!   r   z!=T)r"   r'   	is_publicr&   systemhas_tree_nodesr#   r$   parentzparent.codetree_hiddenr%   perm_policy_anonymousperm_policy_guestlogic_prefixrd   rP   )r(   include_archivedr)   r'   r+   rM   rN   rO   	obj_modelCmfComponentu   ▣ rk   rl   rg   Fr&   rm   r%   r,   c                     t        | d       S N)r7   )xrY   s    r   <lambda>z*CmfMenuTree._build_nodes.<locals>.<lambda>   s    WQt-L r   rH   )keyreversec                     | j                   S rr   r"   rs   s    r   rt   z*CmfMenuTree._build_nodes.<locals>.<lambda>   s
    		 r   ru   )4r   rL   r1   rb   r-   iter_models
issubclassr	   r'   r    r   rS   extendanyrj   rd   rP   get_model_by_namer0   r2   hasattrr#   r"   __dict__rM   children_countrN   rO   ro   r4   r$   ri   parent_coder.   r5   r6   r:   r7   cmf_owner_idperm_effective_acl_idrk   rl   rg   r8   r9   rm   rV   r%   r;   reverseditemssort)r<   r[   rV   rX   r@   r=   	tree_noder>   node_modelsrL   
node_modelfilter_cmf_ver_curr(   r3   rA   rB   	directionrY   s                    @r   rU   zCmfMenuTree._build_nodesf   s   
 002	+"8"8"@ (3'='="
#YEYEY]eEe$$ "

 +2*=*=*?b:eU`Caubb!![0[5I5IY5VJ)  )
((H4)D&)+& !8A !*D+2L2LM*D+..A	 t[^^4 !"45"((%)-  ) 
 !!%(A )B &0K"'' 6	#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 !}DN56XX!((--4DOP{{W44Q[[AKK`e`o`oDN ==DL"DO#Az48DM !D)*)@)@D&,3A7NPT,U+VD&(/3F(M'ND"!!Xu5DKa1D1D1FGDG '>4 @D!.Dq*+&'&6&6#&0#T"m6	#r  -5^5I5I5K,L k(y#LV_ciVijk  NN1N2Y"

 cs   $S&3S+	S+c                     d|v r!t         j                  |      }|j                  S t         j                  |dg      j                  }|sy | S )N:Classr    r)   )r-   r.   menu_tree_parent_idrQ   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 rr   )r   r;   )r<   node_idr    rescur_node_ids        r   
get_walkupzCmfMenuTree.get_walkup   sU    
 I^+00=K>	JJ{# ^+ 
r   c                 &     | j                   |i |S rr   )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 )Nra   )r   r/   r'   r-   get_class_name_by_idr   r;   )r   r   
data_nodesrB   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:rV   rE   rI   r   T)r   Fra   )r-   rQ   setr   updateaddr=   r;   r   valuesr   getr'   rL   rV   r#   )r<   r    r   r   
expand_allrV   rE   r   walkup
root_nodesstackrB   	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  ES V U @ 4 4s   I(I8Ic                     |s|S |j                   s|j                  |       |S |j                  |       t        j                  |j                   |      }| j	                  |||      S )N)r   r)   )r    r;   r-   rQ   _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   )r;   r-   rQ   r   )r<   r   r)   r   required_parametersir   s          r   r   zCmfMenuTree.get_parents_listh  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'   rg   r#   r$   r    rM   rN   rO   r%   r2   r4   r   r   r&   r   r+   rM   rN   rO   Trg   Fr&   r,   )r   r-   rQ   r0   r   r1   r2   r#   r3   r"   r   rM   r   rN   rO   r4   r    r$   r.   r5   r6   r:   r   r   r7   rg   r8   r9   r%   )r<   r   rB   r@   rA   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    rK   )r(   r)   include_templatesz)Iter public_tree_menu_in_root to_process:)cmfincluder-   rQ   common.models.cmf_active_entityr   iter_subclassesrS   r   r}   r   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   r0   r1   r   r2   menu_tree_node_is_branchr#   r"   verbose_name_pluralverbose_namer4   r    r5   r6   r$   r7   r8   r9   r'   r:   r;   )r<   r    
menu_itemsretitemr>   rB   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-   rQ   r   r   rC   r   r}   r;   r\   r   )r<   rD   rV   rE   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 rr   rx   ry   s    r   rt   z2CmfMenuTree.helper_subclass_list.<locals>.<lambda>"  s
    AII r   rz   )r-   r{   r   r   r0   r1   r   r2   r   r#   menu_tree_ordernor"   r   r   r4   r    r5   r6   r$   r8   r9   r:   r;   r   )r<   r    r=   r>   rB   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__r6   r5   code_prefixr   r   r   	CmfEntityapi_methodsstaticmethodr   classmethodrC   r   strOptionalr\   boolDictr   r0   rU   r   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 !&DI !&V^_cdg_hVi !& !&F w,w=Aw c7=+A&A!BCw 
$}%	&w wr # #  " - -
  !*+ 
S00	1  HL?CH H),HAEH8<H  HT 	;D 	; 	; T  & )] ) )V " "J  < OS"3iHL	c4.//	0 2  < L Lr   r   N)typingr   r   r   collectionsr   cmf.includecmf.cmf_profiler   common.models.cmf_tree_noder	   r   r   r   r   r   r   r   <module>r      s1    - - #  ) 3^L#**&& ^Lr   