
    i']                     l    d dl mZmZmZ d dl d dlmZ  G d dej                  j                        Z
y)    )OptionalListLiteral)*)CmfTreeNodec                      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fd
       Zed        Zed        Zed        Zeddeded	ede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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   sv   	''7::&6n%M C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order_byc           	      
   t         j                  |      }i }|&|D ]!  j                  d      r	d|dd  <   d|<   # |j                  dd|gg d|j	                         D cg c]  }d| 	 c}z   	      }| j                         }g }	||j                  |	S |j                  D 
cg c]   }
|
j                  d
k(  r|
j                  s|
" 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 ]9  }|j"                  dk(  r|s|j$                  r#|r|j$                  s|j&                  s>t         j)                  |j                        }t+               }|j                   |_        |j$                  |_        |j                  |_        |j,                   |_        t/        |d      r!|j                  dk(  r|j&                  |_        n|j0                  |_        |j2                  xs d|_        d|j4                  v r|j6                  |_        d|j4                  v r|j:                  |_        d|j4                  v r|j<                  |_        d|j4                  v r|j>                  |_        |j@                   |_         |j                  dk(  rd|j@                   |_         | |_        |jB                   |_!        |jD                  r|jD                  j,                   nd |_#        |jB                  r)t         j                  |jB                        jH                  n|jH                  |_$        |jJ                  |_%        d|_&        tO        |dd       |_        |jP                  |_(        |jR                  |_)        tO        |dd        |_*        tO        |dd        |_+        tO        |d d!      |_,        tO        |d"|jJ                  j[                               |_.        tO        |d#d       |_/        ||_0        t/        |d$      r|r|jb                  |_1        nd%|_1        |	je                  |       < |r<tg        |ji                               D ]  \  }|	jk                  fd&|dk(  '         |	S |	jk                  d( )       |	S c c}w c c}
w c c}w )*N-desc   ascr   r   )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'   CmfReq	CmfFolderarchive)cmf_ver_curr   TOR)cmf_archivedr   T)rL   r   Ttree_parentz!=T)r    r%   	is_publicr$   systemhas_tree_nodesr!   r"   parentzparent.codetree_hiddenr#   perm_policy_anonymousperm_policy_guestlogic_prefixrR   rL   )r&   include_archivedr'   r%   r)   rI   rJ   rK   	obj_modelCmfComponentu   ▣ rY   rZ   rU   Fr$   r[   r#   r*   c                     t        | d       S N)r5   )xsort_by_fields    r   <lambda>z+CmfMenuTree.obj_node_list.<locals>.<lambda>   s    WQt-L r   )keyreversec                     | j                   S r`   r    ra   s    r   rc   z+CmfMenuTree.obj_node_list.<locals>.<lambda>   s
    		 r   rd   )6r+   r,   
startswithsgetkeysr   rH   r/   rP   iter_models
issubclassr   r%   r   r   slistextendrX   rR   rL   get_model_by_namer.   r0   hasattrr!   r    __dict__rI   children_countrJ   rK   r]   r2   r"   rW   parent_coder3   r4   r8   r5   cmf_owner_idperm_effective_acl_idrY   rZ   rU   r6   r7   r[   only_archivedr#   r9   reverseditemssort)r:   r   rx   rB   r<   sort_by_fieldsrb   pr>   r;   	tree_nodenode_modelsrH   
node_modelfilter_cmf_ver_curr&   r1   r?   r@   	directions         `             r   obj_node_listzCmfMenuTree.obj_node_list;   s   ''7 =?!) : ++C08>N=#4549N=1	: JJn- IWH[H[H]^}{=/2^_   002	9, 45<<  BiyG[G[_gGgkt  lA  lA	  B*1*=*=*?b:eU`Caubb<<;&1::+BJ)  )
((H4)D&)+& 4= &a.>.>?&add3	 4& !"45"((!%) ) 
 !!%(A )B &AL 5	#A}}$ Q^^q~~a>U>U--all;E ?DDG !DllDO66(DIq*%!**	*A+,+B+B(+,+@+@(99/DL$

2&'&;&;##qzz1&'&:&:#(AJJ6&'&?&?#ajj(!"66(DI||~-"166(O	%3$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"k5	#p  -5^5I5I5K,L k(y#LV_ciVijk  NN1N2a _ Bbs   %U+ UU.UUc                     d|v r!t         j                  |      }|j                  S t         j                  |dg      j                  }|sy | S )N:Classr   r'   )r+   r,   menu_tree_parent_idget_obj_by_idr   )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 r`   )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 r`   )r   )r:   argskwargss      r   r   zCmfMenuTree.public_get_tree   s     s||T,V,,r   levelexpand_nodesreturnc                 ~   |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 g }	| j                  |||      }
|	j                  |
       |dz  }|
D ]  }|j                  dk(  r-| j                  |j                  ||d|	      |_        d|_        ?|j                  sL|d
kD  s|j                  |v s`| j                  |j                  ||||	      |_         |	S )u  
        Получить дерево в развернутом виде

        :param tree_parent_id: Корневой элемент
        :param level: Уровень развернутости дерева, базовый уровень 1 и далее вложенные в него узлы
        :param expand_nodes: Список узлов которые раскрыты пользователем
        :param set expand_all: Весь список список узлов которые раскрыты пользователем от родителя до текущего узла

        :return: Список узлов раскрытых до определенного уровня и в соответствии с настройками пользователя
        r   Nnull:rx   rB   rF   rO   T)
expand_allrx   rB   r   )r+   r   setr   updateaddr;   rp   r%   r   r   rH   rx   r!   )r:   r   r   r   r   rx   rB   r   walkupr   r;   r@   s               r   r   zCmfMenuTree.get_tree   sK    !?H]H]^lHmJ+ 	,G"g&73g;M "009  ^^G^DF%%f-NN7+	, MM.X`Ma	

9
 	FD}}	)"%,,tww*dhs{,"|%)"))uqyDGGz<Q"%,,tww*dq  }E,  #F	F 
r   c                     |s|S |j                   s|j                  |       |S |j                  |       t        j                  |j                   |      }| j	                  |||      S )N)r   r'   )r   r9   r+   r   _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+   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                    d|v rt         j                  |      }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%   rU   r!   r"   r   rI   rJ   rK   r#   r0   r2   rv   rw   r$   r   r)   rI   rJ   rK   TrU   Fr$   r*   )r+   r,   r   r   r.   r   r/   r0   r!   r1   r    rs   rI   rt   rJ   rK   r2   r   r"   r3   r4   r8   rv   rw   r5   rU   r6   r7   r#   )r:   r   r<   r@   r>   r?   s         r   r   zCmfMenuTree.get_node:  s   
 r>++B/E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 ]w  }|j                  ddt        |D 	cg c]  }	|	j                   c}	      gdgd      }
|t        |
D 	cg c]  }	|	j                   c}	      v r|c c S |j                  |
       y |st        j                  d	t        |               y c c}	w c c}	w )
Nr   r   Tr   )CmfActiveEntityr   IN)r&   r'   include_templatesz)Iter public_tree_menu_in_root to_process:)cmfincluder+   r   common.models.cmf_active_entityr   iter_subclassesro   r-   r   rp   r   debuglen)r:   r   
root_nodesroot_node_tuuidr   children_newchildrenr   	model_clscchildrens_iters              r   r   zCmfMenuTree.tree_menu_in_rootg  s     * 	YO++%%33OTF3SC5L'!K!0!@!@!B 8I &/__=MtUYiqZrde[\[_[_ZrUs<t  C  ~D  X\_  &]N$n'E'E"FF.. ''78 $CCDUCVWX 	Y.  [s'Es   ,C4C9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                    d|v rDt         j                  |      }t        |d      r|j                         }n&| j	                  |      }n| j                  |||      }| j                  |      }|j                  |       |S )Nr   menu_class_node_listr   )r+   r,   rr   r   rA   r   r   rp   )r:   r   rx   rB   r<   nodesr   s          r   r;   zCmfMenuTree.node_list  s|    ~%++N;Eu45224++N;%%nM\d%eE''7
Z 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 r`   rg   rh   s    r   rc   z2CmfMenuTree.helper_subclass_list.<locals>.<lambda>  s
    AII r   ri   )r+   rm   rr   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)2   NNFN)!__name__
__module____qualname__r4   r3   code_prefixr   r   r   	CmfEntityapi_methodsstaticmethodr   classmethodrA   r-   r   r   r   r   intr   r   r   r   r   r.   r   r   r   r;   r   r   r   r   r   r	   r	      s   GIK*L**&&22 6
 
K    @ N$ N Nb # #  " - -
 (S (T (  CG (  S[  \`  Sa ( (T 	;D 	; 	; T  & *] * *X  >  < d     < L Lr   r	   N)typingr   r   r   cmf.includecommon.models.cmf_tree_noder   r   r   r   r	   r   r   r   <module>r      s+    * *  3RL#**&& RLr   