U
    #-d                     @   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                    sF   t  j||}tjrB|jtjjkrBtd| dtj  td|S )NuX   В public_get share api попытались запросить чужой объект z != u8   Нет прав public_get (ошибка доступа))supergetgZsharelink_access_requestidZsharelink_access_objdebug	Exception)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_meta2   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>9   s     
 z3CmfPublicMixin._get_node_models.<locals>.<listcomp>)r
   r   _get_node_models)r   Z_modelsr   r   r   r!   6   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    R   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    U   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_filterr0   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"   Tr0   )r1   r!   r6   r
   Zget_tree_leaf)r   r   Zproject_typer   r0   r   r7   r   r   r   get_public_tree_leafc   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)r9   )__name__
__module____qualname__Ztree_fieldsclassmethodr   r   r   r!   r8   r:   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   