
    oi                     d    d dl Z d dl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)*)cmf_backbone_instancec                   v    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j                  d
      Zej                  d      Zej                  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y)CmfBackboneInstance.PeerNbackbone_instancedispositiontypeurltoken
ssl_verifyid
project_idproject_codeproject_nameis_src_peertask_filter_ubqlc                    | j                   r3| j                  dk(  r| j                  xs t        | j                   j                        | _        | j
                  xs t        | j                   j                        | _        | j                  xs- t        | j                   j                  j                               | _        | j                  $t        | j                   j                        | _
        | j                  xs t        | j                   j                        | _        | j                  xs t        | j                   j                         | _        | j"                  xs t        | j                   j$                        | _        | j&                  xs t        | j                   j(                        | _        | j*                  | j                   j,                  dv | _        | j.                  xs t        | j                   j0                        | _        y | j                  dk(  r| j                  xs t        | j                   j2                        | _        | j
                  xs t        | j                   j4                        | _        | j                  xs- t        | j                   j6                  j                               | _        | j                  $t        | j                   j8                        | _
        | j                  xs t        | j                   j:                        | _        | j                  xs t        | j                   j<                        | _        | j"                  xs t        | j                   j>                        | _        | j&                  xs t        | j                   j@                        | _        | j*                  | j                   j,                  dv | _        | j.                  xs t        | j                   jB                        | _        y | j                  rtE        d| j                        y y )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* $		 TS1G1G1S1S-TDI#xxQ3t/E/E/P/P+QDH!%!as43I3I3V3V3^3^3`/aDJ.*.t/E/E/W/W*X"ggNT-C-C-M-M)NDG&*oo&fT=S=S=e=e9fDO(,(9(9(lSAWAWAkAk=lD%(,(9(9(lSAWAWAkAk=lD%''/+/+A+A+K+K|+[(,0,A,A,xSI_I_IwIwExD)%%, $		 TS1G1G1S1S-TDI#xxQ3t/E/E/P/P+QDH!%!as43I3I3V3V3^3^3`/aDJ.*.t/E/E/W/W*X"ggNT-C-C-M-M)NDG&*oo&fT=S=S=e=e9fDO(,(9(9(lSAWAWAkAk=lD%(,(9(9(lSAWAWAkAk=lD%''/+/+A+A+K+K|+[(,0,A,A,xSI_I_IwIwExD)%%$%?AQAQRR &7 &    )__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r9   r@   Tz	@minutely)	only_once
system_jobschedulec                     t         j                  j                  g dg d      D ]  } | j                  xs | j                  j                  }| j
                  r| j
                  j                  |k  rMt        j                         }	 | j                          d | _	        t#        t        j                         |z
        | _        | j
                  j'                          | j)                          t+                 y # t        t        f$ r  t        $ r:}t        j                  d|        t                t!        |      | _	        Y d }~d }~ww xY w)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!    "(!;!;!@!@Hb lL!@ "M 	  ,77`;L;X;X;`;`K 338I8\8\8`8`cn8nJ;!&&(48!1 47tyy{Z7O3P00088:""$/	   12  ;!!/3DE$&47F!11;s   C;;E0EEc                 H    d | _         | j                          t        d       y )Nuu   Синхронизация запущена, она может выполняться длительное время)rI   r\   	cmf_alertr5   s    r7   r   zCmfBackboneInstance.force_syncY   s"    "&		  J  	Kr9   c                 F   t         j                  rt        j                  d|  d       yt        j	                  d|  d       | j                          | j                  d|       }| j                  d|       }| j                  dk(  r| j                  | ||	       nk| j                  d
k(  r| j                  | ||	       nG| j                  dk(  r)| j                  | ||	       | j                  | ||	       nt        d|  d      t        j	                  d|  d       y)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^   s    **OO7v=lmn0mDEsdCsdC>>T!vPVW^^t#vPVW^^t#vPVWvPVW8>[\]]0kB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][^>]*)?>c                     !"#$%&'()*+ *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                  j                  g d      ! |       x}rg  i }|D ]  ""d   ++|
v rA"d   |
+   k  r6t        j                  dj                   dj                   "d   +       N"d   )t        j                  j                  )j                  +g d      ((st        j                  j                  )j                  +g d      }|rdt        j                  )j                  |j                  |j                  |j                  |j                  |j                  |j                  	      ("d   d   (rd"d   v r"d   d   (j                  k7  sd"d   v r "d   d   (j                  k7  r
"d   j                  d      (_        "d   j                  d      (_        (j                  d       nŉdk(  rt        j                  d j                   dj                   +       d! |+      }|s7t        j!                  d"j                   dj                   "d   +       "d   |d<   "d   }t        j#                  d#j                   dj                   "d   |       |"|d   |
+<   (sIt        j                  )j                  +"d   j                  d      "d   j                  d      $      ((|"d   <    j%                   |	                rg }	  |       D ci c]  }|d   |
 }} D ]  }||d      }|j                  d%      }t        j#                  d&j&                  j                   dj                   |       |d   |d'}|j%                  |       |d(k7  r|j                  d)      }|r||d)<   |j                  d      }|s||d      (|j                  d*      }|j                  d      }(j                  |k7  s(j                  |k7  s(j                  |k7  r?|(_	        |(_        |(_        t        j#                  d+j&                  j                   dj                   (j                   d,(j                   d-(j                   d,(j                   d.       (j                          |d   d/k(  r|d   d   d!k(  r|d   d0   }t        j                  j                  |d1g2      } ||j                        }|d   d3   d4   }|d5   rL '|d5         |d5<   d6|d   |dd4|id7d8}t        j(                  j+                  d9j,                  |gg:       |d   d   d;k7  sG|d   d/k(  sQ |(j                  (j                  (j                  (j                          	  ||        |       x}ry6y6c c}w # t.        $ r  D cg c]
  }|d   d<d' nc c}w }}Y @w xY w)>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                  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   sB    ))33kk]4q!ftH~+V 4 X Xr9   c                  `    t         j                  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(kk?3 4 5 5r9   c                 `    t         j                  j                  dj                  | g      S )Nget_objr   r   )obj_idre   s    r7   r   z1CmfBackboneInstance._sync_oneway.<locals>.get_obj   s4     ))33kk6* 4 , ,r9   c                 `    t         j                  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kk=1 4 3 3r9   c                     t         j                  j                  | |      }t         j                  j                  |||       y )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   sL    ,,HH!#3( I DG"">>!#3W8 ? Mr9   Tc                    t         j                  j                  j                  | dg      }|xr |j                  j
                  }|sWj                  dk(  rHt         j                  j                  j                  | dg      }|xr |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266"3h>R>R!<. 7 G 8!3!3!8!8F /99TA 66::&7(BVBV%|n ;  !<W%7%7%<%<24ExG[G[]cddMr9   c                 B    | s| S d| v r | d   d      }|sy || d<   | S )Nr   F)r   r?   )	obj_valuer   r   s     r7   map_field_obj_valuez=CmfBackboneInstance._sync_oneway.<locals>.map_field_obj_value   s;      y   	$%@"(	$r9   c                    	fd}	fd}	fd}t         j                  j                  ||       } t         j                  j                  ||       } t         j                  j                  ||       } | S )Nc           	         t         j                  j                  dj                  | d   ddg      }|rot        j                  dj                   dj                   d   | d   |j                         t        |j                        }t        |j                        }n=t        j                  d	j                   dj                   d   | d          d
}d
}| d   d | j                  d      | j                         z
    | | d   | j                  d      | j                         z
  | j                  d      | j                         z
    | | d   | j                  d      | j                         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]q$%56N`?a "B "c "LLn)h.B.B-C4H\H\G]+^`dei`jlv./1J1JL
 !!:!:;F">#B#BCHOOv)h.B.B-C4H\H\G]+^`dei`jlv./1  F!HQx L-=!>u{{}!LMNhQx		*: ;EKKM I%++V[J\]b]h]h]jJjkljQx		% 0 > ?@A	CCr9   c           	         t         j                  j                  dj                  | d   ddg      }|rot        j                  dj                   dj                   d   | d   |j                         t        |j                        }t        |j                        }n=t        j                  d	j                   dj                   d   | d          d
}d
}| d   d| j                  d      | j                         z
    | | d   | j                  d      | j                         z
  | j                  d      | j                         z
    | | d   | j                  d      | j                         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]q$%56N`?a "B "c "LLo)h.B.B-C4H\H\G]+^`dei`jlv./1J1JL
 !!:!:;F">#B#BCH OOv)h.B.B-C4H\H\G]+^`dei`jlv./1  F!HQx L-=!>u{{}!LMNhQx		*: ;EKKM I%++V`JabgbmbmboJopqjQx		* 5ekkm C DEF	HHr9   c           	      @   t         j                  j                  dj                  | d   ddg      }|rZt        j                  dj                   dj                   d   | d   |j                         t        |j                        }n;t        j                  d	j                   dj                   d   | d          d
}| d   d | j                  d      | j                         z
    | | d   | j                  d      | j                         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$  sI   "(">">"B"B&7<ZbZnZn$%56N`?a #C #c #LLr)h.B.B-C4H\H\G]+^`dei`jlv./1K1KM !!;!;<FOOz)h.B.B-C4H\H\G]+^`dei`jlv./1  FQx L-=!>u{{}!LMNhQx		*: ;EKKM I JKL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   sw    C C8H H<N N.  6 6
JOJ 6 6*MJ 6 6
SJr9   c                 &   t        j                  |       }|d   }|dk(  r|dv r
dv r|d   r 	|d         |d<   |S |dk(  r |d         |d<   |S |dk(  r9dD ]4  }||v sg }||   D ]  } |      }|s|j                  |         |||<   6 |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    --4K#F+IG#!77IIq<q  wB  CJ  wK+D[QXEY+ZK(  h&':;w;O'PG$  m+!A :I K/#%)4Y)? ;I(;I(FI( (	 :; 2:I.: r9   c                     D ]n  }|j                   dk(  r'|j                  | k(  r|j                  j                  c S |j                   dk(  r'|j                  | k(  r|j                  j                  c S p y )Nr   r   )r)   peer_a_fieldpeer_b_fieldr   )r   fmfields_mappingss     r7   map_custom_fieldz:CmfBackboneInstance._sync_oneway.<locals>.map_custom_fieldS  se    % <<4'BOOz,I??000\\T)boo.K??000 r9   c                  f   i } t        |       }t        d   xr j                  j                  |      }d   j                  d      }|r |      }||d<   d   j                  di       j	                         D ]-  \  }}|j                  d      r 	|      }|s" 
||      | |<   / |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'B'	C !/33K@M !'} 5+8K(-1--@-D-DXr-R-X-X-Z V)
M((/!1*!=J%  *;=*)U
:&V" 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   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   deleteerror)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_dataapply_result_dict
dst_changerE   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   sx    	X	5
	,	3
	M	(
	W	 W	r	&	"	 "	J 5  !88==/@ > 
 "1!22o2 OL' M3!(^
!44j9IL_`jLk9kLLp)h.B.B-C4H\H\G]+^`dei`jlvx  -	$::>>&79W_WkWk) 3` ? a #&,&B&B&F&F*;y[c[o[o#- 7d 'G 'eO
 '&,&B&B.?9_g_s_s'6'A'AoNhNh)8)E)ETcTpTp-<-M-M-<-M-M 'C ' m,X6$}"55$}:Mf:UYdYqYq:q)T--@@ $] 3N C{GcGc c373F3J3J63R07;M7J7N7N~7^4#((4(8x'LLt)h.B.B-C4H\H\G]+^`jl &F$+J$7M(
  A-(2F2F1GtHL`L`Ka/b J
	4
 !*.t*M$'!%m!4JMMm)h.B.B-C4H\H\G]+^T
M3 )D6CJ6O'
3""(">">*;y!)!5!5*%)-%8%<%<V%D)-m)<)@)@)P	 #? #RK
 ,7T$Z(&&xz2[M3^  "JZXiXk(l*D)9:)E(l%(l '6 EZ
%6z$7G%H
!+!9XZkZpZp'334D9M9M8NO&(
 #-T"2&,$ &,,X6!Y.)3)EJ)9C 6$%/^^H%=
%*6z$7G*HK+5>>*+EL/9~~n/M, + 6 6* D#.#;#;|#K#.#?#?CS#S :D 6;G 8?O < '$bdudzdz'/';';&<DAUAU@V$W'2'='=&>bAYAY@Z [++6+A+A*B"[E]E]D^^_%a!b
 !, 0 0 2 $.k#:o#MR\]jRkltRu  zB  SB4>}4Mk4ZM9?9U9U9Y9Yer  }I  |J9Y  :K$6189K9V9V1WJ1;M1J81TU[1\J'1'':>WXbcjXk>l
7(;269CK9P6C:B4:J;2<.	
>*(: )/(>(>(H(H,7192:++@R?S1T )I )*  *-8BhNS]^iSjn}S} ;$/$:$:K<X<X$/$:$:K<X<X!ZGEZP m,G "1!22o2n )m tcr$sU_Jt,<%P$s$sM$sts0   6	X2 ?X-X2 -X2 2Y?YYYc                     | j                   j                  r| j                   s4| j                  r| j                  r| j                  sd| _         y d| _         y y )NstoppedrG   )rE   
is_changedr%   r/   r)   r5   s    r7   _calc_statusz CmfBackboneInstance._calc_status1  s;    {{%%T[[>>t~~''	 .9r9   c                     | j                   j                  rT| j                   rH	 t        j                  j	                  t
        j                  | j                   j                               | j                  j                  rV| j                  rI	 t        j                  j	                  t
        j                  | j                  j                               y y y # t        $ r t        dd       Y w xY w# t        $ r t        dd       Y y w xY w)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  s    ''22t7S7Sh$$DJJt7S7S7Y7Y,Z$[ ''22t7S7Sh$$DJJt7S7S7Y7Y,Z$[ 8T2  hZbfgh  hZbfghs%   AC AC4 C10C14DDc                 *    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    w*, 0
 
 	
r9   c                 @    |xs |}|xs |}t        |   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`  s7     .?-?w~q0AUfqjpqqr9   c                    | j                   j                  r"| j                   j                  r| j                  s8| j                  j                  r/| j                  j                  r| j
                  rt        dd       | j                  rtd| _        t        j                  j                  | j                  j                        | _        | j                  xs d| _        d| _        d| _        | j%                  d       | j'                          | j)                          t+        | X  di |}| j                  s.i }i }| j.                  j                  s| j0                  j                  rv| j                  dv r-| j.                  j2                  | j0                  j2                  d	}| j                  d
v r-| j.                  j2                  | j0                  j2                  d	}| j4                  j                  r| j4                  j2                  |d<   | j6                  j                  r| j6                  j2                  |d<   |r| j9                  d|       |r| j9                  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   ""--$2H2H2L2LQUQ_Q_%%00T5K5K5O5OTXTbTb  ]  ei  j;;&D%55CCDOODYDYZD!^^3tDN &+D"%*D"t,gl$V${{!#!# ))T^^-F-F>>\1&*oo&:&:%)^^%8%8*& >>\1&*oo&:&:%)^^%8%8*& ++66=A=Y=Y=^=^"#9:++66=A=Y=Y=^=^"#9: "!!#,>!?!!!#,>!?
r9   c                     | j                  | |      }t        j                  j                  d||j                  g|       y )N)r
   r   r   ru   )r@   rL   ry   rz   r   )r6   peer_dispositionr%  	peer_datas       r7   r)  z CmfBackboneInstance._update_peer  s@    IIBRIS	((,,	 	) 	
r9   c                    | j                  ||       }t        j                  j                  d|t	        | j
                  j                  | j                  j                  | j                  j                  t        j                  |j                  |j                  |j                              }|r2|j                  r&t        j                  j                  d||d   g       | j                  }|j                  dk(  r|d   | _        |d	   | _        |d
   | _        nD|j                  dk(  r|d   | _        |d	   | _        |d
   | _        nt-        d|j                        | j                  r|s| j/                          y y y )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   r-  r#  r.  rv   was_changeds         r7   _setup_peerzCmfBackboneInstance._setup_peer  sR   II*:dIS	 %%//y%)WW\\'+yy~~diinn)/ ) 4 4)BWBW%.%?%?2 0  .."",,)4:, -  oo  C'!$ZDN (,N';D$'+N';D$""c)!$ZDN'+N';D$'+N';D$>	@U@UVV??;IIK $/?r9   c                     | j                  g d       |s'| j                  d|       | j                  d|       y| j                  ||       y)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_fieldsr9  )r6   r-  r#  s      r7   rk   zCmfBackboneInstance.setup_peers  sT     
 	  SI6SI6-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)  r9  rk   __classcell__)r  s   @r7   r   r   
   s   ';;GGK K +S +S +SZ L  M  4K
D8 	  		 	 U- U-n(h
4 r r4l
!FDr9   r   )astr   r=  rP   cmf.includemodules.backbone.fieldsr   r   r?   r9   r7   <module>rG     s.    
     9LD/CC LDr9   