U
    9=wc0G                     @   s0   d dl mZmZ d dlT G dd dejjZdS )    )OptionalList)*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	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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|_t|d|j|_d
|_d|_|r|j|_nd|_|| q>|S )Ntree_parent_id==ordernotree_node_is_branch	parent_idsharelink_hashui_view_form)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getattrvf
allow_move	is_publicr   append)clsr   	node_listmodelZobj_listadd_sharelinkvnoder	   r	   r
   class_node_list   s8    








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dgd}|  }g }|d ks`|jd krd|S |jD ]X}|jdkr|qjt |j}t }|j	 |_
|j	 |_	|j|_|j |_|j|_|jpd|_d|jkr|j|_d|jkr|j|_d|jkr|j|_|j |_| |_|j |_|jr0t |jjn|j|_|j|_d|_|j|_|j|_t|dd  |_t|dd  |_t|dd  |_t|dd|_t|d|j|_ |r|j!|_!nd|_!|"| qj|j#dd  d! |S )"Nr   r   r   
tree_nodesztree_nodes.ordernoztree_nodes.sys_typez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.parent_idztree_nodes.tree_hiddencache_members_countcache_select_countcache_child_tasks_countztree_nodes.sharelink_hashz tree_nodes.perm_policy_anonymousztree_nodes.perm_policy_guest)r   r   Tr   perm_policy_anonymousperm_policy_guestr%   systemFr   r   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   r   r   r   r   r   r   __dict__r/   children_countr0   r1   r   r   r   r    r!   r$   cmf_owner_idperm_effective_acl_idr"   r2   r3   r%   r4   r#   r   r&   sort)r'   r   r)   pr*   r(   r+   r,   r	   r	   r
   obj_node_list3   sz    
            









zCmfMenuTree.obj_node_listc                 C   s8   d|krt |}|jS t j|dgdj}|s2d S | 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   s>   |sg S g }|}||kr:|  |}|s.|r.g S || q|S r5   )rI   r&   )r'   r   r   resZcur_node_idr	   r	   r
   
get_walkup~   s    
zCmfMenuTree.get_walkupc                 O   s   | j ||S r5   )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rtt }|rt|D ]B}|r0|dks0d|krJq0t |sVq0|| || || 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   NZnull:   r   archive)
expand_all)r   rH   setupdaterK   addr(   extendr   r   sys_typerL   r.   )	r'   r   rQ   rR   rW   r   rJ   r(   r,   r	   r	   r
   rL      s,    


zCmfMenuTree.get_tree)rS   c                 C   sH   |s|S |j s|| |S || tj|j |d}| |||S d S )N)r   r   )r   r&   r   rH   _check_parents)r'   objresultr   r	   r	   r
   r]      s    

zCmfMenuTree._check_parentsc                 C   sP   g }|s|S ddg}|D ]}||kr| | qtj||d}| |||}|S )u  
        Получить совокупный список из id родителей и самого объекта
        :param str id: id обекта, родителей которого нужно узнать
        :param fields: перечень полей, которые дудут присутствовать у объектов в результирующем списке

        :return: Список из id.
        r   r   rF   )r&   r   rH   r]   )r'   r   r   r_   ZREQUIRED_PARAMETERSir^   r	   r	   r
   get_parents_list   s    	zCmfMenuTree.get_parents_listc                 C   sh  d|krt |}d}nJ|  }t j|ddddddd	d
dddddddgd}|sVdS t }|j |_|j |_|j|_|j |_|j	j
|_	|jj
pd|_d	|jkr|jj
|_d
|jkr|jj
|_d|jkr|jj
|_|j |_|j |_|j |_|jr
t |jjn|j|_|j|_d|_|j|_|j|_t|dd|_t|d|j|_|r^|j|_nd|_|S )u@   
        Получить CmfUiMenuNode для ноды
        rE   Nr   r\   r4   r   r   r   r/   r0   r1   r   r   r   r@   rA   r   rF   r   TFr   )r   r   r   rH   r   r   r   r   r   r   r   r   r>   r/   r?   r0   r1   r   r   r   r    r!   r$   r@   rA   r"   r4   r#   r   )r'   r   r)   r,   r*   r+   r	   r	   r
   get_node   sb    
           













zCmfMenuTree.get_nodec           
      C   s   |D ]}t jjj|dgd}|s"q|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 |	|	 qD|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	   re   rf   r	   r	   r
   ri   $  s     z)Iter public_tree_menu_in_root to_process:)cmfZincluder   rH   Zcommon.models.cmf_active_entityrc   Ziter_subclassesZslistr   r[   r   debuglen)
r'   r   Z
root_nodesZroot_node_tuuidr^   Zchildren_newZchildrenrc   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 |_|j |_d|_d|_|| q|S )N	obj_id_id)r   r   rE   F)r   ZCmfMenuTreeItemr   r   r   rn   r   r   r   r   r   menu_tree_node_is_branchr   r   verbose_name_pluralverbose_namer   r   r    r!   r   r%   r#   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   hasattrrv   r-   rD   ru   r[   )r'   r   r)   Znodesrr   r	   r	   r
   r(   J  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 |_|j |_d|_d|_|| q|jdd d |S )NrG   rE   Fc                 S   s   | j S r5   r6   r7   r	   r	   r
   r9   v  r:   z2CmfMenuTree.helper_subclass_list.<locals>.<lambda>r;   )r   Ziter_modelsrw   rG   r   r   r   r   r   ro   r   Zmenu_tree_ordernor   rp   rq   r   r   r    r!   r   r%   r#   r$   r&   rB   )r'   r   r(   r)   r,   r	   r	   r
   helper_subclass_list[  s4    

z CmfMenuTree.helper_subclass_listc                 C   s   t jdS )NzCmfMenuTree:Class)r   r   rx   )r'   r	   r	   r
   rv   z  s    z CmfMenuTree.menu_class_node_list)rP   NN)__name__
__module____qualname__r!   r    Zcode_prefixrq   staticmethodr   classmethodr-   rD   rI   rK   rO   intr   r   rL   r   r]   ra   r   rb   rm   ru   r(   rx   rv   r	   r	   r	   r
   r      sD   


@
	

),



r   N)typingr   r   Zcmf.includerj   r   Z	CmfEntityr   r	   r	   r	   r
   <module>   s   