U
    #mhX[                     @   s@   d dl mZ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Literal)*)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.edddZedd Zedd Zedd Zed/e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d0edd(d)Zed*d+ Zed,d- Z dS )1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_listFN)order_byc                    s  t |}i }|d k	rD|D ](  dr:d| dd  < qd| < q|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!d"gd#d$ | D  d%}|  }g }|d ks|jd kr|S d&d$ |jD |_d'd$ t  D }	|jd(kr|j	d)krg }
|	D ]}|jd*kr$d+dd,g}ng }d-d.dd,gd dd,ggd/d|j
gg}||g}|
|j|d,ddd0d1d2d3d4dd5d6d7d8d9d:d;d.d gd< q|
|_|jD ]}|jd,krq|s|jrĐqn|r|js|jsސqt |j}t }|j |_|j|_|j|_|j |_t|dr6|j	d)kr6|j|_n|j|_|jpHd=|_d|jkr`|j|_d|jkrt|j|_d|jkr|j|_d>|jkr|j|_|j |_|jd?krd@|j |_| |_
|j |_|jr|jj nd |_ |jr t |jj!n|j!|_!|j"|_"d,|_#t$|dd |_	|j%|_%|j&|_&t$|d9d  |_'t$|d:d  |_(t$|d2dA|_)t$|d1|j"* |_+t$|d;d |_,||_-t|d8r|r|j.|_.ndB|_.|/| q|rt0|1 D ]$\ }|j2 fdCdD|dkdE qn|j2dFdD dG |S )HN-Zdesc   Z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                 S   s   g | ]}d | qS )ztree_nodes.r   ).0sort_by_fieldr   r   r   
<listcomp>Z   s     z-CmfMenuTree.obj_node_list.<locals>.<listcomp>)r   r   c                 S   s    g | ]}|j d kr|jr|qS )CmfReq)r#   cmf_ver_cur)r=   Z	tree_noder   r   r   r?   c   s     
  c                 S   s   g | ]}t |tr|qS r   )
issubclassr   )r=   r0   r   r   r   r?   e   s     
 Z	CmfFolderarchiver@   rA   TORcmf_archivedZ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   t |  d S N)r)   xr>   r   r   <lambda>       z+CmfMenuTree.obj_node_list.<locals>.<lambda>)keyreversec                 S   s   | j S rM   r   rN   r   r   r   rQ      rR   rS   )3r   r    
startswithsgetkeysr   r8   iter_modelsr#   r   r   extendslistrH   rE   r<   Zget_model_by_namer"   r   r$   hasattrr   r   __dict__r9   children_countr:   r;   rL   r&   r   rG   Zparent_coder'   r(   r,   r)   cmf_owner_idperm_effective_acl_idrI   rJ   rF   r*   r+   rK   only_archivedr   r-   reverseditemssort)r.   r   rb   r5   r0   Zsort_by_fieldspr1   r/   Znode_modelsr8   Z
node_modelZfilter_cmf_ver_curr   r2   r3   	directionr   rP   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   r0   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 rM   )rm   r-   )r.   node_idr   resZcur_node_idr   r   r   
get_walkup   s    
zCmfMenuTree.get_walkupc                 O   s   | j ||S rM   )r   )r.   argskwargsr   r   r   r	      s    zCmfMenuTree.public_get_tree2   )levelexpand_nodesr5   returnc                 C   s  |rd|krt |sdS |dkrxt }|rx|D ]F}|r0|dks0d|krJq0t |sVq0| ||}|| || q0g }	| j|||d}
|	|
 |d8 }|
D ]^}|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: Список узлов раскрытых до определенного уровня и в соответствии с настройками пользователя
        ri   NZnull:rb   r5   r7   rC   T)
expand_allrb   r5   r   )r   rl   setrp   updateaddr/   r[   r   r   r   r8   rb   r   )r.   r   rt   ru   ry   rb   r5   rn   Zwalkupro   r/   r3   r   r   r   r      s0    



zCmfMenuTree.get_tree)rv   c                 C   sH   |s|S |j s|| |S || tj|j |d}| |||S d S )N)r   r   )r   r-   r   rl   _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   rj   )r-   r   rl   r}   )r.   r   r   r   ZREQUIRED_PARAMETERSir~   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 для ноды
        ri   Nr   r   rF   r   r   r   r9   r:   r;   r   r$   r&   r`   ra   r   rj   r   TFr   )r   r    r   rl   r"   r   r#   r$   r   r%   r   r^   r9   r_   r:   r;   r&   r   r   r'   r(   r,   r`   ra   r)   rF   r*   r+   r   )r.   r   r0   r3   r1   r2   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   rj   r   )CmfActiveEntityr   INc                 S   s   g | ]
}|j qS r   r   r=   cr   r   r   r?   j  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   r?   l  s     z)Iter public_tree_menu_in_root to_process:)cmfZincluder   rl   Zcommon.models.cmf_active_entityr   Ziter_subclassesr\   r!   r[   r   debuglen)
r.   rn   Z
root_nodesZroot_node_tuuidr~   Zchildren_newZchildrenr   Z	model_clsZchildrens_iterr   r   r   r
   U  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   ri   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itemr0   r3   r   r   r   menu_item_listu  s,    
zCmfMenuTree.menu_item_listc                 C   sZ   d|kr2t |}t|dr&| }qB| |}n| j|||d}| |}|| |S )Nri   menu_class_node_listrx   )r   r    r]   r   r4   rh   r   r[   )r.   r   rb   r5   r0   Znodesr   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|_|j|_	|j
|_|jpr|j|_|j|_|j|_|j|_d |_|j  |_d|_|| q|jdd d |S )Nrk   ri   Fc                 S   s   | j S rM   rU   rN   r   r   r   rQ     rR   z2CmfMenuTree.helper_subclass_list.<locals>.<lambda>rV   )r   rZ   r]   rk   r"   r#   r   r$   r   r   Zmenu_tree_ordernor   r   r   r&   r   r'   r(   r   r*   r+   r,   r-   re   )r.   r   r/   r0   r3   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)FN)rs   NNFN)FN)!__name__
__module____qualname__r(   r'   Zcode_prefixr   r   r   	CmfEntityZapi_methodsstaticmethodr   classmethodr4   r!   rh   rm   rp   r	   intr   r   r   r}   r   r"   r   r
   r   r/   r   r   r   r   r   r   r      sR   

 
	

*,


r   N)typingr   r   r   Zcmf.includeZcommon.models.cmf_tree_noder   r   r   r   r   r   r   r   r   <module>   s   