B
    YfHJ                 @   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jj	j
ddddd	g 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   Корень меню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	}|  }x|D ]}t }|j |_|j|_|j |_|jj	|_|j
j	p|d
|_
|j |_|jj	|_|jj	|_|jrt |jjn|j|_|j|_t|d|j |_d|_|j|_|r|j|_nd|_|| qBW |S )Ntree_parent_idz==ordernotree_node_is_branch	parent_idsharelink_hashui_view_formsys_type)filterfieldsZorderbyi@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   s4    









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ddgd}|  }g }|d ksd|jd krh|S x|jD ]}|jdkrqrt |j}t }|j	 |_	|j|_|j
 |_
|j|_|jpd|_d|jkr|j|_d|jkr|j|_d|jkr|j|_|j |_|jdkr d|j |_| |_|j |_|jrHt |jjn|j|_|j|_d|_t|dd |_|j|_|j|_t|dd  |_t|dd  |_t|dd|_t|d |j |_ t|d!d |_!t"|d"r|r|j#|_#nd#|_#|$| qrW |j%d$d% d& |S )'Nr   z==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_guestztree_nodes.logic_prefix)r   r   Ti@B ZCmfComponentu   ▣ r   perm_policy_anonymousperm_policy_guestsystemFr   logic_prefixr   r   c             S   s   | j S )N)r   )xr   r   r   <lambda>}       z+CmfMenuTree.obj_node_list.<locals>.<lambda>)key)&r   r   sgetr   r1   Ztree_hiddenZget_model_by_namer   r   r   r    r   r   __dict__r2   children_countr3   r4   r"   r   r   r#   r$   r(   r%   r   cmf_owner_idperm_effective_acl_idr5   r6   r7   r&   r'   r8   hasattrr   r)   sort)r*   r   r,   pr-   r+   r.   r/   r   r   r   obj_node_list;   sd    












zCmfMenuTree.obj_node_listc             C   s8   d|krt |}|jS t j|dgdj}|s2d S | S )Nz: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   sB   |sg S g }|}x,||kr<|  |}|s0|r0g S || qW |S )N)rH   r)   )r*   node_idr   resZcur_node_idr   r   r   
get_walkup   s    

zCmfMenuTree.get_walkupc             O   s   | j ||S )N)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rxt }|rxxJ|D ]B}|r2|dks2d|krLq2t |sXq2|| || || q2W g }| |}|| |d8 }xN|D ]F}|jr|dks|j	|kr|j
dkr|j	|krq| j|j	||d|_qW |S )	u  
        Получить дерево в развернутом виде

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

        :return: Список узлов раскрытых до определенного уровня и в соответствии с настройками пользователя
        z:ClassNZnull:   r   archive)
expand_all)r   rG   setupdaterK   addr+   extendr   r   r   r
   r1   )	r*   r   rO   rP   rU   rI   rJ   r+   r/   r   r   r   r
      s,    




zCmfMenuTree.get_tree)rQ   c             C   sH   |s|S |j s|| |S || tj|j |d}| |||S d S )N)r   r   )r   r)   r   rG   _check_parents)r*   objresultr   r   r   r   rZ      s    

zCmfMenuTree._check_parentsc             C   sT   g }|s|S ddg}x|D ]}||kr| | qW tj||d}| |||}|S )u  
        Получить совокупный список из id родителей и самого объекта
        :param str id: id обекта, родителей которого нужно узнать
        :param fields: перечень полей, которые дудут присутствовать у объектов в результирующем списке

        :return: Список из id.
        r   r   )r   )r)   r   rG   rZ   )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 для ноды
        z:ClassNr   r   r7   r   r   r   r2   r3   r4   r   r    r"   r@   rA   r   )r   i@B TFr   )r   r   r   rG   r   r   r   r    r   r!   r   r>   r2   r?   r3   r4   r"   r   r   r#   r$   r(   r@   rA   r%   r7   r&   r'   r   )r*   r   r,   r/   r-   r.   r   r   r   r	      sH    














zCmfMenuTree.get_nodec       
      C   s   x|D ]}t jjj|dgd}|s$q|g}x|}g }ddlm} xZ| D ]N}|jddtdd |D gdgd	d
}	|tdd |	D kr|S |	|	 qJW |sP t
dt|  q,W qW d S )Nr   )r   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`   ra   r   r   r   rb   1  s    z)Iter public_tree_menu_in_root to_process:)cmfZincluder   rG   Zcommon.models.cmf_active_entityr^   Ziter_subclassesZslistr   rY   r   debuglen)
r*   rI   Z
root_nodesZroot_node_tuuidr[   Zchildren_newZchildrenr^   Z	model_clsZchildrens_iterr   r   r   r     s$    
&zCmfMenuTree.tree_menu_in_rootc             C   s   t jj|ddddgd}g }x|D ]}t|j}t }|j d|_|j|_|j d|_	|j
|_|j|_|jpv|j|_|j|_|j|_|j|_d |_t|d|j |_|j|_d|_|| q"W |S )N	obj_id_idr   r   r   )r   r   z:ClassF)r   ZCmfMenuTreeItemr   r   r   rf   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,   r/   r   r   r   menu_item_list:  s*    
zCmfMenuTree.menu_item_listc             C   sT   d|kr2t |}t|dr&| }q<| |}n
| |}| |}|| |S )Nz:Classmenu_class_node_list)r   r   rB   rn   r0   rE   rm   rY   )r*   r   r,   Znodesrj   r   r   r   r+   Y  s    





zCmfMenuTree.node_listc             C   s   g }xt  D ]}t|dr|jd k	r|j|krt }|j d|_|j d|_|j|_|j|_	|j
|_|jpt|j|_|j|_|j|_|j|_d |_|j  |_d|_|| qW |jdd d |S )NrF   z:ClassFc             S   s   | j S )N)r   )r9   r   r   r   r:     r;   z2CmfMenuTree.helper_subclass_list.<locals>.<lambda>)r<   )r   Ziter_modelsrB   rF   r   r   r   r    rg   r   Zmenu_tree_ordernor   rh   ri   r"   r   r#   r$   r   r&   r'   r(   r)   rC   )r*   r   r+   r,   r/   r   r   r   helper_subclass_listj  s*    


z CmfMenuTree.helper_subclass_listc             C   s   t jdS )NzCmfMenuTree:Class)r   r   ro   )r*   r   r   r   rn     s    z CmfMenuTree.menu_class_node_list)rN   NN)!__name__
__module____qualname__r$   r#   Zcode_prefixri   rc   r   	CmfEntityZapi_methodsstaticmethodr   classmethodr0   rE   rH   rK   r   intr   r   r
   r   rZ   r   r   r	   r   rm   r+   ro   rn   r   r   r   r   r      s:   !F
), r   N)typingr   r   Zcmf.includerc   r   rs   r   r   r   r   r   <module>   s   