
    #h                       d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlmZmZ d dlmZ d dlmZmZmZmZ d dlmZ d dlZd dlZd dlZd dlmZ d dlmZ d dlm Z m!Z! d d	l"m#Z# d d
l$m%Z% d dl&m'Z' d dl(T d dl)m*Z+ d dl,Z&d dl-Z- e-j.        d          Z/ G d de0          Z0d Z1 G d de2          Z3 G d de#          Z4 e0e5de6j7                  Z8 e4e8          e8_9        de8_:        de8_;        g e8_<        de8_=        d e8j6        d<   i e8_>        de8_?        i e8_@        de8_A        de8_B        de8_C         ejD                    e8_E        i e8_F        e6jG        e8_H        d dlImJZJmKZK d dlLmMZM d dlLmNZN d dlOZOi e8_P        deQfdZReRe8_R        dd ZS G d! d"          ZT eT            ZU eVe6d#          rve6jW        d$         d%         d&k    r_e6jW        d$         X                                ZYeYZ                    d%           d'eYv reYZ                    d'            eOj[        di eYeU_O        e\j]        ^                    d(          reUjO         e_d)          e8d*e6j`        dd+Za eVe6d#          re6jW        d$         d%         d&k    re6jW        d$         d,         Zbe6jW        d$         ^                    d-          r-d.e6jW        d$         d-          d/eb Zc eMecd0d1          Zdedead2<   nd3Zed4e6jW        d$         v reee6jW        d$         d4         z  Zed5e6jW        d$         v reed6e6jW        d$         d5          d7z  Zeeee6jW        d$         d8         z  Zeeed6e6jW        d$         ^                    d9d:           z  Zeeed;eb z  Zeeeead<<   d d=lfmgZg d>eg_h         eJdi eaZL eNe6j`        ?          Zi eNe6j`        ?          Zje\jk        l                    e6j7        d@z             rV eme6j7        d@z             5 Zneno                                p                                e6_q        ddd           n# 1 swxY w Y    eVe6d#          rXe6jW        d$         d%         d&k    r e3eUjO        A          Zrn9e6jW        d$         d%         dBk    r e3dC          Zrn e_dD           e3            ZreUe8_U        de8_s        d e8_t        e8u                    e_          dE             Zve8w                    e_ev            ee6j7                  dFz  Zx ee6j7                  dGz  Zyd dHlzm{Z{ exl                                r' e{j|        ex}                                          e8_~        eyl                                r' e{j|        ey}                                          e8_        g dIe8_        dJ Z:dK ZdL ZdM ZdN Z;de8_        de8_        de8_        dO ZdP ZdQ Z ee:           ee          _:         ee:           ee          _         ee           ee          _         ee           ee          _         ee           ee          _         ee           ee          _         ee           ee          _         ee;           ee          _;        dR Z ee           ee          _        dS Z ee           ee          _        ddVZddWZdddXdYZdZ Ze8j        d[             Zdd\Zdd]Zd^ Zd_ Zd` Zda Zdb ZddcZdd Zde Zdf Zdg Ze8j        dh             Zdi Zdj Zdk Ze8j        ddl            ZddmZddnZd;ddog dpdqZ	 	 ddrZds Zdt Zdu Zdv ZddwZddxZ G dy dz          Zd{ Zd| Zdd}Zd~ Zd Zd ZdeQfdZdeQdefdZi e8_        i e8_        i e8_        i e8_        i e8_        dZdadaddZd ZddZd ZddZddZdS )    N)OrderedDictdefaultdict)Path)urlparseparse_qs	urlencodequote)	safe_join)SHA256)
PKCS1_v1_5)Responseflash)DefaultJSONProvider)HTTPExceptionfields)*)basez^.*\.(png|jpeg|ico)|^(/plugins/|/sso/|/drawio/|/pub/|/docs/|/share/|/files/|/tinymce/|/app/assets/|/socket.io/).*|^.*/forms/CmfForm:.*|^.*(styles|vendor|runtime|polyfills|main).*\.js$|/styles.*\.css$c                   $     e Zd Z fdZd Z xZS )Flaskc                 :     t                      j        |i | d S N)super__init__)selfargskwargs	__class__s      ./cmf/app.pyr   zFlask.__init__(   s%    $)&)))))    c                       fd}|S )Nc                                          dd           }| j        }|                    d          d         }|dk    r	d|z   z   }n}||dz   | j        z   } j        ||| fi  t          |           | S )Nendpoint.index/)pop
__module__split__name__add_url_ruleprint)fr#   module_pathmodule_nameurloptionsruler   s        r   	decoratorzFlask.route.<locals>.decorator,   s    {{:t44H,K%++C004Kg%%K'$.&,qz9Dc8Q::':::(OOOHr     )r   r3   r2   r4   s   ``` r   routezFlask.route+   s0    	 	 	 	 	 	 	 r    )r+   r)   __qualname__r   r6   __classcell__)r   s   @r   r   r   '   sG        * * * * *      r    r   c                 r    | r4t          j        dd                    d |D                                  d S d S )N%s c              3   4   K   | ]}t          |          V  d S r   str).0args     r   	<genexpr>zprint_debug.<locals>.<genexpr>?   s(      %?%?3c#hh%?%?%?%?%?%?r    )loggingdebugjoin)condr   _kwargss      r   print_debugrG   =   sJ     BdCHH%?%?$%?%?%?@@AAAAAB Br    c                   ,   e Zd ZdZdZdZdZdZdZdZ	dZ
d8d9dZd Zd Zd Zd Zd:d	Zd
 Zd Zd Zd Zededefd            Zedefd            Zed;d            Zd Zd Zd Zd Zd Zd Zd Z d8dZ!d Z"d Z#d Z$d:dZ%d<d Z&d! Z'd" Z(d# Z)d$ Z*d% Z+d& Z,d' Z-d:d(Z.d) Z/d=d+Z0d, Z1d;d-Z2d. Z3e4d/             Z5e4d0             Z6e4d<d1            Z7e e8d23          d4                         Z9e4d5             Z:e4d6             Z;e4d7             Z<dS )>CmfCacheNFreturnc                    t                      | _        t                      | _        || _        || _        i | _        | j        r6| j                            dd           | j                            dd           d| _        d S )Nstat_hitr   	stat_missF)dict	cache_objcache_invalidateredis_dbmemorytexcom_growcache_hack_cacheincrbyjob_daemon_mode)r   rQ   rR   s      r   r   zCmfCache.__init__O   sw     $ +-(= 	1M  Q///M  a000$r    c                    t          t          j        p| j        dt          j                   | j        r| j                                         n&t                      | _        t                      | _	        | j        
                    dt                              d                      | j        
                    dt                              ddi                     d S )NzCmfCache.flushdb!!!filezCmfCache:flushdbCmfCache:inmemory_delkeysALL)rG   configDEBUGsysstderrrQ   flushdbrN   rO   rP   publishjsondumpsr   s    r   r`   zCmfCache.flushdb[   s    FL.DJ0ECJWWWW= 	+M!!####!VVDN$(FFD!0$**T2B2BCCC5tzz65/7R7RSSSSSr    c                    t          t          j        p| j        dt          j                   t          t                    }| j                                        }| j        	                    dd          D ]}t          | j        d| dt          j                   |dd	         
                                }| j                            |          }|`t          j        |          }|d
         }|d         ||         |<   |                    |           |                                 |                     |           d	S )u)   Инвалидируем весь jscachezCmfCache.flush_jscache!!!rW   zobj:jshash:*  countz"CmfCache.flush_jscache invalidate z!!!   Ncurrent_person_idjsver)rG   r\   r]   r^   r_   r   rN   rQ   pipeline	scan_iterdecodegetpickleloadsdeleteexecuteemit)r   emit_msgpipekeyjshashjsresjspersons          r   flush_jscachezCmfCache.flush_jscachee   s+   FL.DJ0KRUR\]]]]t$$}%%''=**>*FF 		 		C
$Q$Q$Q$QX[XbccccW^^%%FM%%c**E}L''E01H).wHXv&KK		(r    c                    t          t          j        p| j        dt          j                   d}| j                                        }| j                            dd          D ]2}|                    d          r|dz  }|	                    |           3|
                                 t          t          j        p| j        d	| d
t          j                   dS )u+   Инвалидируем весь obj cachezCmfCache.flush_all_obj!!!rW   r   zobj:*rf   rg   s
   obj:jshash   zCmfCache.flush_all_obj: z recordsN)rG   r\   r]   r^   r_   rQ   rl   rm   
startswithrr   rs   )r   rh   rv   rw   s       r   flush_all_objzCmfCache.flush_all_objw   s     	FL.DJ0KRUR\]]]]}%%''=**7$*?? 	 	C~~m,, QJEKKFL.DJ0Z50Z0Z0Zadakllllllr    c                   	
 dd l dd l}dd lddlm ddlm	 |}	
fd
t          j        r	                    t          t          j        j                                        t          j        d          z
            dd                                                                                   d d         d	v rc|                                }|d
k    rIt$          j        r=t$          j        t$          j        k    r#t          j        j                                        S |D ]}|dz    
|          z   }d|v r|dz   t          |d                   z   }t+          |                                          D ]#\  }}|dk    r|dz   |z   dz    
|          z   }$| j        rwd|dd         z   dz   	                    |                                                                          z   }|                    dd          }|                    dd          }n?| d	                    |                                                                          z   }t3          | j        d|           |S )Nr   )timezone)ImmutableDictc                    t          |           }t          |t          j        j                  r'| j        r| j        } t          |           }n	d} t          }d}|t          t          t          fv r|t          k    r| dd         dk    rv	 	j
                            |           }|                    j                  }|                    dd          }|} t          d|            n# t           $ r
}Y d }~nd }~ww xY wt          |           }n|t"          k    r| D ]}| |          z   dz   }n|t$          k    s|k    r9|                                 D ]#\  }}||z   }|r| d	 |          z   }|dz   }$n| d
}n|t(          u rt          |           }nlt+          | d          rt          | j                  }nGd|j        z   d	z   
                    t3          j        |                                                     z   }|S )Nz... r      20)secondmicrosecondz!!!!! Date:,:Noneidz
todo2:obj:)type
issubclasscmfr   CmfType
is_definedvaluer>   intfloatparserparse
astimezoneutcreplacer-   	ExceptionlistrN   itemsboolhasattrr   r+   md5rp   rc   	hexdigest)valtresval1evkr   _all2strdateutilhashlibr   s          r   r   zCmfCache.hash.<locals>._all2str   s5   S		A!SZ/00 > )CS		AACACS#u%%%88AaCD 0 0&o33C88"oohl;;"ll!lCC!}c2222%   #hhd 2 2A+c1CC2da=00IIKK ( (DAq'C (!$iii((1++5!Ci( d#hh 3%% gcf++CC&3c9GKKUXHYHY<Z<Z<d<d<f<ffCJs   	AC' '
C;6C;Z   )daysri      )c92a103d860eddgUUUUUU?|r   z|id:r   zHASH:i  z|md5:
r;   _zDEBUG_CACHE HASH:)r   randomdateutil.parserdatetimer   werkzeug.datastructuresr   APPcache_optimizer   r>   r   r   CmfDatenow	timedeltaencoder   gcurrent_usersystem_usersortedr   r]   r   rG   )r   prefixr   r   r   srr   rw   r   r   r   r   r   s            @@@@@r   hashzCmfCache.hash   s   %%%%%%9999990	 0	 0	 0	 0	 0	 0	 0	 0	d  	0'++c#*2D2H2H2J2J8K]ceKfKfKf2f.g.ghijkhk.l.s.s.u.u"v"v  #A  #A  #C  #C  DF  EF  DF  #G  Ka  #a  #aACxxANxq~/N/Nz)--/// 	( 	(CC((3--'AA6>>F
S...Av||~~.. 	4 	4HCd{{C##hhsmm3AA: 	C!AcE("W,AHHJJ0G0G0Q0Q0S0SSA		$$$A		#s##AAw{{188::66@@BBBADJ 3Q777r    c                    |t                      }|s|S t          t          |j                  }t                      }|j                                        D ]Z}|j                            |d           }|s!|                    d          r|	                    |d d                    n|	                    |           t          |t          j        j                  r0t          ||j        d           }|r|                     ||           t          |t          j        j        t          j        j        f          rrt          ||j        d           }|r|D ]}|                     ||           |                                D ])}	d|j         d|	j         }
|	                    |
           *\|	                    |j        dz   d                    t'          |                    z              |S )N_idr%   )r   ref_r   r;   r   )setgetattrmodels
class_name__dict__rZ   r   ro   endswithaddr   r   CmfRelationBasesimple_objects_id_recursive
CmfM2MBaseCmfBackrefBaserelated_modelsr   rD   r   )r   objr   modelfields_str_set
field_name	field_clsfield_valuerel_obj	rel_modelrefs              r   r   z$CmfCache.simple_objects_id_recursive   s   ;%%C 	J//,++-- 	! 	!J((T::I ""5)) /"":crc?3333"":...)SZ%?@@ !%c9+?FF K44[c4JJJI
(=sz?X'YZZ 	!%c9+?FF K#. K K88c8JJJJ "+!9!9!;!; ! !I@@@)*>@@CGGCLLLLsxx~(>(>???@@@
r    c                    |sg S g }t                      }|                    d          D ]M}|j                            d          r#|                    |j        dd                    n|                    |j                   t          |t          j        j                  r-|	                    | 
                    |j                             t          |t          j        j        t          j        j        f          rw|j        r2|j        D ]*}|	                    | 
                    |                     +|                                D ])}d|j         d|j         }|                    |           *O|                    |j        j        dz   d	                    t%          |                    z              t'          t          |                    }|S )
u   
        Собираем ид связанных обьектов 2 уровня для настройки инвалидации
        :param obj:
        :return:
        Tr   r   Nr%   r   r   r;   r   )r   valuesr   r   r   
isinstancer   r   r   extendobjects_id_recursiver   r   r   r   r   appendrD   r   r   )r   r   r   r   fieldr   r   r   s           r   r   zCmfCache.objects_id_recursive   s     	IZZ4Z00 	$ 	$E((// 5""5#3CRC#89999""5#3444%!;<< C

444U[AABBB%#*"79R!STT $; G#(; G G

4#<#<W#E#EFFFF!&!5!5!7!7 $ $I@@@)*>@@CJJsOOOO

36<#%1G1G(H(HHIII3s88nn
r    c                     t          |          t          j        k    rt          dd           dS | j        r | j                            d| |           dS | j        r|| j        |<   dS d S )NuU   DEV: Слишком большой объект для кэширования — keyT)
debug_onlyFobj:)lenr\   CACHE_MAX_OBJ_SIZE	cmf_alertrQ   r   rR   rO   )r   rw   str_vals      r   _obj_dict_setzCmfCache._obj_dict_set  s    w<<&333 n{  A  A  A  A5= 	MlSllG4444[ 	")DN34	 	r    c                    t                      }|D ]}|                    d|            | j        r$ | j        j        | t	          |          k    rdS dS | j        r$|D ]}| j                            |          s dS  dS d S )Nr   TF)r   r   rQ   existsr   rR   rO   ro   )r   rZ   hkeysrw   s       r   _obj_dict_existszCmfCache._obj_dict_exists,  s     	$ 	$CIIlSll####= 	#t}#U+s4yy88tu[ 	 ! !~))#.. ! 55!44r    c                    | j         rV| j                             d|           }|| j                             d           n| j                             d           |S | j        r| j                            |          S d S )Nr   rL   rM   )rQ   ro   rT   rR   rO   )r   rw   r   s      r   _obj_dict_getzCmfCache._obj_dict_get>  s    = 
	-##L3LL11C$$Z0000$$[111J[ 	>%%c***4r    rx   inv_payloadc                     |  d| S )N::r5   )rx   r   s     r   %_jshash_invalidate_confirm_member_keyz.CmfCache._jshash_invalidate_confirm_member_keyK  s    ))K)))r    
member_keyc                 0    |                      dd          S )Nr   r}   )maxsplitr*   )r   s    r   +_jshash_invalidate_confirm_member_key_splitz4CmfCache._jshash_invalidate_confirm_member_key_splitO  s    q111r    c                 J    | r| n|                     d          d         }d| S )Nr   zjscache-invalidate-confirm-set:r   )cache_idrx   set_keys      r   "_jshash_invalidate_confirm_set_keyz+CmfCache._jshash_invalidate_confirm_set_keyS  s1     'A((FLL,=,=b,A::::r    c                    t          t                    }|                                D ]\  }}t          d| |d |g           |                                D ]]\  }}|                    d          rC||                     |                                       |                     ||                     ^| j        r-|                                D ]\  }} | j        j	        |g|R   d S d S )Nzinvalidate-)roomevent_personsjshash:rx   )
r   r   r   cmf_emit_eventr~   r   r   r   rQ   sadd)	r   msgsconfirmations	person_idinv_dictrx   r   r   confirm_lists	            r   rt   zCmfCache.emitZ  s4   #D))#'::<< 	Y 	YIx444hTZcYdeeee'/~~'7'7 Y Y#$$Y// Y!$"I"IQW"I"X"XY``BB6;WWY Y YY
 = 	;)6)<)<)>)> ; ;%""7:\:::::	; 	;; ;r    c                    | j         r|r|d         d         }|                     |          }t                      }|D ]7}|                    |                     |d         |d                              8 | j         j        |g|R   d S d S d S )Nr   r  r}   )rQ   r   r   r   r   srem)r   confirm_dictsample_jshashkey_cache_idr  confirms         r   jshash_invalidate_confirmz"CmfCache.jshash_invalidate_confirmi  s    = 	<\ 	< )OA.MBB-BXXL66L' h h##D$N$NwWXz[bcd[e$f$fggggDM|;l;;;;;;	< 	< 	< 	<r    c                      t           j        rt                                            j        r;                     |          } fd j                            |          D             S d S )Nc                 ^    g | ])}                     |                                          *S r5   )r   rn   )r?   memberr   s     r   
<listcomp>z;CmfCache.jshash_invalidate_confirm_list.<locals>.<listcomp>  s?     ? ? ? @@QQ? ? ?r    )r   invalidated_keys	CMF_CACHE_do_invalidate_defferrQ   r   smembers)r   r   r   s   `  r   jshash_invalidate_confirm_listz'CmfCache.jshash_invalidate_confirm_listu  s    
  	.++---= 	?==hGGG? ? ? ?"m44W==? ? ? ?	? 	?r    c           	         |sd S | j         r | j         j        d |D               t                              |           |                     |           i }|D ]}| j        rd|vrt          d|            t          | j        d|            | j                             d| d          x}rt          | j        d|            | j        rt          d	|            | j         	                                }|D ]X}	|
                    d
|	                    d                      |                    d
|	                    d                      Y|                                }
t          ||
dd d                   D ]\  }	}|	                    d          }	|t          j        |          }|rr|d         }||vrt!                      ||<   |dk    r/|r-d                    t%          d |D                                 }nd}|d          d| d| d| }|||         |	<   | j                             d| d          x}t'          j                    }|                     |           t'          j                    }||z
  dk    r#t*                              d||z
   d           d S d S | j        r|D ]}|| j        v r| j        |= d S d S )Nc                     g | ]}d | S )r   r5   r?   rw   s     r   r  z+CmfCache._obj_dict_mdel.<locals>.<listcomp>  s    "@"@"@C<#<<"@"@"@r    rh   z#DEBUG_CACHE JSHASH: try invalidate z*DEBUG_CACHE JSHASH: try invalidate:jshash:invalidate:jshash:d   rg   z*DEBUG_CACHE JSHASH: got invalidate:jshash:z#DEBUG_CACHE JSHASH: got invalidate r   utf-8r   r   rj   updater   c                     g | ]}|d v|	S ))cache_fieldscmf_modified_atcmf_viewed_atcmf_modified_by_idr5   r?   r   s     r   r  z+CmfCache._obj_dict_mdel.<locals>.<listcomp>  s0     ,@ ,@ ,@!+,4~+~+~ -.+~+~+~r    ONLYFORUPDATESrk         ?z_obj_dict_mdel emit got sec)rQ   rr   r  inmemory_delprofiler_invalidater]   r  rG   spoprl   ro   rn   rs   ziprp   rq   rN   rD   r   timert   r   rC   rR   rO   )r   rZ   obj_changed_fieldsobj_idactionru   rw   invjsrv   rx   jshash_listry   rz   changed_fieldsr   
emit_startemit_ends                    r   _obj_dict_mdelzCmfCache._obj_dict_mdel  s    	F= D	 DM "@"@4"@"@"@AA""4((($$T***H +E +E: P'"4"4"#N#N#NOOODJ(ZUX(Z(Z[[[  $}112Ls2L2LTW1XXXe %E
,^Y\,^,^___z T&'RS'R'RSSS=1133D"' E E!@g(>(>!@!@AAA$C6==+A+A$C$CDDDD"&,,..K),UK14E)F)F E E!'w!7!7 !=$ &U 3 3  E',-@'AH'x7759VV 2  &116H115$* ,@ ,@7I ,@ ,@ ,@ %A %A2" 2"
 2B-27^*c*cv*c*c*c*cSa*c*cK9DHX.v6K  $}112Ls2L2LTW1XXXe %E\ JIIhy{{H*$s**M8j3HMMMNNNNN +*[ 	 , ,$.((s+, , Fr    c                    | j         rs| j                                         5 }|                                D ]\  }} |j        d| g|R   |                                 d d d            d S # 1 swxY w Y   d S | j        rG|D ]B}|| j        v r'| j        |                             ||                    2||         | j        |<   Cd S d S Ninvalidate:)rQ   rl   r   r  rs   rR   rP   r   )r   r  rv   rw   r   s        r   _invalidate_dict_msetzCmfCache._invalidate_dict_mset  sB   = 	'')) T#+>>#3#3 < <KCDI1C11;F;;;;;                  [ 	 ? ?$///)#.55hsmDDDD19#D)#..	? ? Fs   A A..A25A2c                     | j         r-| j                             d|           }|rd |D             S |S | j        r| j                            |          S d S )Nr=  c                 8    g | ]}|                     d           S )r"  rn   r  s     r   r  z1CmfCache._invalidate_dict_get.<locals>.<listcomp>  s$    ;;;

7++;;;r    )rQ   r  rR   rP   ro   )r   namer   s      r   _invalidate_dict_getzCmfCache._invalidate_dict_get  sq    = 	-(()=t)=)=>>C <;;s;;;;J[ 	(,,T222Fr    c                    | j         rz| j                                         5 }|                                D ]\  }}|r | j         j        d| g|R   |                                 d d d            d S # 1 swxY w Y   d S | j        r^|                                D ]G\  }}|D ]?}|| j                            |g           v r | j        |                             |           @Hd S d S r<  )	rQ   rl   r   r  rs   rR   rP   ro   remove)r   r  rv   rB  r   key_listrw   s          r   _invalidate_dict_mdelzCmfCache._invalidate_dict_mdel  sm   = 	'')) T$,NN$4$4 J JLD& J**+?+?+?I&IIII	                  [ 	"*.."2"2 @ @h# @ @Cd377bAAAA-d3::3???@@ @
 Fs   AA55A9<A9c           	      L
    t           j                            d          rdt          _        d S t
          j        r|s	 j        rd S t          j        v r 	                    d           d S t                              |          r>dt          _        t           j        dt                              |                      d S                      |          }t          j                            |t          j                  }||k     rFdt          _        t           j        dt          j         d                     |                      d S i t$          j        j                            |          }fd fd	}	|rzt-          |t.                    set1          |d
d           rT |	|           d}
t3          |j                  t          j        v r&t9          d|j         dt          j                    d S n|r:t-          |t.                    r%t1          |d         d
d           rd}
 |	|           n\|Dd}
t;          |          t<          k    r)t;          |          t>          k    rt:          t2          k    r	 n|sd}
d}ntA          d          d}|rN|d         rEt           j        d|           |
dk    rM|j!        |d         vr>|d         D ]5}||j!         d|j!         dfv rd}|j         vrtE          d            n6|sg }dg|j#        D ]}||d         v r|d         |         }|sdg}t/          |          t          j$        d<   |D ]u}|dv rd}|d         D ]d}|%                    d           d         }||k    r d!|             d!| d"           A d#| d$|             d#| d$| d"           ev|d         D ]} d!| d"           |r|d         s d!| d"            j        r D ]}t           j        d%| d&            tM          j'        |          } (                    |          sdt          _)        |r)t          *                    |tW          |                     d't          v rzt          j,        rnt           j        d( dt          j,                     j        rt[          d( t          j,                    .                    d) t          j,        fi            .                               d S )*NNO_CACHETr   r   z%DEBUG_CACHE ADD SKIP CACHE LOCKED_BY z#DEBUG_CACHE ADD SKIP too old trans r;   c                     |                      d          \  }}}|vrt                      |<   |r!|                              d|            n|                                         d S )Nr;   )	partitionr   r   )bind_and_fieldsbindr   r   r  rw   s       r   bind_addzCmfCache.add.<locals>.bind_add  s     .77<<OD!V8##!$ -""c#4#4F#4#45555""c8,,,Fr    c                 $   t          | t                    r| }n| g}g }|D ]n}t          |j        t          j        j                  r                    |          }n"t                              |                    }|D ]} |           odS )u   
            Собираем списки ключей инвалидации
            :param val:
            :param invalidate_dict:
            :return:
            N)r   r   r   r   r   r   r   r   )r   obj_listr   itemrN  rO  r   s        r   bind_add_recursivez(CmfCache.add.<locals>.bind_add_recursive"  s     #t$$ # 7C  # #dgsz'9:: G33D99CCt??EEFFC # #DHTNNNN## #r    r   r   zSkip add to cache z  g.skipcache_select_for_update: r   r   customemptyEmptyuG   Невозможный объект для хранения в кешеFr   zDEBUG_CACHE WHERE: r   z.idz.codezDEV: Obj in not in inv_dictparentcache_clustersScopeAll)NullNULLnullr   noneNr   r$   where_ScopeAll__insdelwhere_r   zDEBUG_CACHE BIND: z = rx   #DEBUG_CACHE JSHASH: add invalidate r  )/osenvironro   r   no_jscache_forcer\   JOB_DAEMON_DISABLE_CACHErU   r  $profiler_redis_invalidated_keys_skipr  cache_is_lockedrG   r]   cache_locked_byget_last_invalidatecache_lockscache_transaction_startr   utilcmfutilget_model_by_namer   r   r   r>   r   skipcache_select_for_updater-   r   r   r   r   r   r   cache_cluster_fieldsprofiler_datar*   rp   rc   r   cache_store_errorinmemory_addr   rx   r  r>  )r   rw   r   obj_typequery_paramscache_inmemorylirk  	obj_modelrS  obj_casewhere_pkr   scopesc_fieldscope
model_namebindidstr_objrO  r  s   ``                 @@r   r   zCmfCache.add  s   :>>*%% 	!%A4 * 	> 	dFZ 	4 !$$$5555AAA4 $$X.. 	!%A
$qILeLefnLoLo$q$qrrr4 %%h//"#-"3"3Ha>W"X"X"R''!%A
  %K!Jc  %K  %Kfjf~f~  @H  gI  gI  %K  %K  L  L  L4H$66x@@	
	 
	 
	 
	 
	 
		# 	# 	# 	# 	# 	#,  &	gz#t,, &	gdD1I1I &	g s###H36{{a;;;r36rrSTSprrsss <  	gZT** 	gws1vtT/J/J 	g Hs####_H CyyCDII$6$643;;   	gH
 CCefff
  F	DL2 F	D
$9<HHH 5  <;Q)Q)Q".x"8  J!&<&<&<>V>V>V%WWW#'!f;h66%&CDDD X  4D  !)J9+IJ I IG,/?"@@@!-.>!?!H  *(\F48LL 01# K KE NNN &&28&< K K
 &0%5%5c%:%:1%=
#z11$H%Cz%C%CDDD$H%Jz%J%J%JKKKK$H%Be%B%Bj%B%BCCC$H%Ie%I%Ij%I%I%IJJJJK #/x"8 D DJ HBzBBBCCCC 	:<#9 	:H8x888999 : 	O" O ODJ(MV(M(M(M(MNNNN ,s##!!#w// 	'"&A 	;""3S\\::: q==QX=
$Z#$Z$ZPQPX$Z$Z[[[z VJSJJAHUUU&&#!('EFFF 	""8,,,,,r    c                    	 dt           vrt                      t           _        n# t          $ r}Y d }~d S d }~ww xY wdt           j        vrt	          |          t           j        d<   n't           j        dxx         t	          |          z  cc<   t
          j        rDdt           j        vrg t           j        d<   t           j        d                             |           d S d S )Nrq  rP   cache_invalidate_keys)r   rN   rq  r   r   rI   DEBUG_PROFILE_VERBOSEr   )r   rZ   r   s      r   r.  zCmfCache.profiler_invalidate  s    	a''"&&& 	 	 	FFFFF	Q_4425d))AO.//O.///3t99<///) 	B&ao==;= 78O34;;DAAAAA		B 	B   !$ 
99c                    	 dt           vrt                      t           _        n# t          $ r}Y d }~d S d }~ww xY wdt           j        vrdt           j        d<   nt           j        dxx         dz  cc<   dt           j        vrdt           j        d<   t          j        rDdt           j        vrg t           j        d<   t           j        d                             |           d S d S )Nrq  redis_cache_hitr}   redis_cache_missr   redis_cache_hit_keysr   rN   rq  r   rI   r  r   r   rw   r   s      r   profiler_redis_data_hitz CmfCache.profiler_redis_data_hit  s    	a''"&&& 	 	 	FFFFF	AO3312AO-..O-...!3...Q_4423AO./) 	@%Q_<<:< 67O23::3?????		@ 	@r  c                    	 dt           vrt                      t           _        n# t          $ r}Y d }~d S d }~ww xY wdt           j        vrdt           j        d<   nt           j        dxx         dz  cc<   dt           j        vrdt           j        d<   |t           j        d<   t          j        rDdt           j        vrg t           j        d<   t           j        d                             |           d S d S )Nrq  r  r}   r  r   redis_cache_miss_lastredis_cache_miss_keysr  r  s      r   profiler_redis_data_missz!CmfCache.profiler_redis_data_miss  s   	a''"&&& 	 	 	FFFFF	Q_4423AO.//O.///14///AO3312AO-.36/0) 	A&ao==;= 78O34;;C@@@@@		A 	Ar  c                     	 dt           vrt                      t           _        n# t          $ r}Y d }~d S d }~ww xY wd| }|t           j        vrdt           j        |<   d S t           j        |xx         dz  cc<   d S )Nrq  invalidated_keys_skip_r}   )r   rN   rq  r   )r   r   r   r   s       r   rf  z-CmfCache.profiler_redis_invalidated_keys_skip  s    	a''"&&& 	 	 	FFFFF	+T++AO##!"AOAOA!#r  c                    t           j                            d          st          j        rd S |t          j        v r|                     d           d S d}|rt                              |          }nd}t          | j
        d           |du r<d}|                     |          }|r#t          j        |          }t          |          }|durdt          v rzt          j        rn|                     d	| t          j        fi           t          | j
        d
| dt          j                    | j
        rt#          d| t          j                   t          | j
        d|            t          | j
        d|           |s3|r1|                     |           t                              |||           |S |                     |           t          | j
        d|            d S )NrI  ro   rJ  T.CACHEFrx   r  z*DEBUG_CACHE JSHASH: add invalidate jshash:r;   ra  zDEBUG_CACHE HIT: zDEBUG_CACHE GET:zDEBUG_CACHE MISS: )rb  rc  ro   r   TECHCOM_HACK3441r  rf  r  inmemory_getrG   r]   r   rp   rq   r   rx   r>  r  r  rs  r  )r   rw   rv  from_inmemoryr   r   obj_sizes          r   ro   zCmfCache.get  s   :>>*%% 	); 	4!$$$5555AAA4 	((--CCCDJ(((#::!M$$S))C $l3''s88c>>1}}}**OcOOah[+IJJJDJ(eUX(e(e[\[c(e(efff: Z"#N#N#NPQPXYYY
$=$=$=>>>
$6<<<  ;^ ;,,S111&&sC:::J%%c***DJ :S : :;;;tr    c                     dS Nr   rG   r]   r   rQ   ro   r   r~  s     r   ri  zCmfCache.get_last_invalidate4      qr    c                 l    t          | j        d           |                                 t          _        d S )Nz)DEBUG_CACHE TRANS cache_transaction_start)rG   r]   gen_time_usr   rk  rd   s    r   rk  z CmfCache.cache_transaction_start9  s/    DJ KLLL$($4$4$6$6!!!r    c                     t          t          j                            t          j        j                                      d                    S )Nz%Y%m%d%H%M%S%f)r   r   r   r   r   strftimerd   s    r   r  zCmfCache.gen_time_us=  s6    8$(():)>??HHIYZZ[[[r    c                     d S r   )	rG   r]   rg  r  rQ   r   r   rj  rk  )r   r~  ls      r   
cache_lockzCmfCache.cache_lock@      r    c                     d S r   )	r   rj  r   rh  rk  rG   r]   rQ   r   )r   r~  tr_startlock_trs       r   cache_unlockzCmfCache.cache_unlockQ  r  r    c                     dS r  r  r  s     r   rh  zCmfCache.cache_locked_bya  r  r    c                     dS NF)	rh  r   rj  ro   rk  rG   r]   rQ   r   )r   r~  _cache_locked_byrk  s       r   rg  zCmfCache.cache_is_lockedf  s    ur    c                    t          j                     }t          j        }t          j        }t          j        }t                      }	||j        }|D ]}
|
|vrt          ||
                   ||
<   n!||
                             ||
                    ||
         D ]J}d|v r/|	                    |	                    d          d                    5|	                    |           K|                    |	           |
                    |d |                    d          D             ||	d           t          j                     }||z
  dk    r#t                              d||z
   d	           d S d S )
Nr;   r   c                     g | ]}|S r5   r5   r)  s     r   r  z+CmfCache._do_invalidate.<locals>.<listcomp>  s    "H"H"H1"H"H"Hr    T)
is_changed)r3  r2  r4  inv_listr+  zPROF _do_invalidate got r,  )r1  r   r  r  r  r   r   r#  r   r*   r   rZ   rC   )r   r   r  r4  r3  stglob_inv_dictglob_inv_listr  r  r   inv_valends                r   _do_invalidatezCmfCache._do_invalidateu  s   Y[[

-55>fV 		* 		*A%%#&x{#3#3a  a ''444#A; * *'>>LLs!3!3A!67777LL))))	*
 	)))"H"Hchh$h.G.G"H"H"H 	
 
 	 	 	 ikk8c>>GG<sRx<<<===== >r    c                    t           j        sd S t          j                    }t           j        }t           j        }|D ]2}|                     |d         |d         |d         |d                    3t          j                    }|                     |           t          j                    }||z
  dk    rt                               d||z
   d           t                               d||z
   d	t          t           j                              t                               d
||z
   d	t          |                      t                      t           _        i t           _        g t           _        d S )Nr  r2  r3  r4  r+  z_do_invalidate_deffer got r,  z)_do_invalidate_deffer _obj_dict_mdel got zsec len=z0_do_invalidate_deffer _invalidate_dict_mdel got )
r   r  r1  r  r  r:  rG  rC   r   r   )r   r  r  r  r  st_invalidate_dict_mdelr  s          r   r  zCmfCache._do_invalidate_deffer  s   ! 	FY[[

% 	~ 	~H 4h?S6TV^_gVhjrs{j|}}}}"&)++""=111 ikk8c>>GG>r>>>???GG@WZ\@\fijkj|f}f}  A  A  AGG  CsMdGd  C  Cnqr  oA  oA  C  C  D  D  D UU



r    r#  c                    t           j                            d          rd S || dh}|sd S |                     |           t	          | j        d| d| dt          |                      t                      }t                      }t                      }i }i }t          |          dk    r|D ]}	| j        	                    d|	 dd	          }
|
D ]X}| j        
                    |          }|r:|D ]7}|                    d
          d         }|                    |           |	||<   8Y|                    |
           n{t                              d           t!          | j        	                    dd	                    }
t                              dt          |
                      t#          j        dd                    |          z   dz             }t#          j        d          }t                              d           |
D ]}|                                }|                    |          s,| j        
                    |          }|rS|D ]P}|                    d
          d         }|                    |           |                    |          d         ||<   Q|                    |           |D ]}| j        
                    d|                                           }|                    |          }	|r|D ]}|                    d
          d         }|                    |           | j                            d|                                           }|sdt/          j        |          }|d         }||vrt3                      ||<   d}|d          d| d|	 d| }|||         |                                <   Ȑg |d |D             d |D             d |D             }|r3t                              d| d| d|             | j        j        |  n!t                              d| d| d           |                     |           d S ) NrI  r   z!DEBUG_CACHE start invalidate_ids r;   x   zinvalidate:*r   rf   )matchrh       r   zscan get all keysz
scan over z.*(r   z).*zK[A-Za-z]+:[0-9a-z-]{8}-[0-9a-z-]{4}-[0-9a-z-]{4}-[0-9a-z-]{4}-[0-9a-z-]{12}zre compile doner   r   rj   r*  rk   r   c              3   D   K   | ]}d |                                  V  dS r   NrA  r?   	query_keys     r   rA   z*CmfCache.invalidate_ids.<locals>.<genexpr>  s7      FFi)Y%%''))FFFFFFr    c              3   D   K   | ]}d |                                  V  dS )r   NrA  r  s     r   rA   z*CmfCache.invalidate_ids.<locals>.<genexpr>  s7      TTI79#3#3#5#577TTTTTTr    c              3   D   K   | ]}d |                                  V  dS r  rA  )r?   rx   s     r   rA   z*CmfCache.invalidate_ids.<locals>.<genexpr>  s3      >>6&V]]__&&>>>>>>r    zinvalidate_ids(, ): z): no keys found.)rb  rc  ro   r  rG   r]   r   r   rQ   rm   r  r*   r   r#  r   rC   r   recompilerD   rn   r  findallrp   rq   rN   rr   rt   )r   r~  idsr4  invalidate_keys
query_keysjshashesru   obj_id_by_query_keyid_rZ   rw   inv_members
inv_memberid_retuuid_rekey_decodedr  query_jshashesrx   ry   rz   r7  r   	keys_lists                            r   invalidate_idszCmfCache.invalidate_ids  s    :>>*%% 	F; ###$C 	F 	
###DJ dF d dZ d dZ]^aZbZb d deee%%UU
55 & s88s?? - - }..5JC5J5J5JRV.WW B BC"&-"8"8"="=K" B*5 B BJ)3)9)9$)?)?)BJ&NN:666>A/
;;&&t,,,,-  GG()))//oT/RRSSDGG,T,,--- JuSXXc]]25899Ez"oppHGG&''' 
) 
)!jjll{{;// "m44S99 [&1 [ [
%/%5%5d%;%;A%>
"z222:B:J:J;:W:WXY:Z+J77##C((((# 	F 	FI!]334]IYIYI[I[4]4]^^N%)))44C F, F FF#\\$//2FLL((( M--.FV]]__.F.FGGE  ! "L//E$%89Hx//-1VV* &6N%*7^"X"Xv"X"X"X"X"X"XK:EHX&v}}77

FF:FFF
 UTTTT
 ?>X>>>	
	  	LGGGjGGCGGIGGHHH DM ),,,GGJjJJCJJJKKK		(r    c                 B    d fd	}t           j                            d          rd S |sd S                      |           t	           j        d d|            i |D ]9} |d| d| d            ||d	                                d |
           :d S )Nr   c                 ~                         |           }|r$|| <   t          j        d d| |             d S d S )NDEBUG_CACHE INVAL: r;   )rC  rG   r]   )invalrC   invdr4  r  r   s      r   _check_invalz8CmfCache.invalidate_ids_as_wrapper.<locals>._check_inval  sd     ,,U33D W"&DJ(Uf(U(Uu(Ue(U(UVVVVVW Wr    rI  DEBUG_CACHE start invalidate r;   r   r   ref=obj.id=)r3  )r   )rb  rc  ro   r  rG   r]   r  )r   r~  r  r4  r  r  r  s   `  `  @r   invalidate_ids_as_wrapperz"CmfCache.invalidate_ids_as_wrapper  s   	W 	W 	W 	W 	W 	W 	W 	W :>>*%% 	F 	F 	
###DJ U U U U UVVV 	D 	DCL222j22F;;;Li(((
 hsCCCC	D 	Dr    c                     t                               dd|d|d|           t          j                    }d7 fd	}ddlm} t
          j                            d	          rd S                      |j	                   t           j        d
 d|j	                    |j	        }i  j        rdd l}	|	                                 |j	        dk    r ||j         d           dv r |d|j         d|j	         d           |st#          d            ||j         d|g            |d|j	         dd            |d|j         d|j	         dd           t          j                    }
                     |           t          j                    }||z
  dk    r$t                               d d||z
   d           d S t'                      }|                    d          D ]\  }}d}|j	        |v rt+          |t,          j        j                  rt3          |d           r|j        j        r|j        sd!v r%|r#|j        r |d|j         d|j	         d           d"v ro|j        rh|j        |j        k    rX |d|j        j         d|j	         d#            |d|j        j         d|j	         d$           |                    |           t+          |t,          j        j                   r"d"v r|j        r|                    |           1|j        r6t+          |t,          j        j!                  r|                    |           n|j        rW|j        |j        k    rG|                    |           |"                    d%          r|                    |d d&                    tG          |          dk    r'd"k    r!t           j        d' d(|j                   d S d)g}|j$        D ]}|                    |           tK          tM          |          d*d           r|'                    |           d!v r ||j         d           d"k    r ||j         d|           d"k    rB|D ]>}d+g|j$        D ]}t3          ||          stQ          tM          ||                   t,          j        j                   r&||         D ]} |d|j         d| d,| d           ltQ          tM          ||                   t,          j        j                  r |d||d%z             d| d,| d           tQ          tM          ||                   t,          j        j)                  r |d||          d| d,| d           t#          d-d.            |d| d,| d           @d/}d+g|j$        D ]=}t3          ||          r+||         j        r||         j        ||         j        k    rd}>d!v s|r7t3          |d           r|j        j        r|j        sd+g|j$        D ]}t3          ||          stQ          tM          ||                   t,          j        j                   rf||         D ]} |d|j         d| dd0           ||         j        r5||         j        r(||         j        D ]} |d|j         d| dd1           tQ          tM          ||                   t,          j        j                  r[ |d||d%z             d| dd           ||         j        r0||         j        r# |d||         j        j         d| dd2           9tQ          tM          ||                   t,          j        j)                  rX |d||          d| dd           ||         j        r0||         j        r# |d||         j        j         d| dd2           t#          d-d.           t3          |d           r|j        j        r|j        s |d| d           nktT          j+        r_d!v s|rYt3          |d           rI|j        j        s=|j        ,                                 |j        rt#          d3t           j-         d4           t\          j/        r1t           j0                            d5g           gz   t           j0        d5<   t          j                    }
                     |           t          j                    }||z
  dk    r#t                               d6||z
   d           d S d S )8NzRUN INVALIDATE: action=z obj=z item=z m2m_field_name=r   c           	                              |           }g }|rF|rt          |          }g }|D ]}d|vr|                    |           |                    d          ^}}}|rPt                              d|  d|            t          d|  d| d| d           |                    |           t          |                    d                    }	||	z  r|                    |           || <   n|| <   t          j        d d| |             i }
||
| <   t          j
        r5t          j                            dg           |
gz   t          j        d<   d S d S d S )	Nr;   z=cmfCache.invalidate(): ValueError: too many values to unpack(r  Tabortr   r  r  )rC  r   r   r*   r   rC   r   rG   r]   rI   r  rq  ro   )r  rC   change_fieldsr  invd_affectedir   i_fieldstaili_set_fieldstmpr4  r  r   s              r   r  z)CmfCache.invalidate.<locals>._check_inval=  s    ,,U33DM V  +$'$6$6M$&M! 4 4a<<)00333$-.WWS\\*8d   %GG$qdi$q$qno$q$qrrr%&zfk&z&zpq&z&ztx&z&z  CG  H  H  H  H)00333$'*8>>#+>+>'?'?(<7 4)00333&3HUOO&*HUODJ(Uf(U(Uu(Ue(U(UVVV!E
1 V./o.A.A&.L.LPSu.TAOF+++=V V:V Vr    r   )r   rI  r  r;   RelationCachezRelationCache.parent.id=)r   rE  r   r   r  uY   DEV: FATAL в инвалидацию м2м поля не передали имя поляr  )r  r^  r_  zwhere=r`  r+  zinvalidate (action=z) got zjsec. _check_inval {_check_inval_done - st}sec, _do_invalidate {_do_invalidate_done - _check_inval_done}secTr   )r'  cmf_viewed_bycmf_versionr   is_dummy)createrr   r#  zref_new=zref_old=r   r%   zDEBUG_CACHE ivalidate: z not fields_have_changesz--logical_deleterW  r$   u   Ошибка конфигурации моделей: cache_cluseter_fields может быть только по m2m и relation полямr  Fz
where_m2m=zwhere_m2m_old=z
where_old=u   DEV: в методе ux    не загружается is_dummy, что приводит к лишним инвалидациям кластераr  zinvalidate got r   N)1r   rC   r1  collectionsr   rb  rc  ro   r  r   rG   r]   TRACEpdb	set_trace	parent_idr   r   r  r   r   r   r   r   r   r   r  r   r  oldnewr   r   r   r   r   rp  r   r   load_fieldsr   CmfTUUIDr\   RAISE_LAZYLOADload
api_methodrI   r  rq  )r   r   r4  rR  m2m_field_namer  r  r   rt  r  _check_inval_done_do_invalidate_doner  r   r   no_caching_fieldscluster_load_fieldsr|  cc_field_name
cc_clustercluster_field_is_changedr  s   ` `                  @r   
invalidatezCmfCache.invalidate:  s   	M6MMSMMDMMNMMNNNY[[#	V #	V #	V #	V #	V #	V #	V #	VJ 	,+++++:>>*%% 	4'''DJ Y Y Y Y YZZZ> : 	(JJJ>_,,LCM+-GHHH)))L:::#.::FCCC! wuvvvLCFi?OPPPPLB3>BBBHMMMLC$'CCCNCCCXNNN !%	Xv666"&)++"R'#-- Wf W W<ORT<T W W W X X X F!$d!;!; 1	: 1	:J
 !V $555
  %!;<< $S*55:=,:QVYVb 111e11 L!C!C!C3>!C!CFKKK h''E,<'eiAWAW L!G!G!Gs~!G!G
SSS L!G!G!Gs~!G!G
SSS!((444%!677 Fx<P<PUZUe<P $$Z000 Jucj6O$P$P $$Z000  :EI$:$:$$Z000&&u-- :!((CRC999 }q  Vx%7%7
$^f$^$^$^`c`fgggF
  $f/ 	0 	0G&&w////499.55 	1OO/000
 ***LCFY///XLCFYmLLLL X+ Q Q
 '/%J1I%J Q QM"366 ! !$s='9":":CJ<QRR 	Q*-m*< e eJ(L)Y*-)Y)Y()Y)YZ)Y)Y[cdddde#D]);$<$<cj>XYY Q$%`c-2E.F%`%`%`%`T^%`%`bjkkkk#D]);$<$<cj>QRR Q$%Zc-.@%Z%Z8%Z%Zj%Z%Z\deeee! #DKOQ Q Q Q Q FxFF*FFxPPPP#( &B)AB 	0 	0MsM** 0M*50M*.#m2D2HHH+/( ***.F*!#z22 +7:|7N +SVS_ + #+!FS-E!F M MsM22 d3}#566
8MNN M&)-&8 _ _
$%Ojm%O%Oh%O%O%OQ]^^^^=)4 g]9K9O g*-m*<*@ g gJ(L)S*-)S)S()S)S)SUeffffS%7 8 8#*:TUU 
M L!X#me.C*D!X!Xx!X!X!XZbccc=)4 k]9K9O k$%[c-.@.D.G%[%[(%[%[%[]ijjjS%7 8 8#*:MNN M L!P#m*<!P!Px!P!P!PRZ[[[=)4 k]9K9O k$%[c-.@.D.G%[%[(%[%[%[]ijjj @GKM M M M M. C,, B1H BS\ B@x@@@AAA # 	z---1I-c:&& .,) . L| z  y!,  y  y  y  z  z  z) 	\*+/*=*=j*L*LPXl*ZAOJ' IKKC6222"ikk#c))GG S&9B&> S S S T T T T T *)r    c                     | j         D ]\  }}t          d|           | j                                        D ]\  }}t          d|           d S )NzDEBUG CmfCache.dumps)rO   r-   rP   r   )r   rw   r   s      r   rc   zCmfCache.dumpsO  sk     	/ 	/HC(#....-3355 	/ 	/HC(#....	/ 	/r    c                    |                     d          d         }t          j        r|                     d          d         }	 t          j        j                            |          }n# t          $ r Y dS w xY wt          j	        s2|j
        r|j        t          j        vrn|                     |           dS |j
        st          dd           d S |t          j        vr|                     |           dS t          j        |         }|                    |d          }|du r|                     |           |S |                    |           |                     |           |S )	Nr$   r   r   r}   .S   DEV: inmemory_get вызван для модели без флага cache_inmemoryTr  )r*   rI   r]   r   rl  rm  rn  KeyErrorr   in_memory_cacherv  r   in_memory_cache_skip_modelsprofiler_inmemory_data_skipr   r   INMEM_CACHEprofiler_inmemory_data_missro   move_to_endprofiler_inmemory_data_hit)clsrw   r~  r   model_cacherets         r   r  zCmfCache.inmemory_get^  s|    YYs^^A&
> 	2#))#..q1J	H$66zBBEE 	 	 	33	   		
 # E,<@],],]//444s# 	ltxyyyy4S_,,++C0003oj1ooc3''#::++C000J ##C(((**3///Js   $A) )
A76A7c           	         |dk    rt          |t          j        j                  st	          j        |          rd| }nw|rut          |t                    r`t          |d         t          j        j                  st	          j        |d                   r!d|d         j         dt          |           d}t          | j
        d| d|            d S t          | j
        d|            |                    d	          d         }t          j
        r|                    d
          d         }	 t          j        j                            |          }n# t           $ r Y d S w xY wt"          j        s	|j        sd S |j        st)          dd           d S |j        rd}|t*          j        vrt/                      t*          j        |<   t*          j        |         }||v r,||         |k    rt1          d| d| d||                     d S |||<   t          |          |k    r3|                    d          \  }	}
t          | j
        d|	            d S d S )Ni  r  r   []u/   DEV: skip inmemory_cache obj_size > 128000 — u	    байтzCmfCache:inmemory_add add key r$   r   r}   r	  Tr    zInmemory cache error! key:z	 try_add:z exists:F)lastz"CmfCache:inmemory_add evicted key )r   r   r   	BaseModeldataclassesis_dataclassr   r   r   rG   r]   r*   rI   rl  rm  rn  r
  r   r  rv  r   r   r  r   r-   popitem)r  rw   r   r  detailr~  r   	LRU_LIMITr  evicted_keyr   s              r   rs  zCmfCache.inmemory_add  s    f#sz344 >8PQT8U8U >#c >C.. >A
(<==>ALAYZ]^_Z`AaAa>=c!f/==#c((===	#pU]#p#phn#p#pqqq4 	CIEEEFFFYYs^^A&
> 	2#))#..q1J	H$66zBBEE 	 	 	FF	   	)= 	 4# 	ltxyyyyF 	IS_,,*5--COJ'oj1+ 33&&`3````kZ]N^``aaaFC{i''(00e0<<NK	#U#U#UVVVVV ('s   /$E 
E"!E"c                    g }|dk    r#t          | j        d           i t          _        d S |D ]}|                    d          d         }t
          j        r|                    d          d         }	 t          j        j        	                    |          }n# t          $ r Y vw xY w|j        s|                    |           |t          j        vrt          j        |         }|D ]}|                    |d            |sW|rWt          j                            dt                               |t$                                          d          g           d S d S d S )	Nr[   uS   CmfCache:inmemory_del Полный сброс inmemory_cache при REDISDB.flushdbr$   r   r   r}   rY   )rZ   skip_app_id)rG   r]   r   r  r*   rI   r   rl  rm  rn  r
  rv  r   r(   r   delayed_redis_eventsrb   rc   rb  getpid)r  rZ   
from_event
event_keysrw   r~  r   r  s           r   r-  zCmfCache.inmemory_del  s   
5==	#xyyy COF 	+ 	+C3*J~ 6'--c2215
(:::FF    ' c"""00/*5K + +T****+ 	Cj 	C"))+BDJJXbsus|s|s~s~OO  EA  EA  +B  C  C  C  C  C	C 	C 	C 	Cs   3$B
B%$B%rY   )channelc                     | sd S | d         fd}t          t          j        d           t          j        |           d S )NrZ   c                  v    t          t          j        d            t                               d           d S )Nz*CmfCache:on_inmemory_del event with keys: T)r%  )rG   rI   r]   r  r-  )rZ   s   r   handlerz)CmfCache.on_inmemory_del.<locals>.handler  s8    (TVZ[[[""4D"99999r    z&CmfCache:on_inmemory_del spawn handler)rG   rI   r]   geventspawn)datarF   r*  rZ   s      @r   on_inmemory_delzCmfCache.on_inmemory_del  s_      	FF|	: 	: 	: 	: 	:
 	HN$MNNNWr    c                    	 dt           vrt                      t           _        n# t          $ r}Y d }~d S d }~ww xY wdt           j        vrdt           j        d<   nt           j        dxx         dz  cc<   dt           j        vrdt           j        d<   t          j        rDdt           j        vrg t           j        d<   t           j        d                             |           d S d S )Nrq  inmemory_cache_hitr}   inmemory_cache_missr   inmemory_cache_hit_keysr  r  rw   r   s      r   r  z#CmfCache.profiler_inmemory_data_hit  s    	a''"&&& 	 	 	FFFFF	q6645AO011O0111Q6111 7756AO12) 	C(??=? 9:O56==cBBBBB		C 	Cr  c                    	 dt           vrt                      t           _        n# t          $ r}Y d }~d S d }~ww xY wdt           j        vrdt           j        d<   nt           j        dxx         dz  cc<   t          j        rDdt           j        vrg t           j        d<   t           j        d                             |           d S d S )Nrq  inmemory_cache_skipr}   inmemory_cache_skip_keysr  r3  s      r   r  z$CmfCache.profiler_inmemory_data_skip  s    	a''"&&& 	 	 	FFFFF	 7756AO122O1222a7222) 	D)@@>@ :;O67>>sCCCCC		D 	Dr  c                    	 dt           vrt                      t           _        n# t          $ r}Y d }~d S d }~ww xY wdt           j        vrdt           j        d<   nt           j        dxx         dz  cc<   dt           j        vrdt           j        d<   t          j        rDdt           j        vrg t           j        d<   t           j        d                             |           d S d S )Nrq  r1  r}   r0  r   inmemory_cache_miss_keysr  r3  s      r   r  z$CmfCache.profiler_inmemory_data_miss  s    	a''"&&& 	 	 	FFFFF	 7756AO122O1222a7222q6645AO01) 	D)@@>@ :;O67>>sCCCCC		D 	Dr  r  rJ   Nr   NN)F)r#  )=r+   r)   r7   rO   rP   rQ   rR   r]   r  r  PROCESS_EVICTED_FLUSHr   r`   r{   r   r   r   r   r   r   r   staticmethodr>   r   r   r   rt   r  r  r:  r>  rC  rG  r   r.  r  r  rf  ro   ri  rk  r  r  r  rh  rg  r  r  r  r  r  rc   classmethodr  rs  r-  on_server_eventr.  r  r  r  r5   r    r   rI   rI   E   s)       IHFE!E!
% 
% 
% 
% 
%T T T  $m m mQ Q Qf! ! ! !F  <  &  $   *c * * * * \* 2 2 2 2 \2 ; ; ; \;; ; ;
< 
< 
<? ? ?G G GR  	 	 	   Q- Q- Q- Q-fB B B"@ @ @&A A A($ $ $ $$ $ $ $LR R R
7 7 7\ \ \* * *"C C C G G G
  > > > >>  2k k k kZD D D@ST ST ST STj/ / / + + [+\ .W .W [.W` C C C [CB _4555  65 \ C C [C& D D [D" D D [D D Dr    rI   c                       e Zd Zd ZdS )CustomJSONProviderc                     	 t          |t          j        t          j        f          r|j        }t          |t
          j                  st          |t
          j                  r2|j        s|                                dz   S |                                S t          |t          j	                  r|j        S t          |          }t          |          S # t          $ r
}Y d }~nd }~ww xY wt          j        | |          S )NZ)r   r   CmfDateTimer   r   r   datetzinfo	isoformatr   iterr   	TypeErrorr   default)r   r   iterabler   s       r   rI  zCustomJSONProvider.default-  s    	"# 2FNCDD  i#x011 !ZX]5S5S !z 1==??S00}}&C00 !y CyyH >>!  	 	 	DDDD	 #*4555s$   A>C C  C 6C 
C(#C(N)r+   r)   r7   rI  r5   r    r   r@  r@  ,  s#        6 6 6 6 6r    r@  )static_folder	root_pathTSEND_FILE_MAX_AGE_DEFAULTF)SocketIO	Namespace)RedisManager)Client
project_idc                     t           j                            |           }|s2t          j                            | g d          }|t           j        | <   |S )N)ui_form_scheme
logic_typelogic_prefixcust_field_conf_schemer   r   )r   cache_projectsro   r   
CmfProject)rR  projects     r   get_cache_projectr\  ]  sc     $$Z00G 1#'':  ?I  ?I  ?I'  J  J)0:&Nr    r   c                    |rd| dg}ng d}d |D             D ]}t          ||           }t          j                            |          s t          j                            ||          }	 t          j                            |          srn3# t          t          f$ r t          j	        
                                w xY wt          j	                            |d          c S t          j        D ]2} ||           }|r#t          j	                            |d          c S 3t          j	                            d          S )Nzcustom/plugins/z/static)zcustom/static/zcommon/static/zcmf/static/zdist/cmf-angular/c                 b    g | ],}t           j                            t          j        |          -S r5   )rb  pathrD   r\   PROJECT_DIR)r?   ds     r   r  zsend_static.<locals>.<listcomp>o  s+    OOOabgll6#5q99OOOr    T)conditionalzdist/cmf-angular/index.html)r
   rb  r_  isabsrD   isfilerH  
ValueErrorflaskhelpers
BadRequest	send_filer   HOOK_STATIC_NOTFOUND)req_filenamepluginsearch_dirs	directoryfilenamehooks         r   send_staticrq  f  sn    !88889! ! !
 PO;OOO 	C 	C	Y55w}}X&& 	9w||Ix88H	-7>>(++ :& 	- 	- 	--**,,,	-}&&xT&BBBBB( G G4%% 	G=**8*FFFFF	G=""#@AAAs   -B0B>c                      e Zd ZdZddej        fdZd Zed             Zed             Zed             Z	ed	             Z
ed
             Zedd            Zed             Zedd            Zed             Zed             ZdS )CmfRedisMemoryWrapperut    Если есть self.redis - используется он
        Если нет - нужен фолбэк
    Nredisc                 "    || _         i | _        d S r   )rt  
memstorage)r   rt  s     r   r   zCmfRedisMemoryWrapper.__init__  s    
r    c                       fd}|S )Nc                 p    | j         r  t          | j         j                  |i |S t          d          )Nu&   Redis memory wrapper запрещен!)rt  r   r+   CmfAbortError)r   r   r   r.   s      r   wrapperz/CmfRedisMemoryWrapper.fallback.<locals>.wrapper  s?    z 06wtz1:66GGGG#$LMMMr    r5   )r.   rz  s   ` r   fallbackzCmfRedisMemoryWrapper.fallback  s#    	0 	0 	0 	0 	0 r    c                     t           r   NotImplementedErrorr   r   r   s      r   r  zCmfRedisMemoryWrapper.smembers      !!r    c                     t           r   r}  r  s      r   r  zCmfRedisMemoryWrapper.smembers  r  r    c                 6    | j                             |          S r   rv  ro   r   rw   s     r   ro   zCmfRedisMemoryWrapper.get      ""3'''r    c                 8    | j                                          d S r   )rv  clearrd   s    r   r`   zCmfRedisMemoryWrapper.flushdb  s    r    c                 6    | j                             |          S r   )rv  ttlr  s     r   r  zCmfRedisMemoryWrapper.ttl  r  r    Fc                 B    | j                             ||||||          S )N)nxxxgtlt)rv  expire)r   rw   r1  r  r  r  r  s          r   r  zCmfRedisMemoryWrapper.expire  s%    %%c4B2"%LLLr    c                 Z    | j                             |d          }||z  }|| j         |<   |S r  r  )r   rw   amountr   s       r   rT   zCmfRedisMemoryWrapper.incrby  s3    ##C++$r    r}   c                 .    |                      ||          S r   )rT   )r   rw   r  s      r   incrzCmfRedisMemoryWrapper.incr  s    {{3'''r    c                 0    d}|D ]}|| j         v r|dz  }|S )Nr   r}   rv  )r   namesr   ns       r   r   zCmfRedisMemoryWrapper.exists  s2     	 	ADO##Qr    c                     || j         |<   d S r   r  )r   rw   r   s      r   r   zCmfRedisMemoryWrapper.set  s    $r    r   )FFFF)r}   )r+   r)   r7   __doc__rt  Redisr   r{  r  ro   r`   r  r  rT   r  r   r   r5   r    r   rs  rs    sk         ek       " " X" " " X" ( ( X(     X  ( ( X( M M M XM   X ( ( ( X(   X % % X% % %r    rs  cache_settingsrI  r   rt  	celery_db	run_uwsgiu?   При работе через uwsgi обязателен Redisr   )appcors_allowed_originsloggerengineio_loggerdbunix_socket_pathzunix://z?db=zflask-socketio)r'  
write_onlyclient_managerzredis://usernamepasswordr   @hostport6379r'   message_queue)Payloadr!  )r  z/custom/org_name)rQ   rR   )rR   u&   Неизвестный тип кешаc                    t                               |            t                               t          j                               	 t	          | t
                    r|                                 }t                              | j	        | j
        | j        t          j                    d          |_        d|_        dt          j         |j        d<   d|j        d<   d|j        d<   |S t#                      }d	|d
<   d|d<   t%          |           |d<   t          j                    |d<   t'          |          }d	|_        dt          j         |j        d<   d|j        d<   d|j        d<   |S )N)coderB  description	tracebackapplication/jsonhttps://Access-Control-Allow-Origintrue Access-Control-Allow-CredentialsContent-Type, x-ijtAccess-Control-Allow-Headersr  r  zUnknown errorrB  r  r  )r   rC   r  
format_excr   r   get_responserb   rc   r  rB  r  r-  content_typer\   APP_FQDNheadersrN   r>   jsonifystatus_code)r   responses     r   handle_exceptionr    s[   GGAJJJGGI ""###6!]## >>##

FF="-//	$
 $
   !3:VV_:V:V67?E;<;P7866*"%a&& ) 4 6 68$$":VV_:V:V67?E;<;P78r    jwt_rsazjwt_rsa.pub)RSA)cmf_deletedrg_member_ofdefault_projectemailphone
user_localphone_internalprimary_roleonline_statusvacation_startvacation_endon_vacationactivitydoes_not_workauth_inactive_blockis_admin
is_supportservicedesk_allow
first_name	last_nameztwo_factor.two_factor_optlic_evaprojectlic_evawikilic_evaservicedesk
lic_evagitlic_evatestlic_evacicd
lic_evarmsc                    t           j        sd S 	 t          j        s5t          j                            dt          j                  t          _        n## t          $ r t          j
        d            w xY wt          j        S )Nz.CmfPerson:00000000-0000-0000-0000-000000000001rX  zapp.system_person() error)r\   AUTH_ENABLEDr   system_personr   	CmfPersonro   current_person_fieldsr   rB   	exceptionrd   s    r   r  r  L  s     t
   	g & 0 4 4CCLe !5 !g !gC   5666 s   AA  A2c                  2   t           j                            d          r t           j                            d          } nt           j        sdS 	 t          j        t           j                  }n%# t          $ r t          j
        d           Y dS w xY w|dS t          |t                    o|                    dd          } | sdS t          |           }|j                            d          sdS dt          _        t!          |j                                      d	dg          d
         }|rt%          |          dk    rdS |j                            d          d         }|sdS t)          j        d|          x}r|                                \  }}ndS |dk    s|dk    s|dk    rt.          j        }nJ|dk    s|dk    s|dk    s|dk    rt.          j        }n%|dk    s|dk    rt.          j        }nt.          j        }t7          |t8          j        j                  sdS d|v r$|                    |j         d| ddg          }	n|                    |ddg          }	|	sdS |t?          |	j                   k    rdt          _!        |	t          _"        dS )u  
    Проверяем, что пользователь пришел из share-ссылки
    Если идёт обращение к /files, то проверяем Referer
    Т.к. jsurl передаётся только в апи для других ендпоинтов не смысла путаться парсить body
      Вообще, для API тоже лучше использовать реферер, тогда не придётся по два раза парсить json
    Выставляем:
     - g.sharelink_access_request = True, если пользователь пришел по /share ссылке
     - g.sharelink_access_granted = True, если проверка hash прошла
     - g.sharelink_access_obj = объект, по которому проверяли ключ. Используется в API для доп.фильтрации
    /filesRefererNu{   _check_sharelink_access не смогли распарсить request.data для проверки прав доступаjsurlr   /share/Tr   r      r'   r   z*^(?P<obj_type>[^:-]*)[:-](?P<obj_code>.*)$docDOCCmfDocumentflFLIN_WORK	CmfFolderCmfListEPI-r   r   sharelink_hashrX  )r  r   )#requestr_  r~   r  ro   r-  ujsonrq   r   rB   r  r   rN   r   r   sharelink_access_requestr   queryr   r*   r  r  groupsr   r  r  r  r   r   	CmfEntityr   r>   r  sharelink_access_grantedsharelink_access_obj)
r  json_resr1   
hash_paramobj_keyr  rt  obj_coderx  r   s
             r   _check_sharelink_accessr  ]  s    |x(( I##I.. | 	F	{7<00HH 	 	 	  \  ]  ]  ]FF	 F8T**Hx||GR/H/H 
5//C 8y))  "&A#)$$(("66q9J ZA--hnnS!!"%G  FPPPu "\\^^(( 5H--]1J1J&			T		X--Y1F1F(VaJaJa$			Y		(e"3"3N		 &	 i!566 
hmm)"6CCCC$(*:#;  = = mm$8H1ImJJ  S+,,,,%)"!$
Fs   A. .BBc                     | t           _        | r4| t           j        k    t           _        | t           j        k    t           _        t           j        S )uh   !!! Эта функция не меняет контекст, только инициализирует.)r   _current_personanonymous_usercurrent_user_is_anonymoussharelink_anonymous_user#current_user_is_sharelink_anonymous)persons    r   set_current_personr
    s<    A U&,0@&@#06!:T0T-r    c                     t          | dd           }|dk    r| j        S t          j        sd S ||S t	          d           t          j        t          j                   d S )Nr  FAIL_recursionz#Warning!!! Lazy Calc Current PersonrW   )	r   r  r\   r  r-   r  print_stackr^   stdout)r   cps     r   current_personr    so    	($	/	/B	!! t	~	 

/000sz****4r    c                 &   	 t           j        st          j                            dg          }|j        st
          j        j                                        5  dd l	}dd l
|j        |j        z   d                    fdt          d          D                       |_        |                                 d d d            n# 1 swxY w Y   |j        t           _        n## t           $ r t#          j        d            w xY wt           j        S )Napp_keyr   r   r   c              3   B   K   | ]}                               V  d S r   )choice)r?   r   alphabetsecretss     r   rA   zapp_key.<locals>.<genexpr>  s/      .[.[Aw~~h/G/G.[.[.[.[.[.[r        zapp.app_key() error)r   r  r   CmfGlobalSettingsro   r   rl  rm  disable_aclstringr  ascii_lettersdigitsrD   rangesaver   rB   r  )r   settingsr  r  r  s      @@r   r  r    sP   { 
	+/33I;3GGH# $X%1133 $ $!MMM"NNN%3fmCH')ww.[.[.[.[.[QVWYQZQZ.[.[.['['[H$MMOOO$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ #*CK   /000 ;s1   AC$ A C;C$ CC$ CC$ $ Dc                 d   t          | dd           | j        S 	 t          j        s6t          j                            ddt          j                  t          _        t          j        | _        | j        st          j        	                    dd          }|
                                 	 t          j                            ddt          j                  | _        | j        swt          j        j                                        5  t          j                            | j                  | _        d d d            n# 1 swxY w Y   t%          j                     |                                 n# |                                 w xY w| j        S # t*          $ r t-          j        d            w xY w)	N_anonymous_userzanonymous@evateam.ruTr  include_deletedr   zcreate-anonymous-user-lock   timeoutzapp._anonymous_user() error)r   r!  r   r   r  ro   r  REDIS_DBrt  lockacquirer   rl  rm  r  system_datacreate_anonymous_userr  ddcommit_all_dsreleaser   rB   r  r   
redis_locks     r   r  r    s   t&--9##" 	2"("2"6"6+T0 #7 #2 #2C  #2# 	%!,,-IST,UUJ   %'-'7';';/4 (< (6 (6$ + ')5577 i i/2/T/TUYUg/h/h,i i i i i i i i i i i i i i i $&&&""$$$$
""$$$$##   7888I   BF +AE/ *D<0E/ <E  E/ E E/ F /F	F  F/c                 d   t          | dd           | j        S 	 t          j        s6t          j                            ddt          j                  t          _        t          j        | _        | j        st          j        	                    dd          }|
                                 	 t          j                            ddt          j                  | _        | j        swt          j        j                                        5  t          j                            | j                  | _        d d d            n# 1 swxY w Y   t%          j                     |                                 n# |                                 w xY w| j        S # t*          $ r t-          j        d            w xY w)	N_sharelink_anonymous_userzsharelink-anonymous@evateam.ruTr"  z$create-sharelink-anonymous-user-lockr$  r%  z%app._sharelink_anonymous_user() error)r   r3  r   r   r  ro   r  r'  rt  r(  r)  r   rl  rm  r  r*  create_sharelink_anonymous_userr  r,  r-  r.  r   rB   r  r/  s     r   r  r    s   t0$77C--, 	.,2,<,@,@14, -A -. -.C) *-)F&- 	%!,,-S]^,__J   %171A1E1E944 2F 26 26. 5 ')5577 0 09<9h9h .:0 :060 0 0 0 0 0 0 0 0 0 0 0 0 0 0 $&&&""$$$$
""$$$$--   ABBBr1  c                     t          | dd           | j        S 	 t          j                            ddt
          j                  | _        | j        st          j        	                    dd          }|
                                 	 t          j                            ddt
          j                  | _        | j        swt          j        j                                        5  t          j                            | j                  | _        d d d            n# 1 swxY w Y   t%          j                     |                                 n# |                                 w xY w| j        S # t*          $ r t-          j        d            w xY w)	N_test_guest_userztest-guest@evateam.ruTr"  zcreate-test-guest-user-lockr$  r%  zapp._test_guest_user() error)r   r6  r   r  ro   r   r  r'  rt  r(  r)  r   rl  rm  r  r*  create_test_guest_userr  r,  r-  r.  r   rB   r  r/  s     r   test_guest_userr8  2  s    t'..:$$ & 0 4 4($, !5 !. !. $ 	%!,,-JTU,VVJ   %(.(8(<(<0$4 )= )6 )6% , ')5577 k k030V0VW[Wi0j0j-k k k k k k k k k k k k k k k $&&&""$$$$
""$$$$$$   8999sI   A.E- 	AE $*DE DE !D"E 8E- E##	E- - Fc                 >    t           j                                        S r   )r   r  get_settingsrd   s    r   global_settingsr;  [  s    #00222r    c                     t          | d          rt          | dd           | j        S t          j                            ddg          | _        | j        S )N_global_varaccount_sync_statusaccount_sync_lastr   )r   r   r=  r   CmfGlobalVarro   rd   s    r   
global_varrA  b  sZ    t]##  mT(J(J(V*..7LNa6b.ccDr    lineno   c           	         |                      t                              dd          t                              dd          f          } |                     |d          }t	          d|z             t          |d |         d          D ]\  }}|j        d         }t          j        	                    |j
                            t          j                  d	d                    }t	          d
|||j        |j        dz  fz             t                              |j
        |j                                                  }|rt	          d|z             |j                                        D ]}	t	          |	           ||d          }
|
r=t%          d |
D                       }t	          dt'          |
          |dz  fz             t%          d |D                       }t	          d|dz  z             d S )NFz<frozen importlib._bootstrap>z	<unknown>T)
cumulativezTop %s linesr}   r   z#%s: %s:%s: %.1f KiBi   z    %sc              3   $   K   | ]}|j         V  d S r   sizer?   stats     r   rA   zdisplay_top.<locals>.<genexpr>  s$      //49//////r    z%s other: %.1f KiBc              3   $   K   | ]}|j         V  d S r   rH  rJ  s     r   rA   zdisplay_top.<locals>.<genexpr>  s$      00d	000000r    zTotal allocated size: %.1f KiB)filter_tracestracemallocFilter
statisticsr-   	enumerater  rb  seprD   ro  r*   rB  rI  	linecachegetlinestripformatsumr   )snapshotkey_typelimit	top_statsr&   rK  framero  linellotherrI  totals                r   display_topra  l  s   %%5"ABB5+..'  H ##H#==I	.5
 !!! 6E6!2A66 
 
tq!6;;u~33BF;;BCC@AA$%,	D0@AB 	C 	C 	C  >>DDFF 	#(T/""".'')) 	 	B"IIII	 effE @///////"c%jj$+%>>???00i00000E	
*edl
;<<<<<r    c                    t           j        j                            dd          5  t          j                            | j        t          j	                  }|sd | 
                    d          D             }t          j        |d<   t          j        |d	<   t          j        |d
<   t	          j        di |}|rzd|_        |j                            t          j                                                   d|_        |j                            t          j                                                   |r?d|_        |j                            t          j                            d                     t           j        j                                        5  |                    d           d d d            n# 1 swxY w Y   t/          j                     |cd d d            S # 1 swxY w Y   d S )Nzcreate-current_person-lock
   r%  )loginr   c                 P    i | ]#\  }}|                     d           s	|dk     ||$S )cmf_r   )r~   )r?   r   r   s      r   
<dictcomp>z+create_person_from_auth.<locals>.<dictcomp>  sE     ; ; ;Aq||F++; 12T		 109		r    Tr   	cmf_owner
cmf_authorcmf_modified_byServiceDeskClient)r  )	only_datar5   )r   rl  rm  CmfLockr   r  ro   rd  r   r  r   r   r   r  r  r   CmfPersonGroupsupport_groupr  
user_groupr  r  r  r,  r-  )authr  is_servicedeskr	  person_valuess        r   create_person_from_authrt    sL   			!	!">	!	K	K  !%%DJs?X%YY 	; ; JJ$J77; ; ;M *+M+&*+-M,'/0}M+,%6666F O$(!#**6+@+N+N+P+PQQQ$(!#**6+@+K+K+M+MNNN `+/(#**6+@+D+DJ]+D+^+^___!--// , ,d+++, , , , , , , , , , , , , , , 5                 s6   E2G(F<0G(<G 	 G(G 	G((G,/G,)forcelevelc                    t          j                     }t          t          dd           s| s|r|+t          |t                    rt          t
          |          }n| rt
          j        }nt
          j        }t          j                     }t	          t          |t          j
        z
  dz  d                    }t	          t          |t          j        z
  dz  d                    }t                              di                               dt                                }|                    dd          }|                    dd          }	|                    d	d          }
t          j                            d
          }t          j        d|d| d| dd| d|	 d|
 d||	z   |
z    ddg|}t          j        |dd                    d |D                                  t          j                     t          _        t'          t          j                     |z
  dz            }|dk    rt          j        |dd| d           d S d S d S )Nr]   rf   r   rq  select_countselectr   r#  insertmr'   z(+z)mszs zu zi r   r:   r;   c              3   4   K   | ]}t          |          V  d S r   r=   )r?   parts     r   rA   zdebug.<locals>.<genexpr>  s(      *G*G3t99*G*G*G*G*G*Gr    zPROF debug funcion got ms)r1  r   r\   r   r>   rB   INFOr]   roundr   debug_start	debug_nowro   rN   r  r   
request_idlogrD   r   )ru  rv  messagesdebug_str   r   r  scscsscuscir{  parts	debug_ends                 r   rC   rC     s4   y{{Hvw%% N N% N%%% 0// 	"LEEMEikksQ]*d2A6677sQ[(D0!4455UU?B''++NDFFCCffXq!!ffXq!!ffXq!!LS!!LAC;;3;;#;;sS;;;

 
 	E4*G*G*G*G*G!H!HIIIikk X-t344	q==Kt%Ly%L%L%LMMMMM;N N8 =r    c                  t   t           j                            d          } t           j                            d          rw| rut          t          |           j                  }|                    t                       d          rdS |                    d          s|                    d          rdS nt           j                            d          rdS t           j                            d	          st           j                            d          rd
S t           j                            d          s>t           j                            d          st           j                            d          rdS t           j                            d          rdS t           j                            d          rdS dS )Nr  /files/servicedesksd_api/docs/r  pub_api/servicedesk/api/api/pub/z/auth/rq  /with-contextsystemdeny)r  r  ro   r_  r~   r>   r   app_base_href)refererreferer_paths     r   set_api_scoper    s   o!!),,G|y)) g 8G,,122""moo#B#B#BCC 	8""8,, 	0G0G	0R0R 	9			 	 	0	0 	x		 	 	)	) W\-D-DY-O-O u		 	 	)	) W\-D-DX-N-N RYR^RiRijsRtRt y		 	 	*	* v		 	 	1	1 x6r    c                  &   t           j        dk    rdS t                       t                                           t          j                     dt          _        i t          _	        i t          _
        g t          _        t          j                            d          dk    t          _        ddlm}  ddlm}  |             t          _        t          j        t          _        d	                     |d
d                    t          _        dt          _        g t          _        g t          _        dt          _        dt          _        dt          _        dt          _        dt          _        dt          _        dt          _         dt          _!        dt          _"        dt          _#        dt          _$        dt          _%        dt          _&        dt          _'        dt          _(        dt          _)        dt          _*        dt          _+        tY                      t          _-        dt          _.        dt          _/        t`          j0        1                    t`          j2        j3                  t          _4        d t          _1        t          j4        5                                t          _6        d t          _5        dt          _7        i t          _8        i t          _9        g t          _:        g t          _;        i t          _<        dt          _=        dt          _>        t                      t          _@        i t          _A        g t          _B        dt          _C        dt          _D        dt          _E        g t          _F        i t          _G        i t          _H        i t          _I        t                      t          _J        i t          _K        g t          _L        i t          _M        i t          _N        g t          _O        g t          _P        t          t          _Q        dt          _R        dt          _S        dt          _T        dt          _U        t                      t          _V        t          jX        Y                                 t          jZ        Y                                 t          j\        st          d           dS t           j^        _                    d          rdS t          ja        st          jb        st          Q                    dt          c                                 d           t          jd        5  t          Q                    dt          c                                 d           t          ja        st          Q                    dt          c                                 d           t                       t                       t          jg        rt                       t          ji        rt                       dt          _a        t          Q                    dt          c                                 d           n5t          Q                    dt          c                                 d           ddd           n# 1 swxY w Y   d}d}t           j^        _                    d          s t           j^        _                    d          rHt           jk                            d          }|sPt           jk                            d          }|r/|_                    d          r|t          d          d         }nd}|st           jm                            d          }|rt          jn        o                    |          }t          jn                            |dt          jp                  }t          Q                    d|dd          d | d!|            |s<t          jr        d"t           jk        t           jm                   t          d#d$d%&          S t           j^        d'k    r*t          jt        u                    t          jp        (          }t           j^        _                    t                       d)          rd*}d+t           jw        v rt           jw        d+         }t          |          }|s1t          d+|i          }t          t                       d,|           }d-t          j{         |jk        d.<   d/|jk        d0<   d1|jk        d2<   |S d3}	 |             }
|sqt           j|                            d4          }t           j|                            d5          }|r7t          j}        ~                    |          \  t          _        t          _/        n+|r)t          j                            |          t          _        t          j        rZt          j        o3t          j                            t          j        j        j        6          }t          j        r|sdt          _        t          j        r\t          j        j        j        t          _        d7d8t          j        j        gg}t          jn                            |t          jp        9          }d:t          j         d;}	|r\|j        r&t          Q                    d:|j         d<           d}n|j        r'd:|j         d=}	t          Q                    |	           d}n|r"t          |t          j        j        >          }njt          j        j        r,t          t          j        t          j        j        >          }n-t          j        j        rt          t          j        d?          } |             |
z
  d@k    r(t          Q                    dA |             |
z
              t           j^        _                    dB          p=t           j^        _                    dC          pt           j^        _                    dD          }dE }|r|j        j        t          _        t          j        r8t          j        j        t          _        t          j        j         t          _        ndt          _        |j         t          _        dt          _        t          |           n|s
 |            r[t          j        }t                       t          j(        rt          j        }dt          _        dt          _        t          |           n%dt          _        t          t          j                   t          j        pt           j^        _                    dF          pt           j^        _                    dG          pt           j^        dHv pt           j^        _                    dI          pt           j^        _                    dJ          pnt           j^        _                    dK          pNt           j^        _                    dL          p.t           j^        dMk    pt           j^        _                    dN          pt           j^        _                    d          o2t           jw                            dO          dPk    ot           j        dQk    pt           j^        _                    dR          pt           j^        dSk    pyt           j^        _                    dT          pYt           j^        _                    dU          ot           j        dQk    p)t           j^        _                    dV          ot           j        dQk    p| o<t           j^        _                    dW          ot          j                                        p| o<t           j^        _                    dX          ot          j                                        pzt           j^        _                    dY          ot          j        pOt$                              t           j^                  p*t           j^        _                    dZ          ot          j        }t          j        }t          j        } |             }
t          jZ                                          |             |
z
  d@k    r(t          Q                    d[ |             |
z
              |s
 |            rdS t          j-        d\k    rM|s,t          j        rt-          |	          S t-          |	          S |j        s|j        st-                      S nHt          j        r|st-          |	          S t           j^        d*k    r.|r,|j        s%|j        rt          d]          S t          d^          S |r|j        st          j        st-          d_          S t          j        rt-                      S t          j        st1          t          d`d          r|r|j        r |             }
t          j                                        st          t7                       da          S  |             |
z
  d@k    r(t          Q                    db |             |
z
              t          j        s^dt          _         |             }
t;                        |             |
z
  d@k    r(t          Q                    dc |             |
z
              t          j/        re |             }
t          j/                                        } |             |
z
  d@k    r(t          Q                    dd |             |
z
              |r|S dS dS )euJ  
    Должны вернуть Response or None
    Особенности поведения:
      В случае web запроса:
        - response - view не выполняется, сразу отправляем response
        - None - выполняем view
        - Exception(в т.ч. и abort) - обработчик выводит трейс клиенту
      Системный контекст(shell, celery, socket, other with cmf_context):
        - None, Response - нет разницы
        - Exception - прерывает выполнение.
    OPTIONSNF
run_pytest1r   r1  )choicesr   0123456789abcdef   )r   c                      t           j        S r   )r   _nowr5   r    r   <lambda>z before_request.<locals>.<lambda>	  s    AF r    c                      t           j        S r   )r   _dater5   r    r   r  z before_request.<locals>.<lambda>	  s    QW r    Tz/memOKz"Wait first_request_init lock (pid=)z!Got lock first_request_init (pid=zStart first_request_init (pid=zDone first_request_init (pid=z%Already done first_request_init (pid=r  r  zX-Eva-TokenAuthorizationzBearer token)api_token_hashr  r   zAuth API Token(z...): hash=z	, person=z6Invalid API token: request.headers=%s, request.args=%szInvalid API token  
text/plainr  /pub/webhookr   zauth/not_authorizedr'   next_urlauth/signin?r  r  r  r  r  r  uU   Требуется авторизация. Введите логин и пароль.session_tokenaccess_token)rd  rd  ==filterr   u   Учётная запись uQ    заблокирована. Обратитесь к администраторуu    заблокирована.uo    заблокирована за неактивность, обратитесь к администратору)r  )rr  g?z-PROF before_request get auth and session got z/pub/pub_apiz/docsz/sharec                  ~    t           j                            d          pt           j                            d          S )Nr  /socket.io/)r  r_  r~   r5   r    r   is_allow_publicz'before_request.<locals>.is_allow_public	  s4     L##H-- 6|&&}55	7r    z/health_check/z
/auth/sync)z/auth/invitez/auth/restore_passwordz
/auth/signz/servicedesk/auth/signz/servicedesk/auth/invitez/servicedesk/auth/two-factorz"/servicedesk/auth/restore_passwordz/auth/two-factormoderootz	127.0.0.1z/crm/forms/z/manifest.webmanifestz/app/assets/z/forms/z/js/r  z/sso/z	/helpdeskz/nolicense.htmlz6PROF before_request CmfAccessList.setup_context() got r  r  r  u-   Доступ в раздел запрещен
CmfLicenseznolicense.htmlz,PROF before_request license_ui_access() got z-PROF before_request prepare_plan_cache() got z/PROF before_request tfa_check_two_factor() got )r  methodcheck_db_lockr  rk  r,  before_requestr   rd  rj  flagsremove_filesrb  rc  ro   testr1  r   r  r  r  rD   r  save_only_data_hackalertnoterq  rd  is_guest_useris_anonymousr  is_system_contextr  r  disable_notifyimport_modesession_tab_idcomponent_idinteractive_shellr  r  r  api_args
api_kwargsr  	api_scoper  sessionr   r   r   r   r  rD  r  relaxed_bz_python_mode	emit_listsocket_eventsserver_eventsdeferred_audit_listdeferred_fullsearch_dirty_listr  jscache_timelifer   r  r  r  TEXCOM_ENABLE_GROWCACHE_HACKr  r  r  acquired_locksacquired_locks_shacquired_lock_timignsro  fulltext_search_headlinesr#  project_perm_browse_cache%project_perm_timetrackerhistory_cacheshow_bg_progressbarapi_hack_fieldsrC   
new_acl_idapi_license_required license_disable_user_count_hooksbackbone_synccurrent_save_objectsr   CmfDeferredJobinit_contextCmfAccessListr\   r  r
  r_  r~   r   first_request_init_donefirst_request_init_skipr$  first_request_init_lockapp_init_aclapp_init_project_permissionWHATSAPP_MESSENGER_URLspawn_messenger_socketio_clientWHATSAPP_WEB_SOCKETspawn_whatsapp_socketio_clientr  r   r   r  
hash_tokenr  rB   warningr   
CmfWebhookget_token_personauth_base_hrefr   check_sso_redirectr   redirectr  cookies
CmfSession
from_tokenCmfAuthfrom_jwtIS_AUTHORIZATORr   r  r  rt  jwt_is_supportr;  servicedesk_allow_auth_guestsjwt_is_match_orgr  r  r  r  r   remote_addr	CmfPlugincheck_secretSTATIC_URL_REr  r  setup_contextreject_responser  r   r  license_ui_accessr  prepare_plan_cache_doneprepare_plan_cachetfa_check_two_factor)r1  r  auth_person	real_auth	api_tokenr  r  r   qserr_msgprof_str  r  _filteris_force_publicr  anon_personis_allow_without_authr   s                      r   r  r    s    ~""tOOO%%'''AAMAGANZ^^L))S0AF$&&AKKAM7777#5;;;<<AL!AAGAF AFAGAOANALA"&A,0A)AAMAANA!&A!&AALAJAL//AK!AAI""8#4#899AFNAEfkkmmAG_AF  %AAKAOAOA')A$A AAAJAJ%*A"AA$&A!AA A$'EEA!"$AA"$A.0A+AAAGAL!A)-A& AO UUA
&&(((
%%'''  4   |v&& t
 & Ps/J P	CRYY[[CCCDDD ( 	P 	PGGF		FFFGGG. PGGGGHHH +---0 63555- 52444.2+F		FFFGGGGN		NNNOOO%	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P. KI |w'' V7<+B+B9+M+M V
 O''66	 	%++O<<I %''	22 % )#i..// :II $I 	3 ))'22Y 	V#-88CCN *..-$sG` / b bKGGfimffffYdffggg V XZaZikrkwxxx 4cUUUU |~%%'88@Y8ZZ |."2"2GGGHH ''~j1Hx(( 	@J122BN,,>>">>??A3Ofo3O3O	/08>	454I	01fGdffG 0S++O<<**>:: 	; & 1 < <] K KAFAII 	;^,,\::AF6 	._6>3E3EAFLL^3E3_3_I % i 6  	Sfl(AG $-/G !*..gcF_.``K PQW  P  P  PG  S, 	'GGj;;Ljjjkkk #'KK 4 ' @[=N  @  @  @GGGG$$$"&K S5iAFLabbb& S5afI^___"@ S5afTRRR tvv#	R@PRRSSS l--n== -<""7++-<""8,, 
7 7 7   *#)6 	960AL"#&"99AOO !AL"-"88AO $;''''	 *OO-- *&!!!% 	54K#;'''' #1=)))
 F F|&&'788F |&&|44F |II	F
 |&&|44F |&&'?@@F |&&'ABBF |&&'EFFF |CCF |&&'9::F |&&w// 7GN4F4Fv4N4NRX4X 7';6F |&&}55F" |66#F$ |&&~66%F( |&&y11Xg6I[6X)F* |&&v..U73F+3U+F. #"kw|'>'>w'G'GkFL\LiLiLkLk/F0 #"kw|'>'>w'G'GkFL\LiLiLkLk1F4 |&&{33?5F6 ""7<007F: |&&'899Eag? F 	
A	A dffG
&&(((tvv#	[RYIY[[\\\  -[ 1 1 -[	
	 	  	,v 0&w///"7+++, 	%[5K 	%"$$$ 6 	,+ 	,"7+++ <3;{7M, +000	***  	T+"8 	TAW 	T ##RSSS 	% #$$$" 	[wv|T'J'J 	[{ 	[_j_u 	[dffG$6688 D=?? B B BCCCtvv#%%YttvvPWGWYYZZZ & X&*#$&&466Gc!!GGVDDFFWDTVVWWW 	y $&&I**,,466Gc!!GGXddffwFVXXYYY 	H 	 	s   "D>Y,,Y03Y0c                     g dg}t           j        dk    r|                    g d           t          j                            |          }|r|                    |           S d S )N)disabledr  Fr  )servicedesk_supportr  T)r  )r   r  r   r   CmfAuthOpenIdPluginro   login_redirect)r  r  openids      r   r  r  
  su    ((()G{h:::;;;'++7+;;F /$$X.../ /r    c                 H   t           j        dk    st          j        dk    rKt	          j        dt           j        t          j        t          j        t          j        t          j                   t           j        	                    d          s/t           j        	                    d          st           j        dk    rt          | pddd	
          S t          t           j                  }d|i}| rt          | d           | |d<   t          |          }d }|st          |          }|sQt          j        dk    r!t!          t#                       d|           }n t!          t#                       d|           }dt$          j         |j        d<   d|j        d<   d|j        d<   |S )Nr  r  zJRequest reject access: path=%s, auth=%s, login=%s, api_scope=%s, person=%sr  r  r  znot authorizedr  r  r  r  
auth_errormessager  zservicedesk/auth/signin?r  r  r  r  r  r  r  )r  r_  r   r  rB   r  rq  rd  r  r~   r   r	   r1   r   r   r  r  r  r\   r  r  )r#  skip_ssor  paramsr  r   s         r   r  r  
  s   |&&!+*A*AXL!&!'1;8I	K 	K 	K L##M22|&&w// |~--3#3S|TTTT%%h' 	('<((( 'F9v 	-"8,,A 	D{h&& 0 0NN"NNOO 0 0BBbBBCC3Ofo3O3O	/08>	454I	01r    c                  d    t          j                     t                       t                       d S r   )r,  r-  emit_eventsemit_server_eventsr5   r    r   commit_with_eventr)  
  s,    MMMr    c            
          t                               d          sd S t           j                                        D ]5\  } }t	          d|d          |d|                    dd                     6i t           _        d S )Nr  is_changed-r   r'   r  private)	namespacer  )r   ro   r  r   r  )r   r   s     r   emit_list_applyr.  
  s    55 +##%% o o38S%688#SVSZSZ[aclSmSmnnnnnAKKKr    c                    |                                  D ]V\  }}|D ]L}|d         }|d= t          |d                   }|d= |d                                         }	 t                              |           t                              |           t                              |           n2# t
          $ r%}t          d| d| d| d|            Y d }~d }~ww xY wt          |t                    s" |j	        |g|d         R i |d	|d	         i |d
         r:|d
         dk    s.|d
         |d
<    |j	        |g|d         R i |d	|d	         i ;|
                    d          r{|d         rsd|d         d         v r'|                    |d         d         d                    d|d         d         v r,|d         d         d         D ]}|                    |           |D ]~}	t          |	t          j        j                  r(t          d|	 d| d| d|            |	j        j        }
nt#          |	          }
|
|d
<    |j	        |g|d         R i |d	|d	         i NXd S )Nsocket_clientr  r   uP   DEV: FATAL emit пришел с несериализуемыми данными z! socket_client:z; event_persons:z; event_param:r   r-  r  r,  r  event_current_personr   relation_personsuY   DEV: INFO Кривой евент, в event_person попал объект, а не str: r;   )r   r   copyrb   rc   r   r-   r   rN  rt   r~   r   r   r   r  r   r   r>   )
event_dictmsgevent_param_listevent_paramr0  r  emit_kwargsr   user_idevent_personevent_persons_strs              r   emit_events_dictr<  
  s   !+!1!1!3!3 ,q ,q+ +	q +	qK'8MO,O <==MO,%h/4466K

3

;'''

;''''     Fij  F  F  }J  F  F  \i  F  F  yD  F  F  G  G  G mX66 ""3pV)<pppppWbcnWopppp 6" ;v+>)+K+K&1&&9F#""3pV)<pppppWbcnWopppp~~l++ 7v& 7-V1DQ1GGG%))+f*=a*@AW*XYYY)[-@-CCC'26':1'=>P'Q 7 7G)--g6666 - 
q 
q lCJ,@AA :  g  wC  g  g  FI  g  g  LW  g  g  Ze  g  g  h  h  h(4(=%%(+L(9(9%&7F#""3pV)<pppppWbcnWoppppp
qC+	q,q ,qs   AB--
C7CCc                  &    t          d           d S )Nr   delay)emit_events_with_delayr5   r    r   r'  r'    s    ######r    c                     dd l } t                              d          sd S i }|                      t          j                  D ]9}|                    d          r"t          j        |         ||<   t          j        |= :t          |           d S )Nr   r  project_notify)r3  r   ro   r  r~   r<  )r3  r  r5  s      r   emit_project_eventsrC    s    KKK55!! Myy)) % %>>*++ 	%!"!5M#$]#####r    c                      t                       t                              d          pi i t          _        r r fd}t	          j        |           dS rt                     dS dS )u   Запускаемся в контексте, но отправляем в отдельном таске вне контекста, после паузы, чтобы не держать запрос.r  c                  N    t          j                    t                     d S r   )r+  sleepr<  )r?  r  s   r   emitterz'emit_events_with_delay.<locals>.emitter  s'    L]+++++r    N)r.  r   ro   r  r+  r,  r<  )r?  rG  r  s   ` @r   r@  r@    s    EE/**0bMAO 	( 	(	, 	, 	, 	, 	, 	, 	W	 ('''''( (r    c                     t                               d          pg } g t           _        | D ]]\  }}t                               d| d|            t          j                            |t                              |                     ^d S )Nr  zemit_server_events: r  )	r   ro   r  rC   r'  rt  ra   rb   rc   )r  r'  r-  s      r   r(  r(  $  s    EE/**0bMAO& : :	8w88$88999w

4(8(89999: :r    c                  D    t          j                     i t          _        d S r   )r,  rollback_all_dsr   r  r5   r    r   rollback_purge_eventrK  ,  s    AOOOr    c                      t                               dg           D ];} t          j                            |           rt                              |            <g t           _        d S )Nr  )r   ro   rb  r_  r   rE  r  ro  s    r   apply_deferred_remove_filesrN  2  sS    EE."--    7>>(## 	 IIhANNNr    c                 v    t           j        r,t          j                            t           j        |            dS dS )u   Сессия может быть продлена через SSO, надо продлить куку

    Args:
        r (response): ответ браузеру в котором обновляем куки
    N)r   r  r   r  set_session_tokenr   s    r   update_cookiesrR  :  s8     	y 7((A666667 7r    c                     t          dd           t          |            dt          j         | j        d<   d| j        d<   d| j        d	<   d
| j        d<   | S )uk   
    Запускается только если небыло ошибок
    :param r:
    :return:
    Tr   )after_hooksevent_delayr  r  r  r  r  r  byteszAccept-ranges)
cmf_commitrR  r\   r  r  rQ  s    r   acaorX  E  sg     4Q////1/K&//K/KAI+,4:AI010EAI,-!(AIoHr    c                  4   ddl m}  t          j        sd S t          j        t
          _        t          j        j	        
                                5  t          j        j        j                                         d d d            n# 1 swxY w Y    |              d S )Nr   spawn_server_event_listener)cmf.cmf_server_event_listenerr[  r\   r  DISABLE_PERMISSIONSr   disable_permissionsr   rl  rm  r  includer   r  load_acl_datarZ  s    r   r  r  W  s    IIIIII $8C			%	%	'	' 9 9(668889 9 9 9 9 9 9 9 9 9 9 9 9 9 9  !!!!!s   )BB
Bc                     t          t          j        j        d          sd S t          j        j                                        5  t          j        j        j                                         d d d            d S # 1 swxY w Y   d S )NCmfProjectPermScheme)	r   r   r_  r   rl  rm  r  rb  load_project_permission_datar5   r    r   r  r  d  s    3;%'=>> 			%	%	'	' O O/LLNNNO O O O O O O O O O O O O O O O O Os   )A;;A?A?c                     t          t          d          dk    rd S t          j        j                                        5  t          j                                        } t          j        	                    | d                   }|
                                 d d d            n# 1 swxY w Y   t          j        	                                }|r|                                 |                                 |                    g d           |                    g d           |                    g d           |                    dd	g           |                    g d
           |                    dg           |                    g d           |                    g d           |                    ddg           |                    g d           |                    dg           |                    g d           |                    g d           |                    g d           |                    ddg           |                    ddg           |                    g d           |                    g d           |                    g d           |                    g d           |                    dg           g ddg dg dgfD ]+}|g dg}t          j                            |g d !           ,t          j        	                                }|rm|                                 |                                 |                    g d           |                    g d"           |                    g d#           t          j        	                                }|rm|                                 |                                 |                    d$dg           |                    g d%           |                    g d&           t          j        	                                }|r*|                                 |                                 d S d S )'Nr`  z/opt/eva-appr   )r   )r  rU  rW  	scheme_wf)ri  dealordernorW  zparent.project_idrR  )rh  
perm_acl.*zperm_acl.cmf_ownerz!perm_acl.object_ownerperm_inheritperm_effective_acl_idperm_has_aclperm_inherit_acl_idperm_parentrW  parent_logic_prefix)0parent.sl_allow_executor_change_nofatal_deadlineparent.sl_deadline_shiftparent.sl_deny_no_approveparent.sl_only_owner_approveparent.sl_task_need_approveparent.sl_task_only_owner_closeworkflow.enable_sl_control2workflow.sl_allow_executor_change_nofatal_deadlineworkflow.sl_deadline_shiftworkflow.sl_deny_no_approveworkflow.sl_only_owner_approveworkflow.sl_task_need_approve!workflow.sl_task_only_owner_close'project.task_code_use_logic_type_prefix)
rh  ri  rj  perm_inheritrk  rl  perm_policyperm_policy_anonymousperm_policy_guestperm_policy_sharelink)rh  cmf_owner_assistantsparent.cmf_ownerparent.cmf_owner_assistantsr  r  )logic_type.obj_code_prefixzproject.task_code_prefixr{  z!parent.default_agile_story_points)r  zparent.task_code_prefixz&parent.task_code_use_logic_type_prefix)cache_status_typecmf_created_atrj  rh  rW  r  r  waiting_for)r  hrefrW  ui_nameop_gantt_tasktree_parent_id)r  rU  zparent.ui_form_scheme)agile_story_points	executorslistsrU  rW  rm  priorityresponsiblezresponsible.namestatuszstatus.status_codezstatus.status_type)zcmf_author.user_localzcmf_owner.user_localzexecutors.user_localzparent.cmf_owner.user_localzresponsible.user_localzspectators.user_localzwaiting_for.user_local)rn  ro  rp  rq  zparent.sl_readonly_closed_taskrr  rs  rt  ru  rv  rw  rx  z workflow.sl_readonly_closed_taskry  rz  z5workflow.sl_deny_closing_task_before_closing_subtasksu.   workflow.sl_сlose_task_after_closing_subtasksz9project.security_level_scheme.default_task_security_level)cache_action=r  OR)r  r  r  )	cmf_modelr  CmfTask)json_filterjson_entry_pointjson_action	func_name	json_datar  )r   rB  rW  rW  zparent.logic_prefixsys_type)r  r   rB  zparent.codez	parent.idzparent.logic_type.namezparent.name	log_level)zparent.activityzparent.logic_type_idzparent.scheme_wfrR  )ri  r  rh  	importantlikesr  rW  zperson_views.personr,  
spectatorstexttree_parent)r   r\   r   rl  rm  r  r   r  create_dummy_taskro   delete_dummy_tasksave_prepare_load_perm_fieldsr  
CmfTriggerr   r  
CmfComment	CmfNotify)dummy_task_data
dummy_taskr   _fr  cr  s          r   r  r  l  se   v}%%77 
		%	%	'	' ' ' .::<<^''?4+@'AA
$$&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' ' 	A U			GGGHHH	dddeee	  |  |  |  	}  	}  	}	x!67888	  _  _  _  	`  	`  	`	@ABBB	  Z  Z  Z  	[  	[  	[	nnnooo	)+HIJJJ	{{{|||	:;<<<	yyyzzz	  j  j  j  	k  	k  	k	;;;<<<	1222	x!12333	IIIJJJ	  W  W  W  	X  	X  	X	  L  L  L  	M  	M  	M	  P
  P
  P
  	Q
  	Q
  	Q
	RSTTT -,,t5R5R5RTsTsTs.tu  ///0b1}1}1}~~~~A s			GGGHHH	[[[\\\	qqqrrrA y			{H-...	cccddd	  x  x  x  	y  	y  	yA 		 s   AB$$B(+B(c                 &    t          |            d S Nr  )cmf_rollbackr  s    r   teardown_requestr    s    9%%%%%%r    c           
         |rt           j        sdS ||rt          j        nt          j        }t
                              d| d|d|d||           ||t           j         k    rdS |rRd                    t          j
                              }t
                              d|            t          |           | t
          j        vr!t
          j                            |            dS dS )	   
    Глобальная функция для оповещения фронта о предупреждениях
    :param msg:
    :return:
    Nzcmf_alert: msg=z abort= debug_only= devel_only=rv  r   zcmf_alert Stack:
)r\   r]   rB   WARNINGr  r   rC   
PRODUCTIONrD   r  format_stackry  r  r   )r5  r  r   
devel_onlyrv  	stack_strs         r   r   r     s      &, }#(:glGGE#EEEE*EE
EEUGSSS*V5F1F"G"G !IIi46677		0Y00111C   
!'	s r    c                    |rt           j        sdS |t          j        }t                              d| d|d||           ||t           j         k    rdS | t          j        vr!t          j                            |            dS dS )r  Nzcmf_note: msg=r  r  r  )	r\   r]   rB   r  r   rC   r  r  r   )r5  r   r  rv  s       r   cmf_noter    s      &, }GG;;;
;;j;;5GIII*V5F1F"G"G
!&	c r    r,  )r-  r0  r  r  c                   |st           }	 dt          vrt                      t          _        n# t          $ r}Y d }~d S d }~ww xY wt          |          dk    r'dt          j        rt          j        j        j        pd ig}t          |d                   t          k    rWdt          v rt          j
        |d         d<   nd|d         d<   t          j        rt          j        j        j        pd |d         d<   t          ||||          }t                              |           ||d<   d	}	d
D ]}
|                     |
          rd}	 n|	rt          dt                                  |s-t          j        g}|	st!          dt                                  g }|D ]c}t#          |t$          j        j                  r |                    |j        j                   A|                    t-          |                     d||d<   t                              |d                    t          j                            | g           }||vr|                    |           d S d S )Nr  r   rj   r  r   r1  )r   r   r-  r  r0  F)
zevent-zinvaldebug-ztask-comment-zaudit-task-comment-znotify-person-r+  zcomment-z	notify-osznotify-important-DEBUG_TuC   DEV: WARNING в cmf_emit_event не указали cmf_emit_event: u   DEV: FATAL!!!!!!!!!!!!!! Добавьте меня в спинт Баги реактивности. 10.10.2022 в cmf_emit_event не указали cmf_emit_event: r  )socketior   rN   r  r   r   r  r   r   r   r  rb   rc   r~   r-   localsr   r   r   r   r  r   r>   
setdefault)r5  r-  r0  r  r  r   r   r   event_paramsmuted
muted_debtr;  r:  
event_lists                 r   r  r    s    ! !##"ffAO   
4yyA~~$a&6&T1;K;N;T&\X\]^DG}}q  ()(8DG$%%(*DG$%*+*:*Xq?O?R?X*`\`Q&'T&IDQQQLJJ|$1L!Ep  
>>*%% 	EE	  `^TZT\T\^^___ J)* 	J  I  E  G  G  I  I  J  J  J % 8 8lCJ$899 	8$$\_%:;;;;$$S%6%67777$5L! 	JJ|O,---++C44J:%%,''''' &%s   !- 
AAc                    |rd                     |          nd}|rdnd}	|rdnd}
d                     |	|| |
          g}|rddlm}  |            }t          j        |dt          j        t          j        	          }|r|                                \  }}|r(|                                }|                                }|j        }|rS|rQt          j	        d
|           t          j	        d|           t          j	        d|           t          d|           |g}|r+|                    |           |                    |           n|                    |p|           |r |                     |            |z
             |S dS )u  
    :param command: собственно, команда которую необходимо выполнить
    :param sudo: необходимо ли команду выполнять от рута
    :param timeout: секунд на выполнение. Дальше команда получит SIGTERM.
    :param wait: True дождаться окончания выполнения команды, False запустить и забыть, вернёт (None, None)
    :param separate_out_and_err: отдельно stdout, отдельно stderr, иначе не ясно как это всё парсить
        False по умолчанию, чтобы никому ничего не сломать.
    :param do_decode: возвращать декодированные строки вместо байт
    :param do_raise: выбрасывать исключение в случае, если код возврата != 0 (удобно для логирования трэйсбэков)
    TODO: почему u''? Наследие python2 и биллинга или реальная необходимость?
    TODO: Можно перейти на f'{sudo}bash -c export BLA=BLA;{timeout}{cmd}{redirect}', читается лучше
    ztimeout -v {0} r   zsudo z 2>&1z0{0} bash -c "export BOOTUP="noncolor";{1}{2}{3}"r   r  T)shellr  r_   u6   Произошла ошибка при вызове %sz
STDOUT: %sz
STDERR: %su4   Произошла ошибка при вызове r:  )rV  r1  
subprocessPopenPIPEcommunicatern   
returncoderB   errorRuntimeErrorr   )commandsudor&  waitseparate_out_and_err	do_decodedo_raisemeasure_runtimetimeout_cmd_sudo	_redirectcmdr1  popen_startprocessouterrerrcoder  s                      r   run_bash_commandr    s    9@H$++G444SK%HH#E+9I>EE	  	C  DFFs$&0o&0o7 7 7G  &&((S 	**,,C**,,C$ 	]x 	]MRTWXXXM,,,,M,,,,[VY[[\\\i 	#JJsOOOJJsOOOOJJszc""" 	+JJttvvk)***
:r    c                 :   t          j        t          j                  }t	          j                    }|                    |                                            |                    |          }t          j	        |          
                                }|  d| }|S )ua   
    Подписываем токен сертификатом
    :param jwt:
    :return:
    r$   )r   r  r   rsa_private_keyr   r#  r   signbase64	b64encodern   )jwtsignerdigestr  r   s        r   rsa_sign_pack_jwtr  S  s|     ^C/00FZ\\F
MM#**,,;;vDD!!((**D//4//CJr    c                 Z   ddd}t          j        t                              |                                                                                    }t          j        t                              |                                                                                     } | d|  S )uD   
    Создаем токен
    :param payload:
    :return:
    RS256JWT)algtypr$   )r  r  rb   rc   r   rn   )payloadheaders     r   
create_jwtr  b  s     U++Fdjj007799::AACCFtzz'2299;;<<CCEEG  w   r    c                      t           j        S )u2   
    Текущая версия
    :return:
    )r\   CMF_VERSIONr5   r    r   cmf_get_versionr  n  s    
 r    c                 d    | t           j        vr!t           j                            |            dS dS )ux   
    Удаления файлов после коммита транзакции
    :param filename:
    :return:
    N)r   r  r   rM  s    r   cmf_remove_filer  v  s5     q~%%	h''''' &%r    c                 0    t          j        |            d S r  )r,  r-  r  s    r   r  r    s    y))))))r    c                 0   t          j                     | rt          j                    }ddlm} t
                                           |j                                         |j	        
                                 t                       t          |           t                       t                       t          j                     t          j                    |z
  dk    r5t                              dt          j                    |z
              d S d S d S )Nr   )r   r>  g{Gz?z PROF cmf_commit after_hooks got )r,  r-  r1  cmf.includer   r  r  CmfAuditapply_deferred_auditCmfFullSearchapply_deferred_dirtyrC  r@  r(  rN  r   rC   )rT  rU  r  r   s       r   rW  rW    s    P)++&&&&&&''))),,...11333[1111#%%%
9;; 4''GGNty{{W7LNNOOOOOP P ('r    c                   $    e Zd Zdd	dZd Zd ZdS )
cmf_contextFTrJ   Nc                 `    t                               d          | _        || _        || _        d S )Nr  )r   test_request_contextctxinit_views_and_dspreprocess_request)r   r  r  s      r   r   zcmf_context.__init__  s-    ++O<<!2"4r    c                 
   ddl m}  |            rt          d          | j                                         | j        r!t                       t          j                     | j	        rt          	                                 d S d S )Nr   )has_app_contextu;   Контекст нельзя включать дважды)rf  r  r   r  	__enter__r  start_viewsr,  init_dsr  r   )r   r  s     r   r  zcmf_context.__enter__  s    ))))))? 	[YZZZ! 	MMMJLLL" 	%""$$$$$	% 	%r    c                     	 |rt          |           nt          d           | j                            |||           d S # | j                            |||           w xY w)Nr  T)rT  )r  rW  r  __exit__)r   excr   r  s       r   r  zcmf_context.__exit__  st    	5 -s+++++t,,,,Hc5)44444DHc5)4444s   #A A!)FTr9  )r+   r)   r7   r   r  r  r5   r    r   r   r     sK        5 5 5 5 5
	% 	% 	%5 5 5 5 5r    r   c                  H   g d} t          j        d | D              }|D ]\  }}}|                    t          j        d          }|                    d          r|D ]}|                    d          s|                    d          r|                    d          smd                    d	 |                    d
          D                       }t          
                    |dz   |                    d          d         z   d            t                              d
dt                     t                              ddt                     t                              ddt                     t                              ddt                     t                       d S )N)z	cmf/viewszcmf/modulescommonmoduleszcustom/commonzcustom/modulesc                 d    g | ]-}t                               t          j         d | d          .S )r'   T)followlinks)rb  walkr\   r`  )r?   
search_dirs     r   r  zstart_views.<locals>.<listcomp>  sI     $' $' $' 	6%44
44$GG$' $' $'r    r   z/viewsz.pyz.pycz__init__.pyr$   c              3      K   | ]}||V  	d S r   r5   )r?   r   s     r   rA   zstart_views.<locals>.<genexpr>  s'      *N*NA*N1*N*N*N*N*N*Nr    r'   r   )packager  )r#   	view_funcz/<path:req_filename>distz/static/<path:req_filename>staticz,/plugins/<plugin>/static/<path:req_filename>plugins_static)	itertoolschainr   r\   r`  r   r~   rD   r*   	importlibimport_moduler   r,   rq  app_before_run)rm  search_iterdirnamedirnames	filenamesro  r/   s          r   r	  r	    s   fffK/ $' $'%$' $' $' (K )4 f f$9//&"4b99H%% 	f% f f%%e,, f0A0A&0I0I fS[SfSfgtSuSu f"%((*N*NgmmC6H6H*N*N*N"N"NK++K#,=s@S@STU@V,V`d+eee S6[AAA+fTTT%K     CN^juvvvr    c                      d S r   r5   r5   r    r   r  r    s    Dr    c                 `    |                     dd           ||d<   ||d<    | j        di | d S )N	countdownr   r   r   r5   )r  apply_async)jobr   r   r2   s       r   schedule_deferred_jobr)    sK     {A&&&GFOGHCOgr    c                  V    d } t           j        rt          j        | dg           d S d S )Nc                     i }t           j                            dd           rdt          j        i}t
                              t          j        | |           d S )NSOCKETIOr  
namespacesr  )rb  rc  ro   r\   ORG_NAMEwhatsapp_sioconnectr  r-  s     r   messenger_connectz:spawn_messenger_socketio_client.<locals>.messenger_connect  sa    :>>*d++ 	0v/GV:(2G 	 	E 	E 	E 	E 	Er    z	/whatsapp)r.  )r\   r  r+  r,  )r2  s    r   r  r    sL    E E E $ B&K=AAAAAAB Br    c                  X    t          j        t          j        t          j                   d S r   )r+  r,  whatsapp_go_sior1  r\   r  r5   r    r   r  r    s     
L(&*DEEEEEr    c                      dd l } t          j        ddt          j         dt          j                    |                     t          j        t          j        ddd           d S )Nr   r:   uY   Подключаемся к удаленной отладке config.REMOTE_DEBUG_SERVER=z config.REMOTE_DEBUG_PORT=TF)r  stdoutToServerstderrToServersuspend)pydevd_pycharmrB   infor\   REMOTE_DEBUG_SERVERREMOTE_DEBUG_PORTsettrace)r9  s    r   cmf_pycharm_debugr>    s    L	@'-'A	@ 	@%+%=	@ 	@A A A
 F6V=Ufj+/  @ @ @ @ @r    rJ   c                  `   t          t          j        t          j        t	          t          t          j                                        t	          t          t          j                    dz                       t          j        j	        d          } t          |           }t          |          S )N<   guid)issorg_nameiatexpr  jti)rN   r\   r  r/  r>   r   r1  r   r  r   r  r  )r  r  s     r   gen_eva_app_tokenrG    s}    v"O3ty{{++,,3ty{{R/00119?  G W

CS!!!r    urir-  c                    ddl m} t          j        rt          j        dk    rUt	          t
          j        |d                   }|                    dg           }|                    di           } ||i |}n |            }ddd	d
|_        t                       |  }t                      |d<   |                    |t                              |                    }	|	j        dk    r"t          d| d|	j         d|	j                   |	                                }|rd|v rt          d|           t"                              |           |S )Nr   )r  Falser  r   r   r  r  r"  )zContent-typeAcceptzContent-Encodingeva_app_token)r-     u9   Не удалось отправить запрос, url=z, status_code=z, res=r  u(   Сервер вернул ошибку: )requestsr  r\   EVA_ACCOUNT_USEr   r   r  ro   r  r  rG  postrb   rc   r  r   contentr   rC   )
rH  r-  r  r  method_argsmethod_kwargsresultr   r1   r   s
             r   call_eva_accountrU    s         ! QV%;w%F%Fh88hhvr**2..666GII%7*(/1 1	  !!(3(( 1 3 3_ffStzz$//f00?c!! DC  D  D_b_n  D  Dvy  wB  D  DE E E 	Qg''OvOOPPPGGFOOOMr    eva_db_upgrade_runningc                     | s&t          t                                                    } t          j                            t          | dd          st          dt                     dS )u   Запускается перед миграций БД. Информирует приложение, что не следует открывать транзакции.rC  T)exr  zCannot lock N)r>   rb  r$  r'  rt  r   _DB_LOCK_KEYCmfError)r   s    r   app_db_upgrade_startr[  (  sa     !BIIKK  >lEbTBB 64l445556 6r    c                  N    t           j                            t                     dS )u   Запускается после миграций БД. Информирует приложение, что можно продолжать работать.N)r'  rt  rr   rY  r5   r    r   app_db_upgrade_stopr]  0  s    N,'''''r       c                     d }d}t          j                     } |            rZ| rt          j                     |z
  |k    r|rt          dt                     dS |dz  }t          j        d            |            ZdS )u   Проверяем не заблокировано ли использование БД, если заблокировано, то можем дождаться разблокировки.c                      t           rt          j                    t           z
  dk    r7t          j                            t
                    at          j                    a t          S )uW   используем кеш 1sec, чтобы часто не ходить в редисr}   )_db_lock_cache_tsr1  r'  rt  ro   rY  _db_lock_cacher5   r    r   
check_lockz!check_db_lock.<locals>.check_lock7  sI     ! 	,TY[[3D%D$I$I%^//==N $	r    r   z
DB locked Fr}   T)r1  rZ  rY  rF  )r  r&  raise_errorrc  rh   starts         r   r  r  5  s       EIKKE
*,,  		e+w66 :L::;;;u

1 *,,  4r    c                      dd l } t          j        rd}nt          j        } | j        |d            | j                    }|                    |           d S )Nr   r]   z:%(asctime)s %(process)d %(name)s %(levelname)s %(message)s)rv  rV  )logging.handlersr\   r]   	LOG_LEVELbasicConfig	getLoggersetLevel)rB   rv  r  s      r   init_loggingrl  L  sh    | ! Ge,hiiiiW  F
OOEr    httpsc                     t           j        pd}|                    d          s|dz  }| r2t           j        rdt           j         nd}| dt           j         | | S |S )Nr'   r   r   z://)r\   	BASE_HREFr   EXTERNAL_PORT_HTTPSr  )full_urlprotocol	base_href	port_specs       r   r  r  \  s}     'CIc"" S	 G8>8RZ42444XZ	FFvF	F9FFFr    c                     t           j        rt           j        }nI| r4|rd}n1t           j        rdt           j         nd}dt           j         | }nd}|t           j        pdz  }|                    d          s|dz  }|S )Nzhttp://127.0.0.1:8080r   r   r  r'   )r\   AUTH_SERVER_URLrp  r  ro  r   )absoluteinternalrs  rt  s       r   r  r  f  s     -*		 	 D4		@F@Zb< :<<<`b	CvC	CC		IV%,,	c"" S	r    r  r5   )rB  rC  )FFr   r  )r   )FFNN)FNN)TNTFFFF)T)Tr   r:  )Tr^  T)Frm  )r  r  rB   r^   fcntlr  r   rp   r  r1  r  	threadingr  r   r   pathlibr   urllib.parser   r   r   r	   werkzeug.utilsr
   r+  r   r  Crypto.Hashr   Crypto.Signaturer   rf  r   r   flask.json.providerr   werkzeug.exceptionsr   r   r   r  cmf.data_providersr   r,  cmf.system_datar  r  r
  r   rG   objectrI   r@  r+   r\   r`  r   rb   r  r  rj  r^  cache_in_project_roler  
rpc_modelsclean_attributesr  r  Lockr  all_models_meta
SECRET_KEY
secret_keyflask_socketiorN  rO  r  rP  rQ  rt  rY  r>   r\  rq  rs  r'  r   r  r3  cfgr(   r  rb  rc  ro   r   r]   socketio_kwargsr  r1   r  r  engineio.payloadr  max_decode_packetsr0  r4  r_  r   openr.   readrU  r/  r  REDIS_DB_IDREDIS_DB_ID_TIMERerrorhandlerr  register_error_handlerprivate_key_pathpublic_key_pathCrypto.PublicKeyr  
import_key
read_bytesr  rsa_public_keyr  r  r
  r  r!  r3  r   r  r  r8  propertyr   r   r   r   r;  rA  ra  rt  rC   r  r  r  r  r)  r.  r<  r'  rC  r@  r(  rK  rN  rR  after_requestrX  r  r  r  r  r   r  r  r  r  r  r  r  r  rW  r   r	  r  r)  r  r  r>  rG  rN   rU  cache_notify_scheme_rulecache_person_notify_optcache_cust_field_config_schemecache_email_listr  rY  rb  ra  r[  r]  r  rl  r  r  r5   r    r   <module>r     s            



                  0 0 0 0 0 0 0 0       = = = = = = = = = = = = $ $ $ $ $ $          ' ' ' ' ' ' ! ! ! ! ! ! ! ! 3 3 3 3 3 3 - - - - - -           ) ) ) ) ) )     				 
  f  g  g    E   ,B B BcD cD cD cD cDv cD cD cDN/6 6 6 6 6, 6 6 6* eHDF4FGGGc""   *+
& ' #  " # ,in..  " . . . . . . . . ! ! ! ! ! !              * B B B B6@% @% @% @% @% @% @% @%F ! "" 76#$$ ()>y)I&)QU\)\)\

	
*
/
/
1
1CGGFOOOc U[''3''HN :>>+ [~iYZZZ l  76#$$ 9)>y)I&)QU\)\)\		y	)$	/BY'++,>?? 9V-i89KLVVRTVV%c3CPUVVV,:())#.y999V29=jIIM.y999P!6y!A*!MPPPPM.y9&AASV29=AA&&QQSSSR!+8( % $ $ $ $ $  8&&o&&vV\***&--- 7>>&$'99:: +	f #55	6	6 +!&&((..**+ + + + + + + + + + + + + + + 76#$$ 	Y'/7::Hhn555				y	)&	1X	=	=HD)))		i@AAA 

I  )  B   9&6 7 7 74*++i7 $v)**]:             H(#.)9)D)D)F)FGGC F'(B(B(D(DEEC     "_ _ _D       &   $    @  D  > !//Q h}--Q !.11Q #+8,D#E#EQ  "(?33Q !.11Q x//Q (7##Q3 3 3 #(?33Q    Xj))Q = = = =>   <  t N N N N NB  , p p pf/ / / /$ $ $ $N    -q -q -q`$ $ $	$ 	$ 	$( ( ( ($: : :    7 7 7   "
" 
" 
"O O O? ? ?D & & & &   4   * *-Dy`b 7( 7( 7( 7( 7(t in5:2 2 2 2j  	! 	! 	!  ( ( (* * * *
P P P P$5 5 5 5 5 5 5 56  8	 	 	   	B 	B 	BF F F@ @ @	"3 	" 	" 	" 	"# T    4  "   %' "  ( 6 6 6 6( ( (
   .           s   7,P//P36P3