
    6i                    l    d dl Z d dlZd dlmZ d dlZd dlZd dlT d dlm	Z	  G d de	j
                  Z
dS )    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d0d            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d1deddfd            Zed-d            Zed-d            Zed2d            Zed3d            Zed4d            Zed5d            Ze	 	 d6d             Z d-d!Z!d-d"Z"d# Z#d7d$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 )8CmfBackbonePeer)getsgetlistslistcountdelete
setup_peer	log_applylog_listlog_mark_doneget_objpeer_project_nclist	full_syncNc                 z    | r8	 t          |           }|j        t          j        k    rdS n# t          $ r Y nw xY wdS )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   s`     	%%%c]]
 &&*>>>$9 ?     ws   + 
88c                 F   t           j                                         |pddg}t           j                            |          } t           j                            || ||          }t           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8)..!	 / 
 
 %//    0 
 
 	
    c                 :     t                      j        di | d S N )superr   selfr'   	__class__s     r   r   zCmfBackbonePeer.delete8   s%           r1   c                 Z    | j          d| j         d| j        o| j        j         | _        d S )N@ )backbone_instance_domainbackbone_instance_codepeer_projectcodenamer7   s    r   
_calc_namezCmfBackbonePeer._calc_name<   sJ    4 G Gt7R G G)Dd.?.DG G			r1   c                     | j         j        sd S | j         j        sd S |                     | j         j                   |                     | j         j                   d S )Ntask_filter)src_task_filter_bql
is_changedoldfull_sync_deletedvaluer   rA   s    r   _calc_src_task_filter_bqlz)CmfBackbonePeer._calc_src_task_filter_bql@   sk     '2 	F'+ 	F 	4+C+IJJJ 	4#;#ABBBBBr1   c                 N    t                                                      g dz   S )N)r<   r=   r>   src_task_filter_ubql)r5   save_preload_fields)r7   r8   s    r   rN   z#CmfBackbonePeer.save_preload_fieldsS   s4    ww**,, 0j 0j 0j j 	jr1   c                     |                                   |                                   t                      j        di |S r3   )rB   rK   r5   saver6   s     r   rP   zCmfBackbonePeer.saveW   sA    &&(((uww|%%f%%%r1   Fc                    t           j        rt                              d           d S t          j        rd S t          |t          j                  r| 	                    |||          S t          |t          j
                  r|                     |||          S t          |t          j                  r|                     |||          S t          |t          j                  r|                     |||          S t          |t          j                  r|                     ||          S t          |t          j                  r|                     |          S t                              d           d S )Nz_CmfBackbonePeer.obj_after_save_hook(): Skip write changelog due config.MODULE_BACKBONE_DISABLEDrD   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_newrE   s       r   obj_after_save_hookz#CmfBackbonePeer.obj_after_save_hook^   sy   * 	OOqs s sF? 	F c6>** 	9,,S,K,XXXV.// 
	9//\{/[[[V122 	9223R]2^^^V566 	977\Wb7cccV/00 	9++C>>>V677 	933C888 	p	
 	
 	
 	
 	
r1   c                    t           j        rt                              d           d S t          j        rd S t          |t          j        t          j	        f          r$| 
                    |j        |j        |          }n+t          |t          j                  r]t                              |j                  t          j        t          j	        fvrd S | 
                    |j        |j        |          }nt          |t          j                  rt          |j        j        t          j                  rW|j        j        r<t                              |j        j                  t          j        t          j	        fvrd S |j        j        }n:t          |j        j        t          j        t          j	        f          r|j        }nd S |sd S | 
                    |j        ||          }nt          |t          j                  r| 
                    |j        j        |j        j        |          }|sd S | 
                    |j        j        |j        j        |          }t/          |                              t/          |                    }nt3          t5          |          |          |sd S d|j        j        d}|D ]}t                              d|j         d           t                                          5  t                              ||j         |j        |          !                                 d d d            n# 1 swxY w Y   d S )NzdCmfBackbonePeer.obj_after_delete_hook(): Skip write changelog due to config.MODULE_BACKBONE_DISABLED
project_idobj_idrE   r   )actionr?   z7CmfBackbonePeer.obj_after_delete_hook(): add record id=z, action=deletebackbone_peer	obj_modelrk   obj_changes)"r   rR   rS   rT   rU   rV   rW   r)   rX   r`   _get_sync_peersrj   idrZ   cmfutilget_model_by_id	parent_idr\   parentrJ   r^   in_linkout_linksetintersection	TypeErrorr"   r?   jsoninfodisable_aclCmfBackboneLog
class_namerP   )	rd   re   rE   peerstask_idin_link_peersout_link_peersrp   r(   s	            r   obj_after_delete_hookz%CmfBackbonePeer.obj_after_delete_hook~   se   * 	OOvx x xF? 	FcFNF,>?@@ *	,''3>#&^i'jjEEV.// '	,&&s}55fnfN`=aaa''3>#-ep'qqEEV122 "	,#**F,=>> 

,..sz/CDDV^]c]oLpppF*.CJ,v~v?Q.RSS . ''3>'_j'kkEEV566 	,//;1{~' 0  M
 !  00<2|' 1  N
 &&33C4G4GHHEE DIIs+++ 	F HM
 
  	 	DLLjSVSYjjjkkk$$&&  %%"&!n6 +	 &  
 $&&&              	 	s   ?;MM
	M
	c                 z   |d S |j         |j        j        |j        j        d}t	          |t
          j                  r|j        j        |d<   |j        j        |d<   nt	          |t
          j	                  r|j
        j        |d<   nt	          |t
          j                  r|j        j        |d<   nt	          |t
          j                  r;|                    ddg           |j        j        j        |d<   |j        j        |d<   n5t	          |t
          j        t
          j        f          r|j        j        |d<   |S )N)r   r@   r?   login
user_localstatus_typerr   
logic_typelogic_prefix)r   r@   r|   r?   rW   r)   	CmfPersonr   r   	CmfStatusr   rX   rr   CmfListload_fieldsr   r   rZ   r\   )rd   re   obj_datas      r   _serialize_relation_objz'CmfBackbonePeer._serialize_relation_obj   s/   ;4 .HMHM
 
 c6+,, 	) #	HW%(^%8H\""V-.. 	) '*o&:H]##V^,, 	) V[HTNNV^,, 	)OO\>:;;;%(^%8%=H\"'*'7'<H^$$f/1EFGG 	) V[HTNr1   c                     i }h d}|                     |d          D ]7\  }}|j        s|j        |f|vr|dv r|dv r|j        dk    r.|                    d          rD|                    d          rZt          |t          j        j                  rzi }t          |t          j        j	                  rFd	|d
<   |r- fd|j
        D             |d<    fd|j        D             |d<   nc fd|D             |d<   nQt          |t          j        j                  r#d|d
<                        |j                  |d<   nd|d
<   |j        |d<   |||<   9|S )N>   rX   parent_taskrX   cmf_created_atrZ   
cmf_authorrZ   r   r`   ordernor\   r   rb   cmf_modified_atrb   cmf_modified_byT)rG   
is_defined>   r?   likesviewsrv   projectcmf_versioncache_fieldscmf_viewed_atstatus_closed_atstatus_modified_atstatus_in_progress_end)r   r   rb   _idcache_object_listr"   c                 :    g | ]}                     |          S r4   r   .0obj_rd   s     r   
<listcomp>z4CmfBackbonePeer._get_fields_data.<locals>.<listcomp>+  s(    0v0v0vW[1L1LT1R1R0v0v0vr1   appendedc                 :    g | ]}                     |          S r4   r   r   s     r   r   z4CmfBackbonePeer._get_fields_data.<locals>.<listcomp>,  s(    /t/t/tVZ0K0KD0Q0Q/t/t/tr1   removedc                 :    g | ]}                     |          S r4   r   r   s     r   r   z4CmfBackbonePeer._get_fields_data.<locals>.<listcomp>.  s(    -b-b-bTXc.I.I$.O.O-b-b-br1   rJ   object)itemsvisibler   endswith
startswithrW   cmffieldsCmfBackrefBase
CmfM2MBasechanges_appendedchanges_removedCmfRelationBaser   rJ   r|   )rd   re   changes_onlyfields_dataadd_model_fields
field_namefieldfield_changess   `       r   _get_fields_dataz CmfBackbonePeer._get_fields_data   s   
 

 

 

 "%lt!T!T 8	4 8	4J= cnj%AIY%Y%Y   & CCCZnHnHn""5)) $$X.. %!:;;  M%!677 4(5f% c0v0v0v0v_d_u0v0v0vM*-/t/t/t/t^c^s/t/t/tM),,-b-b-b-b\a-b-b-bM'**E3:#=>> 4(0f%),)D)DU[)Q)Qg&&(/f%).g&&3K
##r1   c                    |                      g dg ddd|gg          }t                              |          }g }|t          j        u rj|D ]f}|j        s
||n|j        j        }|r5t          j                            ||t          j
        |                    sQ|                    |           gnV|t          j        u rH|D ]E}|j        s
d }t          j                            |||d          s0|                    |           F|S )	N)rF   
sync_tasks	sync_docs)is_src_peer=Tpeer_project_idr   r   r&   )rr   ru   r&   T)rr   ru   r&   include_deleted)r
   rs   rt   r)   rX   r   rF   rJ   r   astliteral_evalappendr`   r   )	rd   rj   rk   rE   r   ro   result_peersr(   
doc_filters	            r   rq   zCmfBackbonePeer._get_sync_peers8  so   EEE...1BC0TU  W W ++F33	&& * * -8-Dkk$JbJh !!>//!","/<< 0   !
 !##D))))* &,,, * *~  "
)//(%$(	 0    ##D))))r1   c                 &   |                      |j        |j        |          }|sd S |p|j        }|rdnd|                     ||           d}|d         r|j        j        |d<   |                    dd	g           |j        d
k    r|j	        rd|d         v r	|d         d= |D ]}t                              dd|j         d|d          dt          |d                               t                                          5  t                              ||j        |j        |                                           d d d            n# 1 swxY w Y   |s|j        s|j        j        rt          j                            |g ddg          }|D ]+}	||	_        t          j                            |	d|           ,t          j                            |ddg          }
|
D ]/}||_        t          j                            |d|           ,d S d S d S )Nri   createupdater   rl   r   r   r?   epicr   ztask.sub4CmfBackbonePeer.obj_after_save_hook(): add record %sid=	, action=rl   	, fields=rm   )	log_levelis_dummyr   texttree_parentr   rv   r   order_byTrf   rE   r   st_sizerv   r   )rq   ru   rr   is_newr   r?   r|   r   r   r   rS   r}   r
   rs   r~   r)   r   r   rP   r   rG   rZ   rv   r   rg   r\   )rd   taskrf   rE   r   r   rp   r(   commentscommentattachments
attachments               r   rY   z%CmfBackbonePeer._task_after_save_hookc  s    ##t~dg[f#gg 	F, #)6hhh**4&j*II
 

 x  	"&).Kfn5666 J..49.;W_K`A`A`)&1  Ji$'iiK,AiiDQ\]eQfLgLgiik k k ((**  ))&*dodgcn *  dfff                	st} 	s1I 	s(--UUU*+ .  H
 $ p p!%&::7QUcn:oooo .334PYHZ3[[K) s s
$(
!&:::TXfq:rrrr	s 	s 	s 	ss ss   ;EE	E	c                 D   |j         dk    s>|j        s7t                              |j                  t
          j        t
          j        fvrd S |                    g d           t          |j
        d          r|j
        j        rd S |                     |j        |j        |          }|sd S |p|j        p|j        j        }|rdnd|                     ||           d}|d	         r|j        j        |d
<   |j        j        |d<   |D ]}t$                              dd|j         d|d          dt+          |d	                               t                                          5  t
                              ||j        |j        |                                           d d d            n# 1 swxY w Y   |j        s|j        j        s|rQt
          j                            |g d          }|D ]-}	||	_
        t
          j                            |	d|           ,d S d S )Nr   )zparent.is_dummyr   cmf_owner.namer   r   ri   r   r   r   r   r   r?   ru   r   r   r   rl   r   rm   )r   r   r   r   Tr   )r   r   rs   rt   ru   r)   rX   r`   r   hasattrrv   rq   rj   r   rH   r   r?   r|   rS   r}   rr   r
   r~   r   r   rP   rG   r\   r   rg   )
rd   r   rf   rE   r   r   rp   r(   r   r   s
             r   r[   z(CmfBackbonePeer._comment_after_save_hook  s    "" #''(9::v~vOa>bbbFbbbccc7>:.. 	7>3J 	F##)$# $ 
 

  	FGG73C3G"(6hhh**7V*LL
 

 x  	"),"3K'.'8'=K$  Jl'*ll{8/DlltT_`hTiOjOjlln n n ((**  ))&*g6HQXQ[it *  dfff                 	sW%5%@ 	s\ 	s .337KoKoKo3ppK) s s
$+
!&:::TXfq:rrrr		s 	ss ss   %;F,,F0	3F0	c                    |j         j        |j         j        k    rd S |j        j        |j        j        k    rd S |j         j        |j        j        k    rd S |s	|j        sd S |                     |j         j        |j         j        |          }|sd S |                     |j        j        |j        j        |          }t          |                              t          |                    }|sd S |	                    dg           d| 
                    |          |j        j        d}|d         r|D ]}t                              dd|j         d|d	          d
t          |d                               t                                           5  t$                              ||j        |j        |                                           d d d            n# 1 swxY w Y   d S d S )Nri   r   r   )rl   r   r?   r   r   r   r   rl   r   rm   )rw   rj   ru   rx   r   rq   rr   ry   rz   r   r   r?   r|   rS   r}   r
   rs   r~   r)   r   r   rP   )	rd   relation_optionsrf   rE   r   r   r   rp   r(   s	            r   r_   z0CmfBackbonePeer._relation_option_after_save_hook  sv   #.2B2J2TTTF$/3C3L3VVVF#.2B2K2VVVF 	 0 7 	F++'/:#+.# , 
 

  	F,,'0;#,/# - 
 

 M""//N0C0CDD 	F$$&6%7888 **+;<<$).
 
 x  		  Ju*-uuH8MuuX\]hiq]rXsXsuuw w w ((**  ))&*6F6Q/2 *   dfff	              		 		 s   ;GG	G	c                 n   t          |j        j        t          j        t          j        t          j        f          r|j        sd S t          |j        j        t          j                  r:|j        j        r|j        j        	                    d          sd S |j        j        }nRt          |j        j        t          j        t          j        f          r|j        }nt          ||j        j                  t          |j        d          r,|j        j                                         |j        j        rd S |j        s|sd S |                     |j        ||          }|sd S |                    dg           d|                     |          |j        j        d}|d         r|j        j        |d<   |j        j        |d	<   |D ]}|j        d
k    r4t,                              dd|j         d|j         d|j                    At,                              dd|j         d|d          dt5          |d                               t6                                          5  t                              ||j        |j        |                                           d d d            n# 1 swxY w Y   d S d S )N)zCmfTask:zCmfDocument:r   ri   r   r   )rl   r   content_pathr   r?   ru   i -1z:CmfBackbonePeer.obj_after_save_hook(): skip attachment: %sr   z, name=z, size=r   r   rl   r   rm   ) rW   rv   rJ   r)   rZ   rX   r`   rj   ru   r   r{   r   r   loadcontent_updatedrq   r   r   r   r|   r?   r   rS   r}   rr   r@   r
   rs   r~   r   r   rP   )rd   r   rf   rE   rk   r   rp   r(   s           r   r]   z+CmfBackbonePeer._attachment_after_save_hook  s9    *+1F4Ev~W]Wi3jkk 	s}  tI 	Fj'-v/@AA 	A$. j6G6Q6\6\]y6z6z &0FF
)/&.&BT1UVV 	A)FFJ
(9(?@@@:$j11 	&++--- ) 
 ) 	, 	F##!,# $ 
 

  	F 01222 **:66&N/
 
 x  	",/"6K'1';'@K$  %
22LLT`jm``JO``JL^``b b b Jo*-oo+h2GooRVWbckWlRmRmooq q q ((**  ))&*j6KT^Taoz *  dfff              	 	 s    ;J''J+	.J+	c                 b   |                      |j        |j                  }|sd S |p|j        }|rdnd|                     ||           d}|d         r|j        j        |d<   |D ]}t                              dd	|j         d
|d          dt          |d                               t                                          5  t                              ||j        |j        |                                           d d d            n# 1 swxY w Y   |rt          j        	                    |g ddg          }|D ]#}	t          j                            |	d           $t          j        	                    |g d          }
|
D ]%}t          j                            |d           $d S d S )Nrj   rk   r   r   r   r   r   r?   r   r   r   rl   r   rm   )r   r   r   r   r   rv   inline	cmf_ownerr   r   Trf   )r   r   rv   r   )rq   ru   rr   r   r   r?   r|   rS   r}   r
   rs   r~   r)   r   r   rP   rZ   r   rg   r\   )rd   docrf   r   r   r   rp   r(   r   r   r   r   s               r   ra   z$CmfBackbonePeer._doc_after_save_hook0  sW    ##s}SV#LL 	F+ #)6hhh**3Z*HH
 

 x  	"%(-K  Jh#&hh;x+@hh4P[\dPeKfKfhhj j j ((**  ))&*cnSVal *  dfff                	Z(--vvv*+ .  H
 $ W W&::7QU:VVVV .333GcGcGc3ddK) Z Z
&:::TX:YYYY	Z 	ZZ Zs   ;DD	D	c                 `   |                      |j        |j                  }|sd S |                    dg           d|                     |          d}|d         r|j        j        |d<   |j        j        |d<   |D ]}t                              dd	|j	         d
|d          dt          |d                               t                                          5  t                              ||j        |j	        |                                           d d d            n# 1 swxY w Y   d S d S )Nr   r   r   r   r   r?   ru   r   r   r   rl   r   rm   )rq   rj   ru   r   r   r?   r|   rS   r}   rr   r
   rs   r~   r)   r   r   rP   )rd   doc_historyr   r   rp   r(   s         r   rc   z,CmfBackbonePeer._doc_history_after_save_hook^  s    ##{/EkNc#dd 	F!1 2333 **;77
 

 x  	"-"2"7K'2'<'AK$ 
 
Jp+.pp;x3HppSWXcdlXmSnSnppr r r ((**  ))&*"-"8*~$/	 *  
 dfff              	 	

 
s   ;D  D$	'D$	methodmodelzcmf.models.BaseModel | Nonec                    |s| }|j         dk    rt                              ||          }d}t          |t          t
          f          s-t                              |d                   }|g|dd         }t          ||          } ||pg i |pi }	|r|j	        r|
                                 nT|j         dk    r5|                     |j         d| |||j        |j        |j                  }	nt!          |j                   |	S )u   
        !!! Локально работаем в той же транзакции
        :param method:
        :param model:
        :param args:
        :param kwargs:
        :param peer:
        :return:
        r   Nr      r   .)r  argsr'   r#   r   r$   )r"   inspectgetattr_staticrW   classmethodstaticmethodrs   get_obj_by_idgetattrrG   rP   _eva_api_callr   r#   r   r$   r   )
rd   r  r  r  r'   r(   method_attrself_method_funcresults
             r   r.   zCmfBackbonePeer.call_peer  s-     	E9!00??KEkK+FGG *--d1g66)QRR)!%00K [4:2A6<RAAF ) 

Y)##&&*55V55Djdh4? ' L LFF TY'''r1   c                    dd l }|j        dk    rPt          j                            |dg          }|                                D ]}|                                c S d S |j        dk    r^	 |                     ||j        |j	        |j
                  S # |j        $ r(}t                              d|||           Y d }~d S d }~ww xY wt          |j                  )Nr   r   rv   rr   r   r   )r#   r   r$   zFCmfBackbonePeer.peer_get_attachment_content(%s, %s): download error %s)requestsr"   r)   r\   r   get_contentread_eva_http_getr#   r   r$   RequestExceptionrS   errorr   )rd   attachment_idr   r(   r  r   filees           r   peer_get_attachment_contentz+CmfBackbonePeer.peer_get_attachment_content  s!   9-11]H:1VVJ"..00 # #yy{{"""# #Y)##+(( 
T_ ) ^ ^ ^, + + +\ $+ + + + + + + + ++
 TY'''s   ,'B 
CCCc                    dd l }|j        dk    r9t          j                            |dg          }|                    |           d S |j        dk    ra	 |                     |d|i|j        |j        |j	                  S # |j
        $ r(}t                              d|||           Y d }~d S d }~ww xY wt          |j                  )	Nr   r   rv   r  r   r  )filesr#   r   r$   zDCmfBackbonePeer.peer_put_attachment_content(%s, %s): upload error %s)r  r"   r)   r\   r   upload_file_eva_http_postr#   r   r$   r  rS   r  r   )rd   r  r   contentr(   r  r   r  s           r   peer_put_attachment_contentz+CmfBackbonePeer.peer_put_attachment_content  s   9-11]H:1VVJ""7+++++Y)##+)) !7+*# *    , + + +Z $+ + + + + + + + ++
 TY'''s   *B   
B2
B--B2c                     dd l }i }| |vr |                                }||_        ||| <   ||          }|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  sc     %%''))H(HO#+M%  '   r1   c                     |                     d          sd|z   }|                     ||                              | | dd| i          }|                                 |j        S )N/r#   r$   AuthorizationBearer )headers)r   r,  r   raise_for_statusr#  )rd   pathr#   r   r$   responses         r   r  zCmfBackbonePeer._eva_http_get  s    s## 	:D,,5Z,PPTTNDNN_6G6G6G$H U J J!!###r1   c                     |                     d          sd|z   }t          | | dd| i          }|r||d<   |r||d<    |                     ||          j        di |}|                                 d S )	Nr.  r0  r1  )r   r2  datar   r/  r4   )r   r0   r,  postr3  )	rd   r4  r#  r   r#   r   r$   post_kwargsr5  s	            r   r"  zCmfBackbonePeer._eva_http_post  s    s## 	:D$&7&7&78
 
 
  	*")K 	)#(K U3,,5Z,PPUddXcdd!!#####r1   c           	      R   |pi }d|d<   dt          t          j                              d||pg |pi d|d}	 |                     ||                              | d| |dd	| i
          }	n1# t
          $ r$}
t          d||t          |
                    d}
~
ww xY w|	j        s"t          d|	j        |	j	        |	j
        |	          |	                                }|                    d          rt          d|||          |d         rt          d|||          |d         }|S )u\   Адаптированный код, из нагрузочного тестирования.T
admin_modez2.2N)jsonrpccallidjsverr  r  r'   no_metaflagsr/  z/api/?m=r0  r1  )r|   r2  z&CmfBackbonePeer._eva_api_call(): errorzAPI call error r  abortz&CmfBackbonePeer._eva_api_call(): abortr  )struuiduuid1r,  r8  	ExceptionCmfErrorokstatus_codereasonr#  r|   r   )rd   r  r  r'   r@  r#   r   r$   r7  r5  r  json_resultr  s                r   r  zCmfBackbonePeer._eva_api_call  s    "l $*,,''JBl
 
$	Z00u0TTYY(((((*;E*;*;< Z  HH
  	Z 	Z 	ZCS&RUVWRXRXYYY	Z
 { 	q,h.BHOU]Uegopppmmoo??7## 	_CS&R]^^^w 	_CS&R]^^^X&s   7A0 0
B:BBc                    |                      ||g d          }	|	sCt          j                             |          }
|
st          d| d            | ||
          }	||	_        ||	_        ||	_        ||	_        ||	_        |	j	        r|	
                                 |	j        j        |	j        j        j        |	j        j        j        dS )	N)r>   r=   backbone_instance_namer<   r   rM   )backbone_instance_idr   r   rr   u   Проект не найден T)rA  )rM  r>   )rr   project_codeproject_name)r   r)   r/   	cmf_alertr=   rL  r<   r   rM   rG   rP   rr   r|   r>   r?   r@   )rd   rM  r=   rL  r<   r   r   rM   _kwargsr(   r>   s              r   r   zCmfBackbonePeer.setup_peer'  s     ww!5 `7 `7 `7  8 8  	]!,00O0DDL [MOMMUYZZZZ3,@|\\\D&<#&<#(@%&$8!? 	IIKKK', -27 -27
 
 	
r1   c                     dd g }n j                                         j         j                                          fd}g dd |t          j                  r_D ]9}t          j                            |d           |                    |           :t                        |t          j                  _dgd |t          j                  rD ]} 
                    |j        |j                  }|s&d	                     |d
          d}|j        j        |d<   |D ]u}t                               dd|j         dt%          |d                               t                              ||j        |j        |                                           vt                        |t          j                  t          j                            dd|gdd|ggg d          D ]$}t          j                            |d           %~g dd |t          j                  rID ]#}	t          j                            |	d           $t                        |t          j                  Idgd |t          j                  rD ]}	 
                    |	j        |	j                  }|s&d	                     |	d
          d}|	j        j        |d<   |D ]u}t                               dd|	j         dt%          |d                               t                              ||	j        |	j        |                                           vt                        |t          j                  g dd |t          j                  rID ]!}
t          j                            |
           "t                        |t          j                  Gd S d S )N  c                     | t           j        u r}n| t           j        t           j        fv rd }|                     j        |z   gdg          z  S )Nr   )rj   r&   r   r%   r   )r)   rX   r`   rb   r
   r   )r  r&   r   r  r7   
slice_sizestartrE   s     r   get_dataz+CmfBackbonePeer.full_sync.<locals>.get_dataL  s|     &&$6-v/HIIIZZ/ej01*+    F ZEMr1   )r   r   workflowr   Tr   ***r   r   Fr   r   r?   z*CmfBackbonePeer.full_sync(): add record %sr   z, action=update, fields=r   rm   rw   INrx   )rw   rx   relation_type)r&   r   )r   rY  tree_parent_idztree_parent.namer   )r   zcmf_modified_by.namezstatus.name)rF   r   rJ   r   r)   rX   r   rg   r   
cmf_commitrq   ru   rr   r   r?   r|   rS   r}   r
   r   r   rP   r^   r`   rb   )r7   rE   objsrX  tr   rp   r(   relationddhr   r  rV  rW  s   ``         @@@@r   r   zCmfBackbonePeer.full_syncC  s   
%0%<kk$BZB_B_BaBaBg!!###	 	 	 	 	 	 	 	 	 	( <;;hv~&& 	  &::14]h:iiiALLL hv~&& 	 hv~&& 	  ,,AD,QQ  '"33AE3JJ  '(fkF#!  DLLDYadYYDXAV<W<WYY[ [ [ ))&*al14]h *  dffff LLL) hv~&& 	. 055d+j$-EF;;; 6 
 
 	m 	mH "66xd`k6llll PPPhv)** 	 Q Q&::14:PPPPLLL hv)** 	 hv)** 	  ,,AD,QQ  '"33AE3JJ  '(fkF#!  DLLDYadYYDXAV<W<WYY[ [ [ ))&*al14]h *  dffff LLL) hv)** 	, >==hv011 	 ? ?&::2>>>>LLL hv011 	 	 	 	 	r1   c                 6   	
 d
g 	g ||n j                                         j        }                     ddg           d	 
fd	}d |t          j        |          rK	D ]#}t          j                            ||           $t                        |t          j        |          Kdd	g |t          j	                  rI	D ]#}t          j                            ||           $t                        |t          j	                  Id |t          j
                  rI	D ]#}t          j                            ||           $t                        |t          j
                  Id
 t          j                            dg j                  D             }dddg |t          j        dd|gd          rQ	D ]#}t          j                            ||           $t                        |t          j        dd|gd          Od S d S )NrT  rM  r   Tc                 z    t          |z   gdgdd          }|r
j        |d<    | j        di |z  S )Nr   T)r&   r   r%   r   cmf_deletedr   rj   r4   )r0   r   r
   )	r  r&   by_project_idr'   r   r  r7   rV  rW  s	       r   rX  z3CmfBackbonePeer.full_sync_deleted.<locals>.get_data  su     ej01*+  $  F  <'+';|$UZ))&))FZEMr1   r   )r&   rD   rv   c                 &    g | ]}|j         j        S r4   )
src_obj_idrJ   )r   rlos     r   r   z5CmfBackbonePeer.full_sync_deleted.<locals>.<listcomp>  s)       #-   r1   ri  )r   rM  rw   rx   rr   r[  F)r&   rg  )NT)rF   r   rJ   r   r)   rX   r   r   r^  rZ   r\   CmfBackboneObjMappingr
   rM  r^   )r7   rE   rX  r`  carelations_idsrr   r  rV  rW  s   `       @@@@r   rI   z!CmfBackbonePeer.full_sync_deleted  s   
%0%<kk$BZB_B_BaBaBg02CDEEE	 	 	 	 	 	 	 	 	 	( hv~k::: 	 Y Y&<<QK<XXXXLLL hv~k::: 	 hv()) 	 Y Y&<<QK<XXXXLLL hv()) 	 hv+,, 	 Y Y&<<QK<XXXXLLL hv+,, 	 9U9Z9Z >!%!: :[ :
 :
    Z(hv/t]8Schiii 	 Y Y&<<QK<XXXXLLL hv/t]8Schiii 	 	 	 	 	r1   c                    t                               d| j        d|           |                     dg           t                              |dgdd| j        g          }|sd	S d
|j        j        |                     |          d}t          |t          j        t          j        f          r|j        j        |d<   t          d	|j        |j        j        |j        j        |          }t                               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   rZ  r   r   r   Nr   )rl   r?   r   ru   rr   ro   rk   datetimerp   z&CmfBackbonePeer.get_obj(%s): result %s)rS   r}   r?   r   rs   r  r   r|   r   rW   r)   rZ   r\   ru   r0   r   rr   r   debug)r7   rk   rR  re   r   r  s         r   r   zCmfBackbonePeer.get_obj  s+   @ 	-ty,V,,	H 	H 	H!2 3444 ##FE7IsTXThCi#jj 	FHM++C00
 

 cF-v/CDEE 	7$'M$6H[!n6;(- 
 
 
 	4di	I 	I 	Ir1   c                 x    d t           j                            dd| gdd|pg gg dg|g d          D             S )	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: [
                                ...
                            ]
                        }
                    },
                },
            },
            ...
        ]
        c           	          g | ]A}t          |j        |j        |j        |j                                        |j                   BS )rr  )r0   rr   ro   rk   r   	isoformatrp   )r   items     r   r   z,CmfBackbonePeer.log_list.<locals>.<listcomp>[  s`     
 
 
  7.{,6688 ,  
 
 
r1   rn   r   rk   zNOT IN)statusr   queued)r   ro   rk   rp   )r&   r%   r   )r)   r   r   )r7   r%   skip_idsrR  s       r   r   zCmfBackbonePeer.log_list/  st    X
 
 -33$c40xR8---/ OOO 4 Q Q
 
 
 	
r1   c                    |D ]=}t                               d| j        d|                    d          d|                    d                     |d         }t          j                            |dg          }|d         }|dv rd	|_        |                                 |d
v rFd|_        |xj        dz  c_        |                    d          |_	        |
                                 d|_        |xj        dz  c_        d| |_	        |
                                 t                               d||           ?dS )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")=rr   z, log_mark.get("status")=ry  error_countr  )successskipsynced)failfailedr  
error_textzUnknown apply status: zBCmfBackbonePeer.log_mark_done(): unknown apply status %s for id %sN)rS   rt  r?   r   r)   r   ry  r   r}  r  rP   rT   )r7   log_mark_listrR  log_marklog_idlogry  s          r   r   zCmfBackbonePeer.log_mark_donel  sU    & 	v 	vHMMGC8<<%%CC(,,x*@*@CCE E E d^F'++v}o+NNCh'F,,,%


:%%%
1$!)l!;!;



 &
1$!B&!B!B


 dflntuuuu+	v 	vr1   c                       e Zd ZdZdS )CmfBackbonePeer._ApplySkipErroru<   Пропускаем применение измененийN)__name__
__module____qualname____doc__r4   r1   r   _ApplySkipErrorr    s        JJJJr1   r  c                    |                      g d           t          j        }g }|D ]L}t                              d| j        d|                    d          d|                    d          d|                    d	          d
|                    di                               d          dt          |                    di                               dg                     
           t                              d| j        |           d}d}d}d}		 dt          _        |d         }|d         }|d	         }t          
                    |          }
|o|
                    |dd| j        g          }	|	r|	                                 |d         d         dk    r|	                                 n|d         d         dv r|
t          j        u od|d         d         v }|r'|d         d                             d          d         }|                     |	|d         d         |d         d                    |	                                 d|d         d         v r|d         d         d         d         |	_        t)          |	t          j                  r|	j        rt          j                            |	j        t          j                  }|D ]}|                                 d|	_        |	|	j        _        |	j        |	j        _        |	j                                         |r||	_        |	j        r|	                                 ntA          d|j!        d                   d}ni|d         d         dk    r>|dv rK|d         d         }t          "                    || j                   }|s| #                    d!| d"          n| j        } |
|#          }	|                     |	|d         d         |d         d                    |d$k    r|	j$        r|t          %                    |	j$                  t          j&        u rQt          j                            |	j$        |	j'        %          D ]%}|j'         d&|_'        |                                 &|	                                 |	j(        j)        }d}n| #                    d'|           tU          ||||	o|	j        j)        |(          }t)          |	t          j+                  r|	j,        j)        |d)<   |-                    |           n# | j#        $ rZ}|-                    tU          ||||	o|	j        j)        d*(                     t          .                    d+|||           Y d}~nd}~wt^          $ r t          0                    d,|                    d                     |-                    tU          |                    d          |                    d          |                    d	          d-tc          j2                    .                     Y nw xY w|t          _        n# |t          _        w xY wtg                       N|S )/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_guestrq  z/CmfBackbonePeer.log_apply(%s): apply changes %szchange change.get("id")=rr   z, change.get("obj_model")=ro   z, change.get("obj_id")=rk   z., change.get("obj_changes", {}).get("action")=rp   rl   z7,list(change.get("obj_changes", {}).get("fields", []))=r   NTr   r   )rr   r&   r   )r   r   r   rJ   rl   r   )ru   r   zInvalid actionr~  r   )rZ   r\   rb   ru   )r   zparent z absent)rv   r`   )r   r@   u    (старый)zobj not found )rr   ro   rk   obj_codery  r   r  z7CmfBackbonePeer.log_apply(): skip record %s, obj %s: %sz2CmfBackbonePeer.log_apply(): apply record %s errorr  )rr   ro   rk   ry  r  )4r   rU   rV   rS   r}   r?   r   r
   rt  rs   get_model_by_namer>   save_preparer   r)   r`   pop_apply_obj_changesrP   r   rW   rb   has_publishedru   system_personcur_workflowrv   cur_published_versiondoc_version	save_datar   rG   r   rp   r  r  r]  rt   r/   r@   rr   r|   r0   r\   r   r   rT   rE  	exception	traceback
format_excr^  )r7   changes_listrR  g_backbone_sync_bkr  change	change_idro   rk   re   r  is_doc_text_changedchanged_textunpublished_in_work_by_systemrc  sync_statusru   rv   r   result_datar  s                        r   r   zCmfBackbonePeer.log_apply  s-   r 	hhh 	 	j 	j 	j_" {	 {	FLLA49L&**T** L Lvzz+/F/F L L6::V^K_K_ L LJJ}b1155h??L L

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

.x8<PPP.3v7I.I.wfX^_lXmnvXwNw+. `+1-+@+J+N+Nv+V+VW^+_L//!6x!@P]I^_gIh 0 j j j


 -}0Eh0OOO282G2QRc2del2mC/)#v/HII 7cN_ 7@F@Y@^@^.1m /0o	 A_ A" A" = +H !0 !0B$&IIKKKK37 0CF
 @9<
 6 #
 4 4 6 6 6. 4'3CH> ,MMOOO ))96;Mh;WXXX"+KKM*84@@ $YYY$*=$9+$F	!(!6!6y$J[!6!\!\% U"&"6"67S7S7S7S"T"TTU "&!2%v...C++VM28<VMEZ[cEd , f f f M11c6H1WMdMdehewMxMx  }C  }N  NN  NN#)#5#:#:sGY`c`h#:#i#i ' 'C*-('C'C'CCHHHJJJJHHJJJ !V[F"+KK ../H/H/HIII" '! 2SX]&   c6#788 ?25',K/k****' q q qd '! 2SX]!       Y[dflnopppppppp 	 	 	!!"VX^XbXbcgXhXhiiidzz$''$jj55!::h//!(355       	 #5"44444LLLLs?   PT86Y8
YAVYB,YYYYY$c           	         |d S |d         }t                               |          }|s&t                              d|  d| d| d           d S t	          |t
          j        j                  s%t                              d|  d| d|            d S |                    d          }|                    d          }d }|d	k    rI|                    d
          }|r|                    |          }|s|r|                    |          }nV|dk    r4|r|                    |          }|s|r|                    |          }n|dk    rG|r t          j	                            |          }|s"|r t          j	                            |          }n|dk    r|                    |          }n|dk    r!d|v r|                    |d                   }n|dk    r| j
        }n}g }	t	          |t          j        t          j        t          j        t          j        f          s&d|j        v r|	                    dd| j
        g           |r|                    ||	          }|s!t                              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CmfWorkflowrZ   rr   rN  r/   r   r   )r@   r&   z): not mapped)rs   r  rS   rT   
issubclassr   r)   CmfModelr   r  r>   r   CmfActivityCmfPersonGroupCmfTagr   r   )
r7   r   	obj_fieldobj_class_namero   obj_namer  re   r   
obj_filters
             r   _map_object_valuez!CmfBackbonePeer._map_object_valueN  s   4!,/--n==	 	OOssHssWesssu u u4)SZ%899 	OOjjHjj_hjjl l l4<<''<<''[((LL))E 1mm%m00 38 3mmm22000 3mmm22 38 3mmm22~-- =)--8-<< =8 =)--8-<<},,--X-..CC|++xmmx~m66|++#CC J (*-	  
G  9#333!!9c43D"EFFF Fmm*mEE 	iOODT"g"gPX"g"g"ghhh
r1   c                    d|v r*|                      |d         d                   }|r||_        |                                 d|v r*|                      |d         d                   }|r||_        d|v r*|                      |d         d                   }|r||_        |                                 d|v rd}t          |t          j                  r!|                      |d         d                   }|sh|d         d         }|rVt          	                    |
                    d          |
                    d          |
                    d	          
          nd}||_        |                                 dS ) activityrJ   r   rY  ry  Nr@   r?   r   )r@   r?   r   )r  r  _calc_scheme_wfr   rY  _calc_workflowrW   r)   r`   r   r   ry  _calc_status)	r7   re   fields_changesrl   r  r   rY  ry  status_datas	            r   _apply_wf_logiczCmfBackbonePeer._apply_wf_logic  s    ''--nZ.H.QRRH (' 	>))//|0LW0UVVJ ,!+''--nZ.H.QRRH ('~%%F#v122 S//x0H0QRR +,X6w? !+))$00{v7N7N\g\k\kly\z\z *   &*   CJr1   c                     |dk    ro|j         sj|                    di                               d          }|rAd|                    d           d|                    d           d|j         |_        d S d S d S d S )	Nr   r   rJ   u   <p>Автор: r@   z &lt;r   z&gt;</p><br>)r   r   r   )r7   re   r  rl   cmf_author_datas        r   _add_comment_metaz!CmfBackbonePeer._add_comment_meta  s    Xcn,00rBBFFwOOO } }o&9&9&&A&A||H[H[\cHdHd||rurz||  } }r1   c           
         d}|                                 D ]s\  }}t          |t          j        t          j        f          r|dv rd}3|j                            |          }|s*t                              d|  d| d|j	         d           yt          ||          }|d         }	|	d	k    rt          |||d	                    |	d
k    rd }
|                    d	          0d|d	         v r&t                              |d	         d                   }
|j	        dk    r?|dk    r9|
r7|
t          j        ur)|
                    |d	         d         | j                  }n|                     |d	         |          }|s+|j        s$|                     d| d| d|d	                    t          |||           |	dk    rd	|v rLg }|d	         D ]0}|                     ||          }|r|                    |           1t          |||           d|v r9|d         D ]0}|                     ||          }|r|                    |           1d|v r9|d         D ]0}|                     ||          }|r|                    |           1u|r|                     |||           t          |t          j                  r|                     |||           d S d S )NF>   ry  r  rY  	scheme_wfr   Tr  z._apply_obj_changes(): field z not found in z. Field changes lost.r"   rJ   r   r   r`   r   r@   )r@   r   )r  zskip apply z', object not mapped for required field z, r   r   r   r  )r   rW   r)   rX   r`   r   r   rS   rT   r   r  setattrrs   r  r/   r>   r  nullabler  r   remover  rZ   r  )r7   re   r  rl   has_wf_changesr   
field_datar   r  field_data_typevalue_model	value_objrJ   r   
mapped_objs                  r   r  z"CmfBackbonePeer._apply_obj_changes  s   &4&:&:&<&< 3	9 3	9"J
#0BCDD  XQ JQ JQ "&JNN:..E  , ,* , ,TWTb , , ,- - - Z00I )0O'))ZG)<==== H,,">>'**6<:V]K^;^;^")";";Jw<OP\<]"^"^K>]22z]7R7RWb7Rgr  {A  {L  hL  hL +'08 $ 1 !0 ! !II
 !% 6 6z'7JV_ 6 ` `I  w); w..ucuuR\uu`jkr`suuw w wZ3333 M11j((E$.w$7 5 5%)%;%;HPY%;%Z%Z
% 5!LL444CU333++$.z$: 9 9%)%;%;HPY%;%Z%Z
% 9%,,Z888
**$.y$9 9 9%)%;%;HPY%;%Z%Z
% 9%,,Z888 	E  nV DDDc6,-- 	G""3v"FFFFF	G 	Gr1   )N)NNNNN)FN)F)NNNN)NF)NNF)NNNNF)NNNNNF)NNNNNNN)NN).r  r  r  api_methodsr  r   r   r   rB   rK   rN   rP   r
  rg   r   r   r   rq   rY   r[   r_   r]   ra   rc   rB  r.   r  r$  r,  r  r"  r  r   r   rI   r   r   r   rE  r  r   r  r  r  r  __classcell__)r8   s   @r   r   r      s         K 
 
 
 \
 
 
 
 \
,! ! ! ! !G G GC C C&j j j j j& & & & & 
 
 
 [
> F F F [FP     [ D K K K [KZ ( ( ( [(T /s /s /s [/sb ,s ,s ,s [,s\ , , , [,\ : : : [:x +Z +Z +Z [+ZZ ! ! ! [!F  s +H    [D ( ( ( [($ ( ( ( [(,    \       [  $ $ $ [$  + + + [+Z `dhl
 
 
 [
6m m m m^< < < <|= = =~;
 ;
 ;
 ;
z"v "v "vHK K K K K) K K Ky y yvH H H HT- - - -^} } } }9G 9G 9G 9G 9G 9G 9G 9Gr1   r   )r   r  urllib.parser   rC  
cmf.modelsr   cmf.includemodules.backbone.fieldsr   r   r4   r1   r   <module>r     s    



     ! ! ! ! ! !          5 5 5 5 5 5~G ~G ~G ~G ~G'7 ~G ~G ~G ~G ~Gr1   