B
    Ef
                 @   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 )N)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
        N)r   )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
   r   get_full_tree*   s    zCmfTreeRoot.get_full_treec       
      C   s   dd t | D }x| D ]}| | t|tjr>q"|jsFq"|jrNq"|	|jj
}|sptd|  q"| | d|_| |_|jj}|jj}|jj
pd}t||}	||	| ||	| q"W | ||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   r-   r
   r
   r
   r   r      s   	"r   )r'   	itertoolsr   Zcmf.includeZcommon.models.cmf_tree_noder   r   r
   r
   r
   r   <module>   s   