U
    r;ds                     @   sZ   d dl Z d dlmZ d dlZd dlT d dlZd dlmZ d dl	m
Z
 G dd de
jZdS )    N)chain)*)	BaseModel)cmf_public_mixinc                       s   e Zd ZdddddddgZe fdd	Zed
d Zedd Ze fddZedd Z	ed fdd	Z
 fddZ fddZ  ZS )CmfPublicMixintree_parent_idZordernonameZsys_typeZhas_tree_nodesZtree_hiddenparentc                    sB   t  j||}tjr>|jtjjkr>td| dtj  d S |S )NuX   В public_get share api попытались запросить чужой объект z != )supergetgZsharelink_access_requestidZsharelink_access_objdebug)clsargskwargsobj	__class__ #./common/models/cmf_public_mixin.py
public_get   s    
zCmfPublicMixin.public_getc                 O   s   | j ||S N)Zget_approved_versionr   r   r   r   r   r   public_get_approved_version.   s    z*CmfPublicMixin.public_get_approved_versionc                 O   s   | j ||S r   )Zget_metar   r   r   r   public_get_meta3   s    zCmfPublicMixin.public_get_metac                    s   t t|  }dd |D S )Nc                 S   s   g | ]}t |tr|qS r   )
issubclassr   ).0modelr   r   r   
<listcomp>:   s     
 z3CmfPublicMixin._get_node_models.<locals>.<listcomp>)r
   r   _get_node_models)r   Z_modelsr   r   r   r    7   s    zCmfPublicMixin._get_node_modelsc                 O   sR  dddgdd|gg}t  }ddddg}tt|dd	  j||d
}|sNg S |}g }	|r|	|jj tt	|j
jts|q|j
jsq|j
j}|| |	dd |jjD 7 }	qVt|dr|	dd |jjD 7 }	ddd|	gdd|	ggdddgg}
|  D ]4}|j}||}|r$|| |
g||< q|
||< q| jf |dd|}| ||jS )u]   
        Прогружаем дерево снизу вверх от обьекта
        	is_public==Tr   tree_parentztree_parent.is_public
tree_nodes:r   )filterfieldsc                 S   s   g | ]}t |d r|jjqS r$   hasattrr   valuer   Znoder   r   r   r   S   s     
 z6CmfPublicMixin.get_public_obj_tree.<locals>.<listcomp>c                 S   s   g | ]}t |d r|jjqS r(   r)   r,   r   r   r   r   V   s     
 ORr   IN)filtersZfilter_project)dictvarsZmodelssplitr   appendr   r+   r   typer#   r   r!   Zload_fieldsr$   r*   r    
class_nameZ_get_tree_dataZ_create_tree)r   Zobj_idr   r   Z
obj_filterr/   r'   r   r	   Z
parents_idZparent_filterr   
model_nameZmodel_filterZ	tree_datar   r   r   get_public_obj_tree<   s<     



z"CmfPublicMixin.get_public_obj_treeprojectc                    sX   t  }|  D ].}|j}ddd|gdd|ggdddgg||< qt j||fd|i|S )uj   
        Строим одну ветвь
        Для подгрузки вниз дерева
        r-   r   r"   r   r!   Tr/   )r0   r    r5   r
   Zget_tree_leaf)r   r   Zproject_typer   r/   r   r6   r   r   r   get_public_tree_leafd   s    
z#CmfPublicMixin.get_public_tree_leafc                    s   t   dg S )Nr!   )r
   save_preload_fields)selfr   r   r   r:      s    z"CmfPublicMixin.save_preload_fieldsc                    sV   t t| j|| | j s$| jjrRtd}|s<i }i t_|| j	j
}d|d< dS )uR   
        Отправляем событие в публичный апи
        	emit_listNZroom)r
   r   emitr!   loadoldr   r   r<   r   r+   )r;   r   r   r<   Zbodyr   r   r   r=      s    
zCmfPublicMixin.emit)r8   )__name__
__module____qualname__Ztree_fieldsclassmethodr   r   r   r    r7   r9   r:   r=   __classcell__r   r   r   r   r      s,   



'0r   )Zbisect	itertoolsr   ZhashlibZcmf.includeZ
cmf.fieldsZcmfZ
cmf.modelsr   Zcommon.fieldsr   r   r   r   r   r   <module>   s   