
    fi                     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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eddfd            Zed+d            Zed+d            Zed/d            Zed0d            Zed1d            Zed2d            Ze	 	 d3d            Zd+dZd+d Z d! Z!d4d"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 )5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        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   r@   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Br0   c                 N    t                                                      g dz   S )N)r;   r<   r=   src_task_filter_ubql)r4   save_preload_fields)r6   r7   s    r   rM   z#CmfBackbonePeer.save_preload_fieldsR   s4    ww**,, 0j 0j 0j j 	jr0   c                     |                                   |                                   t                      j        di |S r2   )rA   rJ   r4   saver5   s     r   rO   zCmfBackbonePeer.saveV   sA    &&(((uww|%%f%%%r0   Fc                 8   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_DISABLEDrC   )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	TypeErrorr"   )clsobjforce_is_newrD   s       r   obj_after_save_hookz#CmfBackbonePeer.obj_after_save_hook]   s   * 	OOqs s sF? 	Fc6>** 	d,,S,K,XXXV.// 	d//\{/[[[V122 	d223R]2^^^V566 	d77\Wb7cccS		3'''r0   c                 @   t           j        rt                              d           d S t          j        rd S t          |t          j                  r$| 	                    |j
        |j        |          }nt          |t          j                  rQt                              |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_idrD   r   )actionr>   z7CmfBackbonePeer.obj_after_delete_hook(): add record id=z, action=deletebackbone_peer	obj_modelobj_idobj_changes)!r   rQ   rR   rS   rT   rU   rV   r(   rW   _get_sync_peersrf   idrY   cmfutilget_model_by_id	parent_idr[   parentrI   r]   in_linkout_linksetintersectionr_   r"   r>   jsoninfodisable_aclCmfBackboneLog
class_namerO   )	r`   ra   rD   peersrg   in_link_peersout_link_peersrm   r'   s	            r   obj_after_delete_hookz%CmfBackbonePeer.obj_after_delete_hookq   s7   * 	OOvx x xF? 	Fc6>** '	,''3>36_j'kkEEV.// $	,&&s}55V^KK''3>3=fq'rrEEV122 	,#**F,=>> 

,..sz/CDDFNZZF*.CJ,fn== .''3>7`k'llEE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)r|   r?   r>   login
user_localstatus_typero   
logic_typelogic_prefix)r|   r?   rx   r>   rV   r(   	CmfPersonr   r   	CmfStatusr   rW   ro   CmfListload_fieldsr   r   rY   r[   )r`   ra   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>   rW   parent_taskrW   cmf_created_atrY   
cmf_authorrY   r   r[   r   T)rF   
is_defined>   r>   likesviewsrs   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   rI   object)itemsvisibler|   endswith
startswithrV   cmffieldsCmfBackrefBase
CmfM2MBasechanges_appendedchanges_removedCmfRelationBaser   rI   rx   )r`   ra   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 ]^}||n|j        j        }|r5t          j                            ||t          j        |                    sI|                    |           _|S )NrE   )is_src_peer=Tpeer_project_idr   r   filter)ro   rr   r   )	r
   rE   rI   r(   rW   r   astliteral_evalappend)r`   rf   rg   rD   r}   result_peersr'   s          r   rn   zCmfBackbonePeer._get_sync_peers#  s    )*...1BC0TU  W W  		& 		&D)4)@++dF^FdK ~++(+K88 ,   
 %%%%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 )Nre   createupdater   rh   r   r   r>   epicr   ztask.sub4CmfBackbonePeer.obj_after_save_hook(): add record %sid=	, action=rh   	, fields=ri   )	log_levelis_dummyr   texttree_parentr   )rs   r   order_byTrb   rD   r   st_sizers   r   )rn   rr   ro   is_newr   r>   rx   r   r   r   rR   ry   r
   rp   rz   r(   r{   r|   rO   r   rF   rY   rs   r   rc   r[   )r`   taskrb   rD   r}   r   rm   r'   commentscommentattachments
attachments               r   rX   z%CmfBackbonePeer._task_after_save_hook5  s    ##t~tw\g#hh 	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                    |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|rQt(          j                            |ddg          }|D ]-}	||	_        t(          j                            |	d|           ,d S d S )Nr   CmfTask:zparent.is_dummyr   re   r   r   r   r   r   r>   rr   r   r   r   rh   r   ri   r   r   r   Tr   )r   r   strrr   r   r   rs   rn   rf   r   rG   r   r>   rx   rR   ry   ro   r
   rp   rz   r(   r{   r|   rO   rF   r[   r   rc   )
r`   r   rb   rD   r}   r   rm   r'   r   r   s
             r   rZ   z(CmfBackbonePeer._comment_after_save_hookg  s    !!W%5!SAR=S=S=^=^_i=j=j!F.>???>" 	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37ES\K]3^^K) s s
$+
!&:::TXfq:rrrr		s 	ss s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 )Nre   r   )rh   r   r>   r   r   r   r   rh   r   ri   )rt   rf   rr   ru   r   rn   ro   rv   rw   r   r>   rx   rR   ry   r
   rp   rz   r(   r{   r|   rO   )	r`   relation_optionsrb   rD   r~   r   r}   rm   r'   s	            r   r^   z0CmfBackbonePeer._relation_option_after_save_hook  s^   #.2B2J2TTTF$/3C3L3VVVF#.2B2K2VVVF 	 0 7 	F++'/:$,/# , 
 

  	F,,'0;$-0# - 
 

 M""//N0C0CDD 	F **+;<<$).
 
 x  		  Ju*-uuH8MuuX\]hiq]rXsXsuuw w w ((**  ))&*6F6Q/2 *   dfff	              		 		 s   9;G  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   re   r   )rh   r   content_pathr   r>   rr   i -1z:CmfBackbonePeer.obj_after_save_hook(): skip attachment: %sr   z, name=z, size=r   r   rh   r   ri   )rV   rs   rI   r(   rY   rW   rf   rr   r   r_   r   loadcontent_updatedrn   r   r   rx   r>   r   rR   ry   ro   r?   r
   rp   rz   r{   r|   rO   )r`   r   rb   rD   rg   r}   rm   r'   s           r   r\   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##!,# $ 
 

  	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_staticrV   classmethodstaticmethodrp   get_obj_by_idgetattrrF   rO   _eva_api_callr|   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   rs   ro   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$   RequestExceptionrR   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   rs   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  rR   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_sessionE  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_getU  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_post^  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  )rx   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  rx   r   )r`   r   r   r&   r+  r#   r   r$   r"  r   r  json_resultr   s                r   r   zCmfBackbonePeer._eva_api_callo  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   rL   )backbone_instance_idr   r   ro   u   Проект не найден T)r,  )r7  r=   )ro   project_codeproject_name)r   r(   r.   	cmf_alertr<   r6  r;   r   rL   rF   rO   ro   rx   r=   r>   r?   )r`   r7  r<   r6  r;   r   r   rL   _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 }n j                                         j         j                                         	
 fd}dg	d |            rT
D ]9}t          j                            |d           |                    |           :t                        |            Td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 )N  c                  p    t           j                            j         z   gdg          z  S )Nr   )rf   r   r   r%   r   )r(   rW   r
   r   )r   r   r6   
slice_sizestartrD   s   r   get_dataz+CmfBackbonePeer.full_sync.<locals>.get_data  sO    ^((/"ej01*+ )  F ZEMr0   r   r   Tr   ***)rf   rg   r   Fr   r   r>   z*CmfBackbonePeer.full_sync(): add record %sr   z, action=update, fields=r   ri   rt   INru   )rt   ru   relation_type)r   r   )rE   r   rI   r   r(   r   rc   r   
cmf_commitrn   rr   ro   r   r>   rx   rR   ry   r
   r{   r|   rO   r]   )r6   rD   tasksrB  tr}   rm   r'   relationr   r   r@  rA  s   ``       @@@@r   r   zCmfBackbonePeer.full_sync  s   
%0%<kk$BZB_B_BaBaBg!!###
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 hjj 	    &::14]h:iii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 
 
 	m 	mH "66xd`k6llll		m 	mr0   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 )Nr>  r7  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_deletedinclude_deletedrf   r3   )r/   r   r
   )	r   r   by_project_idr&   r   r   r6   r@  rA  s	       r   rB  z3CmfBackbonePeer.full_sync_deleted.<locals>.get_data  su     ej01*+  $  F  <'+';|$UZ))&))FZEMr0   r   )r   rC   rs   c                 &    g | ]}|j         j        S r3   )
src_obj_idrI   )r   rlos     r   r   z5CmfBackbonePeer.full_sync_deleted.<locals>.<listcomp>)  s)       #-   r0   rP  )r   r7  rt   ru   ro   rD  F)r   rN  )NT)rE   r   rI   r   r(   rW   r   r   rF  rY   r[   CmfBackboneObjMappingr
   r7  r]   )r6   rD   rB  rH  carelations_idsrr   r   r@  rA  s   `       @@@@r   rH   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 	 	 	 	 	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   rC  r   r   r   Nr   )rh   r>   r   rr   ro   rk   rl   datetimerm   z&CmfBackbonePeer.get_obj(%s): result %s)rR   ry   r>   r   rp   r   r   rx   r   rV   r(   rY   r[   rr   r/   r|   ro   r   debug)r6   rl   r<  ra   r   r   s         r   r   zCmfBackbonePeer.get_obj4  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 )rY  )r/   ro   rk   rl   r   	isoformatrm   )r   items     r   r   z,CmfBackbonePeer.log_list.<locals>.<listcomp>  s`     
 
 
  7.{,6688 ,  
 
 
r0   rj   r   rl   zNOT IN)statusr   queued)r   rk   rl   rm   )r   r%   r   )r(   r{   r   )r6   r%   skip_idsr<  s       r   r   zCmfBackbonePeer.log_lists  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")=ro   z, log_mark.get("status")=r`  error_countr   )successskipsynced)failfailedr   
error_textzUnknown apply status: zBCmfBackbonePeer.log_mark_done(): unknown apply status %s for id %sN)rR   r[  r>   r   r(   r{   r`  r   rd  rj  rO   rS   )r6   log_mark_listr<  log_marklog_idlogr`  s          r   r   zCmfBackbonePeer.log_mark_done  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   _ApplySkipErrorrp    s        JJJJr0   ru  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_guestrX  z/CmfBackbonePeer.log_apply(%s): apply changes %szchange change.get("id")=ro   z, change.get("obj_model")=rk   z, change.get("obj_id")=rl   z., change.get("obj_changes", {}).get("action")=rm   rh   z7,list(change.get("obj_changes", {}).get("fields", []))=r   NTr   r   )ro   r   r   )r   r   rh   zInvalid actionre  r   )rY   r[   rr   )r   zparent z absent)rs   zobj not found )ro   rk   rl   obj_coder`  r   rf  z7CmfBackbonePeer.log_apply(): skip record %s, obj %s: %sz2CmfBackbonePeer.log_apply(): apply record %s errorrh  )ro   rk   rl   r`  rj  )"r   rT   rU   rR   ry   r>   r   r
   r[  rp   get_model_by_namer=   save_preparer   _apply_obj_changesrO   r   rm   r   ru  ro   rx   r/   rV   r(   r[   r   r   rS   r/  	exception	traceback
format_excrF  )r6   changes_listr<  g_backbone_sync_bkr   change	change_idrk   rl   ra   r   sync_statusrr   rs   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 )Nr|   %sz%._map_object_value(): cannot map obj(z	): model z - not foundz): invalid model r?   r>   r   r   )r   )r?   CmfRelationType)r>   CmfLogicTyperY   ro   r8  r   r   )r?   r   z): not mapped)rp   r|  rR   rS   
issubclassr   r(   CmfModelr   r  CmfActivityCmfPersonGroupCmfTagr   r   r=   )
r6   r   	obj_fieldobj_class_namerk   obj_namer{  ra   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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 )
 activityrI   r   r`  r?   r>   r   )r?   r>   r   N)
r  r  _calc_scheme_wfr   _calc_workflowr(   r   r   r`  _calc_status)r6   ra   fields_changesrh   r  r   status_datar`  s           r   _apply_wf_logiczCmfBackbonePeer._apply_wf_logic  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   rI   u   <p>Автор: r?   z &lt;r   z&gt;</p><br>)r   r   r   )r6   ra   r  rh   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||  } }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>   r`  r  workflow	scheme_wfr   Tr  z._apply_obj_changes(): field z not found in z. Field changes lost.r"   rI   r   )r  zskip apply z', object not mapped for required field z, r   r   r   rz  )r   rV   r(   rW   r   r   rR   rS   r|   r   setattrr  nullableru  r   remover  rY   r  )r6   ra   r  rh   has_wf_changesr   
field_datar   r  field_data_type	value_objrI   r   
mapped_objs                 r   r~  z"CmfBackbonePeer._apply_obj_changes  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   )N)NNNN)FN)F)NF)NNF)NNNNF)NNNNNF)NNNNNNN)NN),rq  rr  rs  api_methodsr   r   r   r   rA   rJ   rM   rO   r   rc   r   r   r   rn   rX   rZ   r^   r\   r   r-   r	  r  r  r  r  r   r   r   rH   r   r   r   r/  ru  r   r  r  r  r~  __classcell__)r7   s   @r   r   r      s;         K 
 
 
 \
 
 
 
 \
*! ! ! ! !G G GC C C&j j j j j& & & & & ( ( ( [(& C C C [CJ     [ D F F F [FP    [" /s /s /s [/sb (s (s (s [(sT * * * [*X 6 6 6 [6p  s +H    [D ( ( ( [($ ( ( ( [(,    \       [  $ $ $ [$  + + + [+Z `dhl
 
 
 [
6;m ;m ;m ;mz< < < <|= = =~;
 ;
 ;
 ;
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   r  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   