U
    Vc?                     @   s,   d dl mZ d dlT G dd dejjZdS )    )Optional)*c                   @   s   e Zd ZdZdZdZdZedd Ze	dd Z
e	d	d
 Ze	dd Ze	dd Ze	dd Ze	d#eeee dddZe	edddZe	dd Ze	dd Ze	dd Ze	dd  Ze	d!d" ZdS )$CmfMenuTreeZMenuTreeZevarootZMNTu   Корень менюc                   C   s   t j jtjkrdS dS )NTF)modelsZCmfPersonGroupZsharelink_groupidgZcurrent_person__member_of r   r    ./common/models/cmf_menu_tree.py_allow_add_sharelink   s    z CmfMenuTree._allow_add_sharelinkc                 C   s   g }t |}|jdd|gdddddgdgd}|  }|D ]}t }|j |_|j |_|j|_|j |_|j	j
|_	|jj
pd|_|j |_|jj
|_|jj
|_|jrt |jjn|j|_|j|_d	|_d
|_|r|j|_nd|_|| q<|S )Ntree_parent_id==ordernotree_node_is_branch	parent_idsharelink_hash)filterfieldsZorderby@B TFNOACCESS)cmfutilget_model_by_idlistr
   CmfUiMenuNoder   node_id
class_namecoder   valuer   namer   r   	ui_moduleui_name
allow_move	is_publicr   append)clsr   	node_listmodelZobj_listadd_sharelinkvnoder   r   r	   class_node_list   s6    








zCmfMenuTree.class_node_listc                 C   s  t |}|jdd|gddddddd	d
dddddddddgd}|  }g }|d ks^|jd krb|S |jD ]t}|jdkrzqht |j}|jst	d|j
 ddd t }|j |_|j |_|j|_|j |_|j|_|jpd|_d|jkr|j|_d|jkr|j|_|j
 |_
| |_|j |_|jr:t |jjn|j|_|j|_d|_|j|_|j|_t|dd  |_t|dd  |_t|dd  |_t|dd  |_ t|dd|_!t|d d  |_"|r|j#|_#nd!|_#|$| qh|j%d"d# d$ |S )%Nr   r   r   
tree_nodesztree_nodes.ordernoztree_nodes.is_publicztree_nodes.sys_typeztree_nodes.systemztree_nodes.has_tree_nodesztree_nodes.tree_node_is_branchr   ztree_nodes.parent_idztree_nodes.list_typeztree_nodes.tree_hiddencache_members_countcache_select_countztree_nodes.sharelink_hashz tree_nodes.perm_policy_anonymousztree_nodes.perm_policy_guest)r   r   Tz3ERROR! obj_node_list, if not v.menu_tree_show_obj: z. Goto nikolay1)abortr   perm_policy_anonymousperm_policy_guestr!   sys_typesystemF	list_typer   c                 S   s   | j S Nr   xr   r   r	   <lambda>p       z+CmfMenuTree.obj_node_list.<locals>.<lambda>key)&r   r   sgetr
   r*   Ztree_hiddenZget_model_by_namer   Zmenu_tree_show_objZ	cmf_alertr   r   r   r   r   r   r   __dict__r+   children_countr,   r   r   r   r   r    cmf_owner_idperm_effective_acl_idgetattrr.   r/   r!   r0   r1   	view_moder   r"   sort)r#   r   r%   pr&   r$   r'   r(   r   r   r	   obj_node_list2   sz    
           







zCmfMenuTree.obj_node_listc                 C   s0   d|krt |}|jS t j|dgdj}| S )N:Classr   r   )r   r   menu_tree_parent_idget_obj_by_idr   )r#   r   r%   r   r   r   r	   tree_parent_id_gett   s
    
zCmfMenuTree.tree_parent_id_getc                 C   s6   g }|}||kr2|  |}|| |s|rg S q|S r3   )rI   r"   )r#   r   r   resZcur_node_idr   r   r	   
get_walkup|   s    

zCmfMenuTree.get_walkupc                 O   s   | j ||S r3   )get_tree)r#   argskwargsr   r   r	   public_get_tree   s    zCmfMenuTree.public_get_tree2   N)levelexpand_nodesreturnc           	      C   s   |rd|krt |sdS |dkrbt }|rb|D ]0}t |sD dS || || || q0g }| |}|| |d8 }|D ]F}|jr|dks|j	|kr|j
dkr|j	|krq| j|j	||d|_q|S )u  
        Получить дерево в развернутом виде

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

        :return: Список узлов раскрытых до определенного уровня и в соответствии с настройками пользователя
        rE   N   r   archive)
expand_all)r   rH   setupdaterK   addr$   extendr   r   r0   rL   r*   )	r#   r   rQ   rR   rV   r   rJ   r$   r(   r   r   r	   rL      s(    


zCmfMenuTree.get_tree)rS   c                 C   s`  d|krt |}d}nB|  }t j|ddddddd	d
ddddddgd}|sTdS t }|j |_|j |_|j|_|j |_|j	j
|_	|jj
pd|_d
|jkr|jj
|_d|jkr|jj
|_|j |_|j |_|j |_|jrt |jjn|j|_|j|_d|_|j|_|j|_t|dd |_t|dd|_t|d	d |_|rV|j|_nd|_|S )u@   
        Получить CmfUiMenuNode для ноды
        rE   Nr   r0   r1   r   r   r   r2   r+   r,   r   r   r   r>   r?   rF   r   TFr   )r   r   r
   rH   r   r   r   r   r   r   r   r   r<   r+   r=   r,   r   r   r   r   r   r    r>   r?   r@   r0   r1   rA   r   )r#   r   r%   r(   r&   r'   r   r   r	   get_node   s^    
          











zCmfMenuTree.get_nodec           
      C   s   |D ]}t jjj|dgd}|g}|}g }ddlm} | D ]V}|jddtdd |D gdgd	d
}	|tdd |	D kr|    S |	|	 q>|sqt
dt|  q"qd S )Nr   rF   r   )CmfActiveEntityr   INc                 S   s   g | ]
}|j qS r   r   .0cr   r   r	   
<listcomp>   s     z1CmfMenuTree.tree_menu_in_root.<locals>.<listcomp>T)r   r   Zinclude_templatesc                 S   s   g | ]
}|j qS r   r^   r_   r   r   r	   rb      s     z)Iter public_tree_menu_in_root to_process:)cmfZincluder   rH   Zcommon.models.cmf_active_entityr\   Ziter_subclassesZslistr   rZ   r   debuglen)
r#   r   Z
root_nodesZroot_node_tuuidobjZchildren_newZchildrenr\   Z	model_clsZchildrens_iterr   r   r	   tree_menu_in_root   s    &zCmfMenuTree.tree_menu_in_rootc                 C   s   t jj|dgd}g }|D ]}t|j}t }|j d|_|j d|_	|j|_|j d|_
|j|_|j|_|jp||j|_|j|_|j|_|j|_d |_d |_d |_d |_d|_d|_|| q|S )N	obj_id_id)r   r   rE   F)r   ZCmfMenuTreeItemr   r   r   rh   r   r   r   r   r   menu_tree_node_is_branchr   r   verbose_name_pluralverbose_namer   r   r   r   r   r0   r!   rA   r    r"   )r#   r   
menu_itemsretitemr%   r(   r   r   r	   menu_item_list   s.    zCmfMenuTree.menu_item_listc                 C   sT   d|kr2t |}t|dr&| }q<| |}n
| |}| |}|| |S )NrE   menu_class_node_list)r   r   hasattrrp   r)   rD   ro   rZ   )r#   r   r%   Znodesrl   r   r   r	   r$     s    





zCmfMenuTree.node_listc                 C   s   g }t  D ]}t|dr|jd k	r|j|krt }|j d|_|j d|_|j d|_|j|_|j	|_
|j|_|jp|j|_|j|_|j|_|j|_d |_d |_d |_d |_d|_d|_|| q|jdd d |S )NrG   rE   Fc                 S   s   | j S r3   r4   r5   r   r   r	   r7   K  r8   z2CmfMenuTree.helper_subclass_list.<locals>.<lambda>r9   )r   Ziter_modelsrq   rG   r   r   r   r   r   ri   r   Zmenu_tree_ordernor   rj   rk   r   r   r   r   r   r0   r!   rA   r    r"   rB   )r#   r   r$   r%   r(   r   r   r	   helper_subclass_list/  s6    
z CmfMenuTree.helper_subclass_listc                 C   s   t jdS )NzCmfMenuTree:Class)r   r   rr   )r#   r   r   r	   rp   O  s    z CmfMenuTree.menu_class_node_list)rP   NN)__name__
__module____qualname__r   r   Zcode_prefixrk   staticmethodr
   classmethodr)   rD   rI   rK   rO   intr   r   rL   r   r[   rg   ro   r$   rr   rp   r   r   r   r	   r      s<   


A


%-



r   N)typingr   Zcmf.includerc   r   Z	CmfEntityr   r   r   r   r	   <module>   s   