
    Y~hX[                     ^    d dl mZmZmZ d dlT d dlmZ  G d dej        j	                  Z
dS )    )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 d	S )CmfMenuTreeMenuTreeevarootMNTu   Корень меню)get_parents_listpublic_get_treetree_menu_in_rootget_nodeget_treec                  h    t           j                                        j        t          j        v rdS dS )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259TTT4ur   c                    g }t                               |          }|                    dd|gg ddg          }|                                 }|D ]8}t	                      }|j         |_        |j        |_        |j         |_        |j        j	        |_        |j
        j	        pd|_
        |j         |_        |j        j	        |_        |j        j	        |_        |j        r$t                               |j                  j        n|j        |_        |j        |_        t!          |d|j                                                  |_        d|_        |j        |_        |r|j        |_        nd	|_        |                    |           :|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   s}   	''77::&6n%M C  C  CK    0022 	# 	#A ??DiDGlDO6DI'('<'BD$9?5gDL6DI"#"2"8D[.DNOP{kW44Q[AAKK`a`kDN9DLa1B1BCCDG"DOJDM 1&'&6##&0#T""""r   FNorder_byc           	         t                               |          }i }|-|D ]*                    d          rd|dd          <   %d|<   +|                    dd|gg dd |                                D             z   	          }|                                 }g }||j        |S d
 |j        D             |_        d t                                           D             }	|j        dk    ro|j	        dk    rdg }
|	D ]X}|j        dk    rg d}ng }dg dg dgdd|j
        gg}||g}|
                    |                    |dg d                     Y|
|_        |j        D ]}|j        dk    r|s|j        r|r|j        s|j        s*t                               |j                  }t#                      }|j         |_        |j        |_        |j        |_        |j         |_        t)          |d          r|j	        dk    r|j        |_        n|j        |_        |j        p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         |_        |j        r|j        j         nd |_         |j        r$t                               |j                  j!        n|j!        |_!        |j"        |_"        d|_#        tI          |dd           |_	        |j%        |_%        |j&        |_&        tI          |dd            |_'        tI          |d d            |_(        tI          |d!d"          |_)        tI          |d#|j"        *                                          |_+        tI          |d$d           |_,        ||_-        t)          |d%          r|r|j.        |_.        nd&|_.        |/                    |           |rFta          |1                                          D ]#\  }|2                    fd'|dk    (           $n|2                    d) *           |S )+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_curc                     g | ]}d | S )ztree_nodes.r   ).0sort_by_fields     r   
<listcomp>z-CmfMenuTree.obj_node_list.<locals>.<listcomp>Z   s!    ^^^}2=22^^^r   )r&   r'   c                 6    g | ]}|j         d k    r|j        |S )CmfReq)r/   cmf_ver_cur)rN   	tree_nodes     r   rP   z-CmfMenuTree.obj_node_list.<locals>.<listcomp>c   s<      B  B  BiyG[_gGgGgkt  lAGg	GgGgGgr   c                 <    g | ]}t          |t                    |S r   )
issubclassr   )rN   r<   s     r   rP   z-CmfMenuTree.obj_node_list.<locals>.<listcomp>e   s(    bbb:eU`CaCabubbbr   	CmfFolderarchiverR   )rS   r   TOR)cmf_archivedr   T)rL   r   Ttree_parentT)r    r%   	is_publicr$   systemhas_tree_nodesr!   r"   parentzparent.codetree_hiddenr#   perm_policy_anonymousperm_policy_guestlogic_prefixrZ   rL   )r&   include_archivedr'   r%   r)   rI   rJ   rK   	obj_modelCmfComponentu   ▣ ra   rb   r]   Fr$   rc   r#   r*   c                 &    t          | d           S N)r5   )xrO   s    r   <lambda>z+CmfMenuTree.obj_node_list.<locals>.<lambda>   s    WQt-L-L r   )keyreversec                     | j         S rh   r    ri   s    r   rj   z+CmfMenuTree.obj_node_list.<locals>.<lambda>   s    	 r   rk   )3r+   r,   
startswithsgetkeysr   rH   iter_modelsr/   r%   r   extendslistr`   rZ   rL   get_model_by_namer.   r   r0   hasattrr!   r    __dict__rI   children_countrJ   rK   re   r2   r"   r_   parent_coder3   r4   r8   r5   cmf_owner_idperm_effective_acl_idra   rb   r]   r6   r7   rc   only_archivedr#   r9   reverseditemssort)r:   r   r~   rB   r<   sort_by_fieldspr>   r;   node_modelsrH   
node_modelfilter_cmf_ver_curr&   r?   r@   	directionrO   s                    @r   obj_node_listzCmfMenuTree.obj_node_list;   s\   ''77 =?!) : : ++C00 :8>N=#45549N=11JJn-   _^H[H[H]H]^^^_    0022	9, B  B1<  B  B  Bbb'*=*=*?*?bbb<;&&1:+B+BJ) v v
(H44)D)D)D&&)+&!=!=!=?d?d?de($0@AC "45!!*"2"2&DH;t ;t ;t #3 #u #u v v v v &AL 5	# 5	#A}$$  Q^  q~ a>U --al;;E ??DiDG !DlDO6DIq*%% A!*	*A*A+,+B((+,+@(9/DL$
22&'&;##qz11&'&:#(AJ66&'&?#aj((!"6DI|~--+16OO	%3"5D !-DN56XG!(-114DOP{oW44Q[AAKK`e`oDN =DL"DO#Az488DM !D)*)@D&,3A7NPT,U,U)WD&(/3F(M(M%OD"!!Xu55DKa1D1D1F1FGGDG '>4 @ @D!.Dq*++ 1 1&'&6##&0#T""""  	3 -5^5I5I5K5K,L,L k k(y#L#L#L#LV_ciVijjjjk NN11N222r   c                     d|v r!t                               |          }|j        S t                               |dg          j        }|sd S | 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   s\    r>>++B//E,, ..r;K:L.MM\ 	4 ""r   c                     |sg S g }|}||k    r6|                      |          }|s|rg S |                    |           ||k    6|S rh   )r   r9   )r:   node_idr   rescur_node_ids        r   
get_walkupzCmfMenuTree.get_walkup   ss    
  	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   2   levelexpand_nodesreturnc                    |rd|vrt                               |          sdS |}t                      }|rm|D ]j}|r
|dk    sd|vrt                               |          s*|                     ||          }|                    |           |                    |           kg }	|                     |||          }
|	                    |
           |dz  }|
D ]s}|j        dk    r,| 	                    |j
        ||d|	          |_        d|_        9|j        r3|d
k    s	|j
        |v r$| 	                    |j
        ||||	          |_        t|	S )u  
        Получить дерево в развернутом виде

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

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

9
 	F 	FD}	))"%,,tw*dhs{,"|"|%)"") FuqyyDGz<Q<Q"%,,tw*dq  }E,  #F  #F
 
r   c                     |s|S |j         s|                    |           |S |                    |           t                              |j         |          }|                     |||          S )N)r   r'   )r   r9   r+   r   _check_parents)r:   objresultr'   s       r   r   zCmfMenuTree._check_parents  sv     	;M# 	;MM#MMM#''3+=f'MMC%%c66:::r   c                     g }|s|S ddg}|D ]}||vr|                     |           t                              ||          }|                     |||          }|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  s      	M#%56$ 	! 	!Aa   ##Bv#66##C88r   c                    d|v rt                               |          }d}n|                                 }t                               |g d          }|sdS t	                      }|j         |_        |j        |_        |j         |_        |j        j	        |_        |j
        j	        p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        n|j        |_        |j        |_        d	|_        |j        |_        |j        |_        t1          |d
d          |_        t1          |d|j                                                  |_        |r|j        |_        nd|_        |S )u@   
        Получить CmfUiMenuNode для ноды
        r   N)r    r%   r]   r!   r"   r   rI   rJ   rK   r#   r0   r2   r|   r}   r$   r   r)   rI   rJ   rK   Tr]   Fr$   r*   )r+   r,   r   r   r.   r   r/   r0   r!   r1   r    ry   rI   rz   rJ   rK   r2   r   r"   r3   r4   r8   r|   r}   r5   r]   r6   r7   r#   )r:   r   r<   r@   r>   r?   s         r   r   zCmfMenuTree.get_node(  s   
 r>>++B//EDD4466M%%b 2k 2k 2k% l lA  t ??DiDGlDO6DI'('<'BD$9?5gDL$
22&'&;&A##qz11&'&:&@#(AJ66&'&?&E#6DI%&%5"7D !-DNOP{kW44Q[AAKK`a`kDN9DL"DO !D)*)@D&!!Xu55DKa1B1BCCDG 1&'&6##&0#r   c           
         |D ]}t           j        j                            |dg          }|s,|g}	 |}g }ddlm} |                                D ]k}|                    ddt          d |D                       gdgd	          }	|t          d
 |	D                       v r|c c S |	                    |	           l|sn+t                              dt          |                      d S )Nr   r   Tr   )CmfActiveEntityr   INc                     g | ]	}|j         
S r   r   rN   cs     r   rP   z1CmfMenuTree.tree_menu_in_root.<locals>.<listcomp>j  s    ZrZrZrde[\[_ZrZrZrr   )r&   r'   include_templatesc                     g | ]	}|j         
S r   r   r   s     r   rP   z1CmfMenuTree.tree_menu_in_root.<locals>.<listcomp>l  s    'E'E'E'E'E'Er   z)Iter public_tree_menu_in_root to_process:)cmfincluder+   r   common.models.cmf_active_entityr   iter_subclassesrv   r-   ru   r   debuglen)
r:   r   
root_nodesroot_node_tuuidr   children_newchildrenr   	model_clschildrens_iters
             r   r   zCmfMenuTree.tree_menu_in_rootU  s]     * 	Y 	YO+%33OTF3SSC 5LY'!KKKKKK!0!@!@!B!B 8 8I &/__=MtUYZrZriqZrZrZrUsUs<t  C  ~D  X\_  &]  &]N$'E'En'E'E'E"F"FFF...... ''7777# WCDUDUWWXXXY tr   c                 b   t           j                            |g d          }g }|D ]}t                              |j                  }t                      }|j         d|_        |j        |_        |j         d|_	        |j
        |_        |j        |_        |j        p|j        |_        |j        |_        |j        |_        |j        |_        d |_        t)          |d|j                                                  |_        |j        |_        d|_        |                    |           |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_listu  s%   +008r8r8r 1 t t
 	 	D++DN;;E ??D)111DG#.DO +333DI','ED$<DL1GU5GDI"&"5D #_DN =DL!DNdNEM4G4G4I4IJJDG!NDM#DOJJt
r   c                 <   d|v rUt                               |          }t          |d          r|                                }n.|                     |          }n|                     |||          }|                     |          }|                    |           |S )Nr   menu_class_node_listr   )r+   r,   rx   r   rA   r   r   ru   )r:   r   r~   rB   r<   nodesr   s          r   r;   zCmfMenuTree.node_list  s    ~%%++N;;Eu455 <2244++N;;%%nM\d%eeE''77
Z   r   c                 F   g }t                                           D ]}t          |d          r|j        |j        |k    rt	                      }|j         d|_        |j         d|_        |j        |_        |j        |_	        |j
        |_        |j        p|j        |_        |j        |_        |j        |_        |j        |_        d |_        |j                                         |_        d|_        |                    |           |                    d            |S )Nr   r   Fc                     | j         S rh   rn   ro   s    r   rj   z2CmfMenuTree.helper_subclass_list.<locals>.<lambda>  s    AI r   rp   )r+   rt   rx   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7 '2>2nDD$"-555$/777	"'"2+0+I($6!5K9K	&+&?# "'$}!%"]00224"'  &&&--...r   c                 @    t           j                            d          S )NzCmfMenuTree:Class)r   r	   r   )r:   s    r   r   z CmfMenuTree.menu_class_node_list  s    !667JKKKr   )FN)r   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	      sq       GIK*L*&2 6
 6
 6
 
K   \   [@ | |$ | | | [|~ # # [#   [" - - [-
 ( (S (T (  CG (  S[  \`  Sa ( ( ( [(T 	;D 	; 	; 	; [	; T    [& *] * * * [*X   [>   [<  d    [    [< L L [L 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 3 3 3 3 3@L @L @L @L @L#*& @L @L @L @L @Lr   