U
    Vc
                     @   s:   d dl Z d dlmZ d dlT d dlmZ G dd dZdS )    N)chain)*)CmfTreeNodec                   @   sz   e Zd ZdZedd ZedddZedd Zedd
dZ	edddZ
edddZedddZedd ZdS )CmfTreeRootuD    Базовый класс для корней деревьев
    c                 O   s   t d S NNotImplementedError)clsargskwargs r    ./common/models/cmf_tree_root.py_get_tree_data   s    zCmfTreeRoot._get_tree_dataNc                 C   s   t d S r   r   )r	   	tree_datatree_parent_idr   r   r   _get_tree_root   s    zCmfTreeRoot._get_tree_rootc                 C   s&   d| j kr"| jjs"g | j_g | j_d S )N
tree_nodes)Zfieldsr   Z
is_defined_value_order)noder   r   r   
_init_node   s    zCmfTreeRoot._init_nodeprojectc                 K   s"   | j f d|i|}| j||dS )u2   
        Строим одну ветвь
        project_type)r   r   _create_tree)r	   r   r   r   r   r   r   r   get_tree_leaf   s    zCmfTreeRoot.get_tree_leafc                 K   s   t dS )uJ   
        Обратное получение дерева по id
        Nr   )r	   Z	obj_modelZ
obj_filterfiltersr   r   r   r   get_obj_tree"   s    zCmfTreeRoot.get_obj_treec                 K   s   | j f d|i|}| |S )uf   
        Строим дерево проектов
        :param focus_id:
        :return:
        r   r   )r	   r   r   r   r   r   r   get_full_tree*   s    zCmfTreeRoot.get_full_treec           
      C   s   dd t | D }| D ]}| | t|tjr<q |jsDq |jrLq |	|jj
}|sntd|  q | | d|_| |_|jj}|jj}|jj
pd}t||}	||	| ||	| q | ||S )Nc                 S   s   i | ]}|j j|qS r   )idvalue).0ir   r   r   
<dictcomp>6   s      z,CmfTreeRoot._create_tree.<locals>.<dictcomp>u(   Нет родителя для узла Tr   )r   from_iterablevaluesr   
isinstanceZmodelsZ
CmfProjectr   Ztree_hiddengetr    printZhas_tree_nodesZhas_tree_nodes_hookr   r   r   ordernobisectinsertr   )
r	   r   r   Z
node_by_idr   parentr   r   r)   idxr   r   r   r   4   s.    


zCmfTreeRoot._create_treec                 C   s   dd t  D S )Nc                 S   s   g | ]}t |tr|qS r   )
issubclassr   )r!   Zmodelr   r   r   
<listcomp>Y   s     
 z0CmfTreeRoot._get_node_models.<locals>.<listcomp>)ZcmfutilZiter_models)r	   r   r   r   _get_node_modelsW   s    zCmfTreeRoot._get_node_models)N)r   )N)r   )N)__name__
__module____qualname____doc__classmethodr   r   staticmethodr   r   r   r   r   r0   r   r   r   r   r      s"   

	"r   )r*   	itertoolsr   Zcmf.includeZcommon.models.cmf_tree_noder   r   r   r   r   r   <module>   s   