
    oi                    p    d dl Z d dlZd dlmZ d dlZd dlZd dl d dlm	Z	  G d de	j                        Z
y)    N)urlparse)*)cmf_backbone_peerc                   ,    e Zd Zg dZed+d       Zed,d       Z fdZd Zd Z	 fdZ
 fdZed-d	       Zed+d
       Zed        Zed.d       Zed+d       Zed+d       Zed+d       Zed+d       Zed+d       Zed+d       Zed+d       Zed/deddfd       Zed+d       Zed+d       Zed0d       Zed1d       Zed2d       Zed3d       Ze	 	 d4d       Z d+dZ!d+d Z"d! Z#d5d"Z$d# Z% G d$ d%e&      Z'd& Z(d+d'Z)d+d(Z*d+d)Z+d+d*Z, xZ-S )6CmfBackbonePeer)getsgetlistslistcountdelete
setup_peer	log_applylog_listlog_mark_doneget_objpeer_project_nclist	full_syncc                 |    | r+	 t        |       }|j                  t        j                  k7  ryyy# t        $ r Y yw xY w)Neva_apilocal)r   hostnameconfigHOSTNAME_FQDN
ValueError)url
parsed_urls     ../modules/backbone/models/cmf_backbone_peer.pyget_peer_typezCmfBackbonePeer.get_peer_type   sH    %%c]
 &&&*>*>>$  
 s   / 	;;c                 J   t         j                  j                          |xs ddg}t         j                  j	                  |      } t         j
                  j                  || ||      }t         j                  j                  dt         j                  t        ||      |      S )Nr   d   )r   typetoken
ssl_verifyr
   )slicefilter)kwargspeer)
modelsCmfAccessListcheck_admin_moder   r   CmfBackboneInstancePeer	call_peer
CmfProjectdict)r"   r   r#   r$   r&   r%   r(   s          r   r   z#CmfBackbonePeer.peer_project_nclist!   s    --/!!S%%33C8))..!	 / 
 %%//  0 
 	
    c                 $    t        |   di | y N )superr   selfr'   	__class__s     r   r   zCmfBackbonePeer.delete8   s      r1   c                     | j                    d| j                   d| j                  xr | j                  j                   | _        y )N@ )backbone_instance_domainbackbone_instance_codepeer_projectcodenamer7   s    r   
_calc_namezCmfBackbonePeer._calc_name<   sD    445Qt7R7R6S))Dd.?.?.D.DEG	r1   c                     | j                   j                  sy | j                   j                  sy | j                  | j                   j                         | j                  | j                   j                         y )Ntask_filter)src_task_filter_bql
is_changedoldfull_sync_deletedvaluer   rA   s    r   _calc_src_task_filter_bqlz)CmfBackbonePeer._calc_src_task_filter_bql@   sc     ''22''++ 	4+C+C+I+IJ 	4#;#;#A#ABr1   c                 *    t         |          g dz   S )N)r<   r=   r>   src_task_filter_ubql)r5   save_preload_fields)r7   r8   s    r   rN   z#CmfBackbonePeer.save_preload_fieldsS   s     w*, 0j j 	jr1   c                 b    | j                          | j                          t        |   di |S r3   )rB   rK   r5   saver6   s     r   rP   zCmfBackbonePeer.saveW   s+    &&(w|%f%%r1   c                    t         j                  rt        j                  d       y t        j
                  ry t        |t        j                        r| j                  |||      S t        |t        j                        r| j                  |||      S t        |t        j                        r| j                  |||      S t        |t        j                        r| j                  |||      S t        |t        j                         r| j#                  ||      S t        |t        j$                        r| j'                  |      S t        j                  d       y )Nz_CmfBackbonePeer.obj_after_save_hook(): Skip write changelog due config.MODULE_BACKBONE_DISABLEDrD   zbCmfBackbonePeer.obj_after_save_hook(): Skip write changelog due the model does not support logging)r   MODULE_BACKBONE_DISABLEDloggingwarninggbackbone_sync
isinstancer)   CmfTask_task_after_save_hook
CmfComment_comment_after_save_hookCmfAttachment_attachment_after_save_hookCmfRelationOption _relation_option_after_save_hookCmfDocument_doc_after_save_hookCmfDocumentHistory_doc_history_after_save_hook)clsobjforce_is_newrE   s       r   obj_after_save_hookz#CmfBackbonePeer.obj_after_save_hook^   s   **OOqs?? c6>>*,,S,K,XXV..///\{/[[V112223R]2^^V55677\Wb7ccV//0++C>>V66733C88 	p	
r1   c                 n   t         j                  rt        j                  d       y t        j
                  ry t        |t        j                  t        j                  f      r*| j                  |j                  |j                  |      }nt        |t        j                        rjt        j                  |j                         t        j                  t        j                  fvry | j                  |j                  |j                   |      }nt        |t        j"                        rt        |j$                  j&                  t        j                        rw|j$                  j                   rIt        j                  |j$                  j                         t        j                  t        j                  fvry |j$                  j                   }nLt        |j$                  j&                  t        j                  t        j                  f      r|j                  }ny |sy | j                  |j                  ||      }nt        |t        j(                        r| j                  |j*                  j                  |j*                  j                  |      }|sy | j                  |j,                  j                  |j,                  j                  |      }t/        |      j1                  t/        |            }nt3        t5        |      |      |sy d|j6                  j8                  d}|D ]}  }t        j;                  d|j                   d       t        j=                         5  t        j?                  ||j@                  |j                  |      jC                          d d d         y # 1 sw Y   xY w)NzdCmfBackbonePeer.obj_after_delete_hook(): Skip write changelog due to config.MODULE_BACKBONE_DISABLED
project_idobj_idrE   r   )actionr?   z7CmfBackbonePeer.obj_after_delete_hook(): add record id=z, action=deletebackbone_peer	obj_modelrk   obj_changes)"r   rR   rS   rT   rU   rV   rW   r)   rX   r`   _get_sync_peersrj   idrZ   cmfutilget_model_by_id	parent_idr\   parentrJ   r^   in_linkout_linksetintersection	TypeErrorr"   r?   jsoninfodisable_aclCmfBackboneLog
class_namerP   )	rd   re   rE   peerstask_idin_link_peersout_link_peersrp   r(   s	            r   obj_after_delete_hookz%CmfBackbonePeer.obj_after_delete_hook~   s   **OOvx??cFNNF,>,>?@''3>>#&&^i'jEV../&&s}}5fnnfN`N`=aa''3>>#--ep'qEV112#****F,=,=>

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

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

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

:%%
1$!)l!;
 &
1$#9&!B
 dflntu+	vr1   c                       e Zd ZdZy)CmfBackbonePeer._ApplySkipErroru<   Пропускаем применение измененийN)__name__
__module____qualname____doc__r4   r1   r   _ApplySkipErrorr    s    Jr1   r  c                    | j                  g d       t        j                  }g }|D ]  }t        j	                  d| j
                  d|j                  d      d|j                  d      d|j                  d	      d
|j                  di       j                  d      dt        |j                  di       j                  dg             
       t        j                  d| j
                  |       d}d}d}d}		 dt        _        |d   }|d   }|d	   }t        j                  |      }
|xr  |
j                  |dd| j                  g      }	|	r|	j                          |d   d   dk(  r|	j                          n|d   d   dv rp|
t        j                  u xr
 d|d   d   v }|r|d   d   j!                  d      d   }| j#                  |	|d   d   |d   d          |	j%                          d|d   d   v r|d   d   d   d   |	_        t)        |	t        j*                        r|	j,                  rt        j*                  j                  |	j.                  t        j0                        }|D ]  }|j                           d|	_        |	|	j4                  _        |	j8                  |	j4                  _        |	j4                  j;                          |r|	_        |	j>                  r*|	j;                          ntA        d|jB                  d         d}n`|d   d   dk(  r@|dv r@|d   d   }t        jE                  || j                         }|s!| jG                  d!| d"      | j                  } |
|#      }	| j#                  |	|d   d   |d   d          |d$k(  r|	jH                  rt        jK                  |	jH                        t        jL                  u r^t        j                  j                  |	jH                  |	jN                  %      D ]&  }|jN                   d&|_'        |j%                          ( |	j%                          |	jP                  jR                  }d}n| jG                  d'|       tU        ||||	xr |	j
                  jR                  |(      }t)        |	t        jV                        r|	jX                  jR                  |d)<   |j[                  |       |t        _        tg                 |S # | jF                  $ rY}|j[                  tU        ||||	xr |	j
                  jR                  d*(             t        j]                  d+|||       Y d}~}d}~wt^        $ r t        ja                  d,|j                  d             |j[                  tU        |j                  d      |j                  d      |j                  d	      d-tc        jd                         .             Y w xY w# |t        _        w xY w)/u  
        Применяем список изменений на точке синхронизации
        [
            {
                id: log.id,  # CmfBackboneLog:...
                obj_model: obj.class_name,  # CmfTask
                obj_id: obj.id,  # CmfTask:...
                datetime: log.cmf_created_at.isoformat(),  # 2025-01-01T01:02:03Z
                obj_changes: {
                    action: create/update/remove,
                    code: obj.code,
                    fields: {
                        name: {
                            type: 'value',  # value/object/object_list
                            value: 'New Name'
                        },
                        executors: {
                            type: 'object_list',
                            # for update
                            appended: [
                                {
                                    class_name: CmfPerson,
                                    name: 'Joe',
                                    login: 'joe@eva.com',
                                    user_local: true,
                                },
                                ...
                            ]
                            removed: [
                                ...
                            ],
                            # on full obj sync
                            value: [
                                ...
                            ]
                        }
                    },
                },
            },
            ...
        ]
        return:
        [
            {
                id: log.id,  # CmfBackboneLog:...
                obj_model: obj.class_name,  # CmfTask
                obj_id: obj.id,  # CmfTask:...
                obj_code: obj.code,  # TSK-1
                status: success,  # success|fail|skip
                [error_text: 'some backtrace',]
            },
            ...
        ]
        )r>   dst_create_listsdst_create_usersdst_create_users_as_guestri  z/CmfBackbonePeer.log_apply(%s): apply changes %szchange change.get("id")=rr   z, change.get("obj_model")=ro   z, change.get("obj_id")=rk   z., change.get("obj_changes", {}).get("action")=rp   rl   z7,list(change.get("obj_changes", {}).get("fields", []))=r   NTr   r   )rr   r&   r   )r   r   r   rJ   rl   r   )ru   r   zInvalid actionru  r   )rZ   r\   rb   ru   )r   zparent z absent)rv   r`   )r   r@   u    (старый)zobj not found )rr   ro   rk   obj_codern  r   rv  z7CmfBackbonePeer.log_apply(): skip record %s, obj %s: %sz2CmfBackbonePeer.log_apply(): apply record %s errorrx  )rr   ro   rk   rn  rz  )4r   rU   rV   rS   r}   r?   r   r
   rl  rs   get_model_by_namer>   save_preparer   r)   r`   pop_apply_obj_changesrP   r   rW   rb   has_publishedru   system_personcur_workflowrv   cur_published_versiondoc_version	save_datar   rG   r   rp   r  r  rV  rt   r/   r@   rr   r|   r0   r\   r   r   rT   r>  	exception	traceback
format_excrW  )r7   changes_listrK  g_backbone_sync_bkr  change	change_idro   rk   re   r   is_doc_text_changedchanged_textunpublished_in_work_by_systemr\  sync_statusru   rv   r   result_datar  s                        r   r   zCmfBackbonePeer.log_apply  s   r 	h 	 	j__" {	FLLA499+&**T*,,Gvzz+/F.HH`6::V^K_Ja bAJJ}b155h?A BJ

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

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

 @9<

 6 #

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