
    Bi)-                     p    d dl Z d dl d dlZ G d dej                  j
                  j                        Zy)    N)*c                       e Zd Zej                  j
                  j                  j                  dz   Zg dZej                  j
                  j                  j                  ddgz   Z	ddZ
d Zddd	d
Zd Zd Z fdZed dedefd       Z fdZ fdZd Ze eddd      d!defd              Zd Zd Zd Z fdZdd fd
Zdd fd
Z xZS )"CmfTreeNode)tree_fields)tree_parent_idordernonamesys_typehas_tree_nodestree_hiddenparentdelete_nodecopy_tree_nodec                     |r| j                   j                  n| g}d| j                  vr|S | j                  j	                  |      D ]$  }|j                  |j                  ||             & |S )uN   
        Список всех нод проекта
        :return:
        
tree_nodesfields)r   only_id)idvaluer   r   loadextendget_tree_nodes_recursive)selfr   r   _kwargs	node_listnodes          ./common/models/cmf_tree_node.pyr   z$CmfTreeNode.get_tree_nodes_recursive   sr    
 '.TWW]]48	t{{*OO(((7 	\DT::&RY:Z[	\    c                     | j                   S )N)r   r   s    r   has_tree_nodes_hookzCmfTreeNode.has_tree_nodes_hook$   s    """r   FTforce	recursivec                    | j                  g d       | j                  r&| j                  j                  r| j                           | j                  d||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kwargss        r   r   zCmfTreeNode.delete_node'   sO    ^_ 0 0 > >113t{{F)FvFFr   c                 P    | j                   sd| _         | j                  d       y y )NT	only_data)tree_node_is_branchsaver!   s    r   tree_child_restore_hookz#CmfTreeNode.tree_child_restore_hook-   s&    '''+D$III% (r   c                    | j                   j                  }|rit        |t        j                  t        j
                  f      r|S |j                  j                         st        d||       |j                  j                  S y )Nu@   У узла дерева отсутствует родитель)	r'   r   
isinstancemodels
CmfProjectCmfAssetSchemer   r   CmfError)r   r'   s     r   _node_parentzCmfTreeNode._node_parent2   st     &&,,+(9(96;P;P'QR""%%**,acnptuu%%+++ r   c                 T   t        |   |i |}|j                  dg       |j                  j                  rb|j                  j
                  sLd|j                  _        t        j                         5  |j                  j                  d       d d d        |S |S # 1 sw Y   |S xY w)Nztree_parent.tree_node_is_branchTr1   )	supercopyr*   r'   is_not_nullr3   cmfutildisable_aclr4   r   argsr/   res	__class__s       r   r?   zCmfTreeNode.copy>   s    glD+F+:;<??&&s/R/R26COO/$$& 5$$t$45
s
5
s   4BB'src_tree_node_iddst_tree_node_idc           	         | j                  d      d   }t        t              |   j                  | g d      }|j                  d      d   }t        t              |   j                  |g d      }	|j                  j
                  }
|r|r|
j                  ||      }
| d|
 }
|	j                  dk(  r|	}n|	j                  }|j                  |
d||	|	j                  	      }|rj|j                  r^|j                  j                         D ]A  }|j                  |j                  j
                  |j                  j
                  ||||
       C |S )u~   
        https://bcrm.carbonsoft.ru/project/Document/DOC-006119#spec-005912-b
        Копирование ноды
        :r   )r3   r   textzattachments.urltagszattachments.url_previewzattachments.url_preview_img)r   r   )zparent.tree_node_is_branchr3   projectzproject.logic_prefix r9   T)r	   copy_allr   r'   rM   )r%   name_startswithfind_to
replace_to)splitvarsr8   getr	   r   replace
class_namer   r?   rM   r3   r   r   r   r   )rG   rH   r%   rP   rQ   rR   src_model_namesrc_tree_nodedst_model_namedst_tree_nodenew_namer   r   r   s                 r   r   zCmfTreeNode.copy_tree_nodeH   sh    *//4Q7V^488 )c 9 d *//4Q7V^488<L Vd8 e %%++z''<H%&az2##|3"F"))F&++D39}^k^s^s , u;;%00557 m##DGGMM>3D3D3J3JV_4CWak $ mm r   c                 (    t         |          dgz   S )Nztree_parent.tree_sort_children)r>   save_preload_fields)r   rF   s    r   r^   zCmfTreeNode.save_preload_fieldse   s    w*,0P/QQQr   c                 N   | j                   r| j                  ry | j                  r| j                  st	        dd       dd| j
                  gdd| j                  gg}t        |       j                  dd	| j                  g|gd
g      }|r/| j                  | j
                  |j
                  |d      | _        y t        |       j                  dd| j                  g|gdg      }|r/| j                  | j
                  |j
                  |d      | _        y t        | -          y )Nu   Не заполнено имя!Tabortr   !=r'   z==r	   z<=z-name)filterorder_byF)rc   reversz>=)is_newr   r'   r	   	cmf_alertr   typesget
move_below
move_abover>   _calc_orderno)r   _filtermax_namemin_objrF   s       r   rl   zCmfTreeNode._calc_ordernoh   s    {{dll 99;4HdDGG,}dDDTDT.UVGDzdii/H'.R^e]fgH#twwG\abt*//642KW1Uag`h/i#'??477GJJw_d?#eDLr   c                 T   | j                   j                  s| j                  j                  sy | j                  g d       | j                  s| j                  sy | j                   rC| j                   j                  s,d| j                   _        | j                   j                          y y y )N)!tree_parent.has_children_archivedcmf_archivedhas_children_archivedT)r'   
is_changedrs   r*   rr   r4   r!   s    r   _calc_has_children_archivedz'CmfTreeNode._calc_has_children_archived   s       ++t/I/I/T/Tgh!!T%?%?D$4$4$J$J59D2!!# %Kr   u4   Обновление структуры дерева)	only_oncedescriptionshow_bg_progressbarobj_idc           	      v   t         j                  |       }t         j                  | ddg      }g }|j                  j	                         D ]5  }|j                  |j                  dd| gdd|j                  gg             7 t        |      D ])  \  }}|j                  |_        |j                          |s*+ y )Nr   r   r   r'   =rb   )rc   )
rA   get_model_by_idget_obj_by_idr   related_modelsr   listr   	enumerater4   )ry   update_bg_progressbar	obj_modelobjsub_objsmodelnnsub_objs           r   subtree_update_parent_jobz%CmfTreeNode.subtree_update_parent_job   s     ++F3	 ##FD(3C#D))88: 	aEOO

M3#?(DRUR\R\A]"^
_a	a 'x0 	MR ZZGNLLN$ 	r   c                     t         j                  j                         r(| j                  | j                  j
                  d       y t        | j                  | j                  j
                  g       y )NF)r   )rD   )r8   CmfDeferredJobis_jobr   r   r   schedule_deferred_jobr!   s    r   _subtree_update_parent_jobz&CmfTreeNode._subtree_update_parent_job   sJ      '')**477==PU*V!$"@"@Wr   c                    t         j                  t         j                  k(  ry | j                  sy | j                  j                  }t         j
                  j                  |k7  rvt        j                  |dg      }t        j                  | j                  dg      }t        j                  j                  d|j                   d|j                   d       y y )Nr	   r   uZ   Создавать/удалять здесь только владелец объекта u   . Свяжитесь с Tr`   )gcurrent_personsystem_personr'   cmf_owner_idcurrent_userr   rA   r}   r   cmfincluderg   r	   )r   r   	cmf_ownerr'   s       r   r,   z,CmfTreeNode._check_tree_parent_sl_owner_lock   s    q.''44>>,--lF8-LI!//0C0CVH/UKKK!!$~  @K  @P  @P  Q  Qi  js  jx  jx  iy  #z  BF!  G -r   c                     | j                   sy | j                  j                  rk| j                  j                  d      sO| j	                  ddg       | j
                  j                  r%| j                          | j                   rd| _        y y y y y )Nz:Classr(   ztree_parent.cmf_owner_idT)rf   r   r   endswithr*   r'   r+   r,   r!   s    r   _calc_sl_owner_lockzCmfTreeNode._calc_sl_owner_lock   s    {{$$T-@-@-I-I(-S9;UVW--557;;)-D&  . .T$r   c           	      D   | j                          t        |   |i |}| j                  sc| j                  j
                  rMt        j                  dd|  d| j                  j                   d| j                          | j                          | j                          |S )Nz%sz,CmfTreeNode.save(): Need update subtree for z
: parent: z -> )r   r>   r4   rf   r   rt   logginginfooldr   ru   rC   s       r   r4   zCmfTreeNode.save   s      "glD+F+{{t{{55LL!MdVS]^b^i^i^m^m]nnrsws~s~r   A  B++-((*
r   )skip_tree_movec                <   t        |   | g|d|i| | j                  ddg       | j                  rA| j                  j                  s+d| j                  _        | j                  j                          | j                  D ]  } |j                  |ddi|  | S )Nr   rq   r   T)r>   archiver*   r'   rs   r4   r   r   r   rD   r/   childrF   s        r   r   zCmfTreeNode.archive   s    MtMNMfM=|LMD$4$4$J$J59D2!!#__ 	@EEMM4???	@r   c                    t        |   |d|i| | j                  dgd       | j                  D ]  } |j                  |ddi|  | S )Nr   r   T)include_archived)r>   archive_restorer*   r   r   s        r   r   zCmfTreeNode.archive_restore   se    OnOO,$?__ 	HE!E!!4GGG	H r   )NN)Fu
   КопияNN)T)__name__
__module____qualname__commonr   cmf_tree_noder   ui_meta_skipr   api_methodsr   r"   r   r5   r<   r?   staticmethodstrr   r^   rl   ru   cmf_deferred_jobr   r   r,   r   r4   r   r   __classcell__)rF   s   @r   r   r      s   ==..::GGJZZLK ----99EEI
 
K
# ). G&

,    8R 2$ 2h  C  D#  D ,XG	.	 -2  5:  r   r   )urllibcmf.includecommon.fields.cmf_tree_noder   r   r   r   r)   r   r   <module>r      s,      "[&----99 [r   