
    ?Rh                     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                   j    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             Zed             Zed,d            Zed             Zed             Zed             Zed             Zed             Zed+deddfd            Zed*d            Zed*d            Zed-d            Zed.d            Zed/d            Zed0d            Ze	 	 d1d            Zd Zd  Z d2d!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 )3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                 D   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)kwargspeer)
modelsCmfAccessListcheck_admin_moder   r   CmfBackboneInstancePeer	call_peer
CmfProjectdict)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.delete7   s%           r0   c                 Z    | j          d| j         d| j        o| j        j         | _        d S )N@ )backbone_instance_domainbackbone_instance_codepeer_projectcodenamer6   s    r   
_calc_namezCmfBackbonePeer._calc_name;   sJ    4 G Gt7R G G)Dd.?.DG G			r0   c                     | j         j        r@| j         r0t          j                            | j         j                  | _        d S d | _        d S d S N)src_task_filter_ubql
is_changedr(   CmfTaskubql2bqlvaluesrc_task_filter_bqlr@   s    r   _calc_src_task_filter_bqlz)CmfBackbonePeer._calc_src_task_filter_bql?   sW    $/ 	0( 0+1>+B+B4C\Cb+c+c(((+/(((		0 	0r0   c                 N    t                                                      g dz   S )N)r;   r<   r=   rD   )r4   save_preload_fields)r6   r7   s    r   rL   z#CmfBackbonePeer.save_preload_fieldsF   s4    ww**,, 0j 0j 0j j 	jr0   c                 ^    |                                    t                      j        di |S r2   )rA   r4   saver5   s     r   rN   zCmfBackbonePeer.saveJ   s/    uww|%%f%%%r0   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#          |          |          )Nz_CmfBackbonePeer.obj_after_save_hook(): Skip write changelog due config.MODULE_BACKBONE_DISABLED)r   MODULE_BACKBONE_DISABLEDloggingwarninggbackbone_sync
isinstancer(   rF   _task_after_save_hook
CmfComment_comment_after_save_hookCmfAttachment_attachment_after_save_hookCmfRelationOption _relation_option_after_save_hook	TypeErrorr"   )clsobjforce_is_news      r   obj_after_save_hookz#CmfBackbonePeer.obj_after_save_hookQ   s   * 	OOqs s sF? 	Fc6>** 	K,,S,???V.// 	K//\BBBV122 	K223EEEV566 	K77\JJJS		3'''r0   c                 6   t           j        rt                              d           d S t          j        rd S t          |t          j                  r#| 	                    |j
        |j                  }nt          |t          j                  rPt                              |j                  t          j        urd S | 	                    |j
        |j                  }nt          |t          j                  rt          |j        j        t          j                  rK|j        j        r0t                              |j        j                  t          j        urd S |j        j        }n.t          |j        j        t          j                  r|j
        }nd S | 	                    |j
        |          }nt          |t          j                  r| 	                    |j        j
        |j        j                  }|sd S | 	                    |j        j
        |j        j                  }t-          |                              t-          |                    }nt1          t3          |          |          |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task_idr   )actionr>   z7CmfBackbonePeer.obj_after_delete_hook(): add record id=z, action=deletebackbone_peer	obj_modelobj_idobj_changes)!r   rP   rQ   rR   rS   rT   rU   r(   rF   _get_sync_peersrd   idrW   cmfutilget_model_by_id	parent_idrY   parentrH   r[   in_linkout_linksetintersectionr]   r"   r>   jsoninfodisable_aclCmfBackboneLog
class_namerN   )r^   r_   peersre   in_link_peersout_link_peersrk   r'   s           r   obj_after_delete_hookz%CmfBackbonePeer.obj_after_delete_hooke   s(   * 	OOvx x xF? 	Fc6>** %	,''3>36'RREEV.// "	,&&s}55V^KK''3>3='YYEEV122 	,#**F,=>> 

,..sz/CDDFNZZF*.CJ,fn== .''3>7'SSEE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   ;LL	L	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)rz   r?   r>   login
user_localstatus_typerm   
logic_typelogic_prefix)rz   r?   rv   r>   rU   r(   	CmfPersonr   r   	CmfStatusr   rF   rm   CmfListload_fieldsr   r   rW   rY   )r^   r_   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r0   c                     i }h d}|                     |d          D ]'\  }}|j        s|j        |f|vr|dv r|                    d          r4|                    d          rJt          |t          j        j                  rji }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<   |||<   )|S )N>   rF   parent_taskrF   cmf_created_atrW   
cmf_authorrW   r   rY   r   T)rE   
is_defined>   r>   likesviewsrq   projectcmf_versioncache_fieldscmf_viewed_atcmf_modified_atcmf_modified_bystatus_closed_atstatus_modified_atstatus_in_progress_end_idcache_object_listr"   c                 :    g | ]}                     |          S r3   r   .0obj_r^   s     r   
<listcomp>z4CmfBackbonePeer._get_fields_data.<locals>.<listcomp>  s(    0v0v0vW[1L1LT1R1R0v0v0vr0   appendedc                 :    g | ]}                     |          S r3   r   r   s     r   r   z4CmfBackbonePeer._get_fields_data.<locals>.<listcomp>	  s(    /t/t/tVZ0K0KD0Q0Q/t/t/tr0   removedc                 :    g | ]}                     |          S r3   r   r   s     r   r   z4CmfBackbonePeer._get_fields_data.<locals>.<listcomp>  s(    -b-b-bTXc.I.I$.O.O-b-b-br0   rH   object)itemsvisiblerz   endswith
startswithrU   cmffieldsCmfBackrefBase
CmfM2MBasechanges_appendedchanges_removedCmfRelationBaser   rH   rv   )r^   r_   changes_onlyfields_dataadd_model_fields
field_namefieldfield_changess   `       r   _get_fields_dataz CmfBackbonePeer._get_fields_data   s   
 
 
 
 "%lt!T!T 6	4 6	4J= cnj%AIY%Y%Y   & ""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
##r0   c                    |                      dgg ddd|gg          }g }|D ]]}|j        r?t          j                            ||t          j        |j        j                            sH|                    |           ^|S )NrI   )is_src_peer=Tpeer_project_idr   r   filter)rm   rp   r   )	r
   rI   r(   rF   r   astliteral_evalrH   append)r^   rd   re   r{   result_peersr'   s         r   rl   zCmfBackbonePeer._get_sync_peers  s    )*...1BC0TU  W W  	& 	&D' ~++(+D,D,JKK ,   
 %%%%r0   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 )Nrc   createupdater   rf   r   r   r>   epicr   ztask.sub4CmfBackbonePeer.obj_after_save_hook(): add record %sid=	, action=rf   	, fields=rg   )	log_levelis_dummyr   texttree_parentr   )rq   r   order_byTr`   r   st_sizerq   r   )rl   rp   rm   is_newr   r>   rv   r   r   r   rQ   rw   r
   rn   rx   r(   ry   rz   rN   r   rE   rW   rq   r   ra   rY   )r^   taskr`   r{   r   rk   r'   commentscommentattachments
attachments              r   rV   z%CmfBackbonePeer._task_after_save_hook&  s    ##t~tw#OO 	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                	Zt} 	Z1I 	Z(--UUU*+ .  H
 $ W W!%&::7QU:VVVV .334PYHZ3[[K) Z Z
$(
!&:::TX:YYYY	Z 	Z 	Z 	ZZ Zs    ;EE	E	c                    |j         dk    s.|j        s't          |j                                      d          sd S |                    ddg           |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|rPt(          j                            |ddg          }|D ],}||_        t(          j                            |d           +d S d S )Nr   CmfTask:zparent.is_dummyr   rc   r   r   r   r   r   r>   rp   r   r   r   rf   r   rg   r   r   r   Tr   )r   r   strrp   r   r   rq   rl   rd   r   oldr   r>   rv   rQ   rw   rm   r
   rn   rx   r(   ry   rz   rN   rE   rY   r   ra   )	r^   r   r`   r{   r   rk   r'   r   r   s	            r   rX   z(CmfBackbonePeer._comment_after_save_hookX  s    !!W%5!SAR=S=S=^=^_i=j=j!F.>???>" 	F##w/A7K\#]] 	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                 	ZW%5%@ 	Z\ 	Z .337ES\K]3^^K) Z Z
$+
!&:::TX:YYYY		Z 	ZZ Zs   ?;FF
	F
	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| 	                    |          |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 )Nrc   r   )rf   r   r>   r   r   r   r   rf   r   rg   )rr   rd   rp   rs   r   rl   rm   rt   ru   r   r>   rv   rQ   rw   r
   rn   rx   r(   ry   rz   rN   )r^   relation_optionsr`   r|   r}   r{   rk   r'   s           r   r\   z0CmfBackbonePeer._relation_option_after_save_hook  sX   #.2B2J2TTTF$/3C3L3VVVF#.2B2K2VVVF 	 0 7 	F++'/:DTD\D_ , a a 	F,,'0;EUE^Ea - c cM""//N0C0CDD 	F **+;<<$).
 
 x  		  Ju*-uuH8MuuX\]hiq]rXsXsuuw w w ((**  ))&*6F6Q/2 *   dfff	              		 		 s   7;F>>G	G	c                    t          |j        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        }nFt          |j        j        t          j                  r|j        }nt          ||j        j                  |j        j
                                         |j        j
        rd S |j        s|sd S |                     |j        |          }|sd S 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t/          |d                               t0                                          5  t                              ||j        |j        |                                           d d d            n# 1 swxY w Y   d S d S )Nr   rc   r   )rf   r   content_pathr   r>   rp   i -1z:CmfBackbonePeer.obj_after_save_hook(): skip attachment: %sr   z, name=z, size=r   r   rf   r   rg   )rU   rq   rH   r(   rW   rF   rd   rp   r   r]   r   loadcontent_updatedrl   r   r   rv   r>   r   rQ   rw   rm   r?   r
   rn   rx   ry   rz   rN   )r^   r   r`   re   r{   rk   r'   s          r   rZ   z+CmfBackbonePeer._attachment_after_save_hook  s    *+1F4Ev~3VWW 	_i_t 	Fj'-v/@AA 	A$. j6G6Q6\6\]g6h6h  '1GG
)/@@ 	A *GGJ
(9(?@@@"'')))% 	F
 ) 	, 	F##z/Dg#VV 	F**: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   ;I$$I(	+I(	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_staticrU   classmethodstaticmethodrn   get_obj_by_idgetattrrE   rN   _eva_api_callrz   r#   r   r$   r   )
r^   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'''r0   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   rq   rm   r   r   )r#   r   r$   zFCmfBackbonePeer.peer_get_attachment_content(%s, %s): download error %s)requestsr"   r(   rY   r   get_contentread_eva_http_getr#   r   r$   RequestExceptionrQ   errorr   )r^   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   rq   r   r   r  )filesr#   r   r$   zDCmfBackbonePeer.peer_put_attachment_content(%s, %s): upload error %s)r   r"   r(   rY   r   upload_file_eva_http_postr#   r   r$   r  rQ   r  r   )r^   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%  '   r0   c                     |                     d          sd|z   }|                     ||                              | | dd| i          }|                                 |j        S )N/r#   r$   AuthorizationBearer )headers)r   r  r   raise_for_statusr  )r^   pathr#   r   r$   responses         r   r  zCmfBackbonePeer._eva_http_get8  s    s## 	:D,,5Z,PPTTNDNN_6G6G6G$H U J J!!###r0   c                     |                     d          sd|z   }t          | | dd| i          }|r||d<   |r||d<    |                     ||          j        di |}|                                 d S )	Nr  r  r  )r   r  datar
  r  r3   )r   r/   r  postr  )	r^   r  r  r
  r#   r   r$   post_kwargsr  s	            r   r  zCmfBackbonePeer._eva_http_postA  s    s## 	:D$&7&7&78
 
 
  	*")K 	)#(K U3,,5Z,PPUddXcdd!!#####r0   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=r  r  )rv   r  z&CmfBackbonePeer._eva_api_call(): errorzAPI call error r  abortz&CmfBackbonePeer._eva_api_call(): abortr   )r   uuiduuid1r  r"  	ExceptionCmfErrorokstatus_codereasonr  rv   r   )r^   r   r   r&   r*  r#   r   r$   r!  r  r  json_resultr   s                r   r   zCmfBackbonePeer._eva_api_callR  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   rD   )backbone_instance_idr   r   rm   u   Проект не найден T)r+  )r6  r=   )rm   project_codeproject_name)r   r(   r.   	cmf_alertr<   r5  r;   r   rD   rE   rN   rm   rv   r=   r>   r?   )r^   r6  r<   r5  r;   r   r   rD   _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
 
 	
r0   c                    	
 d
d 	g } j                                          	 
fd}dgd |            rS	D ]8}t          j                            |d           |                    |           9t                        |            Sdgd |            r	D ]}                     |j        |j	                  }|s d S d	 
                    |d
          d}|j        j        |d<   |D ]u}t                              dd|j	         dt          |d                               t                              ||j        |j	        |                                           vt                        |            t          j                            dd|gdd|ggg d          D ]#}t          j                            |d           $d S )Ni  c                      t           j                            j        j                                         z   gdg          z  S )Nr   )rd   r   r   r%   r   )r(   rF   r
   r   rI   r   )r   r   r6   
slice_sizestarts   r   get_dataz+CmfBackbonePeer.full_sync.<locals>.get_data  s^    ^((//4466ej01*+ )  F ZEMr0   r   r   Tr   ***rc   r   Fr   r   r>   z*CmfBackbonePeer.full_sync(): add record %sr   z, action=update, fields=r   rg   rr   INrs   )rr   rs   relation_type)r   r   )r   r   r(   r   ra   r   
cmf_commitrl   rp   rm   r   r>   rv   rQ   rw   r
   ry   rz   rN   r[   )r6   tasksr@  tr{   rk   r'   relationr   r   r>  r?  s   `       @@@@r   r   zCmfBackbonePeer.full_sync  so   
!!###
	 
	 
	 
	 
	 
	 
	 
	 
	 hjj 	    &::14:PPPQLLL	 hjj 	 hjj 	  ,,QT,RR FF '"33AE3JJ  '(fkF#!  DLLDYadYYDXAV<W<WYY[ [ [ ))&*al14]h *  dffff LLL) hjj 	. 055e,z4.GH;;; 6 
 
 	T 	TH "66xd6SSSS		T 	Tr0   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   rA  r   r   r   Nr   )rf   r>   r   rp   rm   ri   rj   datetimerk   z&CmfBackbonePeer.get_obj(%s): result %s)rQ   rw   r>   r   rn   r   r   rv   r   rU   r(   rW   rY   rp   r/   rz   rm   r   debug)r6   rj   r;  r_   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r0   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 )rJ  )r/   rm   ri   rj   r   	isoformatrk   )r   items     r   r   z,CmfBackbonePeer.log_list.<locals>.<listcomp>C  s`     
 
 
  7.{,6688 ,  
 
 
r0   rh   r   rj   zNOT IN)statusr   queued)r   ri   rj   rk   )r   r%   r   )r(   ry   r   )r6   r%   skip_idsr;  s       r   r   zCmfBackbonePeer.log_list  st    X
 
 -33$c40xR8---/ OOO 4 Q Q
 
 
 	
r0   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")=rm   z, log_mark.get("status")=rQ  error_countr   )successskipsynced)failfailedr   
error_textzUnknown apply status: zBCmfBackbonePeer.log_mark_done(): unknown apply status %s for id %sN)rQ   rL  r>   r   r(   ry   rQ  r   rU  r[  rN   rR   )r6   log_mark_listr;  log_marklog_idlogrQ  s          r   r   zCmfBackbonePeer.log_mark_doneT  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r0   c                       e Zd ZdZdS )CmfBackbonePeer._ApplySkipErroru<   Пропускаем применение измененийN)__name__
__module____qualname____doc__r3   r0   r   _ApplySkipErrorra  x  s        JJJJr0   rf  c                 T	   |                      g d           t          j        }g }|D ]}}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|	                                 np|d         d         dv rE|                     |	|d         d         |d         d                    |	                                 nt!          d|j        d                   d}n|d         d         dk    r|dv rK|d         d         }t                              || j                  }|s|                     d| d          n| j        } |
|          }	|                     |	|d         d         |d         d                    |	                                 |	j        j        }d}n|                     d |           t-          ||||	o|	j        j        |!          }t/          |	t0          j                  r|	j        j        |d"<   |                    |           n# | j        $ rZ}|                    t-          ||||	o|	j        j        d#!                     t                              d$|||           Y d}~nd}~wt:          $ r t                              d%|                    d                     |                    t-          |                    d          |                    d          |                    d	          d&t?          j                     '                     Y nw xY w|t          _        n# |t          _        w xY wtC                       |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_guestrI  z/CmfBackbonePeer.log_apply(%s): apply changes %szchange change.get("id")=rm   z, change.get("obj_model")=ri   z, change.get("obj_id")=rj   z., change.get("obj_changes", {}).get("action")=rk   rf   z7,list(change.get("obj_changes", {}).get("fields", []))=r   NTr   r   )rm   r   r   )r   r   rf   zInvalid actionrV  r   )rW   rY   rp   )r   zparent z absent)rq   zobj not found )rm   ri   rj   obj_coderQ  r   rW  z7CmfBackbonePeer.log_apply(): skip record %s, obj %s: %sz2CmfBackbonePeer.log_apply(): apply record %s errorrY  )rm   ri   rj   rQ  r[  )"r   rS   rT   rQ   rw   r>   r   r
   rL  rn   get_model_by_namer=   save_preparer   _apply_obj_changesrN   r   rk   r   rf  rm   rv   r/   rU   r(   rY   r   r   rR   r.  	exception	traceback
format_excrD  )r6   changes_listr;  g_backbone_sync_bkr   change	change_idri   rj   r_   r   sync_statusrp   rq   result_datar  s                   r   r   zCmfBackbonePeer.log_apply{  sO   r 	hhh 	 	j 	j 	j_" W	 W	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K5"&"4L	";/	)11)<<afidN_=`!a!a J$$&&&m,X6(BB

.x8<PPP//!6x!@P]I^_gIh 0 j j j



 ))96;Mh;WXXX"+KKM*84@@ $CCC$*=$9+$F	!(!6!6y$J[!6!\!\% U"&"6"67S7S7S7S"T"TTU "&!2%v...C++VM28<VMEZ[cEd , f f f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?   IM)'R)
Q73AORB,Q74R6Q77RR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|                    |          }n|dk    r3|r|                    |          }|s|r|                    |          }n|dk    rG|r t          j	                            |          }|s"|r t          j	                            |          }n|dk    r!d|v r|                    |d                   }nrg }	t	          |t          j
        t          j        t          j        f          s&d|j        v r|	                    dd| j        g           |r|                    ||	          }|s!t                              d|  d| d           |S )Nrz   %sz%._map_object_value(): cannot map obj(z	): model z - not foundz): invalid model r?   r>   r   r   )r   )r?   CmfRelationType)r>   CmfLogicTyperW   rm   r7  r   r   )r?   r   z): not mapped)rn   rm  rQ   rR   
issubclassr   r(   CmfModelr   r|  CmfActivityCmfPersonGroupCmfTagr   r   r=   )
r6   r   	obj_fieldobj_class_nameri   obj_namerl  r_   r   
obj_filters
             r   _map_object_valuez!CmfBackbonePeer._map_object_value  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mmx~m66 Ji&*<f>SU[Ub)cdd G!Y%555!!9c43D"EFFF Fmm*mEE 	iOODT"g"gPX"g"g"ghhh
r0   c                    d|v r*|                      |d         d                   }|r||_        |                                 d|v r*|                      |d         d                   }|r||_        |                                 d|v ro|d         d         }|rVt
                              |                    d          |                    d          |                    d                    nd	}||_        |	                                 d	S )
 activityrH   r   rQ  r?   r>   r   )r?   r>   r   N)
r  r  _calc_scheme_wfr   _calc_workflowr(   r   r   rQ  _calc_status)r6   r_   fields_changesrf   r  r   status_datarQ  s           r   _apply_wf_logiczCmfBackbonePeer._apply_wf_logicN  s0    ''--nZ.H.QRRH (' 	>))//|0LW0UVVJ ,!+~%%(27;K 'V%% __V,,;??63J3JXcXgXghuXvXv &   "&   CJr0   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   rH   u   <p>Автор: r?   z &lt;r   z&gt;</p><br>)r   r   r   )r6   r_   r  rf   cmf_author_datas        r   _add_comment_metaz!CmfBackbonePeer._add_comment_metaq  s    Xcn,00rBBFFwOOO } }o&9&9&&A&A||H[H[\cHdHd||rurz||  } }r0   c           
      ~   d}|                                 D ]\  }}t          |t          j                  r|dv rd}'|j                            |          }|s*t                              d|  d| d|j         d           mt          ||          }|d         }	|	d	k    rt          |||d	                    |	d
k    r]|                     |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|r|                     |||           t          |t          j                  r|                     |||           d S d S )NF>   rQ  r  workflow	scheme_wfr   Trz  z._apply_obj_changes(): field z not found in z. Field changes lost.r"   rH   r   )r  zskip apply z', object not mapped for required field z, r   r   r   rk  )r   rU   r(   rF   r   r   rQ   rR   rz   r   setattrr  nullablerf  r   remover  rW   r  )r6   r_   r  rf   has_wf_changesr   
field_datar   r  field_data_type	value_objrH   r   
mapped_objs                 r   ro  z"CmfBackbonePeer._apply_obj_changesz  s   &4&:&:&<&< *	9 *	9"J
#v~.. : BQ 4Q 4Q "&JNN:..E  , ,* , ,TWTb , , ,- - - Z00I )0O'))ZG)<==== H,, 22:g3FR[2\\	  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r0   rC   )NNNN)F)NF)NNF)NNNNF)NNNNNF)NNNNNNN)NN)+rb  rc  rd  api_methodsr   r   r   r   rA   rJ   rL   rN   r   ra   r~   r   r   rl   rV   rX   r\   rZ   r   r-   r  r  r  r  r  r   r   r   r   r   r   r.  rf  r   r  r  r  ro  __classcell__)r7   s   @r   r   r      s         K 
 
 
 \
 
 
 
 \
*! ! ! ! !G G G0 0 0j j j j j& & & & & ( ( ( [(& A A [AF     [ D F F F [FP   [  /Z /Z [/Zb $Z $Z [$ZL $ $ [$L 2 2 [2h  s +H    [D ( ( ( [($ ( ( ( [(,    \       [  $ $ $ [$  + + + [+Z `dhl
 
 
 [
6:T :T :Tx= = =~;
 ;
 ;
 ;
z"v "v "vHK K K K K) K K KU U Un: : : :x! ! ! !F} } } }0G 0G 0G 0G 0G 0G 0G 0Gr0   r   )r   rq  urllib.parser   r,  
cmf.modelsr   cmf.includemodules.backbone.fieldsr   r   r3   r0   r   <module>r     s    



     ! ! ! ! ! !          5 5 5 5 5 5_G _G _G _G _G'7 _G _G _G _G _Gr0   