
    6i                     `    d dl Z d dl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)*)cmf_backbone_instancec                       e Zd Zej        j        dgz   Zej         G d d                      Ze	 e
ddd          d                         Zd Zd	 Ze                    d
          Ze                    d          Ze                    d          Zedd            Zd Zd Z fdZed fd	            Z fdZd ZddZddZ xZS )CmfBackboneInstance
force_syncc                       e Zd ZU dZeed<   dZeed<   dZeed<   dZ	eed<   dZ
eed<   dZeed<   dZeed<   dZeed	<   dZeed
<   dZeed<   dZeed<   dZeed<   d ZdS )CmfBackboneInstance.PeerNbackbone_instancedispositiontypeurltoken
ssl_verifyid
project_idproject_codeproject_nameis_src_peertask_filter_ubqlc                 n   | j         r*| j        dk    r{| j        pt          | j         j                  | _        | j        pt          | j         j                  | _        | j        p*t          | j         j        	                                          | _        | j
        t          | j         j                  | _
        | j        pt          | j         j                  | _        | j        pt          | j         j                  | _        | j        pt          | j         j                  | _        | j        pt          | j         j                  | _        | j        | j         j        dv | _        | j        pt          | j         j                  | _        d S | j        dk    r{| j        pt          | j         j                  | _        | j        pt          | j         j                  | _        | j        p*t          | j         j        	                                          | _        | j
        t          | j         j                  | _
        | j        pt          | j         j                  | _        | j        pt          | j         j                  | _        | j        pt          | j         j                  | _        | j        pt          | j         j                   | _        | j        | j         j        dv | _        | j        pt          | j         j!                  | _        d S | j        rtE          d| j                  d S d S )Naabbibbar   zInvalid peer disposition)#r
   r   r   strpeer_a_typer   
peer_a_urlr   peer_a_tokendecryptr   boolpeer_a_ssl_verifyr   	peer_a_idr   peer_a_project_idr   peer_a_project_coder   peer_a_project_namer   	directionr   peer_a_task_filter_ubqlpeer_b_type
peer_b_urlpeer_b_tokenpeer_b_ssl_verify	peer_b_idpeer_b_project_idpeer_b_project_codepeer_b_project_namepeer_b_task_filter_ubql
ValueErrorselfs    2./modules/backbone/models/cmf_backbone_instance.py__post_init__z&CmfBackboneInstance.Peer.__post_init__   s   % S#s** $	 TS1G1S-T-TDI#xQ3t/E/P+Q+QDH!%!as43I3V3^3^3`3`/a/aDJ.*.t/E/W*X*X"gNT-C-M)N)NDG&*o&fT=S=e9f9fDO(,(9(lSAWAk=l=lD%(,(9(lSAWAk=l=lD%'/+/+A+K|+[(,0,A,xSI_IwExExD)))%,, $	 TS1G1S-T-TDI#xQ3t/E/P+Q+QDH!%!as43I3V3^3^3`3`/a/aDJ.*.t/E/W*X*X"gNT-C-M)N)NDG&*o&fT=S=e9f9fDO(,(9(lSAWAk=l=lD%(,(9(lSAWAk=l=lD%'/+/+A+K|+[(,0,A,xSI_IwExExD)))% S$%?AQRRR9S S6S S    )__name__
__module____qualname__r
   object__annotations__r   r   r   r   r   r   r#   r   r   r   r   r   r   r8    r9   r7   Peerr	      s         $(6(((ScSs
DC
C c    c    T    $#$$$	S 	S 	S 	S 	Sr9   r@   Tz	@minutely)	only_once
system_jobschedulec                     t           j                            g dg d          D ]&} | j        p| j        j        }| j        r| j        j        |k     r.t          j                    }	 |                                  d | _	        ne# t          t          f$ r  t          $ rG}t                              d|            t                       t!          |          | _	        Y d }~nd }~ww xY wt#          t          j                    |z
            | _        | j                                         |                                  t+                       (d S )N)status=running)r   r    r!   r%   r&   r'   r(   r+   r,   r-   r/   r0   r1   r2   r)   rE   sync_periodlast_sync_datetime)filterfieldszSync %s error)modelsr   listrH   defaultrI   agetimesynclast_sync_error
SystemExitKeyboardInterrupt	Exceptionlogging	exceptionrollback_purge_eventr   intlast_sync_durationset_nowsavecommit_with_event)r
   rH   
sync_startes       r7   sync_allzCmfBackboneInstance.sync_all=   s    "(!;!@!@HbHbHb lL lL lL!@ "M "M 	  	  ,7`;L;X;`K 3 8I8\8`cn8n8nJ;!&&(((48!11 12    ; ; ;!!/3DEEE$&&&47FF!111111; 47ty{{Z7O3P3P0088:::""$$$/	  	 s   (BC&=C!!C&c                 Z    d | _         |                                  t          d           d S )Nuu   Синхронизация запущена, она может выполняться длительное время)rI   r\   	cmf_alertr5   s    r7   r   zCmfBackboneInstance.force_syncY   s>    "&		  J  	K  	K  	K  	K  	Kr9   c                    t           j        r t                              d|  d           dS t                              d|  d           |                                  |                     d|           }|                     d|           }| j        dk    r|                     | ||	           ns| j        d
k    r|                     | ||	           nO| j        dk    r1|                     | ||	           |                     | ||	           nt          d|  d          t                              d|  d           dS )u   
        Можно тоже сделать джобом, тогда будет распараллеливание между инстансами.
        zCmfBackboneInstance.sync(z/):Skip sync due config.MODULE_BACKBONE_DISABLEDNz): sync startr   r   r
   r   r   )r
   src_peerdst_peerr   r   z): sync direction is not set.z): sync end)
configMODULE_BACKBONE_DISABLEDrV   warninginfosetup_peersr@   r)   _sync_onewayr4   )r6   peer_apeer_bs      r7   rQ   zCmfBackboneInstance.sync^   sj    * 	OOmmmmnnnFDDDDEEEsdCCsdCC>T!!vPVWWWW^t##vPVWWWW^t##vPVWWWvPVWWWW\\\\]]]BBBBCCCCCr9   z<img(?:[\s][^>]*)?[\s]data-attach-id="(?P<data_attach_id>CmfAttachment:[0-9a-f-]+)"(?:[\s][^>]*)?[\s]src="(?P<src>[^"]+)"(?:[\s][^>]*)?(/>|>)z<div(?:[\s][^>]*)?[\s]data-attach-id="(?P<data_attach_id>CmfAttachment:[0-9a-f-]+)"(?:[\s][^>]*)?><a(?:[\s][^>]*)?[\s]download="(?P<download>/[^"]+)"(?:[\s][^>]*)?[\s]rel="(?P<rel>/[^"]+)"(?:[\s][^>]*)?>z<span(?:[\s][^>]*)?[\s]data-mark-annotation-type="inlineComment"(?:[\s][^>]*)?[\s]data-object-id="(?P<data_object_id>CmfComment:[0-9a-f-]+)"(?:[\s][^>]*)?>Nc                     !"#$%&'()*+ *fd} fd}fd}fd}fd}d>fd	&&fd% "+fd	'%')fd
$!fd#"#$&()fd}	t                      *i }
t          j                            g d          ! |            x}rg  i }|D ]""d         ++|
v rF"d         |
+         k     r4t                              dj         dj         "d         +           U"d         )t          j                            )j        +g d          ((sst          j                            )j        +g d          }|rFt                              )j        |j	        |j
        |j        |j        |j        |j        	  	        ("d         d         (rd"d         v r"d         d         (j        k    s!d"d         v rm"d         d         (j        k    rV"d                             d          (_        "d                             d          (_        (                    d           nɉdk    rt                              d j         dj         +           d! |+          }|s5t                              d"j         dj         "d         +           "d         |d<   "d         }t                              d#j         dj         "d         |           |"|d         |
+<   (sWt                              )j        +"d                             d          "d                             d          $          ((|"d         <                         |	                        rg }	 d%  |            D             } D ]}||d                  }|                    d&          }t                              d'j        j         dj         |           |d         |d(}|                    |           |d)k    r|                    d*          }|r||d*<   |                    d          }|r||d                  (|                    d+          }|                    d          }(j	        |k    s(j        |k    s(j        |k    rD|(_	        |(_        |(_        t                              d,j        j         dj         (j
         d-(j         d.(j	         d-(j         d/           (                                 |d         d0k    r|d         d         d!k    r|d         d1         }t          j                            |d2g3          } ||j
                  }|d         d4         d5         }|d6         rP '|d6                   |d6<   d7|d         |dd5|id8d9}t          j                            d:j        |gg;           |d         d         d<k    r.|d         d0k    r" |(j
        (j        (j	        (j                   n# t.          $ r d=  D             }Y nw xY w ||            |            x}d7S d7S )?u  
        TODO: синхронизация должна быть толерантна к ошибкам, что можем - исправляем, что не можем - игнорируем.
            но все отклонения от основной логики должны быть с подробностями в журнале/логах.
        while src_log_list = SrcPeer.log_list():
            dst_log_list = _sync_log_map(src_log_list)
            apply_list = DstPeer.log_apply(dst_log_list)
            SrcPeer.log_done(apply_list)

        ?:
        - удаление Dst
        - смена проекта в src/dst?
        - что делать с ошибками? Пропускать все последующие изменения по объектам с ошибками?
            Что делать со ссылками на объекты, которые не синхронизируются?
        c                      t           j                            dj        gt	          ddgt                                         S )Nlog_listr      )sliceskip_idspeerargskwargs)rL   CmfBackbonePeer	call_peerr   dictrM   )rt   re   s   r7   get_change_listz9CmfBackboneInstance._sync_oneway.<locals>.get_change_list   sK    )33k]4q!ftH~~+V+V+V 4 X X Xr9   c                  V    t           j                            dj         g          S )N	log_applyrv   rw   rL   ry   rz   r   )dst_change_listrf   s   r7   apply_change_listz;CmfBackboneInstance._sync_oneway.<locals>.apply_change_list   s2    )33(k?3 4 5 5 5r9   c                 V    t           j                            dj        | g          S )Nget_objr   r   )obj_idre   s    r7   r   z1CmfBackboneInstance._sync_oneway.<locals>.get_obj   s4     )33k6* 4 , , ,r9   c                 V    t           j                            dj        | g          S )Nlog_mark_doner   r   )log_mark_listre   s    r7   r   z7CmfBackboneInstance._sync_oneway.<locals>.log_mark_done   s2    )33hk=1 4 3 3 3r9   c                     t           j                            | |          }t           j                            |||           d S )N)rv   )rL   ry   peer_get_attachment_contentpeer_put_attachment_content)src_attachment_idsrc_content_pathdst_attachment_iddst_content_pathcontentrf   re   s        r7   transfer_attachment_contentzECmfBackboneInstance._sync_oneway.<locals>.transfer_attachment_content   sd    ,HH!#3( I D DG">>!#3W8 ? M M M M Mr9   Tc                 4   t           j                            j        | dg          }|o|j        j        }|sBj        dk    r7t           j                            j        | dg          }|o|j        j        }|r|st          dj        |           |S )N
dst_obj_id)r
   re   
src_obj_idrK   r   r   )r
   rf   r   rK   zMapping not found)rL   CmfBackboneObjMappinggetr   r   jsonr)   CmfError)src_idrequiredmappingdst_idr
   rf   re   s       r7   map_idz0CmfBackboneInstance._sync_oneway.<locals>.map_id   s    266"3h>R!<. 7  G 8!3!8F  =/9TAA 6::&7(BV%|n ;   !<W%7%< e e24ExG[]cdddMr9   c                 P    | s| S d| v r | d         d          }|sd S || d<   | S )Nr   F)r   r?   )	obj_valuer   r   s     r7   map_field_obj_valuez=CmfBackboneInstance._sync_oneway.<locals>.map_field_obj_value   sR     !  y    	$%@@@  4"(	$r9   c                    	fd}	fd}	fd}t                               j        ||           } t                               j        ||           } t                               j        ||           } | S )Nc           	      d   t           j                            dj        | d         ddg          }|rit                              dj         dj         d         | d         |j                   t          |j                  }t          |j                  }n>t          	                    d	j         dj         d         | d                    d
}d
}| d         d | 
                    d          | 
                                z
            | | d         |                     d          | 
                                z
  | 
                    d          | 
                                z
            | | d         |                     d          | 
                                z
  d           S )NCmfAttachmentdata_attach_idr   r   r
   	obj_modelre   r   rK   zTCmfBackboneInstance._sync_oneway(%s, %s): skip img patch %s for obj %s: map %s -> %s -> r   z\CmfBackboneInstance._sync_oneway(%s, %s): skip img patch %s for obj %s: map for %s not found r   srcrL   r   r   r   rV   rj   r   r   r   ri   startend	matchattach_mappingr   dst_pathr
   rf   itemr   re   s	       r7   
img_mapperzWCmfBackboneInstance._sync_oneway.<locals>.map_text_inline_reference.<locals>.img_mapper   s   !'!=!A!A&7?]e]q$%56N`?a "B "c "c " "LLn)h.B+^+^H\+^+^`dei`jlv./1JL L L
 !!:;;F">#BCCHHOOv)h.B+^+^H\+^+^`dei`jlv./1 1 1  F!HQx L-=!>!>u{{}}!L LM CCQx		*: ; ;EKKMM I%++V[J\J\]b]h]h]j]jJj jkC  C Qx		% 0 0 > ? ?@	C CCr9   c           	      d   t           j                            dj        | d         ddg          }|rit                              dj         dj         d         | d         |j                   t          |j                  }t          |j                  }n>t          	                    d	j         dj         d         | d                    d
}d
}| d         d| 
                    d          | 
                                z
            | | d         |                     d          | 
                                z
  | 
                    d          | 
                                z
            | | d         |                     d          | 
                                z
  d          S )z Mapper for <a\/> tags r   r   r   r   r   zUCmfBackboneInstance._sync_oneway(%s, %s): apply txt patch %s for obj %s: map %s -> %sr   r   z\CmfBackboneInstance._sync_oneway(%s, %s): skip txt patch %s for obj %s: map for %s not foundr   r   Ndownloadr   r   s	       r7   a_mapperzUCmfBackboneInstance._sync_oneway.<locals>.map_text_inline_reference.<locals>.a_mapper  s   !'!=!A!A&7?]e]q$%56N`?a "B "c "c " "LLo)h.B+^+^H\+^+^`dei`jlv./1JL L L
 !!:;;F">#BCCHH OOv)h.B+^+^H\+^+^`dei`jlv./1 1 1  F!HQx L-=!>!>u{{}}!L LM HHQx		*: ; ;EKKMM I%++V`JaJabgbmbmboboJo opH  H Qx		* 5 5ekkmm C D DE	H HHr9   c           	      t   t           j                            dj        | d         ddg          }|rUt                              dj         dj         d         | d         |j                   t          |j                  }n<t                              d	j         dj         d         | d                    d
}| d         d | 	                    d          | 	                                z
            | | d         | 
                    d          | 	                                z
  d           S )N
CmfCommentdata_object_idr   r   r   zXCmfBackboneInstance._sync_oneway(%s, %s): skip comment patch %s for obj %s: map %s -> %sr   r   z`CmfBackboneInstance._sync_oneway(%s, %s): skip comment patch %s for obj %s: map for %s not foundr   r   )rL   r   r   r   rV   rj   r   r   ri   r   r   )r   comment_mappingr   r
   rf   r   r   re   s      r7   comment_mapperz[CmfBackboneInstance._sync_oneway.<locals>.map_text_inline_reference.<locals>.comment_mapper$  ss   "(">"B"B&7<ZbZn$%56N`?a #C #c #c #  LLr)h.B+^+^H\+^+^`dei`jlv./1KM M M !!;<<FFOOz)h.B+^+^H\+^+^`dei`jlv./1 1 1  FQx L-=!>!>u{{}}!L LM NNQx		*: ; ;EKKMM I J JKN NNr9   )resub_ATTACHMENT_IMG_RE_ATTACHMENT_TXT_RE_INLINE_COMMENT_RE)

text_valuer   r   r   r
   clsrf   r   r   re   s
       r7   map_text_inline_referencezCCmfBackboneInstance._sync_oneway.<locals>.map_text_inline_reference   s    C C C C C C C C C8H H H H H H H H H<N N N N N N N N N.  6
JOOJ 6*MMJ 6
SSJr9   c                 R   t          j        |           }|d         }|dk    r%|dv r 
dv r|d         r 	|d                   |d<   n^|dk    r |d                   |d<   nC|dk    r=dD ]:}||v r4g }||         D ]$} |          }|r|                    |           %|||<   ;|S )Nr   value)text
text_draft)CmfTaskCmfDocumentr   r=   object_list)r   appendedremoved)copydeepcopyappend)src_changes
field_namedst_changes	data_type	list_namedst_listr   	dst_valuer   r   r   s           r7   map_field_changesz;CmfBackboneInstance._sync_oneway.<locals>.map_field_changes@  s   -44K#F+IG##!777IIq<q<q  wB  CJ  wK<q+D+D[QXEY+Z+ZK(h&&':':;w;O'P'PG$$m++!A : :I K//#%)4Y)? ; ;I(;(;I(F(FI( ; (	 : : :19I.r9   c                     D ]J}|j         dk    r|j        | k    r|j        j        c S |j         dk    r|j        | k    r|j        j        c S Kd S )Nr   r   )r)   peer_a_fieldpeer_b_fieldr   )r   fmfields_mappingss     r7   map_custom_fieldz:CmfBackboneInstance._sync_oneway.<locals>.map_custom_fieldS  su    %  <4''BOz,I,I?0000\T))bo.K.K?0000  r9   c                     i } t          |           }t          d         oj        j        |          }d                             d          }|r |          }||d<   d                             di                                           D ]7\  }}|                    d          r 	|          }|s( 
||          | |<   8|S )uU   Модифицируем изменения для применения на dst peeractionrK   r   r   r   r   obj_changesr   	parent_idrK   cf_)r{   r   r   r   items
startswith)
obj_fieldsr   ressrc_parent_iddst_parent_ifr   field_changesr   r   r   r   r   obj_mappingr   s          r7   map_itemz2CmfBackboneInstance._sync_oneway.<locals>.map_item]  s   JfZ@@@K:#"B{'='B'	  C !/33K@@M 9 !'} 5 5+8K(-1--@-D-DXr-R-R-X-X-Z-Z V V)
M((// !!1!1*!=!=J% !  *;):=*)U)U
:&& Jr9   )r)   r   r   )r
   rK   r   datetimezVCmfBackboneInstance._sync_oneway(%s, %s): skip record %s for obj %s, due full obj syncr   r   r   )r   src_obj_coder   r   dst_obj_coder   r   r   )r   r   r   r   r   r   )r
   r   rf   r   rK   )	r
   r   re   r   r   r   r   r   r   r   r   codecontent_path)	only_dataupdatezZCmfBackboneInstance._sync_oneway(%s, %s): mapping for %s not found. Request full obj sync.createz`CmfBackboneInstance._sync_oneway(%s, %s): get_obj return none, skip changes(%s) for new task(%s)zSCmfBackboneInstance._sync_oneway(%s, %s): replace changes %s with full obj data: %s)r
   r   re   r   r   r   c                      i | ]}|d          |S )r   r?   ).0
apply_datas     r7   
<dictcomp>z4CmfBackboneInstance._sync_oneway.<locals>.<dictcomp>  s    (l(l(l*D)9:(l(l(lr9   rE   z:CmfBackboneInstance._sync_one_way(%s, %s): apply result %sr   rE   success
error_textobj_codez<CmfBackboneInstance._sync_one_way(%s, %s): update mapping %sz (z) -> )r   r   r   )r   rK   rK   r   r   Nr   r   r~   r   deletec                 $    g | ]}|d          ddS )r   errorr   r?   )r   
dst_changes     r7   
<listcomp>z4CmfBackboneInstance._sync_oneway.<locals>.<listcomp>  s&    $s$s$sU_Jt,<%P%P$s$s$sr9   )T)setrL   CmfBackboneFieldMappingrM   rV   rj   r   r   r   r   r   r   r   r   r   r\   ri   debugr   r   ry   rz   r   r   ),r   r
   re   rf   r|   r   r   r   r   r   full_sync_datetimessrc_change_listobj_mappingsreverse_mappingfull_obj_data
_orig_itemr   apply_result_dictr  r   rE   log_markr   r   r   r   dst_parent_idparent_obj_mapping
src_parent
text_fieldparent_obj_changesr   r   r   r   r   r   r   r   r   r   r   rt   r   s,   ````                           @@@@@@@@@@@@@r7   rl   z CmfBackboneInstance._sync_oneway   s	    	X 	X 	X 	X 	X 	X	5 	5 	5 	5 	5 	5
	, 	, 	, 	, 	,	3 	3 	3 	3 	3
	M 	M 	M 	M 	M 	M	 	 	 	 	 	 	 	(
	 
	 
	 
	 
	W	 W	 W	 W	 W	 W	 W	 W	 W	 W	r	 	 	 	 	 	 	&	 	 	 	 	"	 "	 "	 "	 "	 "	 "	 "	 "	 "	 "	J 55  !8==/@@@ > 
 
 "1!2!22o c	- OL' M3 M3!(^
!444j9IL_`jLk9k9kLLp)h.B+^+^H\+^+^`dei`jlvx x x  -	$:>>&79W_Wk) 3` 3` 3` ? a a # &,&B&F&F*;y[c[o#- 7d 7d 7d 'G 'e 'eO
 ' &,&B&B.?9_g_s'6'AoNh)8)ETcTp-<-M-<-M 'C ' ' m,X6 #P$}"555$}:Mf:UYdYq:q:q)T--@@@ $] 3N C{Gc c c373F3J3J63R3R07;M7J7N7N~7^7^4#((4(888x''LLt)h.B+^+^H\+^+^`jl l l &F$+GJ$7$7M( 
!
  A-(2F/b/bHL`/b/b J
	4 4 4
 !*.t*M$'!%m!4JMMm)h.B+^+^H\+^+^T
M3 3 3 )D6CJ6O'
3" R"(">">*;y!)!5*%)-%8%<%<V%D%D)-m)<)@)@)P)P	 #? #R #RK
 ,7T$Z(&&xxzz2222 Q- "JZ(l(lXiXiXkXk(l(l(l% '6 EZ EZ
%6z$7G%H
!+!9!9XZkZp'3OO9MOO&( ( (
 #-T"2&,$ $ &,,X666!Y..)3)E)EJ) D9C 6$%/^^H%=%=
% 2Z*6z$7G*HK+5>>*+E+EL/9~~n/M/M, + 6* D D#.#;|#K#K#.#?CS#S#S :D 6;G 8?O < '$bdudz'/';$W$WAU$W$W'2'= %a %aAY %a %a+6+A%a %aEPE]%a %a %a!b !b !b
 !, 0 0 2 2 2 $.k#:o#M#MR\]jRkltRu  zB  SB  SB4>}4Mk4ZM9?9U9Y9Yer  }I  |J9Y  :K  :K$6189K9V1W1WJ1;M1J81TU[1\J'1'': %*>W>WXbcjXk>l>l
7(;269CK9P6C:B4:J;2<. <.	
>* 
>*(: )/(>(H(H,7192:+@R?S1T )I )* )* )*  *-8BhNNS]^iSjn}S}S} ; ;$/$:K<X$/$:K<X!Z !Z !ZGEZ   t t t$s$scr$s$s$sMMMtV m,,,G "1!2!22o c	- c	- c	- c	- c	-s   Y YYc                 z    | j         j        r| j         s'| j        r| j        r| j        s	d| _         d S d| _         d S d S )NstoppedrG   )rE   
is_changedr%   r/   r)   r5   s    r7   _calc_statusz CmfBackboneInstance._calc_status1  sT    {% 	(T[ 	(> ( (t~ (''		( 	(r9   c                    | j         j        rl| j         re	 t          j                            t
                              | j         j                             n!# t          $ r t          dd           Y nw xY w| j
        j        rn| j
        ri	 t          j                            t
                              | j
        j                             d S # t          $ r t          dd           Y d S w xY wd S d S )N)rJ   u>   Невалидный BQL-фильтр для проекта A!Tabortu>   Невалидный BQL-фильтр для проекта B!)r*   r  rL   r   countr   loadsr   rU   rb   r3   r5   s    r7   _calc_filtersz!CmfBackboneInstance._calc_filters9  s2   '2 	ht7S 	hh$$DJJt7S7Y,Z,Z$[[[[ h h hZbfggggggh '2 	ht7S 	hh$$DJJt7S7Y,Z,Z$[[[[[ h h hZbfgggggggh	h 	h 	h 	hs%   AA A65A6AC C0/C0c                 N    t                                                      g dz   S )N)r)   rE   r   r    r!   r$   r%   r&   r'   r(   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   
sync_tasks	sync_docs)supersave_preload_fields)r6   	__class__s    r7   r!  z'CmfBackboneInstance.save_preload_fieldsF  s/    ww**,, 0
 0
 0
 
 	
r9   c                 L    |p|}|p|} t                      j        d||d|S )N)r&   r0   r?   )r   r   )r   peer_a_projectpeer_b_projectr&   r0   rx   r"  s         r7   r   zCmfBackboneInstance.create`  sA     .?-?uww~q0AUfqqjpqqqr9   c                    | j         j        r| j         j        r| j        s| j        j        r$| j        j        r| j        rt          dd           | j        rgd| _        t          j
                            | j        j                  | _        | j        pd| _        d| _        d| _        |                     d           |                                  |                                   t+                      j        di |}| j        si }i }| j        j        s| j        j        rD| j        dv r| j        j        | j        j        d	}| j        d
v r| j        j        | j        j        d	}| j        j        r| j        j        |d<   | j        j        r| j        j        |d<   |r|                     d|           |r|                     d|           |S )Nu   Нельзя изменять проект в запущенной синхронизации, нужно создать новую.Tr  localr   F	full_syncr   )r  r  r   src_task_filter_ubqlr   )datar?   )r&   r  oldr%   r0   r/   rb   is_newr   rL   ry   get_peer_typer,   r   r+   r)   r$   r.   rk   r  r  r   r\   r  r  r   r*   r3   _update_peer)r6   rx   r   fields_to_update_afields_to_update_br"  s        r7   r\   zCmfBackboneInstance.saveg  s@   "-	j262H2L	jQUQ_	j%0	j595K5O	jTXTb	j   ]  ei  j  j  j  j; 	-&D%5CCDODYZZD!^3tDN &+D"%*D"t,,,eggl$$V$${ 	@!#!# ) 
T^-F 
>\11&*o&:%)^%8* *& >\11&*o&:%)^%8* *& +6 _=A=Y=^"#9:+6 _=A=Y=^"#9: " @!!#,>!???! @!!#,>!???
r9   c                     |                      | |          }t          j                            d||j        g|           d S )N)r
   r   r   ru   )r@   rL   ry   rz   r   )r6   peer_dispositionr+  	peer_datas       r7   r/  z CmfBackboneInstance._update_peer  sR    IIBRISS	((,	 	) 	
 	
 	
 	
 	
r9   Fc                    |                      ||           }t          j                            d|t	          | j        j        | j        j        | j        j        t          j
        |j        |j        |j                            }|r0|j        r)t          j                            d||d         g           | j        }|j        dk    r(|d         | _        |d	         | _        |d
         | _        nH|j        dk    r(|d         | _        |d	         | _        |d
         | _        nt-          d|j                  | j        r|s|                                  d S d S d S )Nrd   
setup_peer)backbone_instance_idbackbone_instance_codebackbone_instance_namebackbone_instance_domainpeer_project_idr   r*  )rv   rx   r)  r   r   r   r   r   r   zpeer_disposition must be a or b)r@   rL   ry   rz   r{   r   r   r   namerg   APP_FQDNr   r   r   r  r   r%   r'   r(   r/   r1   r2   r4   r\   )r6   r3  r)  r4  rv   was_changeds         r7   _setup_peerzCmfBackboneInstance._setup_peer  sy   II*:dISS	 %//y%)W\'+y~din)/ ) 4)BW%.%?2 2 2 0    	. 	",,)4:, -    o C''!$ZDN (,N';D$'+N';D$$"c))!$ZDN'+N';D$'+N';D$$>	@UVVV? 	; 	IIKKKKK	 	 	 	r9   c                     |                      g d           |s0|                     d|           |                     d|           dS |                     ||           dS )uU   Создаём пиры, если их нет, и обновляем кеш поля.)r)   r   r    r!   r$   r%   r&   r'   r(   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r   r(  r   N)load_fieldsr?  )r6   r3  r)  s      r7   rk   zCmfBackboneInstance.setup_peers  s     
 
 
 	 	 	   	DSI666SI66666-CCCCCr9   )NNN)NNNN)F)NF)r:   r;   r<   r   r   api_methodsdataclasses	dataclassr@   staticmethodcmf_deferred_jobr`   r   rQ   r   compiler   r   r   classmethodrl   r  r  r!  r   r\   r/  r?  rk   __classcell__)r"  s   @r7   r   r   
   s       ';GK K +S +S +S +S +S +S +S +SZ LLL    ML \ 4K K K
D D D8 	   		  	  U- U- U- [U-n( ( (h h h
 
 
 
 
4 r r r r r [r4 4 4 4 4l
 
 
! ! ! !FD D D D D D D Dr9   r   )astr   rC  rP   cmf.includemodules.backbone.fieldsr   r   r?   r9   r7   <module>rM     s    



           9 9 9 9 9 9LD LD LD LD LD/C LD LD LD LD LDr9   