
    i`                     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                       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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eed<   edd       Z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_ubqldoc_filter_ubqlc                     | t        |       S y )N)str)objs    2./modules/backbone/models/cmf_backbone_instance.pystr_or_nonez$CmfBackboneInstance.Peer.str_or_none   s    3x     c                 d   | j                   r| j                  dk(  r| j                  xs/ | j                  | j                   j                  j
                        | _        | j                  xs/ | j                  | j                   j                  j
                        | _        | j                  xs3 | j                  | j                   j                  j                               | _        | j                  $t        | j                   j                        | _        | j                  xs/ | j                  | j                   j                  j
                        | _        | j                   xs/ | j                  | j                   j"                  j
                        | _        | j$                  xs/ | j                  | j                   j&                  j
                        | _        | j(                  xs/ | j                  | j                   j*                  j
                        | _        | j,                  | j                   j.                  dv | _        | j0                  xs/ | j                  | j                   j2                  j
                        | _        | j4                  xs/ | j                  | j                   j6                  j
                        | _        y | j                  dk(  r| j                  xs/ | j                  | j                   j8                  j
                        | _        | j                  xs/ | j                  | j                   j:                  j
                        | _        | j                  xs3 | j                  | j                   j<                  j                               | _        | j                  $t        | j                   j>                        | _        | j                  xs/ | j                  | j                   j@                  j
                        | _        | j                   xs/ | j                  | j                   jB                  j
                        | _        | j$                  xs/ | j                  | j                   jD                  j
                        | _        | j(                  xs/ | j                  | j                   jF                  j
                        | _        | j,                  | j                   j.                  dv | _        | j0                  xs/ | j                  | j                   jH                  j
                        | _        | j4                  xs/ | j                  | j                   jJ                  j
                        | _        y | j                  rtM        d| j                        y y )Naabbibbar!   zInvalid peer disposition)'r
   r   r   r   peer_a_typevaluer   
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_ubqlr   peer_a_doc_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peer_b_doc_filter_ubql
ValueErrorselfs    r   __post_init__z&CmfBackboneInstance.Peer.__post_init__$   s   %%##s* $		 gT-=-=d>T>T>`>`>f>f-gDI#xxd4+;+;D<R<R<]<]<c<c+dDH!%!nt/?/?@V@V@c@c@k@k@m/nDJ.*.t/E/E/W/W*X"gga)9)9$:P:P:Z:Z:`:`)aDG&*oo&y9I9I$J`J`JrJrJxJx9yDO(,(9(9(T=M=MdNdNdNxNxN~N~=D%(,(9(9(T=M=MdNdNdNxNxN~N~=D%''/+/+A+A+K+K|+[(,0,A,A  -LTEUEUVZVlVl  WE  WE  WK  WK  FLD)+/+?+?  ,I4CSCSTXTjTj  UB  UB  UH  UH  DID(%%, $		 gT-=-=d>T>T>`>`>f>f-gDI#xxd4+;+;D<R<R<]<]<c<c+dDH!%!nt/?/?@V@V@c@c@k@k@m/nDJ.*.t/E/E/W/W*X"gga)9)9$:P:P:Z:Z:`:`)aDG&*oo&y9I9I$J`J`JrJrJxJx9yDO(,(9(9(T=M=MdNdNdNxNxN~N~=D%(,(9(9(T=M=MdNdNdNxNxN~N~=D%''/+/+A+A+K+K|+[(,0,A,A  -LTEUEUVZVlVl  WE  WE  WK  WK  FLD)+/+?+?  ,I4CSCSTXTjTj  UB  UB  UH  UH  DID(%%$%?AQAQRR &; &r   )returnz
str | None)__name__
__module____qualname__r
   object__annotations__r   r   r   r   r   r   r*   r   r   r   r   r   r   r   staticmethodr   r@    r   r   Peerr	      s    $(6(ScSs
DC
C c  c  T  $#$##		  
	 	Sr   rI   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/   r3   r4   r5   r7   r8   r9   r:   r0   rN   sync_periodlast_sync_datetime)filterfieldszSync %s error)modelsr   listrQ   defaultrR   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
   rQ   
sync_startes       r   sync_allzCmfBackboneInstance.sync_allE   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   Синхронизация запущена, она может выполняться длительное время)rR   re   	cmf_alertr>   s    r   r   zCmfBackboneInstance.force_synca   s"    "&		  J  	Kr   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_DISABLEDr_   warninginfosetup_peersrI   r0   _sync_onewayr=   )r?   peer_apeer_bs      r   rZ   zCmfBackboneInstance.syncf   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Cr   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][^>]*)?>z<span(?:[\s][^>]*)?[\s]data-macros-parameters="(?P<data_macros_params>[^"]+)"(?:[\s][^>]*)?><a(?:[\s][^>]*)?[\s]data-object-id="(?P<data_object_id>[^"]+)"(?:[\s][^>]*)?[\s]href="(?P<href>[^"]+)".*?<\/span><span(?:[\s][^>]*)?>(?P<name>[^<]+)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)rU   CmfBackbonePeer	call_peerr   dictrV   )r}   rn   s   r   get_change_listz9CmfBackboneInstance._sync_oneway.<locals>.get_change_list   sB    ))33kk]4q!ftH~+V 4 X Xr   c                  `    t         j                  j                  dj                   g      S )N	log_applyr   r   rU   r   r   r   )dst_change_listro   s   r   apply_change_listz;CmfBackboneInstance._sync_oneway.<locals>.apply_change_list   s2    ))33(kk?3 4 5 5r   c                 `    t         j                  j                  dj                  | g      S )Nget_objr   r   )obj_idrn   s    r   r   z1CmfBackboneInstance._sync_oneway.<locals>.get_obj   s4     ))33kk6* 4 , ,r   c                 `    t         j                  j                  dj                  | g      S )Nlog_mark_doner   r   )log_mark_listrn   s    r   r   z7CmfBackboneInstance._sync_oneway.<locals>.log_mark_done   s2    ))33hkk=1 4 3 3r   c                     t         j                  j                  | |      }t         j                  j                  |||       y )N)r   )rU   r   peer_get_attachment_contentpeer_put_attachment_content)src_attachment_idsrc_content_pathdst_attachment_iddst_content_pathcontentro   rn   s        r   transfer_attachment_contentzECmfBackboneInstance._sync_oneway.<locals>.transfer_attachment_content   sL    ,,HH!#3( I DG"">>!#3W8 ? Mr   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
   rn   
src_obj_idrT   r!   r   )r
   ro   r   rT   zMapping not found)rU   CmfBackboneObjMappinggetr   r   jsonr0   CmfError)src_idrequiredmappingdst_idr
   ro   rn   s       r   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Mr   c                 B    | s| S d| v r | d   d      }|sy || d<   | S )Nr   F)r   rH   )	obj_valuer   r   s     r   map_field_obj_valuez=CmfBackboneInstance._sync_oneway.<locals>.map_field_obj_value   s;      y   	$%@"(	$r   c                 X   	
fd}	
fd}	
fd}	
fd}t         j                  j                  ||       } 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_modelrn   r   rT   zUCmfBackboneInstance._sync_oneway(%s, %s): apply 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rU   r   r   r   r_   rs   r   r   r   rr   startend	matchattach_mappingr   dst_pathr
   ro   itemr   rn   s	       r   
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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[J\]b]h]h]jJjkljQx		% 0 > ?@A	CCr   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 )Nr   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   downloadr   r   s	       r   attach_mapperzZCmfBackboneInstance._sync_oneway.<locals>.map_text_inline_reference.<locals>.attach_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r   c           
         t         j                  j                  	j                  | d   g d      }|s>t        j                  d	j                   dj                   d   | d          | d   S t        j                  d	j                   dj                   d   | d   |j                         t        |j                        }| d	   j                  |j                  j                  |j                  j                        }|j                  d
      rHt        j                  d|j                  j                   |j                  j                  | d   d      }n| d   }| d   d | j!                  d      | j!                         z
    | d   | j#                  d      | j!                         z
  | j!                  d      | j!                         z
    | | d   | j#                  d      | j!                         z
  | j!                  d	      | j!                         z
    | | d   | j#                  d	      | j!                         z
  | j!                  d      | j!                         z
    | S )Ndata_object_id)src_obj_coder   dst_obj_coder   z`CmfBackboneInstance._sync_oneway(%s, %s): skip mention patch %s for obj %s: map for %s not foundr   r   r   zYCmfBackboneInstance._sync_oneway(%s, %s): apply mention patch %s for obj %s: map %s -> %shrefzCmfTask:^namer{   )countdata_macros_params)rU   r   r   r   r_   rr   rs   r   r   replacer   r   r   
startswithresubr   r   )
r   mention_mappingr   dst_hrefdst_namer
   ro   r   r   rn   s
        r   mention_mapperz[CmfBackboneInstance._sync_oneway.<locals>.map_text_inline_reference.<locals>.mention_mapper;  sm   "(">">"B"B&7%11$%56I	 #C # 'OOz)h.B.B-C4H\H\G]+^`dei`jlv./
 !8Oo%(*>*>)?tHDXDXCY'Z\`ae\fhr*+_-G-G _778 =001M1M1R1RTcTpTpTuTuv$$Z0!vvO88==>?'4499f	  &  H  %V}H Qx P-A!B5;;=!PQRQx		*> ? MekkZjNklqlwlwlyNyz{hQx		*: ;EKKM I%++V\J]^c^i^i^kJklmjQx		& 1%++- ?F@STYT_T_Ta@abcj""r   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
CmfCommentr   r   r   r   zYCmfBackboneInstance._sync_oneway(%s, %s): apply 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   )rU   r   r   r   r_   rs   r   r   rr   r   r   )r   comment_mappingr   r
   ro   r   r   rn   s      r   comment_mapperz[CmfBackboneInstance._sync_oneway.<locals>.map_text_inline_reference.<locals>.comment_mapperf  sI   "(">">"B"B&7<ZbZnZn$%56N`?a #C #c #LLs)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r   )r   r   _ATTACHMENT_IMG_RE_ATTACHMENT_TXT_RE_MENTION_RE_INLINE_COMMENT_RE)
text_valuer   r   r   r   r
   clsro   r   r   rn   s        r   map_text_inline_referencezCCmfBackboneInstance._sync_oneway.<locals>.map_text_inline_reference   s    C C8H H:)" )"VN N.  6 6
JOJ 6 6zRJLJ 6 6
SJr   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   r&   )text
text_draft)CmfTaskCmfDocumentr   rE   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           r   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.: r   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$   )r0   peer_a_fieldpeer_b_fieldr&   )r   fmfields_mappingss     r   map_custom_fieldz:CmfBackboneInstance._sync_oneway.<locals>.map_custom_field  se    % <<4'BOOz,I??000\\T)boo.K??000 r   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actionrT   r   r   r   r   obj_changesr   	parent_idrT   cf_)r   r   r   r   itemsr   )
obj_fieldsr   ressrc_parent_iddst_parent_ifr   field_changesr   r   r   r   r   obj_mappingr   s          r   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" Jr   )r0   r   r   )r
   rT   r   datetimezVCmfBackboneInstance._sync_oneway(%s, %s): skip record %s for obj %s, due full obj syncr   r   r   )r   r   r   r   r   r   r   r   )r   r   r   r   r   r   )r
   r   ro   r   rT   )	r
   r   rn   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   rn   r   r   r   rN   z:CmfBackboneInstance._sync_one_way(%s, %s): apply result %s)r   rN   success
error_textobj_codez<CmfBackboneInstance._sync_one_way(%s, %s): update mapping %sz (z) -> )r   r   r   )r   rT   rT   r   r&   Nr   r   r   r   deleteerror)T)setrU   CmfBackboneFieldMappingrV   r_   rs   r   r   r   r   r   r   r   r   r   re   rr   debugr   r  r   r   r   r   ),r   r
   rn   ro   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_changerN   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   r}   r   s,   ````                           @@@@@@@@@@@@@r   ru   z CmfBackboneInstance._sync_oneway   sx    	X	5
	,	3
	M	(
	B	 B	H	&	"	 "	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stoppedrP   )rN   
is_changedr,   r7   r0   r>   s    r   _calc_statusz CmfBackboneInstance._calc_statust  s;    {{%%T[[>>t~~''	 .9r   c                 <   | j                   j                  rT| j                   rH	 t        j                  j	                  t
        j                  | j                   j                               | j                  j                  rT| j                  rH	 t        j                  j	                  t
        j                  | j                  j                               | 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 Zw xY w# t        $ r t        dd       Y w xY w# t        $ r t        dd       Y w xY w# t        $ r t        dd       Y y w xY w)N)rS   u>   Невалидный BQL-фильтр для проекта A!Tabortu>   Невалидный BQL-фильтр для проекта B!)r1   r$  rU   r   r   r   loadsr&   r^   rk   r;   r2   r   r<   r>   s    r   _calc_filtersz!CmfBackboneInstance._calc_filters|  s   ''22t7S7Sh$$DJJt7S7S7Y7Y,Z$[ ''22t7S7Sh$$DJJt7S7S7Y7Y,Z$[ &&11d6Q6Qh""((

4;V;V;\;\0](^ &&11d6Q6Qh""((

4;V;V;\;\0](^ 7R1  hZbfggh  hZbfggh  hZbfgh  hZbfghsK   AF, AG	 8AG& "AH ,GG	G#"G#&G?>G?HHc                 *    t         |          g dz   S )N)r0   rN   r%   r'   r(   r+   r,   r-   r.   r/   r1   r3   r4   r5   r6   r7   r8   r9   r:   r;   
sync_tasks	sync_docs)supersave_preload_fields)r?   	__class__s    r   r/  z'CmfBackboneInstance.save_preload_fields  s    w*, 0
 
 	
r   c                 @    |xs |}|xs |}t        |   d||d|S )N)r-   r8   rH   )r.  r	  )r   peer_a_projectpeer_b_projectr-   r8   r   r0  s         r   r	  zCmfBackboneInstance.create  s7     .?-?w~q0AUfqjpqqr   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                  si }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<   | j8                  j                  r| j8                  j2                  |d<   | j:                  j                  r| j:                  j2                  |d<   |r| j=                  d|       |r| j=                  d|       |S )Nu   Нельзя изменять проект в запущенной синхронизации, нужно создать новую.Tr'  localr    F	full_syncr   )r,  r-  r#   src_task_filter_ubqlsrc_doc_filter_ubqlr   )datarH   )r-   r$  oldr,   r8   r7   rk   is_newr%   rU   r   get_peer_typer4   r&   r3   r0   r+   r6   rt   r*  r%  r.  re   r,  r-  r   r1   r;   r2   r<   _update_peer)r?   r   r   fields_to_update_afields_to_update_br0  s        r   re   zCmfBackboneInstance.save  sR   ""--$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:**55<@<W<W<\<\"#89**55<@<W<W<\<\"#89 "!!#,>!?!!!#,>!?
r   c                     | j                  | |      }t        j                  j                  d||j                  g|       y )N)r
   r   r  r~   )rI   rU   r   r   r   )r?   peer_dispositionr:  	peer_datas       r   r>  z CmfBackboneInstance._update_peer  s@    IIBRIS	((,,	 	) 	
r   c                    | j                  ||       }t        j                  j                  d|t	        | j
                  j                  | j                  j                  | j                  j                  t        j                  |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| j1                          y y y )Nrm   
setup_peer)backbone_instance_idbackbone_instance_codebackbone_instance_namebackbone_instance_domainpeer_project_idr   r8  r9  )r   r   r7  r   r   r   r   r   r"   zpeer_disposition must be a or b)rI   rU   r   r   r   r   r   r  r   rp   APP_FQDNr   r   r   r   r$  r   r,   r.   r/   r7   r9   r:   r=   re   )r?   rB  r7  rC  r   was_changeds         r   _setup_peerzCmfBackboneInstance._setup_peer  s[   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 $/?r   c                     | j                  g d       |s'| j                  d|       | j                  d|       y| j                  ||       y)uU   Создаём пиры, если их нет, и обновляем кеш поля.)r0   r%   r'   r(   r+   r,   r-   r.   r/   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r   r6  r"   N)load_fieldsrM  )r?   rB  r7  s      r   rt   zCmfBackboneInstance.setup_peers  sT     
 	  SI6SI6-Cr   )NNN)NNNN)F)NF)rB   rC   rD   r   r   api_methodsdataclasses	dataclassrI   rG   cmf_deferred_jobri   r   rZ   r   compiler   r   r   r   classmethodru   r%  r*  r/  r	  re   r>  rM  rt   __classcell__)r0  s   @r   r   r   
   s"   ';;GGK K 3S 3S 3Sj L  M  4K
D8 	  		 	 **	K  @- @-D(h2
4 r r8t
"HDr   r   )astr   rQ  rY   cmf.includemodules.backbone.fieldsr   r   rH   r   r   <module>rZ     s.    
     9bD/CC bDr   