U
    ĮwhS                     @   s<   d dl mZmZ d dlT d dlmZ G dd dejjZ	dS )    )OptionalList)*)CmfTreeNodec                   @   s  e Zd ZdZdZdZdZejj	j
ddddd	g Z
ed
d Zedd Zed-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'd(Zed)d* Zed+d, Z dS )0CmfMenuTreeZMenuTreeZevarootZMNTu   Корень менюget_parents_listpublic_get_treetree_menu_in_rootget_nodeget_treec                   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dgdgd	}|  }|D ]}t }|j |_|j|_|j |_|jj	|_|j
j	pzd
|_
|j |_|jj	|_|jj	|_|jrt |jjn|j|_|j|_t|d|j |_d|_|j|_|r|j|_nd|_|| q@|S )Ntree_parent_id==ordernotree_node_is_branch	parent_idsharelink_hashui_view_formsys_type)filterfieldsZorderby@B 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modelZobj_listadd_sharelinkvnoder   r   r   class_node_list   s6    







zCmfMenuTree.class_node_listFc                 C   sD  t |}|jdd|gddddddd	d
dddddddddddddddddddgd}|  }g }|d ksr|jd krv|S dd  t  D }|jd!kr
|jd"kr
g }|D ]Z}	||	j	d#d$dd%gddd%ggd&d|j
ggd%ddd'd(d)d*d+dd,d-d.d/d0d1d2d$dgd3 q||_|jD ]}
|
jd%kr&q|s:|
jr:qn|rT|
jsT|
jsTqt |
j}t }|
j |_|
j|_|
j|_|
j |_t|
dr|
jd"kr|j|_n|
j|_|
jpd4|_d|
jkr|
j|_d|
jkr|
j|_d|
jkr|
j|_d5|
jkr|
j|_|
j |_|
jd6kr6d7|
j |_| |_
|
j |_|
jrZ|
jj nd |_|
jrvt |
jjn|j|_|j |_ d%|_!t"|
dd |_|
j#|_#|
j$|_$t"|
d0d  |_%t"|
d1d  |_&t"|
d)d8|_'t"|
d(|j ( |_)t"|
d2d |_*||_+t|
d/r|r|
j,|_,nd9|_,|-| q|j.d:d; d< |S )=Nr   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_model)r   r   c                 S   s   g | ]}t |tr|qS r   )
issubclassr   ).0r/   r   r   r   
<listcomp>W   s     
 z-CmfMenuTree.obj_node_list.<locals>.<listcomp>Z	CmfFolderarchiveORcmf_archivedTZtree_parentZ	is_publicr   systemZhas_tree_nodesr   parentzparent.codetree_hiddenr   perm_policy_anonymousperm_policy_guestlogic_prefix)r   Zinclude_archivedr   r   	obj_modelZCmfComponentu   ▣ Fr   c                 S   s   | j S Nr   xr   r   r   <lambda>       z+CmfMenuTree.obj_node_list.<locals>.<lambda>key)/r   r   sgetr   r4   iter_modelsr"   r   extendslistr   rA   r>   r8   Zget_model_by_namer!   r   r#   hasattrr   r   __dict__r5   children_countr6   r7   rE   r%   r   r@   Zparent_coder&   r'   r+   r(   cmf_owner_idperm_effective_acl_idrB   rC   r?   r)   r*   rD   only_archivedr   r,   sort)r-   r   rW   r/   pr0   r.   Znode_modelsr4   Z
node_modelr1   r2   r   r   r   obj_node_list;   s    
                  
          






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_get   s    
zCmfMenuTree.tree_parent_id_getc                 C   s>   |sg S g }|}||kr:|  |}|s.|r.g S || q|S rF   )r_   r,   )r-   node_idr   resZcur_node_idr   r   r   
get_walkup   s    
zCmfMenuTree.get_walkupc                 O   s   | j ||S rF   )r   )r-   argskwargsr   r   r   r      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 }| j||d}|| |d8 }|D ]Z}	|	jdkr| j	|	j
||dd	|	_d|	_q|	jr|d
ks|	j
|kr| j	|	j
|||d	|	_q|S )u  
        Получить дерево в развернутом виде

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

        :return: Список узлов раскрытых до определенного уровня и в соответствии с настройками пользователя
        r[   NZnull:rW      r<   T)
expand_allrW   r   )r   r^   setupdaterb   addr.   rP   r   r   r   r4   rW   r   )
r-   r   rf   rg   rl   rW   r`   ra   r.   r2   r   r   r   r      s.    


zCmfMenuTree.get_tree)rh   c                 C   sH   |s|S |j s|| |S || tj|j |d}| |||S d S )N)r   r   )r   r,   r   r^   _check_parents)r-   objresultr   r   r   r   rp      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   r\   )r,   r   r^   rp   )r-   r   r   rr   ZREQUIRED_PARAMETERSirq   r   r   r   r      s    	zCmfMenuTree.get_parents_listc                 C   s`  d|krt |}d}nB|  }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	pd|_
d	|jkr|jj	|_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|j |_|rV|j|_nd|_|S )u@   
        Получить CmfUiMenuNode для ноды
        r[   Nr   r   r?   r   r   r   r5   r6   r7   r   r#   r%   rU   rV   r   r\   r   TFr   )r   r   r   r^   r!   r   r"   r#   r   r$   r   rS   r5   rT   r6   r7   r%   r   r   r&   r'   r+   rU   rV   r(   r?   r)   r*   r   )r-   r   r/   r2   r0   r1   r   r   r   r
     s`    
           












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   r\   r   )CmfActiveEntityr   INc                 S   s   g | ]
}|j qS r   r   r:   cr   r   r   r;   M  s     z1CmfMenuTree.tree_menu_in_root.<locals>.<listcomp>T)r   r   Zinclude_templatesc                 S   s   g | ]
}|j qS r   rv   rw   r   r   r   r;   O  s     z)Iter public_tree_menu_in_root to_process:)cmfZincluder   r^   Zcommon.models.cmf_active_entityrt   Ziter_subclassesrQ   r    rP   r   debuglen)
r-   r`   Z
root_nodesZroot_node_tuuidrq   Zchildren_newZchildrenrt   Z	model_clsZchildrens_iterr   r   r   r	   8  s"    &zCmfMenuTree.tree_menu_in_rootc                 C   s   t jj|ddddgd}g }|D ]}t|j}t }|j d|_|j|_|j d|_	|j
|_|j|_|jpt|j|_|j|_|j|_|j|_d |_t|d|j |_|j|_d|_|| q |S )N	obj_id_idr   r   r   )r   r   r[   F)r   ZCmfMenuTreeItemr    r   r   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,   )r-   r   
menu_itemsretitemr/   r2   r   r   r   menu_item_listX  s,    
zCmfMenuTree.menu_item_listc                 C   sX   d|kr2t |}t|dr&| }q@| |}n| j||d}| |}|| |S )Nr[   menu_class_node_listrj   )r   r   rR   r   r3   rZ   r   rP   )r-   r   rW   r/   Znodesr   r   r   r   r.   w  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|_|j|_	|j
|_|jpr|j|_|j|_|j|_|j|_d |_|j  |_d|_|| q|jdd d |S )Nr]   r[   Fc                 S   s   | j S rF   rG   rH   r   r   r   rJ     rK   z2CmfMenuTree.helper_subclass_list.<locals>.<lambda>rL   )r   rO   rR   r]   r!   r"   r   r#   r}   r   Zmenu_tree_ordernor   r~   r   r%   r   r&   r'   r   r)   r*   r+   r,   rX   )r-   r   r.   r/   r2   r   r   r   helper_subclass_list  s.    
z CmfMenuTree.helper_subclass_listc                 C   s   t jdS )NzCmfMenuTree:Class)r   r   r   )r-   r   r   r   r     s    z CmfMenuTree.menu_class_node_list)F)re   NNF)F)!__name__
__module____qualname__r'   r&   Zcode_prefixr   ry   r   	CmfEntityZapi_methodsstaticmethodr   classmethodr3   rZ   r_   rb   r   intr    r   r   r   rp   r   r!   r
   r	   r   r.   r   r   r   r   r   r   r      sR   

 b
	

*,


r   N)
typingr   r   Zcmf.includeZcommon.models.cmf_tree_noder   ry   r   r   r   r   r   r   r   <module>   s   