
    ?Rh                     `    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d            Zd Zd Z fdZed fd	            Z f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   r6    r7   r5   Peerr	      s         $(6(((ScSs
DC
C c    c    T    $#$$$	S 	S 	S 	S 	Sr7   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-   r.   r/   r0   r'   rC   sync_periodlast_sync_datetime)filterfieldszSync %s error)modelsr   listrF   defaultrG   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
   rF   
sync_startes       r5   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   Синхронизация запущена, она может выполняться длительное время)rG   rZ   	cmf_alertr3   s    r5   r   zCmfBackboneInstance.force_syncY   s>    "&		  J  	K  	K  	K  	K  	Kr7   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_DISABLEDrT   warninginfosetup_peersr>   r'   _sync_onewayr2   )r4   peer_apeer_bs      r5   rO   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Cr7   z<img(?:[\s][^>]*)?[\s]data-attach-id="(?P<data_attach_id>CmfAttachment:[0-9a-f-]+)"(?:[\s][^>]*)?[\s]src="(?P<src>[^"]+)"(?:[\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         d/k    r|d         d         d k    r|d         d0         }t          j                            |d1g2          } ||j
                  }|d         d3         d4         }|d5         rP '|d5                   |d5<   d6|d         |dd4|id7d8}t          j                            d9j        |gg:           |d         d         d;k    r.|d         d/k    r" |(j
        (j        (j	        (j                   n# t.          $ r d<  D             }Y nw xY w ||            |            x}d6S d6S )>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)rJ   CmfBackbonePeer	call_peerr   dictrK   )rr   rc   s   r5   get_change_listz9CmfBackboneInstance._sync_oneway.<locals>.get_change_list   sK    )33k]4q!ftH~~+V+V+V 4 X X Xr7   c                  V    t           j                            dj         g          S )N	log_applyrs   rt   rJ   rv   rw   r   )dst_change_listrd   s   r5   apply_change_listz;CmfBackboneInstance._sync_oneway.<locals>.apply_change_list   s2    )33(k?3 4 5 5 5r7   c                 V    t           j                            dj        | g          S )Nget_objr|   r}   )obj_idrc   s    r5   r   z1CmfBackboneInstance._sync_oneway.<locals>.get_obj   s4     )33k6* 4 , , ,r7   c                 V    t           j                            dj        | g          S )Nlog_mark_doner|   r}   )log_mark_listrc   s    r5   r   z7CmfBackboneInstance._sync_oneway.<locals>.log_mark_done   s2    )33hk=1 4 3 3 3r7   c                     t           j                            | |          }t           j                            |||           d S )N)rs   )rJ   rv   peer_get_attachment_contentpeer_put_attachment_content)src_attachment_idsrc_content_pathdst_attachment_iddst_content_pathcontentrd   rc   s        r5   transfer_attachment_contentzECmfBackboneInstance._sync_oneway.<locals>.transfer_attachment_content   sd    ,HH!#3( I D DG">>!#3W8 ? M M M M Mr7   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
   rc   
src_obj_idrI   r   r   )r
   rd   r   rI   zMapping not found)rJ   CmfBackboneObjMappinggetr   r   jsonr'   CmfError)src_idrequiredmappingdst_idr
   rd   rc   s       r5   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Mr7   c                 P    | s| S d| v r | d         d          }|sd S || d<   | S )Nr   F)r   r=   )	obj_valuer   r   s     r5   map_field_obj_valuez=CmfBackboneInstance._sync_oneway.<locals>.map_field_obj_value   sR     !  y    	$%@@@  4"(	$r7   c                 X    fd}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_modelrc   r   rI   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)rJ   r   r   r   rT   rh   r   r   r   rg   startend)	matchattach_mappingr   dst_pathr
   rd   itemr   rc   s	       r5   
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r7   )resub_ATTACHMENT_IMG_RE)
text_valuer   r
   clsrd   r   r   rc   s     r5   map_text_inline_referencezCCmfBackboneInstance._sync_oneway.<locals>.map_text_inline_reference   sT    C C C C C C C C C6 66#0*jIIIr7   c                 V   t          j        |           }|d         }|dk    r'|dk    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)CmfTask
CmfCommentr;   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           r5   map_field_changesz;CmfBackboneInstance._sync_oneway.<locals>.map_field_changes   s   -44K#F+IG##''I9R,R,RWbcjWk,R+D+D[QXEY+Z+ZK(h&&':':;w;O'P'PG$$m++!A : :I K//#%)4Y)? ; ;I(;(;I(F(FI( ; (	 : : :19I.r7   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     r5   map_custom_fieldz:CmfBackboneInstance._sync_oneway.<locals>.map_custom_field  su    %  <4''BOz,I,I?0000\T))bo.K.K?0000  r7   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actionrI   r   r   r   r   obj_changesr   	parent_idrI   cf_)rx   r   r   r   items
startswith)
obj_fieldsr   ressrc_parent_iddst_parent_ifr   field_changesr   r   r   r   r   obj_mappingr   s          r5   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
:&& Jr7   )r'   r   r   )r
   rI   r   datetimezVCmfBackboneInstance._sync_oneway(%s, %s): skip record %s for obj %s, due full obj syncr   r   r   )src_obj_coder   r   dst_obj_coder   r   r   )r
   r   rd   r   rI   )	r
   r   rc   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   rc   r   r   r   c                      i | ]}|d          |S )r   r=   ).0
apply_datas     r5   
<dictcomp>z4CmfBackboneInstance._sync_oneway.<locals>.<dictcomp>  s    (l(l(l*D)9:(l(l(lr7   rC   z:CmfBackboneInstance._sync_one_way(%s, %s): apply result %sr   rC   success
error_textobj_codez<CmfBackboneInstance._sync_one_way(%s, %s): update mapping %sz (z) -> )r   r   r   )r   rI   rI   r   r   Nr   r   r{   r|   deletec                 $    g | ]}|d          ddS )r   errorr   r=   )r   
dst_changes     r5   
<listcomp>z4CmfBackboneInstance._sync_oneway.<locals>.<listcomp>  s&    $s$s$sU_Jt,<%P%P$s$s$sr7   )T)setrJ   CmfBackboneFieldMappingrK   rT   rh   r   r   r   r   r   r   r   r   r   rZ   rg   debugr   r   rv   rw   r   r   ),r   r
   rc   rd   ry   r   r   r   r   r   full_sync_datetimessrc_change_listobj_mappingsreverse_mappingfull_obj_data
_orig_itemr   apply_result_dictr   r   rC   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   rr   r   s,   ````                           @@@@@@@@@@@@@r5   rj   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	 	 	 	 	 	 	 	(
	 
	 
	 
	 
		J 	J 	J 	J 	J 	J 	J 	J 	J 	J@	 	 	 	 	 	 	&	 	 	 	 	"	 "	 "	 "	 "	 "	 "	 "	 "	 "	 "	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stoppedrE   )rC   
is_changedr#   r-   r'   r3   s    r5   _calc_statusz CmfBackboneInstance._calc_status  sT    {% 	(T[ 	(> ( (t~ (''		( 	(r7   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)rH   u>   Невалидный BQL-фильтр для проекта A!Tabortu>   Невалидный BQL-фильтр для проекта B!)r(   r  rJ   r   countr   loadsr   rS   r`   r1   r3   s    r5   _calc_filtersz!CmfBackboneInstance._calc_filters  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'   rC   r#   r-   )supersave_preload_fields)r4   	__class__s    r5   r  z'CmfBackboneInstance.save_preload_fields  s/    ww**,, 0= 0= 0= = 	=r7   c                 L    |p|}|p|} t                      j        d||d|S )N)r$   r.   r=   )r  r   )r   peer_a_projectpeer_b_projectr$   r.   ru   r  s         r5   r   zCmfBackboneInstance.create  sA     .?-?uww~q0AUfqqjpqqqr7   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        s	| j        j        ry| j        dk    r't          j
                            | j        d          }n&t          j
                            | j        d          }| j        |_        |                                 n| j        j        rx| j        d	k    r't          j
                            | j        d          }n&t          j
                            | j        d          }| j        |_        |                                 |S )Nu   Нельзя изменять проект в запущенной синхронизации, нужно создать новую.Tr  localr   F	full_sync)backbone_instance_idr   r   r=   )r$   r  oldr#   r.   r-   r`   is_newr   rJ   rv   get_peer_typer*   r   r)   r'   r"   r,   ri   r  r  r  rZ   r(   r   r   src_task_filter_bqlr1   )r4   ru   r   rs   r  s       r5   rZ   zCmfBackboneInstance.save  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$${ 	+6 >T))!15547`d5eeDD!15547`d5eeD+/+G(		-8 >T))!15547`d5eeDD!15547`d5eeD+/+G(		
r7   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 )Nrb   
setup_peer)r  backbone_instance_codebackbone_instance_namebackbone_instance_domainpeer_project_idr   src_task_filter_ubql)rs   ru   r  r   r|   r   r   r   r   zpeer_disposition must be a or b)r>   rJ   rv   rw   rx   r   r   r   namere   APP_FQDNr   r   r   r  r   r#   r%   r&   r-   r/   r0   r2   rZ   )r4   peer_dispositionr  	peer_datars   was_changeds         r5   _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	 	 	 	r7   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-   r.   r/   r0   r1   r   r  r   N)load_fieldsr)  )r4   r&  r  s      r5   ri   zCmfBackboneInstance.setup_peersQ  s     
 
 
 	 	 	   	DSI666SI66666-CCCCCr7   )NNN)NNNN)F)NF)r8   r9   r:   r   r   api_methodsdataclasses	dataclassr>   staticmethodcmf_deferred_jobr^   r   rO   r   compiler   classmethodrj   r  r  r  r   rZ   r)  ri   __classcell__)r  s   @r5   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 	  \- \- \- [\-|
( ( (h h h= = = = = r r r r r [r+ + + + +Z! ! ! !FD D D D D D D Dr7   r   )astr   r-  rN   cmf.includemodules.backbone.fieldsr   r   r=   r7   r5   <module>r7     s    



           9 9 9 9 9 9T	D T	D T	D T	D T	D/C T	D T	D T	D T	D T	Dr7   