
    Bji                     x    d dl mZmZmZ d dlmZ d dl d dlmZ  G d de	j                  j                        Zy)    )ListLiteralDefaultDict)defaultdict)*)CmfTreeNodec                   6   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   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           	         t         j                  |d         }g d}i }i }|&|D ]!  }|j                  d      r	d||dd  <   d||<   # |rg dg dg}	t        |d	      r|	j	                  g d
       |j                  d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.project_id
project_idcmf_owner_idztree_nodes.cmf_owner_idz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_archivedz tree_nodes.perm_effective_acl_idperm_effective_acl_idhas_children_archivedztree_nodes.obj_modelztree_nodes.cmf_ver_curperm_parent_idztree_nodes.perm_parent_idperm_parent_owner_idztree_nodes.perm_parent_owner_id%perm_security_level_allowed_ids_cachez0tree_nodes.perm_security_level_allowed_ids_cacheperm_inherit_acl_idztree_nodes.perm_inherit_acl_id-desc   asc)rK   r    T)rL   r    Tr&   )r&   r    archiver   INORztree_nodes.T)r'   r(   include_archived)r'   r(   )	r,   get_obj_by_id
startswithhasattrr:   slistkeys_build_nodesr   )r;   rC   only_archivedrD   r=   query_fieldsparent_nodes_childrenssort_by_fieldssort_by_fieldor_branchesparent_nodesparent_noder<   s                r   obj_node_listzCmfMenuTree.obj_node_listA   s   %%oa&89
" "$<>!) : ++C08>N=#4549N=1	:  8@K uj)""#@A ;;41(K( $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   D?>Erh   zmodels.BaseModelra   rd   )rV   rT   returnc                 	   | j                         }g }|j                  dk(  r|j                  dk(  rg }t        j	                         D cg c]  }t        |t              s| }}|D ]  }	dg dg dgddd|j                  gdd|j                  ggdd	|j                  gg}
|	j                  d
k(  r|
j                  g d       |	j                  |
dg d      }|j                  |        ||_        |j                  D cg c]  }|j                  d
k(  r|j                  r|! c}|_        |j                  D ]T  }t        |j                  | xr |j                   |xr |j                    xr |j"                   f      rJt        j%                  |j                        }t'               }|j                   |_        |j                   |_        |j                  |_        |j(                   |_        |j*                  |_        |j,                  |_        |j.                  |_        |j0                  |_        |j2                  |_        |j6                  |_        |j8                  |_        t;        |d      r!|j                  dk(  r|j"                  |_        n|j<                  |_        |j>                  xs d|_        d|j@                  v r|jB                  |_"        d|j@                  v r|jF                  |_"        d|j@                  v r|jH                  |_"        d|j@                  v r|jJ                  |_%        |jL                   |_&        |j                  dk(  rd|jL                   |_&        |j                   |_        |jN                   |_'        |jN                  r)t        jQ                  |jN                        jR                  n|jR                  |_)        |jT                  |_*        d|_+        tY        |dd       |_        tY        |dd      |_-        tY        |d|jT                  j]                               |_/        tY        |dd       |_0        ||_1        t;        |d      r|r|jd                  |_2        nd|_2        |j                  |       W |r<tg        |ji                               D ]  \  }|jk                  fd|dk(           |S |jk                  d  !       |S c c}w c c}w )"N	CmfFolderrW   rY   )cmf_archivedr    T)rN   r    Ttree_parentr    r   z!=CmfReq)cmf_ver_curr    TT)r!   r&   	is_publicr%   systemhas_tree_nodesr"   r#   tree_hiddenr$   logic_prefixrm   rN   )r'   rZ   r(   r&   r*   rH   rI   rJ   	obj_modelCmfComponentu   ▣ rr   Fr%   ru   r$   r+   c                     t        | d       S N)r6   )xre   s    r   <lambda>z*CmfMenuTree._build_nodes.<locals>.<lambda>   s    WQt-L r   rT   )keyreversec                     | j                   S ry   r!   rz   s    r   r{   z*CmfMenuTree._build_nodes.<locals>.<lambda>   s
    		 r   r|   )6r   r0   r&   r,   iter_models
issubclassr   r   r   r:   r^   extend
tree_nodesrp   anyrt   rm   rN   get_model_by_namer/   r1   rM   rF   rG   rR   rO   parm_parent_idrP   rQ   r]   r"   r!   __dict__rH   children_countrI   rJ   rv   r3   r#   r-   r4   r5   r9   r6   rr   r7   r8   ru   ra   r$   reverseditemssort)r;   rh   ra   rd   r?   r<   r   r=   node_models
node_modelarch_filterr2   	tree_noder@   rA   	directionre   s                   @r   r`   zCmfMenuTree._build_nodes   su   
 002	
 !![0[5I5IY5VJ.5.A.A.CfUzRWYdGe5fKf) )
 79^_M41K1KL}^bdodrdrNst40
 ((H4&&'BC"((&%) ) 
 !!%()), &0K" (3'='="
#YEYEY]eEe$$ "

 '' :	#A""5q~~Uq~~#5Ua>U>U:U 
 --all;E ?DDG !DllDO66(DI *+)@)@D&llDO !D'('<'<D$"#"2"2D()(>(>D%9:9`9`D6 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"u:	#z  -5^5I5I5K,L k(y#LV_ciVijk
  NN1N2K g4"
s   
S$ 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_idr[   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 ry   )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 ry   )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 )NrW   )r   r.   r&   r,   get_class_name_by_idr   r:   )r   r   
data_nodesrA   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:ra   rD   rU   r   T)r   FrW   )r,   r[   setr   updateaddr<   r:   r   valuesr   getr&   r   ra   r"   )r;   r   r   r   
expand_allra   rD   r   walkup
root_nodesstackrA   	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   r:   r,   r[   _check_parents)r;   objresultr(   s       r   r   zCmfMenuTree._check_parentsu  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,   r[   r   )r;   r   r(   r   required_parametersir   s          r   r   zCmfMenuTree.get_parents_list  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&   rr   r"   r#   r   rH   rI   rJ   r$   r1   r3   rG   rM   r%   r   r*   rH   rI   rJ   Trr   Fr%   r+   )r   r,   r[   r/   r   r0   r1   r"   r2   r!   r   rH   r   rI   rJ   r3   r   r#   r-   r4   r5   r9   rG   rM   r6   rr   r7   r8   r$   )r;   r   rA   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   rX   )r'   r(   include_templatesz)Iter public_tree_menu_in_root to_process:)cmfincluder,   r[   common.models.cmf_active_entityr   iter_subclassesr^   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   r/   r0   r   r1   menu_tree_node_is_branchr"   r!   verbose_name_pluralverbose_namer3   r   r4   r5   r#   r6   r7   r8   r&   r9   r:   )r;   r   
menu_itemsretitemr=   rA   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,   r[   r]   r   rB   r   r   r:   ri   r   )r;   rC   ra   rD   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 ry   r   r   s    r   r{   z2CmfMenuTree.helper_subclass_list.<locals>.<lambda>;  s
    AII r   r   )r,   r   r]   r   r/   r0   r   r1   r   r"   menu_tree_ordernor!   r   r   r3   r   r4   r5   r#   r7   r8   r9   r:   r   )r;   r   r<   r=   rA   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__r5   r4   code_prefixr   r   r   	CmfEntityapi_methodsstaticmethodr   classmethodrB   r   strOptionalri   boolDictr   r/   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 C&DI C&V^_cdg_hVi C& C&J q,q=Aq c7=+A&A!BCq 
m	q qf # #  " - -
  !*+ 
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.includecommon.models.cmf_tree_noder   r   r   r   r
   r   r   r   <module>r      s.    - - #  3xL#**&& xLr   