U
    Za%i$                     @   s2   d dl Z d dlT d dlZG dd dejjjZdS )    N)*c                       s   e Zd Zejjjjd ZdddddddgZejjjj	d	d
g Z	d0ddZ
dd ZdddddZdd Zdd Z fddZed1eedddZ fdd Z fd!d"Zd#d$ Zd%d& Zd'd( Z fd)d*Zdd+ fd,d-
Zdd+ fd.d/
Z  ZS )2CmfTreeNode)tree_fieldstree_parent_idordernonameZsys_typehas_tree_nodesZtree_hiddenparentdelete_nodecopy_tree_nodeNc                 K   sL   |r| j jn| g}d| jkr |S | jj|dD ]}||j||d q.|S )uN   
        Список всех нод проекта
        :return:
        
tree_nodesfields)r   only_id)idvaluer   r   loadextendget_tree_nodes_recursive)selfr   r   _kwargsZ	node_listnode r    ./common/models/cmf_tree_node.pyr      s    
z$CmfTreeNode.get_tree_nodes_recursivec                 C   s   | j S N)r   r   r   r   r   has_tree_nodes_hook$   s    zCmfTreeNode.has_tree_nodes_hookFTforce	recursivec                O   s<   |  dddg | jr&| jjr&|   | jf ||d|S )Ntree_parentztree_parent.cmf_ownertree_parent.sl_owner_lockr   )load_fieldsr    sl_owner_lock _check_tree_parent_sl_owner_lockdelete)r   r   r   _argskwargsr   r   r   r
   '   s    zCmfTreeNode.delete_nodec                 C   s   | j sd| _ | jdd d S )NTZ	only_data)tree_node_is_branchsaver   r   r   r   tree_child_restore_hook-   s    z#CmfTreeNode.tree_child_restore_hookc                 C   sD   | j j}|r@t|tjtjfr"|S |j s8td|| |jjS d S )Nu@   У узла дерева отсутствует родитель)	r    r   
isinstancemodels
CmfProjectZCmfAssetSchemer	   r   ZCmfError)r   r    r   r   r   _node_parent2   s    
zCmfTreeNode._node_parentc              	      sX   t  j||}|dg |jjrT|jjsTd|j_t  |jjdd W 5 Q R X |S )Nztree_parent.tree_node_is_branchTr(   )	supercopyr"   r    Zis_not_nullr)   cmfutilZdisable_aclr*   r   argsr'   res	__class__r   r   r1   >   s    
zCmfTreeNode.copy
   Копия)src_tree_node_iddst_tree_node_idc              	   C   s   |  dd }tt| j| ddddddd	gd
}| dd }tt| j|ddddgd
}	|jj}
|rz|rz|
||}
| d|
 }
|	jdkr|	}n|	j}|j	|
d||	|	j
d}|r|jr|j D ]"}|j|jj|jj||||d q|S )u~   
        https://bcrm.carbonsoft.ru/project/Document/DOC-006119#spec-005912-b
        Копирование ноды
        :r   r)   r	   textzattachments.urlZtagszattachments.url_previewzattachments.url_preview_img)r   r   zparent.tree_node_is_branchprojectzproject.logic_prefix r.   T)r   Zcopy_allr	   r    r=   )r   name_startswithfind_to
replace_to)splitvarsr-   getr   r   replace
class_namer	   r1   r=   r)   r   r   r   r   )r9   r:   r   r?   r@   rA   Zsrc_model_nameZsrc_tree_nodeZdst_model_nameZdst_tree_nodenew_namer	   r   r   r   r   r   r   H   sF     
    
  
  zCmfTreeNode.copy_tree_nodec                    s   t   dg S )Nztree_parent.tree_sort_children)r0   save_preload_fieldsr   r6   r   r   rH   e   s    zCmfTreeNode.save_preload_fieldsc                    s   | j r| jrd S | jr| js(tddd dd| jgdd| jgg}t| jdd	| jg|gd
gd}|r| j| j|j|dd| _d S t| jdd| jg|gdgd}|r| j	| j|j|dd| _d S t
   d S )Nu   Не заполнено имя!Tabortr   z!=r    z==r   z<=z-name)filterZorder_byF)rK   Zreversz>=)is_newr   r    r   	cmf_alertr   typesgetZ
move_belowZ
move_abover0   _calc_orderno)r   Z_filterZmax_nameZmin_objr6   r   r   rP   h   s      zCmfTreeNode._calc_ordernoc                 C   sX   | j js| jjsd S | dddg | js4| js4d S | j rT| j jsTd| j _| j   d S )N!tree_parent.has_children_archivedcmf_archivedhas_children_archivedT)r    Z
is_changedrS   r"   rR   r*   r   r   r   r   _calc_has_children_archived   s    z'CmfTreeNode._calc_has_children_archivedc                 C   st   t jt jkrd S | jsd S | jj}t jj|krptj|dgd}tj| j	dgd}t
jjd|j d|j dd d S )Nr   r   uZ   Создавать/удалять здесь только владелец объекта u   . Свяжитесь с TrI   )gZcurrent_personZsystem_personr    cmf_owner_idZcurrent_userr   r2   Zget_obj_by_idr   ZcmfZincluderM   r   )r   rV   Z	cmf_ownerr    r   r   r   r$      s    z,CmfTreeNode._check_tree_parent_sl_owner_lockc                 C   sL   | j s
d S | jjrH| jdsH| ddg | jjrH|   | j rHd| _d S )Nz:Classr!   ztree_parent.cmf_owner_idT)rL   r   r   endswithr"   r    r#   r$   r   r   r   r   _calc_sl_owner_lock   s    zCmfTreeNode._calc_sl_owner_lockc                    s"   |    t j||}|   |S r   )rX   r0   r*   rT   r3   r6   r   r   r*      s    zCmfTreeNode.save)skip_tree_movec                   sn   t  j| f|d|i| | ddg | jrJ| jjsJd| j_| j  | jD ]}|j|ddi| qP| S )NrY   rQ   r   T)r0   archiver"   r    rS   r*   r   r   rY   r4   r'   childr6   r   r   rZ      s    

zCmfTreeNode.archivec                   sJ   t  j|d|i| | jdgdd | jD ]}|j|ddi| q,| S )NrY   r   T)Zinclude_archived)r0   archive_restorer"   r   r[   r6   r   r   r]      s
    
zCmfTreeNode.archive_restore)NN)Fr8   NN)__name__
__module____qualname__commonr   cmf_tree_noder   Zui_meta_skipr   Zapi_methodsr   r   r
   r+   r/   r1   staticmethodstrr   rH   rP   rT   r$   rX   r*   rZ   r]   __classcell__r   r   r6   r   r      s:   	



r   )ZurllibZcmf.includeZcommon.fields.cmf_tree_nodera   r   rb   r   r   r   r   r   <module>   s   