B
    bEfs                 @   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 )N)Zget_meta)r   r   r   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_models)r   r   r   r   7   s    zCmfPublicMixin._get_node_modelsc             O   sZ  dddgdd|gg}t  }ddddg}tt|dd	  j||d
}|sNg S |}g }	x\|r|	|jj tt	|j
jts~P |j
jsP |j
j}|| |	dd |jjD 7 }	qXW t|dr|	dd |jjD 7 }	ddd|	gdd|	ggdddgg}
x@|  D ]4}|j}||}|r*|| |
g||< q|
||< qW | jf |dd|}| ||jS )u]   
        Прогружаем дерево снизу вверх от обьекта
        	is_publicz==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   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   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                s\   t  }x:|  D ].}|j}ddd|gdd|ggdddgg||< qW t j||fd|i|S )uj   
        Строим одну ветвь
        Для подгрузки вниз дерева
        r'   r   z==r   r   Tr)   )r*   r   r/   r
   Zget_tree_leaf)r   r   Zproject_typer   r)   r   r0   )r   r   r   get_public_tree_leafd   s    z#CmfPublicMixin.get_public_tree_leafc                s   t   dg S )Nr   )r
   save_preload_fields)self)r   r   r   r4      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   r6   r   r%   )r5   r   r   r6   Zbody)r   r   r   r7      s    
zCmfPublicMixin.emit)r2   )__name__
__module____qualname__Ztree_fieldsclassmethodr   r   r   r   r1   r3   r4   r7   __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   