
    i                    p    d dl Z d dlZd dlmZ d dlZd dlZd dl d dlm	Z	  G d de	j                        Z
y)    N)urlparse)*)cmf_backbone_peerc                   .    e Zd Zg dZed+d       Zed,d       Z fdZd Zd Z	 fdZ
 fdZed-d	       Zed.d
       Zed        Zed/d       Zed.d       Zed+d       Zed.d       Zed+d       Zed.d       Zed+d       Zed+d       Zed0deddfd       Zed+d       Zed+d       Zed1d       Zed2d       Zed3d       Zed4d       Ze	 	 	 d5d       Z d.dZ!d.d Z"d! Z#d.d"Z$d# Z% G d$ d%e&      Z'd& Z(d+d'Z)d+d(Z*d+d)Z+d+d*Z, xZ-S )6CmfBackbonePeer)getsgetlistslistcountdelete
setup_peer	log_applylog_listlog_mark_doneget_objpeer_project_nclist	full_syncc                 |    | r+	 t        |       }|j                  t        j                  k7  ryyy# t        $ r Y yw xY w)Neva_apilocal)r   hostnameconfigHOSTNAME_FQDN
ValueError)url
parsed_urls     ../modules/backbone/models/cmf_backbone_peer.pyget_peer_typezCmfBackbonePeer.get_peer_type   sH    %%c]
 &&&*>*>>$  
 s   / 	;;c                 J   t         j                  j                          |xs ddg}t         j                  j	                  |      } t         j
                  j                  || ||      }t         j                  j                  dt         j                  t        ||      |      S )Nr   d   )r   typetoken
ssl_verifyr
   )slicefilter)kwargspeer)
modelsCmfAccessListcheck_admin_moder   r   CmfBackboneInstancePeer	call_peer
CmfProjectdict)r"   r   r#   r$   r&   r%   r(   s          r   r   z#CmfBackbonePeer.peer_project_nclist!   s    --/!!S%%33C8))..!	 / 
 %%//  0 
 	
    c                 $    t        |   di | y N )superr   selfr'   	__class__s     r   r   zCmfBackbonePeer.delete8   s      r1   c                     | j                    d| j                   d| j                  xr | j                  j                   | _        y )N@ )backbone_instance_domainbackbone_instance_codepeer_projectcodename)r7   s    r   
_calc_namezCmfBackbonePeer._calc_name<   sD    445Qt7R7R6S))Dd.?.?.D.DEG	r1   c                    i }| j                   j                  r| j                   j                  | _        | j                  j                  rM| j                  j	                          | j                  j
                  r| j                  j                  xs g |d<   | j                  j                  r| j                  j                  | _        | j                  j                  rM| j                  j	                          | j                  j
                  r| j                  j                  xs g |d<   |r% | j                  di |  | j                  di | y y )Ntask_filter
doc_filterr4   )
src_task_filter_ubql
is_changedvaluesrc_task_filter_bqlloadoldsrc_doc_filter_ubqlsrc_doc_filter_bqlfull_sync_deletedr   )r7   full_sync_kwargss     r   _calc_src_filters_bqlz%CmfBackbonePeer._calc_src_filters_bql@   s    $$// (,'@'@'F'FD$##..$$))+''++262J2J2P2P2VTV / ##..&*&>&>&D&DD#""--##((*&&**151H1H1N1N1TRT ."D""6%56 DNN.-. r1   c                 *    t         |          g dz   S )N)r<   r=   r>   rE   )r5   save_preload_fields)r7   r8   s    r   rQ   z#CmfBackbonePeer.save_preload_fieldsf   s     w*, 0j j 	jr1   c                 b    | j                          | j                          t        |   di |S r3   )rA   rO   r5   saver6   s     r   rS   zCmfBackbonePeer.savej   s+    ""$w|%f%%r1   c                    t         j                  rt        j                  d       y t        j
                  ry t        |t        j                        r| j                  |||      S t        |t        j                        r| j                  ||||      S t        |t        j                        r| j                  ||||      S t        |t        j                        r| j                  |||      S t        |t        j                         r| j#                  |||      S t        |t        j$                        r| j'                  ||      S t        j                  d       y )Nz_CmfBackbonePeer.obj_after_save_hook(): Skip write changelog due config.MODULE_BACKBONE_DISABLEDrC   )rC   rD   rD   zbCmfBackbonePeer.obj_after_save_hook(): Skip write changelog due the model does not support logging)r   MODULE_BACKBONE_DISABLEDloggingwarninggbackbone_sync
isinstancer)   CmfTask_task_after_save_hook
CmfComment_comment_after_save_hookCmfAttachment_attachment_after_save_hookCmfRelationOption _relation_option_after_save_hookCmfDocument_doc_after_save_hookCmfDocumentHistory_doc_history_after_save_hook)clsobjforce_is_newrC   rD   s        r   obj_after_save_hookz#CmfBackbonePeer.obj_after_save_hookq   s/   **OOqs?? c6>>*,,S,K,XXV..///\{gq/rrV112223R]jt2uuV55677\Wb7ccV//0++C*+UUV66733CJ3OO 	p	
r1   c                 t   t         j                  rt        j                  d       y t        j
                  ry t        |t        j                  t        j                  f      r+| j                  |j                  |j                  ||      }nt        |t        j                        rkt        j                  |j                         t        j                  t        j                  fvry | j                  |j                  |j                   ||      }nt        |t        j"                        rt        |j$                  j&                  t        j                        rw|j$                  j                   rIt        j                  |j$                  j                         t        j                  t        j                  fvry |j$                  j                   }nLt        |j$                  j&                  t        j                  t        j                  f      r|j                  }ny |sy | j                  |j                  |||      }nt        |t        j(                        r| j                  |j*                  j                  |j*                  j                  |      }|sy | j                  |j,                  j                  |j,                  j                  |      }t/        |      j1                  t/        |            }nt3        t5        |      |      |sy d|j6                  j8                  d}|D ]}  }	t        j;                  d|j                   d       t        j=                         5  t        j?                  |	|j@                  |j                  |      jC                          d d d         y # 1 sw Y   xY w)	NzdCmfBackbonePeer.obj_after_delete_hook(): Skip write changelog due to config.MODULE_BACKBONE_DISABLED
project_idobj_idrC   rD   ro   rp   rC   r   )actionr?   z7CmfBackbonePeer.obj_after_delete_hook(): add record id=z, action=deletebackbone_peer	obj_modelrp   obj_changes)"r   rW   rX   rY   rZ   r[   r\   r)   r]   re   _get_sync_peersro   idr_   cmfutilget_model_by_id	parent_idra   parentrG   rc   in_linkout_linksetintersection	TypeErrorr"   r?   jsoninfodisable_aclCmfBackboneLog
class_namerS   )
ri   rj   rC   rD   peerstask_idin_link_peersout_link_peersrv   r(   s
             r   obj_after_delete_hookz%CmfBackbonePeer.obj_after_delete_hook   s   **OOvx??cFNNF,>,>?@''3>>#&&^i  wA'  BEV../&&s}}5fnnfN`N`=aa''3>>#--ep  ~H'  IEV112#****F,=,=>

,,..szz/C/CDV^^]c]o]oLpp**..CJJ,,v~~v?Q?Q.RS..''3>>'_j  xB'  CEV556//;;11{{~~' 0 M
 ! 00<<22||' 1 N
 &33C4GHE DIs++ HHMM
  	DLLRSVSYSYRZZijk$$& %%"&!nn66 +	 & 
 $& 	 s   '<N..N7	c                 H   |y |j                   |j                  j                  |j                  j                  d}t	        |t
        j                        r4|j                  j                  |d<   |j                  j                  |d<   |S t	        |t
        j                        r|j                  j                  |d<   |S t	        |t
        j                        r|j                  j                  |d<   |S t	        |t
        j                        rQ|j                  ddg       |j                  j                  j                  |d<   |j                   j                  |d<   |S t	        |t
        j"                  t
        j$                  f      r|j                  j                  |d<   |S )N)r   r@   r?   login
user_localstatus_typerx   
logic_typelogic_prefix)r   r@   r   r?   r\   r)   	CmfPersonr   r   	CmfStatusr   r]   rx   CmfListload_fieldsr   r   r_   ra   )ri   rj   obj_datas      r   _serialize_relation_objz'CmfBackbonePeer._serialize_relation_obj   sQ   ; ..HHMMHHMM
 c6++, #		HW%(^^%8%8H\"  V--. '*oo&:&:H]#  V^^, VV[[HTN  V^^,OO\>:;%(^^%8%8%=%=H\"'*'7'7'<'<H^$  f//1E1EFG VV[[HTNr1   c                 |   i }h d}|j                  |d      D ]  \  }}|j                  s|j                  |f|vr$|dv r)|dv r|j                  dk7  r=|j                  d      rO|j	                  d      rat        |t        j                  j                        ri }t        |t        j                  j                        rd	|d
<   |rY|j                  D cg c]  }| j                  |       c}|d<   |j                  D cg c]  }| j                  |       c}|d<   n|D cg c]  }| j                  |       c}|d<   n\t        |t        j                  j                        r$d|d
<   | j                  |j                        |d<   nd|d
<   |j                  |d<   |||<    |S c c}w c c}w c c}w )N>   r]   parent_taskr]   cmf_created_atr_   
cmf_authorr_   r   re   ordernora   r   rg   cmf_modified_atrg   cmf_modified_byT)rF   
is_defined>   r?   likesviewsr|   projectcmf_versioncache_fieldscmf_viewed_atstatus_closed_atstatus_modified_atstatus_in_progress_end)r   r   rg   _idcache_object_listr"   appendedremovedrG   object)itemsvisibler   endswith
startswithr\   cmffieldsCmfBackrefBase
CmfM2MBasechanges_appendedr   changes_removedCmfRelationBaserG   r   )	ri   rj   changes_onlyfields_dataadd_model_fields
field_namefieldfield_changesobj_s	            r   _get_fields_dataz CmfBackbonePeer._get_fields_data   s   
 

 "%lt!T 8	4J==cnnj%AIY%Y  & CCZnHn""5)$$X.%!:!:; M%!6!67(5f%_d_u_u0vW[1L1LT1R0vM*-^c^s^s/tVZ0K0KD0Q/tM),\a-bTXc.I.I$.O-bM'*E3::#=#=>(0f%),)D)DU[[)Qg&(/f%).g&&3K
#q8	4r  1w/t-bs   F/F4*F9c                    | j                  g dg ddd|gg      }t        j                  |      }g }|t        j                  u rz|D ]s  }|j
                  s||n|j                  j                  }|r7t        j                  j                  ||t        j                  |      d      sc|j                  |       u |S |t        j                  u rx|D ]s  }|j                  s||n|j                  j                  }|r7t        j                  j                  ||t        j                  |      d      sc|j                  |       u |S )N)rH   rL   
sync_tasks	sync_docs)is_src_peer=Tpeer_project_idr   r   r&   T)rx   r{   r&   include_deleted)r
   ry   rz   r)   r]   r   rH   rG   r   astliteral_evalappendre   r   rL   )	ri   ro   rp   rC   rD   r   ru   result_peersr(   s	            r   rw   zCmfBackbonePeer._get_sync_peersK  sY   [.1BC0TU  W ++F3	& *-8-Dk$JbJbJhJh!>>//!","//<(,	 0  !##D)*@ # &,,, *~~+5+AZtG^G^GdGd
!--33!","//
;(,	 4  !##D)*  r1   c                 F   | j                  |j                  |j                  |      }|sy |xs |j                  }|rdnd| j	                  ||       d}|d   r|j
                  j                  |d<   |j                  dd	g       |j                  d
k(  r|j                  rd|d   v r|d   d= |D ]  }t        j                  dd|j                   d|d    dt        |d                 t        j                         5  t        j!                  ||j"                  |j                  |      j%                          d d d         |s"|j&                  s|j&                  j(                  rt        j*                  j                  |g ddg      }|D ]+  }	||	_        t        j.                  j1                  |	d|       - t        j2                  j                  |ddg      }
|
D ]+  }||_        t        j.                  j1                  |d|       - y y y # 1 sw Y   nxY w)Nrq   createupdater   rr   r   r   r?   epicr   ztask.sub4CmfBackbonePeer.obj_after_save_hook(): add record %sid=	, action=rr   	, fields=rs   )	log_levelis_dummyr   texttree_parentr   r|   r   order_byTrk   rC   r   st_sizer|   r   )rw   r{   rx   is_newr   r?   r   r   r   r   rX   r   r
   ry   r   r)   r   r   rS   r   rF   r_   r|   r   rl   ra   )ri   taskrk   rC   r   r   rv   r(   commentscommentattachments
attachments               r   r^   z%CmfBackbonePeer._task_after_save_hookv  s0    ##t~~dgg[f#g, #)hh**4&j*I

 x "&))..Kfn56  J.499;W_K`A`)&1 J$'')K,A+B)DQ\]eQfLgKhik ((* ))&*doodggcn * df 	 t}}1I1I((--U*+ . H
 $ p!%&&::7QUcn:op !..334PYHZ3[K) s
$(
!&&:::TXfq:rs 2J} s   <HH 	c                    |j                   dk7  sK|j                  s?t        j                  |j                        t
        j                  t
        j                  fvry |j                  g d       t        |j                  d      r|j                  j                  ry | j                  |j                  |j                  ||      }|sy |xs$ |j                  xs |j                  j                  }|rdnd| j                  ||       d}|d	   r|j                   j"                  |d
<   |j                  j"                  |d<   |D ]  }t$        j'                  dd|j(                   d|d    dt+        |d	                 t        j-                         5  t
        j/                  ||j0                  |j(                  |      j3                          d d d         |j                  s|j                  j4                  s|rUt
        j6                  j+                  |g d      }	|	D ],  }
||
_
        t
        j8                  j;                  |
d||       . y y # 1 sw Y   xY w)Nr   )zparent.is_dummyr   cmf_owner.namer   r   rn   r   r   r   r   r   r?   r{   r   r   r   rr   r   rs   )r   r   r   r   T)rk   rC   rD   )r   r   ry   rz   r{   r)   r]   re   r   hasattrr|   rw   ro   r   rJ   r   r?   r   rX   r   rx   r
   r   r   r   rS   rF   ra   r   rl   )ri   r   rk   rC   rD   r   r   rv   r(   r   r   s              r   r`   z(CmfBackbonePeer._comment_after_save_hook  s<    "''(9(9:v~~vOaOa>bbbc7>>:.7>>3J3J##))$$#!	 $ 
 GG73C3C3G3G"(hh**7V*L

 x "),,"3"3K'.'8'8'='=K$ J'**Y{8/D.EYtT_`hTiOjNkln ((* ))&*g6H6HQXQ[Q[it * df 	   W%5%5%@%@\ ..337Ko3pK) 
$+
!&&::!% +)	 ;  FR s   <II	c                 @   |j                   j                  |j                   j                  k7  ry |j                  j                  |j                  j                  k7  ry |j                   j                  |j                  j                  k7  ry |s|j                  sy | j                  |j                   j                  |j                   j                  |      }|sy | j                  |j                  j                  |j                  j                  |      }t        |      j                  t        |            }|sy |j                  dg       d| j                  |      |j                  j                  d}|d   r|D ]  }t        j                  dd|j                   d|d	    d
t        |d                 t         j#                         5  t$        j'                  ||j(                  |j                  |      j+                          d d d         y y # 1 sw Y   xY w)Nrq   r   r   )rr   r   r?   r   r   r   r   rr   r   rs   )r}   ro   r{   r~   r   rw   rx   r   r   r   r   r?   r   rX   r   r
   ry   r   r)   r   r   rS   )	ri   relation_optionsrk   rC   r   r   r   rv   r(   s	            r   rd   z0CmfBackbonePeer._relation_option_after_save_hook  s
   ##..2B2J2J2T2TT$$//3C3L3L3V3VV##..2B2K2K2V2VV 0 7 7++'//::#++..# , 

 ,,'00;;#,,//# - 

 M"//N0CD$$&6%78 **+;<$))..
 x  J*--.iH8M7NiX\]hiq]rXsWtuw ((* ))&*6F6Q6Q/22 *  df	 	 !
 s   <HH	c                 \   t        |j                  j                  t        j                  t        j
                  t        j                  f      r|j                  sy t        |j                  j                  t        j                        rS|j                  j                  r%|j                  j                  j                  d      sy |j                  j                  }nkt        |j                  j                  t        j
                  t        j                  f      r|j                  }n t        ||j                  j                        t        |j                  d      r;|j                  j                  j                          |j                  j                  ry |j                  s|sy | j                  |j                  |||      }|sy |j!                  dg       d| j#                  |      |j$                  j&                  d}|d   r|j(                  j&                  |d<   |j                  j&                  |d	<   |D ]  }|j*                  d
kD  r>t,        j/                  dd|j0                   d|j2                   d|j*                          Pt,        j/                  dd|j0                   d|d    dt5        |d                 t6        j9                         5  t        j;                  ||j<                  |j0                  |      j?                          d d d         y y # 1 sw Y   xY w)N)zCmfTask:zCmfDocument:r   rn   r   r   )rr   r   content_pathr   r?   r{   i -1z:CmfBackbonePeer.obj_after_save_hook(): skip attachment: %sr   z, name=z, size=r   r   rr   r   rs   ) r\   r|   rG   r)   r_   r]   re   ro   r{   r   r   r   r   rI   content_updatedrw   r   r   r   r   r?   r   rX   r   rx   r@   r
   ry   r   r   r   rS   )	ri   r   rk   rC   rD   rp   r   rv   r(   s	            r   rb   z+CmfBackbonePeer._attachment_after_save_hook  s    *++11F4E4Ev~~W]WiWi3jks}  tI  tIj''--v/@/@A$$..j6G6G6Q6Q6\6\]y6z&&00F
))//&..&BTBT1UV))FJ
(9(9(?(?@@:$$j1&&++-  ))
 )),##!,,#!	 $ 
  012 **:6&NN//
 x ",//"6"6K'1';';'@'@K$ %%
2LLTjmm_GJOO3DGJL^L^K_`b J*--	+h2G1H	RVWbckWlRmQnoq ((* ))&*j6K6KT^TaTaoz * df 	 ! s   <L""L+	c                 n   | j                  |j                  |j                  |      }|sy |xs |j                  }|rdnd| j	                  ||       d}|d   r|j
                  j                  |d<   |D ]  }t        j                  dd	|j                   d
|d    dt        |d                 t        j                         5  t        j                  ||j                  |j                  |      j                          d d d         |rt        j                   j                  |g ddg      }|D ]$  }	t        j"                  j%                  |	d|       & t        j&                  j                  |g d      }
|
D ]$  }t        j"                  j%                  |d|       & y y # 1 sw Y   =xY w)Nro   rp   rD   r   r   r   r   r   r?   r   r   r   rr   r   rs   )r   r   r   r   r   r|   inline	cmf_ownerr   r   Trk   rD   )r   r   r|   r   )rw   r{   rx   r   r   r?   r   rX   r   r
   ry   r   r)   r   r   rS   r_   r   rl   ra   )ri   docrk   rD   r   r   rv   r(   r   r   r   r   s               r   rf   z$CmfBackbonePeer._doc_after_save_hookJ  s    ##s}}SVVXb#c+ #)hh**3Z*H

 x "%((--K J#&&;x+@*A4P[\dPeKfJghj ((* ))&*cnnSVVal * df 	 ((--v*+ . H
 $ n&&::7QUbl:mn !..333Gc3dK) q
&&:::TXeo:pq  s   <F**F4	c                 \   | j                  |j                  |j                  |      }|sy |j                  dg       d| j	                  |      d}|d   r|j
                  j                  |d<   |j                  j                  |d<   |D ]  }t        j                  dd	|j                   d
|d    dt        |d                 t        j                         5  t        j                  ||j                  |j                  |      j!                          d d d         y y # 1 sw Y   xY w)Nr   r   r   r   r   r?   r{   r   r   r   rr   r   rs   )rw   ro   r{   r   r   r?   r   rX   r   rx   r
   ry   r   r)   r   r   rS   )ri   doc_historyrD   r   rv   r(   s         r   rh   z,CmfBackbonePeer._doc_history_after_save_hookw  s=    ##{/E/EkNcNcpz#{!1 23 **;7

 x "-"2"2"7"7K'2'<'<'A'AK$ 
J+..);x3H2ISWXcdlXmSnRopr ((* ))&*"-"8"8*~~$/	 * 
 df 	
 ! s   <D""D+	methodmodelzcmf.models.BaseModel | Nonec                    |s| }|j                   dk(  rt        j                  ||      }d}t        |t        t
        f      s t        j                  |d         }|g|dd }t        ||      } ||xs g i |xs i }	|r|j                  r|j                          |	S |j                   dk(  rF| j                  |j                   d| |||j                  |j                  |j                        }	|	S t!        |j                         )u   
        !!! Локально работаем в той же транзакции
        :param method:
        :param model:
        :param args:
        :param kwargs:
        :param peer:
        :return:
        r   Nr      r   .)r   argsr'   r#   r   r$   )r"   inspectgetattr_staticr\   classmethodstaticmethodry   get_obj_by_idgetattrrF   rS   _eva_api_callr   r#   r   r$   r   )
ri   r   r   r  r'   r(   method_attrself_method_funcresults
             r   r.   zCmfBackbonePeer.call_peer  s    E99!00?KEkK+FG--d1g6)QR)!%0K 4:2A6<RAF))

  YY)#&&**+1VH5Djjdhh4?? ' LF
  TYY''r1   c                    dd l }|j                  dk(  rIt        j                  j	                  |dg      }|j                         D ]  }|j                         c S  y |j                  dk(  r4	 | j                  ||j                  |j                  |j                        S t        |j                        # |j                  $ r"}t        j                  d|||       Y d }~y d }~ww xY w)Nr   r   r|   rx   r   r   )r#   r   r$   zFCmfBackbonePeer.peer_get_attachment_content(%s, %s): download error %s)requestsr"   r)   ra   r   get_contentread_eva_http_getr#   r   r$   RequestExceptionrX   errorr   )ri   attachment_idr   r(   r  r   filees           r   peer_get_attachment_contentz+CmfBackbonePeer.peer_get_attachment_content  s    99--11]H:1VJ"..0 #yy{"#YY)#+(( 

T__ ) ^ ^ TYY'' ,, +\ $+ ++s   -2B5 5C&C!!C&c                    dd l }|j                  dk(  r4t        j                  j	                  |dg      }|j                  |       y |j                  dk(  r7	 | j                  |d|i|j                  |j                  |j                        S t        |j                        # |j                  $ r"}t        j                  d|||       Y d }~y d }~ww xY w)	Nr   r   r|   r  r   r  )filesr#   r   r$   zDCmfBackbonePeer.peer_put_attachment_content(%s, %s): upload error %s)r  r"   r)   ra   r   upload_file_eva_http_postr#   r   r$   r  rX   r  r   )ri   r  r   contentr(   r  r   r  s           r   peer_put_attachment_contentz+CmfBackbonePeer.peer_put_attachment_content  s    99--11]H:1VJ""7+YY)#+)) !7+**# *   TYY'' ,, +Z $+ ++s   5B# #C2CCc                     dd l }i }| |vr|j                         }||_        ||| <   ||    }|j                  j	                          |S )Nr   )r  Sessionverifycookiesclear)r#   r$   r  http_sessionssession_s        r   _get_eva_http_sessionz%CmfBackbonePeer._get_eva_http_session  sT     %'')H(HO#+M%  ' r1   c                     |j                  d      sd|z   }| j                  ||      j                  | | dd| i      }|j                          |j                  S )N/r#   r$   AuthorizationBearer )headers)r   r)  r   raise_for_statusr   )ri   pathr#   r   r$   responses         r   r  zCmfBackbonePeer._eva_http_get  so    s#:D,,5Z,PTTeD6N_w6G$H U J!!#r1   c                     |j                  d      sd|z   }t        | | dd| i      }|r||d<   |r||d<    | j                  ||      j                  di |}|j	                          y )	Nr+  r-  r.  )r   r/  datar  r,  r4   )r   r0   r)  postr0  )	ri   r1  r   r  r#   r   r$   post_kwargsr2  s	            r   r  zCmfBackbonePeer._eva_http_post  s    s#:D%v$w&78
 ")K#(K U3,,5Z,PUUdXcd!!#r1   c           	      (   |xs i }d|d<   dt        t        j                               d||xs g |xs i d|d}	 | j                  ||      j	                  | d| |dd	| i
      }	|	j                  s-t        d|	j                  |	j                  |	j                  |	      |	j                         }|j                  d      rt        d|||      |d   rt        d|||      |d   }|S # t
        $ r}
t        d||t        |
            d}
~
ww xY w)u\   Адаптированный код, из нагрузочного тестирования.T
admin_modez2.2N)jsonrpccallidjsverr   r  r'   no_metaflagsr,  z/api/?m=r-  r.  )r   r/  z&CmfBackbonePeer._eva_api_call(): errorzAPI call error r  abortz&CmfBackbonePeer._eva_api_call(): abortr  )struuiduuid1r)  r5  	ExceptionCmfErrorokstatus_codereasonr   r   r   )ri   r   r  r'   r=  r#   r   r$   r4  r2  r  json_resultr  s                r   r  zCmfBackbonePeer._eva_api_call  sG    "l $**,'JBl
$	Z00u0TYY%xx((GE7*;< Z H {{,h.B.BHOOU]UeUegoppmmo??7#CS&R]^^wCS&R]^^X&  	ZCS&RUVWRXYY	Zs   /C, ,	D5DDc	                    | j                  ||g d      }
|
s<t        j                  j                  |      }|st        d| d        | ||      }
||
_        ||
_        ||
_        ||
_        ||
_        ||
_	        |
j                  r|
j                          |
j                  j                  |
j                  j                  j                  |
j                  j                   j                  dS )	N)r>   r=   backbone_instance_namer<   r   rE   rK   )backbone_instance_idr   r   rx   u   Проект не найден T)r>  )rJ  r>   )rx   project_codeproject_name)r   r)   r/   	cmf_alertr=   rI  r<   r   rE   rK   rF   rS   rx   r   r>   r?   r@   )ri   rJ  r=   rI  r<   r   r   rE   rK   _kwargsr(   r>   s               r   r   zCmfBackbonePeer.setup_peer@  s     ww!5 `N  O !,,00O0DL;O;LMUYZ,@|\D&<#&<#(@%&$8!#6 ??IIK'',, --2277 --2277
 	
r1   c                 t    dd g }n# j                   j                         j                  n# j                  j                         j                   j                  j                           fd}g dd |t
        j                        r[D ]5  }t
        j                  j                  |d       |j                  |       7 t                 |t
        j                        r[dgd |t
        j                        rD ]  } j                  |j                  |j                        }|s-d	 j                  |d
      d}|j                  j                   |d<   |D ]o  }t"        j%                  dd|j                   dt'        |d                 t
        j)                  ||j*                  |j                  |      j-                          q  t                 |t
        j                        rt
        j.                  j'                  dd|gdd|ggg d      D ]$  }	t
        j                  j                  |	d       & ~g dd |t
        j0                        rJD ]$  }
t
        j                  j                  |
d       & t                 |t
        j0                        rJdgd |t
        j0                        rD ]  }
 j                  |
j                  |
j                        }|s-d	 j                  |
d
      d}|
j                  j                   |d<   |D ]o  }t"        j%                  dd|
j                   dt'        |d                 t
        j)                  ||
j*                  |
j                  |      j-                          q  t                 |t
        j0                        rg dd |t
        j2                        rJD ]#  }t
        j                  j                  |       % t                 |t
        j2                        rIy y )N  c                     | t         j                  u r}n| t         j                  u r}nd }| j                  j                  |z   gdg      z  S )Nr   )ro   r&   r   r%   r   )r)   r]   re   r
   r   )	r   r&   rD   r   r  r7   
slice_sizestartrC   s	     r   get_dataz+CmfBackbonePeer.full_sync.<locals>.get_datag  st     &$&,,,#ZZ//ej01*+   F ZEMr1   )r   r   workflowr   Tr   ***)ro   rp   r   Fr   r   r?   z*CmfBackbonePeer.full_sync(): add record %sr   z, action=update, fields=r   rs   r}   INr~   )r}   r~   relation_type)r&   r   )r   rV  tree_parent_idztree_parent.namer   )r   zcmf_modified_by.namezstatus.namerV   )rH   rI   rG   rL   r   r)   r]   r   rl   r   
cmf_commitrw   r{   rx   r   r?   r   rX   r   r
   r   r   rS   rc   re   rg   )r7   rC   rD   objsrU  tr   rv   r(   relationddhr   r  rS  rT  s   ```         @@@@r   r   zCmfBackbonePeer.full_sync^  s   
%0%<k$BZBZB_B_BaBgBg#-#9Zt?V?V?[?[?]?c?c
!!#	 	, <v~~& &&::14]h:iA L v~~& v~~& ,,ADD,Q '"33AE3J '(ffkkF#! DLLDaddV#;DXAV<W;XY[ ))&*all144]h * df& L) v~~&. 0055d+j$-EF; 6 
 	mH ""66xd`k6l		m Pv))* h&&::14\f:ghL v))* v))* ,,ADD,Q '"33AE3J '(ffkkF#! DLLDaddV#;DXAV<W;XY[ ))&*all144]h * df& L) v))*, >v001 V&&::2*:UVL v001r1   c                    
 dg g 
||n# j                   j                         j                  }||n# j                  j                         j                  } j	                  ddg       d
 fd	}d |t
        j                  |      rKD ]#  }t
        j                  j                  ||       % t                 |t
        j                  |      rKddg
 |t
        j                        rID ]#  }t
        j                  j                  ||       % t                 |t
        j                        rId |t
        j                        rID ]#  }t
        j                  j                  ||       % t                 |t
        j                        rIt
        j                  j                  d	g j                  
      D cg c]  }|j                  j                   }}dddg
 |t
        j                   dd|gd      rOD ]#  }	t
        j                  j                  |	|       % t                 |t
        j                   dd|gd      rOd |t
        j"                  |      rLD ]#  }t
        j                  j                  ||       % t                 |t
        j"                  |      rKy y c c}w )NrQ  rJ  r   c                     t        |z   gdgdd      }|rj                  |d<    | j                  di |z  S )Nr   T)r&   r   r%   r   cmf_deletedr   ro   r4   )r0   r   r
   )	r   r&   by_project_idr'   r   r  r7   rS  rT  s	       r   rU  z3CmfBackbonePeer.full_sync_deleted.<locals>.get_data  se     ej01*+  $F '+';';|$UZZ)&)FZEMr1   r   )r&   rU   r|   
src_obj_id)r   rJ  r}   r~   rx   rX  F)r&   rd  rV   )NT)rH   rI   rG   rL   r   r)   r]   r   r   r[  r_   ra   CmfBackboneObjMappingr
   rJ  re  rc   re   )r7   rC   rD   rU  r]  carlorelations_idsrr   r  rS  rT  s   `         @@@@r   rM   z!CmfBackbonePeer.full_sync_deleted  s   
%0%<k$BZBZB_B_BaBgBg#-#9Zt?V?V?[?[?]?c?c
02CDE	 	( v~~k: Y&&<<QK<XYL v~~k: v(() Y&&<<QK<XYL v(() v++, Y&&<<QK<XYL v++, :@9U9U9Z9Z >!%!:!: :[ :
 #--   Z(v//t]8Schi Y&&<<QK<XYL v//t]8Schi v))*= W&&<<Q:<VWL v))*==s   Kc                 d   t         j                  d| j                  d|       | j                  dg       t        j                  |dgdd| j                  g      }|sy	d
|j                  j                  | j                  |      d}t        |t        j                  t        j                  f      r|j                  j                  |d<   t        d	|j                  |j                   j                  |j"                  j                  |      }t         j%                  d| j                  |       |S )u9  
        Получаем объект целиком.
        {
            id: log.id,  # CmfBackboneLog:...
            obj_model: obj.class_name,  # CmfTask
            obj_id: obj.id,  # CmfTask:...
            datetime: log.cmf_created_at.isoformat(),  # 2025-01-01T01:02:03Z
            obj_changes: {
                action: create/update/remove,
                code: obj.code,
                fields: {
                    name: {
                        type: 'value',  # value/object/object_list
                        value: 'New Name'
                    },
                    executors: {
                        type: 'object_list',
                        value: [
                            {
                                class_name: CmfPerson,
                                name: 'Joe',
                                login: 'joe@eva.com',
                                user_local: true,
                            },
                            ...
                        ]
                    }
                },
            },
        }
        zCmfBackbonePeer.get_obj(%s): %szobj_id=r   r   rW  r   r   r   Nr   )rr   r?   r   r{   rx   ru   rp   datetimerv   z&CmfBackbonePeer.get_obj(%s): result %s)rX   r   r?   r   ry   r	  r   r   r   r\   r)   r_   ra   r{   r0   r   rx   r   debug)r7   rp   rO  rj   r   r  s         r   r   zCmfBackbonePeer.get_obj  s   @ 	-tyyWVI,	H!2 34 ##FE7IsTXThThCi#jHHMM++C0

 cF--v/C/CDE$'MM$6$6H[!nn66;;((-- 
 	4dii	Ir1   c           
      *   t         j                  j                  dd| gdd|xs g gg dg|g d      D cg c]R  }t        |j                  |j
                  |j                  |j                  j                         |j                        T c}S c c}w )	u(  
        Получаем список изменений по точке синхронизации
        [
            {
                id: log.id,  # CmfBackboneLog:...
                obj_model: obj.class_name,  # CmfTask
                obj_id: obj.id,  # CmfTask:...
                datetime: log.cmf_created_at.isoformat(),  # 2025-01-01T01:02:03Z
                obj_changes: {
                    action: create/update/remove,
                    code: obj.code,
                    fields: {
                        name: {
                            type: 'value',  # value/object/object_list
                            value: 'New Name'
                        },
                        executors: {
                            type: 'object_list',
                            # for update
                            appended: [
                                {
                                    class_name: CmfPerson,
                                    name: 'Joe',
                                    login: 'joe@eva.com',
                                    user_local: true,
                                },
                                ...
                            ]
                            removed: [
                                ...
                            ],
                            # on full obj sync
                            value: [
                                ...
                            ]
                        }
                    },
                },
            },
            ...
        ]
        rt   r   rp   zNOT IN)statusr   queued)r   ru   rp   rv   )r&   r%   r   rn  )
r)   r   r   r0   rx   ru   rp   r   	isoformatrv   )r7   r%   skip_idsrO  items        r   r   zCmfBackbonePeer.log_listT  s    h --33$c40xR8-/ O 4 Q
  77..{{,,668 ,,
 	
 
s   ABc                 X   |D ]$  }t         j                  d| j                  d|j                  d      d|j                  d             |d   }t        j
                  j                  |dg      }|d   }|dv rd	|_        |j                          |d
v rCd|_        |xj                  dz  c_        |j                  d      |_	        |j                          d|_        |xj                  dz  c_        d| |_	        |j                          t         j                  d||       ' y)u1  
        Отмечаем записи лога как обработанные
        [
            {
                id: log.id,  # CmfBackboneLog:...
                status: success,  # success|fail|skip
                [error_text: 'some backtrace',]
            },
            ...
        ]
        z5CmfBackbonePeer.log_mark_done(%s): changes applied %szlog_mark.get("id")=rx   z, log_mark.get("status")=rr  error_countr  )successskipsynced)failfailedr  
error_textzUnknown apply status: zBCmfBackbonePeer.log_mark_done(): unknown apply status %s for id %sN)rX   rp  r?   r   r)   r   rr  r   rx  r~  rS   rY   )r7   log_mark_listrO  log_marklog_idlogrr  s          r   r   zCmfBackbonePeer.log_mark_done  s    & 	vHMMG&8<<%''A(,,x*@)BCE d^F''++v}o+NCh'F,,%


:%%
1$!)l!;
 &
1$#9&!B
 dflntu+	vr1   c                       e Zd ZdZy)CmfBackbonePeer._ApplySkipErroru<   Пропускаем применение измененийN)__name__
__module____qualname____doc__r4   r1   r   _ApplySkipErrorr    s    Jr1   r  c                 .   | j                  g d       t        j                  }g }|D ]  }t        j	                  d| j
                  d|j                  d      d|j                  d      d|j                  d	      d
|j                  di       j                  d      dt        |j                  di       j                  dg             
       t        j                  d| j
                  |       d}d}d}d}		 dt        _        |d   }|d   }|d	   }t        j                  |      }
|xr  |
j                  |dd| j                  g      }	|	r|	j                          |d   d   dk(  r|	j                          n|d   d   dv r|
t        j                  u xr
 d|d   d   v }|r|d   d   j!                  d      d   }| j#                  |	|d   d   |d   d          |	j%                          d|d   d   v r|d   d   d   d   |	_        t)        |	t        j*                        r|	j,                  rt        j*                  j                  |	j.                  t        j0                        }|D ]  }|j                           d|	_        |	x|	j4                  _        |	j4                  _        |	j:                  |	j4                  _        |	j4                  j=                          |r|	_        |	j@                  r*|	j=                          ntC        d|jD                  d         d}n`|d   d   dk(  r@|dv r@|d   d   }t        jG                  || j                         }|s!| jI                  d!| d"      | j                  } |
|#      }	| j#                  |	|d   d   |d   d          |d$k(  r|	jJ                  rt        jM                  |	jJ                        t        jN                  u r^t        j                  j                  |	jJ                  |	jP                  %      D ]&  }|jP                   d&|_(        |j%                          ( |	j%                          |	jR                  jT                  }d}n| jI                  d'|       tW        ||||	xr |	j
                  jT                  |(      }t)        |	t        jX                        r|	jZ                  jT                  |d)<   |j]                  |       |t        _        ti                 |S # | jH                  $ rY}|j]                  tW        ||||	xr |	j
                  jT                  d*(             t        j_                  d+|||       Y d}~}d}~wt`        $ r t        jc                  d,|j                  d             |j]                  tW        |j                  d      |j                  d      |j                  d	      d-te        jf                         .             Y w xY w# |t        _        w xY w)/u  
        Применяем список изменений на точке синхронизации
        [
            {
                id: log.id,  # CmfBackboneLog:...
                obj_model: obj.class_name,  # CmfTask
                obj_id: obj.id,  # CmfTask:...
                datetime: log.cmf_created_at.isoformat(),  # 2025-01-01T01:02:03Z
                obj_changes: {
                    action: create/update/remove,
                    code: obj.code,
                    fields: {
                        name: {
                            type: 'value',  # value/object/object_list
                            value: 'New Name'
                        },
                        executors: {
                            type: 'object_list',
                            # for update
                            appended: [
                                {
                                    class_name: CmfPerson,
                                    name: 'Joe',
                                    login: 'joe@eva.com',
                                    user_local: true,
                                },
                                ...
                            ]
                            removed: [
                                ...
                            ],
                            # on full obj sync
                            value: [
                                ...
                            ]
                        }
                    },
                },
            },
            ...
        ]
        return:
        [
            {
                id: log.id,  # CmfBackboneLog:...
                obj_model: obj.class_name,  # CmfTask
                obj_id: obj.id,  # CmfTask:...
                obj_code: obj.code,  # TSK-1
                status: success,  # success|fail|skip
                [error_text: 'some backtrace',]
            },
            ...
        ]
        )r>   dst_create_listsdst_create_usersdst_create_users_as_guestrm  z/CmfBackbonePeer.log_apply(%s): apply changes %szchange change.get("id")=rx   z, change.get("obj_model")=ru   z, change.get("obj_id")=rp   z., change.get("obj_changes", {}).get("action")=rv   rr   z7,list(change.get("obj_changes", {}).get("fields", []))=r   NTr   r   )rx   r&   r   )r   r   r   rG   rr   r   )r{   r   zInvalid actionry  r   )r_   ra   rg   r{   )r   zparent z absent)r|   re   )r   r@   u    (старый)zobj not found )rx   ru   rp   obj_coderr  r   rz  z7CmfBackbonePeer.log_apply(): skip record %s, obj %s: %sz2CmfBackbonePeer.log_apply(): apply record %s errorr|  )rx   ru   rp   rr  r~  )5r   rZ   r[   rX   r   r?   r   r
   rp  ry   get_model_by_namer>   save_preparer   r)   re   pop_apply_obj_changesrS   r   r\   rg   has_publishedr{   system_personcur_workflowr|   cur_published_versioncur_workflow_versiondoc_version	save_datar   rF   r   rv   r	  r  rZ  rz   r/   r@   rx   r   r0   ra   r   r   rY   rB  	exception	traceback
format_excr[  )r7   changes_listrO  g_backbone_sync_bkr  change	change_idru   rp   rj   r   is_doc_text_changedchanged_textunpublished_in_work_by_systemr`  sync_statusr{   r|   r   result_datar  s                        r   r   zCmfBackbonePeer.log_apply  s   r 	h 	 	j__" {	FLLA499+&**T*,,Gvzz+/F.HH`6::V^K_Ja bAJJ}b155h?A BJ

="599(BGHJLM
 MMKTYYX^_IIFCo5"&"4L	";/	)11)<afidN_N_=`!a$$&m,X6(B

.x8<PP.3v7I7I.I.wfX^_lXmnvXwNw+.+1-+@+J+N+Nv+VW^+_L//!6x!@P]I^_gIh 0 j
 -}0Eh0OO282G2QRc2del2mC/)#v/H/HIcN_N_@F@Y@Y@^@^.1mm /0oo	 A_ A" = +H !0B$&IIK!037 0eh h

 @3::Cb9<

 6 #

 4 4 6.'3CH>>MMO ))96;M;Mh;WXX"+KM*84@ $YY$*=$9+$F	!(!6!6y$J[J[!6!\%"&"6"677S"TT!%!2!2v.C++VM28<VMEZ[cEd , f M1c6H6HWMdMdehewewMx  }C  }N  }N  NN#)#5#5#:#:sGYGY`c`h`h#:#i 'C*-((?'CCHHHJ' HHJ !VV[[F"+K ..x/HII" '! 2SXX]]& c6#7#7825'',,K/k*2 #5Lw{	x 3 '' qd '! 2SXX]]!   Y[dflnopp 	!!"VX^XbXbcgXhidzz$'$jj5!::h/!(335 	 #5s9   <O8TXAU1,X1BX XXXXc           	         |y |d   }t         j                  |      }|s t        j                  d|  d| d| d       y t	        |t
        j                  j                        st        j                  d|  d| d|        y |j                  d      }|j                  d      }d }|d	k(  r?|j                  d
      }|r|j                  |      }|sj|rg|j                  |      }nS|dk(  r.|r|j                  |      }|s7|r4|j                  |      }n |dk(  rG|r t        j                  j                  |      }|s|rt        j                  j                  |      }n|dk(  r|j                  |      }n|dk(  rd|v r|j                  |d         }n|dk(  r| j                  }ng }	t	        |t        j                  t        j                  t        j                  t        j                  f      s,d|j                  v r|	j!                  dd| j                  g       |r|j                  ||	      }|st        j                  d|  d| d       |S )Nr   %sz%._map_object_value(): cannot map obj(z	): model z - not foundz): invalid model r@   r?   r   r   )r   )r@   CmfRelationType)r?   CmfLogicTypeCmfWorkflowr_   rx   rK  r/   r   r   )r@   r&   z): not mapped)ry   r  rX   rY   
issubclassr   r)   CmfModelr   r  r>   r   CmfActivityCmfPersonGroupCmfTagr   r   )
r7   r   	obj_fieldobj_class_nameru   obj_namer  rj   r   
obj_filters
             r   _map_object_valuez!CmfBackbonePeer._map_object_values  sT   !,/--n=	OOCH:YWeVffrsu)SZZ%8%89OOCH:M^_h^ijl<<'<<'[(LL)Emm%m08mmm200mmm28mmm2~-))--8-<8))--8-<},--X-.C|+xmmx~m6|+##C J ((**--	   9#3#33!!9c43D3D"EFmm*mEOODTF*OPXzYf"gh
r1   c                 ^   d|v r | j                  |d   d         }|r||_        |j                          d|v r | j                  |d   d         }|r||_        d|v r | j                  |d   d         }|r||_        |j                          d|v rd}t        |t        j                        r| j                  |d   d         }|sQ|d   d   }|rEt        j                  |j                  d      |j                  d      |j                  d	      
      nd}||_        |j                          y) activityrG   r   rV  rr  Nr@   r?   r   )r@   r?   r   )r  r  _calc_scheme_wfr   rV  _calc_workflowr\   r)   re   r   r   rr  _calc_status)	r7   rj   fields_changesrr   r  r   rV  rr  status_datas	            r   _apply_wf_logiczCmfBackbonePeer._apply_wf_logic  sH    '--nZ.H.QRH' 	>)//|0LW0UVJ!+'--nZ.H.QRH'~%F#v112//x0H0QR,X6w? !  ))$0{v7N\g\k\kly\z * &*   CJr1   c                     |dk(  rj|j                   s]|j                  di       j                  d      }|r9d|j                  d       d|j                  d       d|j                   |_        y y y y )	Nr   r   rG   u   <p>Автор: r@   z &lt;r   z&gt;</p><br>)r   r   r   )r7   rj   r  rr   cmf_author_datas        r   _add_comment_metaz!CmfBackbonePeer._add_comment_meta  s~    Xcnn,00rBFFwOO &o&9&9&&A%B%H[H[\cHdGeeqrurzrzq{|   '5r1   c           
         d}|j                         D ]2  \  }}t        |t        j                  t        j                  f      r|dv rd}8|j
                  j                  |      }|s*t        j                  d|  d| d|j                   d       t        ||      }|d   }	|	d	k(  rt        |||d	          |	d
k(  rd }
|j                  d	      "d|d	   v rt        j                  |d	   d         }
|j                  dk(  r=|dk(  r8|
r6|
t        j                  ur$|
j                  |d	   d   | j                        }n| j!                  |d	   |      }|s)|j"                  s| j%                  d| d| d|d	          t        |||       ||	dk(  sd	|v r@g }|d	   D ])  }| j!                  ||      }|s|j'                  |       + t        |||       d|v r1|d   D ])  }| j!                  ||      }|s|j'                  |       + d|v s|d   D ])  }| j!                  ||      }|s|j)                  |       + 5 |r| j+                  |||       t        |t        j,                        r| j/                  |||       y y )NF>   rr  r  rV  	scheme_wfr   Tr  z._apply_obj_changes(): field z not found in z. Field changes lost.r"   rG   r   r   re   r   r@   )r@   r   )r  zskip apply z', object not mapped for required field z, r   r   r   r  )r   r\   r)   r]   re   r   r   rX   rY   r   r
  setattrry   r  r/   r>   r  nullabler  r   remover  r_   r  )r7   rj   r  rr   has_wf_changesr   
field_datar   r  field_data_typevalue_model	value_objrG   r   
mapped_objs                  r   r  z"CmfBackbonePeer._apply_obj_changes  s   &4&:&:&< 3	9"J
#0B0BCD XQ JQ "&JJNN:.Ef9*^TWTbTbSc d+ ,- Z0I )0O')ZG)<= H,">>'*6<:V]K^;^")";";Jw<OP\<]"^K>>]2z]7RWbgr  {A  {L  {L  hL +'08 $ 1 1 !0 !I
 !% 6 6z'7JV_ 6 `I ););..%cU*QR\Q]]_`jkr`s_tuw wZ3 M1j(E$.w$7 5%)%;%;HPY%;%Z
%!LL45 CU3+$.z$: 9%)%;%;HPY%;%Z
%%,,Z89 
*$.y$9 9%)%;%;HPY%;%Z
%%,,Z89a3	9h   nV Dc6,,-""3v"F .r1   )N)NNNNN)FNN)NN)F)NNNN)NF)NNF)NNNNF)NNNNNF)NNNNNNNN).r  r  r  api_methodsr  r   r   r   rA   rO   rQ   rS   r  rl   r   r   r   rw   r^   r`   rd   rb   rf   rh   r?  r.   r  r!  r)  r  r  r  r   r   rM   r   r   r   rB  r  r   r  r  r  r  __classcell__)r8   s   @r   r   r      sE   K 
 
 
 
,!G$/Lj& 
 
> F FP    D K KZ ( (T /s /sb 2 2h , ,\ ; ;z *q *qX ! !F s +H  D ( ($ ( (,       $ $  + +Z `dMQ;?
 
:obDL=~;
z"vHK) KyvHT-^}9Gr1   r   )r   r  urllib.parser   r@  
cmf.modelsr   cmf.includemodules.backbone.fieldsr   r   r4   r1   r   <module>r     s1    
  !    5cG'77 cGr1   