
    @iU                       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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 d dl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. d dl/m0Z1 d dl2Z,d dl3Z3d dl4m5Z5 d dl	m6Z6 d dl7m8Z8  e3jr                  d      Z: G d de;      Z;d Z< G d de=      Z> G d de)      Z? e;e@deAj                        ZC e?eC      eC_D        deC_E        deC_F        g eC_G        deC_H        d eCj                  d<   i eC_I        deC_J        i eC_K        deC_L        deC_M        deC_N         ej                         eC_P        i eC_Q        eAj                  eC_S        d dlTmUZUmVZV d dlWmXZX d dlYZYd eZfd!Z[i eC_\        e[eC_[        da]d" Z^dd#Z_ G d$ d%      Z` e`       Za G d& d'      Zb eb       ZceceC_c         e>       Zdd d(lemfZf d)ef_g         G d* d+      Zh eh       ZWej                  j                  d,      rd d-lkmlZl eld.        Zm eXeAj                  /      Zo eXeAj                  /      Zpej                  j                  eAj                  d0z         rA eseAj                  d0z         5 Ztetj                         j                         eA_w        ddd       eaeC_a        deC_x        d eC_y        eCj                  e{      d1        Z|eCj                  e{e|        eeAj                        d2z  Z~ eeAj                        d3z  Zd d4lmZ e~j                         r' ej                  e~j                               eC_        ej                         r' ej                  ej                               eC_        g d5eC_        d6 ZEd7 Zd8 Zd9 Zd: ZFdeC_        deC_        deC_        d; Zd< Zd= Z eeE       ee      _E         eeE       ee      _         ee       ee      _         ee       ee      _         ee       ee      _         ee       ee      _         ee       ee      _         eeF       ee      _F        d> Z ee       ee      _        d? Z ee       ee      _        dd@ZddAZdddBdCZdD ZeCj6                  dE        ZddFZddGZdH ZddIZdJ ZdK ZddLZddMZddNZdO ZddPZdQ ZdR ZdS ZeCjT                  dT        ZdU ZdV ZdW ZeCj^                  ddX       ZddYZddZZd[dd\g d]d^Z	 	 dd_Zd` Zda Zdb Zdc Zdd Zde ZddfZddgZdh ZddieZfdjZddieZfdkZddieZfdlZddieZfdmZddieZfdnZddieZfdoZddieZfdpZddieZfdqZdrej*                  e	j                     dse	j                  fdtZdue	j                  dse	j                  fdvZ G dw dx      Zdy Zdz Zdd{Zdd|Zd} Zd~ Zd ZdseZfdZdeZdefdZi eC_        i eC_        i eC_        i eC_        i eC_        i eC_        dZdadaddZd ZddZd ZddZddZy# 1 sw Y   xY w)    N)OrderedDictdefaultdict)Path)OptionalTuple)urlparseparse_qs	urlencodequote)	safe_join)SHA256)
PKCS1_v1_5)Responseflash)DefaultJSONProvider)HTTPExceptionfields)*)base)relativedelta)	timedeltastr_to_timedeltaz^.*\.(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        |   |i | y N)super__init__)selfargskwargs	__class__s      ./cmf/app.pyr    zFlask.__init__0   s    $)&)    c                       fd}|S )Nc                     j                  dd       }| j                  }|j                  d      d   }|dk7  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>.decorator4   s    {{:t4H,,K%++C04Kg%K'$.&,qzz9Dc8Q:':(OHr&    )r!   r9   r8   r:   s   ``` r%   routezFlask.route3   s    	 r&   )r1   r/   __qualname__r    r<   __classcell__)r$   s   @r%   r   r   /   s    *r&   r   c                 b    | r-t        j                  ddj                  d |D                     y y )N%s c              3   2   K   | ]  }t        |        y wr   str).0args     r%   	<genexpr>zprint_debug.<locals>.<genexpr>G   s     %?3c#h%?   )loggingdebugjoin)condr"   _kwargss      r%   print_debugrN   E   s'    dCHH%?$%?@A r&   c                      e Zd ZdZdZdZdZdZdZdZ	dZ
d6d7dZd Zd Zd Zd Zd8dZd	 Zd
 Zd Zd Zededefd       Zedefd       Zed9d       Zd Zd Zd Zd Zd Zd Zd Z d6dZ!d Z"d Z#d Z$d8dZ%d:dZ&d  Z'd! Z(d" Z)d# Z*d$ Z+d% Z,d& Z-d8d'Z.d( Z/d;d)Z0d* Z1d9d+Z2d, Z3e4d-        Z5e4d.        Z6e4d:d/       Z7e e8d01      d2               Z9e4d3        Z:e4d4        Z;e4d5        Z<y)<CmfCacheNFc                     t               | _        t               | _        || _        || _        i | _        | j                  r8| j                  j                  dd       | j                  j                  dd       d| _        y )Nstat_hitr   	stat_missF)dict	cache_objcache_invalidateredis_dbmemorytexcom_growcache_hack_cacheincrbyjob_daemon_mode)r!   rW   rX   s      r%   r    zCmfCache.__init__T   sb     $ +-(==MM  Q/MM  a0$r&   c                    t        t        j                  xs | j                  dt        j                         | j
                  r| j
                  j                          nt               | _        t               | _	        | j
                  j                  dt        j                  d              | j
                  j                  dt        j                  ddi             y )NzCmfCache.flushdb!!!filezCmfCache:flushdbCmfCache:inmemory_delkeysALL)rN   configDEBUGsysstderrrW   flushdbrT   rU   rV   publishjsondumpsr!   s    r%   rf   zCmfCache.flushdb`   s    FLL.DJJ0ECJJW==MM!!#!VDN$(FD!0$**T2BC5tzz65/7RSr&   c                 n   t        t        j                  xs | j                  dt        j                         t        t              }| j                  j                         }| j                  j                  dd      D ]  }t        | j                  d| dt        j                         |dd	 j                         }| j                  j                  |      }|^t        j                  |      }|d
   }|d   ||   |<   |j                  |        |j                          | j!                  |       y	)u)   Инвалидируем весь jscachezCmfCache.flush_jscache!!!r]   zobj:jshash:*  countz"CmfCache.flush_jscache invalidate z!!!   Ncurrent_person_idjsver)rN   rb   rc   rd   re   r   rT   rW   pipeline	scan_iterdecodegetpickleloadsdeleteexecuteemit)r!   emit_msgpipekeyjshashjsresjspersons          r%   flush_jscachezCmfCache.flush_jscachej   s    FLL.DJJ0KRUR\R\]t$}}%%'==**>*F 		C

&HS$QX[XbXbcW^^%FMM%%c*E}LL'E01H).wHXv&KK		 			(r&   c                    t        t        j                  xs | j                  dt        j                         d}| j
                  j                         }| j
                  j                  dd      D ]*  }|j                  d      r|dz  }|j                  |       , |j                          t        t        j                  xs | j                  d	| d
t        j                         y)u+   Инвалидируем весь obj cachezCmfCache.flush_all_obj!!!r]   r   zobj:*rl   rm   s
   obj:jshash   zCmfCache.flush_all_obj: z recordsN)rN   rb   rc   rd   re   rW   rr   rs   
startswithrx   ry   )r!   rn   r|   r}   s       r%   flush_all_objzCmfCache.flush_all_obj|   s     	FLL.DJJ0KRUR\R\]}}%%'==**7$*? 	C~~m,QJEKK		
 	FLL.DJJ2J5'QY0Zadakaklr&   c                   	
 dd l dd l}dd lddlm ddlm	 |}	
fd
t        j                  rj                  t        t        j                  j                  j                         t        j                  d      z
        dd j!                               j#                         d d d	v ro |j                         }|d
k  rYt$        j&                  rIt$        j&                  t$        j(                  k7  r(t        j                  j                  j                         S |D ]  }|dz    
|      z   } d|v r|dz   t        |d         z   }t+        |j-                               D ]  \  }}|dk(  r|dz   |z   dz    
|      z   }! | j.                  r^d|dd z   dz   j                  |j!                               j#                         z   }|j1                  dd      }|j1                  dd      }n3| dj                  |j!                               j#                         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 rv|t        k(  r`| dd dk(  rX	 	j                  j                  |       }|j                  j                        }|j                  dd      }|} t        d|        t        |       }|S |t"        k(  r| D ]  }| |      z   dz   } |S |t$        k(  s|k(  r5| j'                         D ]   \  }}||z   }|r| d	 |      z   }|dz   }" |S | d
}|S |t(        u rt        |       }|S t+        | d      rt        | j,                        }|S d|j.                  z   d	z   
j1                  t3        j4                  |             j7                         z   }|S # t         $ r}Y d }~d }~ww xY w)Nz... r      20)secondmicrosecondz!!!!! Date:,:Noneidz
todo2:obj:)type
issubclasscmfr   CmfType
is_definedvaluerD   intfloatparserparse
astimezoneutcreplacer3   	ExceptionlistrT   itemsboolhasattrr   r1   md5rv   ri   	hexdigest)valtresval1evkr   _all2strdateutilhashlibr   s          r%   r   zCmfCache.hash.<locals>._all2str   s   S	A!SZZ//0>>))CS	ACACS#u%%8AaD 0&oo33C8"oohll;"ll!lC!}c2 #h0 J/ d 2A+c1C2, J) da=0IIK (DAq'C!$Qi(1+5!Ci(& J  J d#h J	 3%cff+C J '3c9GKKUXHY<Z<d<d<ffCJ5 & s   AG 	G$G$Z   daysro      )c92a103d860eddgUUUUUU?|r   z|id:r   zHASH:i  z|md5:
rA   _zDEBUG_CACHE HASH:)r   randomdateutil.parserdatetimer   werkzeug.datastructuresr   APPcache_optimizer   rD   r   r   CmfDatenowr   encoder   gcurrent_usersystem_usersortedr   rc   r   rN   )r!   prefixr"   r#   r   srr   r}   r   r   r   r   r   s            @@@@@r%   hashzCmfCache.hash   s   %90	 0	d '++c#**2D2D2H2H2J8K]K]ceKf2f.ghijk.l.s.s.u"v  #A  #A  #C  DF  EF  #G  Ka  #aACxANNq~~/Nzz))--// 	(CC(3-'A	(6>F
S..Av||~. 	4HCd{C##hsm3A	4
 ::!Ac("W,AHHJ0G0Q0Q0SSA		$$A		#s#A(!w{{188:6@@BBADJJ 3Q7r&   c                    |
t               }|s|S t        t        |j                        }t               }|j                  j                         D ]_  }|j                  j                  |d       }|s#|j                  d      r|j                  |d d        n|j                  |       t        |t        j                  j                        r.t        ||j                  d       }|s| j                  ||       t        |t        j                  j                  t        j                  j                  f      st        ||j                  d       }|r|D ]  }| j                  ||        |j!                         D ]/  }	d|j"                   d|	j                   }
|j                  |
       1 b |j                  |j"                  dz   dj%                  t'        |            z          |S )N_idr+   )r   ref_r   rA   r   )setgetattrmodels
class_name__dict__r`   r   ru   endswithaddr   r   CmfRelationBasesimple_objects_id_recursive
CmfM2MBaseCmfBackrefBaserelated_modelsr   rK   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)"":cr?3"":.)SZZ%?%?@%c9+?+?F44[c4JI

(=(=szz?X?X'YZ%c9+?+?F#. K88c8JK "+!9!9!; !I )*>*>)?@CGGCL!'	!. 	sxx~(>??@
r&   c                    |sg S g }t               }|j                  d      D ]d  }|j                  j                  d      r|j	                  |j                  dd        n|j	                  |j                         t        |t        j                  j                        r*|j                  | j                  |j                               t        |t        j                  j                  t        j                  j                  f      s|j                  r1|j                  D ]"  }|j                  | j                  |             $ |j                         D ]/  }d|j                   d|j                   }|j!                  |       1 g |j!                  |j                  j                  dz   d	j#                  t%        |            z          t'        t        |            }|S )
u   
        Собираем ид связанных обьектов 2 уровня для настройки инвалидации
        :param obj:
        :return:
        Tr   r   Nr+   r   r   rA   r   )r   valuesr   r   r   
isinstancer   r   r   extendobjects_id_recursiver   r   r   r   r   appendrK   r   r   )r!   r   r   r   fieldr   r   r   s           r%   r   zCmfCache.objects_id_recursive   sz    IZZ4Z0 	$E((/""5#3#3CR#89""5#3#34%!;!;<

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

4#<#<W#EFG!&!5!5!7 $I )*>*>)?@CJJsO$	$ 	

366<<#%1G(HHI3s8n
r&   c                     t        |      t        j                  kD  rt        dd       y| j                  r | j                  j                  d| |       y| j                  r|| j                  |<   yy )NuU   DEV: Слишком большой объект для кэширования — keyT)
debug_onlyFobj:)lenrb   CACHE_MAX_OBJ_SIZE	cmf_alertrW   r   rX   rU   )r!   r}   str_vals      r%   _obj_dict_setzCmfCache._obj_dict_set  si    w<&333 m{  A==MMSElG4[[")DNN3 r&   c                    t               }|D ]  }|j                  d|         | j                  r' | j                  j                  | t	        |      k(  ryy| j
                  r%|D ]  }| j                  j                  |      r y yy )Nr   TF)r   r   rW   existsr   rX   rU   ru   )r!   r`   hkeysr}   s       r%   _obj_dict_existszCmfCache._obj_dict_exists1  s     	$CIISEl#	$==#t}}##U+s4y8[[ !~~))#. ! r&   c                    | j                   rZ| j                   j                  d|       }|| j                   j                  d       |S | j                   j                  d       |S | j                  r| j                  j                  |      S y )Nr   rR   rS   )rW   ru   rZ   rX   rU   )r!   r}   r   s      r%   _obj_dict_getzCmfCache._obj_dict_getC  sy    ==--##d3%L1C$$Z0 J $$[1J[[>>%%c**r&   r~   inv_payloadc                     |  d| S )N::r;   )r~   r   s     r%   %_jshash_invalidate_confirm_member_keyz.CmfCache._jshash_invalidate_confirm_member_keyP  s    K=))r&   
member_keyc                 (    | j                  dd      S )Nr   r   )maxsplitr0   )r   s    r%   +_jshash_invalidate_confirm_member_key_splitz4CmfCache._jshash_invalidate_confirm_member_key_splitT  s    q11r&   c                 <    | r| n|j                  d      d   }d| S )Nr   zjscache-invalidate-confirm-set:r   )cache_idr~   set_keys      r%   "_jshash_invalidate_confirm_set_keyz+CmfCache._jshash_invalidate_confirm_set_keyX  s(     '(FLL,=b,A0	::r&   c                    t        t              }|j                         D ]v  \  }}t        d| |d |g       |j                         D ]K  \  }}|j	                  d      s|| j                  |         j                  | j                  ||             M x | j                  r6|j                         D ]"  \  }} | j                  j                  |g|  $ y y )Nzinvalidate-)roomevent_personsjshash:r~   )
r   r   r   cmf_emit_eventr   r  r   r   rW   sadd)	r!   msgsconfirmations	person_idinv_dictr~   r   r  confirm_lists	            r%   rz   zCmfCache.emit_  s    #D)#'::< 	YIx[4hTZcYde'/~~'7 Y#$$Y/!$"I"IQW"I"XY``BB6;WYY	Y ==)6)<)<)> ;%"""7:\:; r&   c                 0   | j                   st        d       | j                   rs|rp|d   d   }| j                  |      }t               }|D ])  }|j	                  | j                  |d   |d                +  | j                   j                  |g|  y y y )Nu$   ERROR! Недоступен redis_dbr   r  r   )rW   r3   r  r   r   r   srem)r!   confirm_dictsample_jshashkey_cache_idr  confirms         r%   jshash_invalidate_confirmz"CmfCache.jshash_invalidate_confirmn  s    }}89==\ )OA.MBB-BXL6L' h##D$N$NwWXz[bcd[e$fghDMM|;l; *=r&   c                    t         j                  rt        j                          | j                  rW| j                  |      }| j                  j                  |      D cg c]!  }| j                  |j                               # c}S y c c}w r   )	r   invalidated_keys	CMF_CACHE_do_invalidate_defferrW   r  smembersr  rt   )r!   r  r  members       r%   jshash_invalidate_confirm_listz'CmfCache.jshash_invalidate_confirm_list|  sw    
 ++-====hGG #mm44W=? @@Q? ? ?s   &B	c                    |sy | j                   r | j                   j                  |D cg c]  }d| 	 c}  t        j                  |       | j	                  |       i }|D ]  }| j
                  rd|vrt        d|        t        | j
                  d|        | j                   j                  d| d      x}s^t        | j
                  d|        | j
                  rt        d	|        | j                   j                         }|D ]H  }	|j                  d|	j                  d
              |j                  d|	j                  d
              J |j                         }
t        ||
dd d         D ]  \  }	}|	j                  d
      }	|t        j                  |      }|s2|d   }||vrt!               ||<   |dk(  r/|r-dj#                  t%        |D cg c]  }|dvr|
 c}            }nd}|d    d| d| d| }|||   |	<    | j                   j                  d| d      x}rx t'        j&                         }| j)                  |       t'        j&                         }||z
  dkD  rt*        j-                  d||z
   d       y y | j.                  r$|D ]  }|| j0                  v s| j0                  |=   y y c c}w c c}w )Nr   rn   z#DEBUG_CACHE JSHASH: try invalidate z*DEBUG_CACHE JSHASH: try invalidate:jshash:invalidate:jshash:d   rm   z*DEBUG_CACHE JSHASH: got invalidate:jshash:z#DEBUG_CACHE JSHASH: got invalidate utf-8r   r   rp   updater   )cache_fieldscmf_modified_atcmf_viewed_atcmf_modified_by_idONLYFORUPDATESrq         ?z_obj_dict_mdel emit got sec)rW   rx   r  inmemory_delprofiler_invalidaterc   r  rN   spoprr   ru   rt   ry   ziprv   rw   rT   rK   r   timerz   r   rJ   rX   rU   )r!   r`   obj_changed_fieldsobj_idactionr}   r{   invjsr|   r~   jshash_listr   r   r   changed_fieldsr   
emit_startemit_ends                     r%   _obj_dict_mdelzCmfCache._obj_dict_mdel  s   == DMM  4"@CT#<"@A""4($$T*H 7E::'"4"%H#NODJJ*TUXTY(Z[  $}}114Fse2LTW1XXeX

.XY\X],^_zz&)LSE'RS==113D"' E4g(>'?!@Ad6==+A*B$CDE #',,.K),UK14E)F 'E!'w!7& !=$ &U 3 ',-@'AH'x759V 2  &16H15$*7I ,@!+,4~+~ -. ,@ %A2"
 2B-27^,<BvhbPRSaRb*cK9DHX.v6O'E  $}}114Fse2LTW1XXeX7E@ JIIhyy{H*$s*28j3H2IMN +[[ ,$..(s+, _ #Al,@s   K"Kc                    | j                   rb| j                   j                         5 }|j                         D ]  \  }} |j                  d| g|   |j	                          d d d        y | j
                  rJ|D ]D  }|| j                  v r"| j                  |   j                  ||          3||   | j                  |<   F y y # 1 sw Y   y xY wNinvalidate:)rW   rr   r   r  ry   rX   rV   r   )r!   r  r|   r}   r   s        r%   _invalidate_dict_msetzCmfCache._invalidate_dict_mset  s    =='') T#+>>#3 <KCDIIC51;F;<  [[ ?$///))#.55hsmD19#D))#.	?  s   ?CCc                     | j                   rA| j                   j                  d|       }|r|D cg c]  }|j                  d       c}S |S | j                  r| j                  j                  |      S y c c}w )Nr=  r$  )rW   r  rt   rX   rV   ru   )r!   namer   r}   s       r%   _invalidate_dict_getzCmfCache._invalidate_dict_get  sl    ==--((;tf)=>C7:;

7+;;J[[((,,T22 <s   A6c                    | j                   ro| j                   j                         5 }|j                         D ](  \  }}|s	 | j                   j                  d| g|  * |j	                          d d d        y | j
                  r]|j                         D ]I  \  }}|D ]?  }|| j                  j                  |g       v s"| j                  |   j                  |       A K y y # 1 sw Y   y xY wr<  )	rW   rr   r   r  ry   rX   rV   ru   remove)r!   r  r|   r@  r   key_listr}   s          r%   _invalidate_dict_mdelzCmfCache._invalidate_dict_mdel  s    =='') T$,NN$4 JLD&***[+?I&IJ 	  [["*.."2 @h# @Cd3377bAA--d3::3?@@
  s   C&2C&&C/c           	      	    t         j                  j                  d      rdt        _        y t
        j                  r|s j                  ry t        j                  v r j                  d       y t        j                  |      r8dt        _        t         j                  dt        j                  |              y  j                  |      }t        j                   j                  |t        j"                        }||k  rEdt        _        t         j                  dt        j"                   d j                  |              y i t$        j&                  j(                  j+                  |      }fd fd	}	|rvt-        |t.              sft1        |d
d       rY |	|       d}
t3        |j4                        t        j6                  v rt9        d|j4                   dt        j6                          y |r+t-        |t.              rt1        |d   d
d       rd}
 |	|       nH|4d}
t;        |      t<        k7  r2t;        |      t>        k7  r t:        t2        k7  rn|sd}
d}ntA        d      d}|r?|d   r9t         j                  d|       |
dk(  rY|jB                  |d   vrH|d   D ]@  }||jB                   d|jB                   dfv s$d}|j4                   vrtE        d        n |sg }dg|jF                  D ]  }||d   v s|d   |   } |sdg}t/        |      t        jH                  d<   |D ]`  }|dv rd}|d   D ]P  }|jK                  d       d   }||k7  r d!|         d!| d"       4 d#| d$|         d#| d$| d"       R b |d   D ]  } d!| d"        |r|d   s d!| d"        j                  r#D ]  }t         j                  d%| d&          tM        jN                  |      } jQ                  |      sdt        _)        |r t        jU                  |tW        |             d't        v rt        jX                  rxt         j                  d( dt        jX                           j                  rt[        d( t        jX                          j]                  d) t        jX                  fi        j]                         y )*NNO_CACHETr   r   z%DEBUG_CACHE ADD SKIP CACHE LOCKED_BY z#DEBUG_CACHE ADD SKIP too old trans rA   c                     | j                  d      \  }}}|vrt               |<   |r|   j                   d|        y |   j                          y )NrA   )	partitionr   r   )bind_and_fieldsbindr   r   r  r}   s       r%   bind_addzCmfCache.add.<locals>.bind_add)  sl     .77<OD!V8#!$""cU!F8#45  ""cU,r&   c                    t        | t              r| }n| g}g }|D ]k  }t        |j                  t        j                  j
                        rj                  |      }nt        j                  |            }|D ]
  } |        m y)u   
            Собираем списки ключей инвалидации
            :param val:
            :param invalidate_dict:
            :return:
            N)r   r   r   r   r   r   r   r   )r   obj_listr   itemrL  rM  r!   s        r%   bind_add_recursivez(CmfCache.add.<locals>.bind_add_recursive5  s     #t$ 7C  #dggszz'9'9:33D9Ct??EFC #DTN##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 = r~   #DEBUG_CACHE JSHASH: add invalidate r
  )/osenvironru   r   no_jscache_forcerb   JOB_DAEMON_DISABLE_CACHEr[   r  $profiler_redis_invalidated_keys_skipr  cache_is_lockedrN   rc   cache_locked_byget_last_invalidatecache_lockscache_transaction_startr   utilcmfutilget_model_by_namer   r   r   rD   r   skipcache_select_for_updater3   r   r   r   r   r   r   cache_cluster_fieldsprofiler_datar0   rv   ri   r   cache_store_errorinmemory_addr   r~   r  r>  )r!   r}   r   obj_typequery_paramscache_inmemoryliri  	obj_modelrQ  obj_casewhere_pkr   scopesc_fieldscope
model_namebindidstr_objrM  r  s   ``                 @@r%   r   zCmfCache.add	  s   ::>>*%!%A **>dFZFZ !$$$5555A $$X.!%A

&KILeLefnLoKp$qr %%h/"#--"3"3Ha>W>W"X"R'!%A

&I!JcJcIddefjf~f~  @H  gI  fJ  %K  LHH$$66x@	
		#, z#t,dD1I s#H366{a;;;*366(2RSTSpSpRqrsZT*ws1vtT/J Hs#_H CyCDI$643;  H
 Ceff
 L2

$9<H 5 <;Q)Q".x"8 J!(8&<@PPU>V%WW#'!ffXh6%&CD   !)J9+I+IJ IG,/?"@@!-.>!?!HI  (\F48L 01# KE NN &&28&< K
 &0%5%5c%:1%=
#z1$zl%CD$zl'%JK$veWAj\%BC$veWAj\%IJKK #/x"8 DJ zl'BCD <#9xj89 ::" ODJJ*<VHCu(MNO
 ,,s#!!#w/"&A""3S\: q=QXX

&I#aPQPXPXz$Z[zz!DSEJAHHU&&'#!(('EF 	""8,r&   c                    	 dt         vrt               t         _        dt         j                  vrt	        |      t         j                  d<   n$t         j                  dxx   t	        |      z  cc<   t
        j                  rHdt         j                  vrg t         j                  d<   t         j                  d   j                  |       y y # t        $ r
}Y d }~y d }~ww xY w)Nro  rV   cache_invalidate_keys)r   rT   ro  r   r   rP   DEBUG_PROFILE_VERBOSEr   )r!   r`   r   s      r%   r.  zCmfCache.profiler_invalidate  s    	a'"&& Q__425d)AOO./OO./3t9</))&aoo=;= 78OO34;;DA	 *  		s   C	 		CCc                    	 dt         vrt               t         _        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
                  rHdt         j                  vrg t         j                  d<   t         j                  d   j                  |       y y # t        $ r
}Y d }~y d }~ww xY w)Nro  redis_cache_hitr   redis_cache_missr   redis_cache_hit_keysr   rT   ro  r   rP   r  r   r!   r}   r   s      r%   profiler_redis_data_hitz CmfCache.profiler_redis_data_hit  s    	a'"&& AOO312AOO-.OO-.!3.Q__423AOO./))%Q__<:< 67OO23::3?	 *  		   C 	C/*C/c                 
   	 dt         vrt               t         _        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
                  rHdt         j                  vrg t         j                  d<   t         j                  d   j                  |       y y # t        $ r
}Y d }~y d }~ww xY w)Nro  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'"&& Q__423AOO./OO./14/AOO312AOO-.36/0))&aoo=;= 78OO34;;C@	 *  		s   C/ /	D=Dc                     	 dt         vrt               t         _        d| }|t         j                  vrdt         j                  |<   y t         j                  |xx   dz  cc<   y # t        $ r
}Y d }~y d }~ww xY w)Nro  invalidated_keys_skip_r   )r   rT   ro  r   )r!   r   r   r   s       r%   rd  z-CmfCache.profiler_redis_invalidated_keys_skip  si    	a'"&& %TF+AOO#!"AOOAOOA!#  		s   A$ $	A72A7c                    t         j                  j                  d      st        j                  ry |t        j
                  v r| j                  d       y d}|rt        j                  |      }nd}t        | j                  d       |du r5d}| j                  |      }|r t        j                  |      }t        |      }|durdt        v rt        j                  rx| j!                  d	| t        j                  fi       t        | j                  d
| dt        j                          | j                  rt#        d| t        j                         t        | j                  d|        t        | j                  d|       |s*|r(| j%                  |       t        j'                  ||       |S | j)                  |       t        | j                  d|        y )NrG  ru   rH  T.CACHEFr~   r
  z*DEBUG_CACHE JSHASH: add invalidate jshash:rA   r_  zDEBUG_CACHE HIT: zDEBUG_CACHE GET:zDEBUG_CACHE MISS: )r`  ra  ru   r   TECHCOM_HACK3441r  rd  r  inmemory_getrN   rc   r   rv   rw   r   r~   r>  r  r  rq  r  )r!   r}   rt  from_inmemoryr   r   obj_sizes          r%   ru   zCmfCache.get!  s   ::>>*%););!$$$5555A((-CCDJJ(#:!M$$S)Cll3's8c>1}**gcUOahh[+IJDJJ*TUXTYYZ[\[c[cZd(ef::"%H#NPQPXPXY

&7u$=>

$6< ^,,S1&&sC:J%%c*DJJ"4SE :;r&   c                      yNr   rN   rc   r   rW   ru   r!   r|  s     r%   rg  zCmfCache.get_last_invalidateG      r&   c                 b    t        | j                  d       | j                         t        _        y )Nz)DEBUG_CACHE TRANS cache_transaction_start)rN   rc   gen_time_usr   ri  rj   s    r%   ri  z CmfCache.cache_transaction_startL  s"    DJJ KL$($4$4$6!r&   c                     t        t        j                  j                  t        j                  j                        j                  d            S )Nz%Y%m%d%H%M%S%f)r   r   r   r   r   strftimerj   s    r%   r  zCmfCache.gen_time_usP  s6    8$$(():):)>)>?HHIYZ[[r&   c                      y r   )	rN   rc   re  r  rW   r   r   rh  ri  )r!   r|  ls      r%   
cache_lockzCmfCache.cache_lockS      r&   c                      y r   )	r   rh  r   rf  ri  rN   rc   rW   r   )r!   r|  tr_startlock_trs       r%   cache_unlockzCmfCache.cache_unlockd  r  r&   c                      yr  r  r  s     r%   rf  zCmfCache.cache_locked_byt  r  r&   c                      yNF)	rf  r   rh  ru   ri  rN   rc   rW   r   )r!   r|  _cache_locked_byri  s       r%   re  zCmfCache.cache_is_lockedy  s    r&   c                    t        j                          }t        j                  }t        j                  }t        j                  }t               }	||j                  }|D ]r  }
|
|vrt        ||
         ||
<   n||
   j                  ||
          ||
   D ];  }d|v r$|	j                  |j                  d      d          +|	j                  |       = t |j                  |	       |j                  ||j                  d      D 
cg c]  }
|
 c}
||	d       t        j                          }||z
  dkD  rt        j                  d||z
   d       y y c c}
w )	NrA   r   T)
is_changed)r3  r2  r4  inv_listr+  zPROF _do_invalidate got r,  )r1  r   r  r  r  r   r   r%  r   r0   r   r`   rJ   )r!   r   r  r4  r3  stglob_inv_dictglob_inv_listr  r  r   inv_valends                r%   _do_invalidatezCmfCache._do_invalidate  sC   YY[



--5>ffV 		*A%#&x{#3a a ''4#A; *'>LLs!3A!67LL)	*		* 	).1hh$h.G"H1"H 	
 	 iik8c>GG.sRxj<=  #Is   	E
c                    t         j                  dd       sy t        j                         }t         j                  }t         j                  }|D ]"  }| j                  |d   |d   |d   |d          $ t        j                         }| j                  |       t        j                         }||z
  dkD  rxt         j                  d||z
   d       t         j                  d	||z
   d
t        t         j                                t         j                  d||z
   d
t        |              t               t         _	        i t         _        g t         _        y )Nr  r  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   ru   r1  r  r  r:  rE  rJ   r   r  r   )r!   r  r  r  r  st_invalidate_dict_mdelr  s          r%   r  zCmfCache._do_invalidate_deffer  sA   uu'.YY[



% 	~H 4h?S6TV^_gVhjrs{j|}	~ #'))+""=1 iik8c>GG0r
#>?GG?@WZ\@\?]]efijkj|j|f}e~  AGGFsMdGdFeemnqr  oA  nB  C  D U

r&   c                    t         j                  j                  d      ry || dh}|sy | j                  |       t	        | j
                  d| d| dt        |              t               }t               }t               }i }i }t        |      dk  r|D ]  }	| j                  j                  d|	 dd	      }
|
D ]Q  }| j                  j                  |      }|s!|D ],  }|j                  d
      d   }|j                  |       |	||<   . S |j                  |
        nJt        j                  d       t!        | j                  j                  dd	            }
t        j                  dt        |
              t#        j$                  ddj'                  |      z   dz         }t#        j$                  d      }t        j                  d       |
D ]  }|j)                         }|j+                  |      s%| j                  j                  |      }|rC|D ]>  }|j                  d
      d   }|j                  |       |j-                  |      d   ||<   @ |j                  |        |D ]  }| j                  j                  d|j)                                }|j                  |      }	|sC|D ]  }|j                  d
      d   }|j                  |       | j                  j                  d|j)                                }|sWt/        j0                  |      }|d   }||vrt3               ||<   d}|d    d| d|	 d| }|||   |j)                         <     g |d |D        d |D        d |D        }|r8t        j                  d| d| d|         | j                  j4                  |  nt        j                  d| d| d       | j7                  |       y ) NrG  r   z!DEBUG_CACHE start invalidate_ids rA   x   zinvalidate:*r   rl   )matchrn       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   rp   r*  rq   r   c              3   B   K   | ]  }d |j                            ywr   Nrt   rE   	query_keys     r%   rG   z*CmfCache.invalidate_ids.<locals>.<genexpr>"  s!     FiY%%'()F   c              3   B   K   | ]  }d |j                            yw)r"  Nr  r  s     r%   rG   z*CmfCache.invalidate_ids.<locals>.<genexpr>#  s"     TI"9#3#3#5"67Tr  c              3   B   K   | ]  }d |j                            ywr  r  )rE   r~   s     r%   rG   z*CmfCache.invalidate_ids.<locals>.<genexpr>$  s     >6V]]_%&>r  zinvalidate_ids(, ): z): no keys found.)r`  ra  ru   r  rN   rc   r   r   rW   rs   r  r0   r   r%  r   rJ   r   recompilerK   rt   r  findallrv   rw   rT   rx   rz   )r!   r|  idsr4  invalidate_keys
query_keysjshashesr{   obj_id_by_query_keyid_r`   r}   inv_members
inv_memberid_retuuid_rekey_decodedr  query_jshashesr~   r   r   r7  r   	keys_lists                            r%   invalidate_idszCmfCache.invalidate_ids  s	    ::>>*%; \#$C 	
#DJJ"CF81ZLXYZ]^aZbYc de%U
5 & s8s? - }}..|C55JRV.W BC"&--"8"8"=K"*5 BJ)3)9)9$)?)BJ&NN:6>A/
;BB  &&t,-  GG')//T/RSDGGjT,- JJuSXXc]2589Ezz"opHGGo' 
)!jjl{{;/"mm44S9&1 [
%/%5%5d%;A%>
"z2:B:J:J;:WXY:Z+J7[  ##C(
) $ 	FI!]]336HIYIYI[H\4]^N%)))4C, FF#\\$/2FLL( MM--V]]_4E.FGE  "LL/E$%89Hx/-1V* &6N%*7^$4BvhbRGW"XK:EHX&v}}7F		F&

F:F
 UT
 ?X>	
	 GGoj\C5I;GH DMM  ),GGoj\C58IJK		(r&   c                 &    d
 fd	}t         j                  j                  d      ry |sy  j                  |       t	         j
                  d d|        i |D ]/  } |d| d| d        ||d        j                  d |	       1 y )Nc                 t    j                  |       }|r$|| <   t        j                  d d| |         y y )NDEBUG_CACHE INVAL: rA   )rA  rN   rc   )invalrJ   invdr4  r  r!   s      r%   _check_invalz8CmfCache.invalidate_ids_as_wrapper.<locals>._check_inval.  sF     ,,U3D"&DJJ*=fXQugeW(UV r&   rG  DEBUG_CACHE start invalidate rA   r   r   ref=obj.id=)r3  )r   )r`  ra  ru   r  rN   rc   r  )r!   r|  r  r4  r  r  r  s   `  `  @r%   invalidate_ids_as_wrapperz"CmfCache.invalidate_ids_as_wrapper-  s    	W ::>>*% 	
#DJJ"?xq UV 	DC4uAj\2F;i(
 hsC	Dr&   c                     t         j                  dd|d|d|       t        j                         }d6 fd	}ddlm} t
        j                  j                  d      ry  j                  |j                         t         j                  d	 d
|j                          |j                  }i  j                  rdd l}	|	j                          |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                         }
 j%                  |       t        j                         }||z
  dkD  rt         j                  d d||z
   d       y t'               }|j)                  d      D ]  \  }}d}|j                  |v rt+        |t,        j.                  j0                        rt3        |d      r"|j4                  j6                  r|j4                  sˉd v r1|r/|j                   r# |d|j                    d|j                   d       d!v r|j8                  r|j:                  |j<                  k7  rm |d|j                   j<                   d|j                   d"        |d|j                   j:                   d|j                   d#       |j?                  |       5t+        |t,        j.                  j@                        r#d!v r|j8                  r|j?                  |       ||j8                  r7t+        |t,        j.                  jB                        r|j?                  |       |j8                  s|j:                  |j<                  k7  s|j?                  |       |jE                  d$      s|j?                  |d d%        " tG        |      dk(  r+d!k(  r&t         j                  d& d'|j                          y d(g}|jH                  D ]  }|j?                  |        tK        tM        |      d)d       r|jO                  |       d v r ||j                    d       d!k(  r ||j                    d|       d!k(  r.|D ](  }d*g|jH                  D ]  }t3        ||      stQ        tM        ||         t,        j.                  j@                        r'||   D ]  } |d|j                    d| d+| d         htQ        tM        ||         t,        j.                  j0                        r |d||d$z       d| d+| d       tQ        tM        ||         t,        j.                  jR                        r |d||    d| d+| d       t#        d,d-         |d| d+| d       + d.}d*g|jH                  D ]A  }t3        ||      s||   j8                  s ||   j:                  ||   j<                  k7  s@d}C d v s|r\t3        |d      r#|j4                  j6                  r|j4                  s-d*g|jH                  D ]  }t3        ||      stQ        tM        ||         t,        j.                  j@                        rs||   D ]  } |d|j                    d| dd/        ||   j8                  su||   j:                  s||   j:                  D ]  } |d|j                    d| dd0        tQ        tM        ||         t,        j.                  j0                        ra |d||d$z       d| dd       ||   j8                  s||   j:                  s |d||   j:                  j                    d| dd1       EtQ        tM        ||         t,        j.                  jR                        r^ |d||    d| dd       ||   j8                  s||   j:                  s |d||   j:                  j                    d| dd1       t#        d,d-        t3        |d      r"|j4                  j6                  r|j4                  s |d| d       n{tT        jV                  rkd v s|ret3        |d      rY|j4                  j6                  sC|j4                  jY                          |j4                  rt#        d2t         jZ                   d3       t\        j^                  r5t         j`                  j                  d4g       gz   t         j`                  d4<   t        j                         }
 j%                  |       t        j                         }||z
  dkD  rt         j                  d5||z
   d       y y )7NzRUN INVALIDATE: action=z obj=z item=z m2m_field_name=c           	         j                  |       }g }|r-|rt        |      }g }|D ]  }d|vr|j                  |       |j                  d      ^}}}|rCt        j                  d|  d|        t        d|  d| d| d       |j                  |       rt        |j                  d            }	||	z  s|j                  |        || <   n|| <   t        j                  d d| |         i }
||
| <   t        j                  r6t        j                  j                  dg       |
gz   t        j                  d<   y y y )	NrA   z=cmfCache.invalidate(): ValueError: too many values to unpack(r  Tabortr   r  r  )rA  r   r   r0   r   rJ   r   rN   rc   rP   r  ro  ru   )r  rJ   change_fieldsr  invd_affectedir   i_fieldstaili_set_fieldstmpr4  r  r!   s              r%   r  z)CmfCache.invalidate.<locals>._check_invalP  sr    ,,U3DM $'$6M$&M! 4a<)003$-.WWS\*8d  GG&cdicjjmnomp$qr%(efkellopqorrstxsy&z  CG  H)003$'*8>>#+>'?(<7)003!4" '4HUO&*HUODJJ*=fXQugeW(UV!E
11./oo.A.A&.LPSu.TAOOF+ 2; r&   r   )r   rG  r  rA   RelationCachezRelationCache.parent.id=)r   rC  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)createrx   r%  zref_new=zref_old=r   r+   zDEBUG_CACHE ivalidate: z not fields_have_changes--logical_deleterU  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   rJ   r1  collectionsr   r`  ra  ru   r  r   rN   rc   TRACEpdb	set_trace	parent_idr   r   r  r   r   r   r   r   r   r   r  r   r  oldnewr   r   r   r   r   rn  r   r   load_fieldsr   CmfTUUIDrb   RAISE_LAZYLOADload
api_methodrP   r  ro  )r!   r   r4  rP  m2m_field_namer  r  r   rr  r  _check_inval_done_do_invalidate_doner  r   r   no_caching_fieldscluster_load_fieldsrz  cc_field_name
cc_clustercluster_field_is_changedr  s   ` `                  @r%   
invalidatezCmfCache.invalidateM  sL	   	*6)6SF'D7:KN;LMNYY[#	VJ 	,::>>*%'DJJ"?xqHX YZ>> ::>>_,CMM?-GH))4y#..)9:FC!uvCFF8i?OP?3>>*:'BHM6$''!CNN+;7CXN !%		Xv6"&))+"R'#--fXV<ORT<T;U VW W X !$d!; 1	:J
 !V  $55
  %!;!;<$S*5#,,:Q:QVYVbVb11e 4z3>>2B!CFK h'E,<,<eiiAW 4~Qs~~6F!G
S 4~Qs~~6F!G
S!((4%!6!67Fx<PUZUeUe $$Z0Jucjj6O6O$P$$Z0 EII$:$$Z0&&u-!((CR9c1	:h }q Vx%7

&=fXE]$^`c`f`fg
  $f// 	0G&&w/	0 49.5OO/0
 **CFF8Y/XCFF8YmL X+ Q
 '/%J1I1I%J QM"36 !$s='9":CJJ<Q<QR*-m*< eJ(6*--(1ZL)Y[cde#D]);$<cjj>X>XY$vc-2E.F-Gq
RST^S_%`bjk#D]);$<cjj>Q>QR$vc-.@-A8*Aj\%Z\de! #DKOQQ2 xj*FxP;Q> $) &B)A)AB 	0MsM*M*55M*..#m2D2H2HH+/(		0 **.F!#z2s||7N7NSVS_S_ #+!FS-E-E!F MsM2d3}#56

8M8MN&)-&8 _
$vjmm_AhZw%OQ]^_=)44]9K9O9O*-m*<*@*@ gJ(6*--(7)SUefgS%7 8#**:T:TU 6#me.C*D)EQxjPW!XZbc=)44]9K9O9O$vc-.@.D.D.G.G-H(SZ%[]ijS%7 8#**:M:MN 6#m*<)=Qxj!PRZ[=)44]9K9O9O$vc-.@.D.D.G.G-H(SZ%[]ij @GKM%MR C,1H1HS\\xj@A ##--1Ic:&,,))LL||1!,,  @x  y  z))*+//*=*=j*LPXl*ZAOOJ' IIKC62"iik#c)GGo&9B&>%? @S S T *r&   c                     | j                   D ]  \  }}t        d|        | j                  j                         D ]  \  }}t        d|        y )NzDEBUG CmfCache.dumps)rU   r3   rV   r   )r!   r}   r   s      r%   ri   zCmfCache.dumpsb  sQ     	/HC(#.	/--335 	/HC(#.	/r&   c                    |j                  d      d   }t        j                  r|j                  d      d   }	 t        j                  j
                  j                  |      }t        j                  s;|j                  r|j                  t        j                  vrn| j                  |       y|j                  st        dd       y |t        j                   vr| j#                  |       yt        j                   |   }|j%                  |d      }|du r| j#                  |       |S |j'                  |       | j)                  |       |S # t        $ r Y yw xY w)	Nr*   r   r   r   .S   DEV: inmemory_get вызван для модели без флага cache_inmemoryTr  )r0   rP   rc   r   rj  rk  rl  KeyErrorr   in_memory_cachert  r   in_memory_cache_skip_modelsprofiler_inmemory_data_skipr   r   INMEM_CACHEprofiler_inmemory_data_missru   move_to_endprofiler_inmemory_data_hit)clsr}   r|  r   model_cacherets         r%   r  zCmfCache.inmemory_getq  s3    YYs^A&
>>#))#.q1J	HH$$66zBE   
 ##E,<,<@]@],]//4##ktxyS__,++C0ooj1ooc3'#:++C0J ##C(**3/JG  		s   )E 	EEc           	         |dkD  rt        |t        j                  j                        st	        j
                  |      rd| }np|rnt        |t              r^t        |d   t        j                  j                        st	        j
                  |d         rd|d   j                   dt        |       d}t        | j                  d| d        y t        | j                  d|        |j                  d	      d   }t        j                  r|j                  d
      d   }	 t        j                  j                  j                  |      }t"        j$                  s|j&                  sy |j&                  st)        dd       y |j&                  rd}|t*        j,                  vrt/               t*        j,                  |<   t*        j,                  |   }||v r ||   |k7  rt1        d| d| d||           y |||<   t        |      kD  r/|j3                  d      \  }	}
t        | j                  d|	        y y # t         $ r Y y w xY w)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   rN   rc   r0   rP   rj  rk  rl  r
  r   r  rt  r   r   r  r   r3   popitem)r  r}   r   r  detailr|  r   	LRU_LIMITr  evicted_keyr   s              r%   rq  zCmfCache.inmemory_add  s    f#szz3348P8PQT8UcUC.A

(<(<=AYAYZ]^_Z`Aac!f//0#c(1=		%TU]T^^ghngo#pq 	CII!?uEFYYs^A&
>>#))#.q1J	HH$$66zBE   )=)= ##ktxyIS__,*5-COOJ'ooj1+ 33&23%yXkZ]N^M_`aC{i'(00e0<NK		%G}#UV (5  		s   $)H9 9	IIc                    g }|dk(  r"t        | j                  d       i t        _        y |D ]  }|j	                  d      d   }t
        j                  r|j	                  d      d   }	 t        j                  j                  j                  |      }|j                  sr|j                  |       |t        j                  vrt        j                  |   }|D ]  }|j                  |d          |sM|rJt        j                  j                  dt         j#                  |t%        j&                         d      g       y y y # t        $ r Y  w xY w)	Nra   uS   CmfCache:inmemory_del Полный сброс inmemory_cache при REDISDB.flushdbr*   r   r   r   r_   )r`   skip_app_id)rN   rc   r   r  r0   rP   r   rj  rk  rl  r
  rt  r   r.   r   delayed_redis_eventsrh   ri   r`  getpid)r  r`   
from_event
event_keysr}   r|  r   r  s           r%   r-  zCmfCache.inmemory_del  s8   
5=		#xy CO 	+C3*J~~'--c215
((:::F ''c"0//*5K +T*+)	+, j""))+BDJJXbsus|s|s~O  EA  +B  C )z!  s   ()E  	EEr_   )channelc                 ~    | sy | d   fd}t        t        j                  d       t        j                  |       y )Nr`   c                  j    t        t        j                  d        t        j	                   d       y )Nz*CmfCache:on_inmemory_del event with keys: T)r%  )rN   rP   rc   r  r-  )r`   s   r%   handlerz)CmfCache.on_inmemory_del.<locals>.handler  s(    (TVZ[""4D"9r&   z&CmfCache:on_inmemory_del spawn handler)rN   rP   rc   geventspawn)datarM   r*  r`   s      @r%   on_inmemory_delzCmfCache.on_inmemory_del  s6     F|	:
 	HNN&LNWr&   c                    	 dt         vrt               t         _        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
                  rHdt         j                  vrg t         j                  d<   t         j                  d   j                  |       y y # t        $ r
}Y d }~y d }~ww xY w)Nro  inmemory_cache_hitr   inmemory_cache_missr   inmemory_cache_hit_keysr  r  r}   r   s      r%   r  z#CmfCache.profiler_inmemory_data_hit  s    	a'"&&  q645AOO01OO01Q61 756AOO12))(?=? 9:OO56==cB	 *  		r  c                    	 dt         vrt               t         _        dt         j                  vrdt         j                  d<   nt         j                  dxx   dz  cc<   t        j
                  rHdt         j                  vrg t         j                  d<   t         j                  d   j                  |       y y # t        $ r
}Y d }~y d }~ww xY w)Nro  inmemory_cache_skipr   inmemory_cache_skip_keysr  r3  s      r%   r  z$CmfCache.profiler_inmemory_data_skip  s    	a'"&& !756AOO12OO12a72)))@>@ :;OO67>>sC	 *  		s   B7 7	C
C
c                    	 dt         vrt               t         _        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
                  rHdt         j                  vrg t         j                  d<   t         j                  d   j                  |       y y # t        $ r
}Y d }~y d }~ww xY w)Nro  r1  r   r0  r   inmemory_cache_miss_keysr  r3  s      r%   r  z$CmfCache.profiler_inmemory_data_miss)  s    	a'"&& !756AOO12OO12a72q645AOO01)))@>@ :;OO67>>sC	 *  		r  r  returnNr   NNF)r%  )=r1   r/   r=   rU   rV   rW   rX   rc   r  r  PROCESS_EVICTED_FLUSHr    rf   r   r   r   r   r   r   r   r   staticmethodrD   r   r  r  rz   r  r   r:  r>  rA  rE  r   r.  r  r  rd  ru   rg  ri  r  r  r  rf  re  r  r  r  r  r  ri   classmethodr  rq  r-  on_server_eventr.  r  r  r  r;   r&   r%   rP   rP   J   s   IHFE!E!
%T$mQf!F<&$ *c * * * 2 2 2 ; ;;<?Sj	 Q-fB"@&A($$LR
7\*"C G
>>2kZD@STj/ + +\ .W .W` C CB 45 6  C C& D D" D Dr&   rP   c                       e Zd Zd Zy)CustomJSONProviderc                    	 t        |t        j                  t        j                  f      r|j                  }t        |t
        j
                        st        |t
        j                        r/|j                  s|j                         dz   S |j                         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%   rK  zCustomJSONProvider.default@  s    	"# 2 2FNNCDii#x001ZX]]5Szz==?S00}}&C0yy CyH >!  		 #**455s$   BC C %C C 	C*%C*N)r1   r/   r=   rK  r;   r&   r%   rB  rB  ?  s    6r&   rB  )static_folder	root_pathTSEND_FILE_MAX_AGE_DEFAULTF)SocketIO	Namespace)Client
project_idc                     t        |       } t        j                  j                  |       }|s?t        j
                  j                  | g d      }|rd|_        |t        j                  | <   |S )N)0ui_form_scheme
logic_typelogic_prefixcust_field_conf_schemedefault_gantt_task_typez1security_level_scheme.default_task_security_levelzcalendar.timezonetask_code_prefixtask_code_use_logic_type_prefix	executors
spectatorsactivityzactivity.prefixresponsibleauto_alarm_datemain_gantt_projectadd_object_typedefault_agile_story_pointstask_allow_multiple_sprintssl_deadline_shiftsl_only_owner_approvesl_deny_no_approve)sl_allow_executor_change_nofatal_deadlinesl_task_need_approvesl_task_only_owner_closesl_readonly_closed_task.sl_deny_closing_task_before_closing_checklistsz cmf_owner_assistants.cmf_deletedz"cmf_owner_assistants.does_not_workzcmf_owner.cmf_deletedzcmf_owner.does_not_workzcmf_owner.user_localzdefault_list.plan_start_datezdefault_list.plan_end_datezdefault_list.ordernozdefault_list.perm_has_aclzdefault_list.sys_typezdefault_list.logic_prefixzdefault_list.affect_gantt_taskz%default_list_if_empty.plan_start_datez#default_list_if_empty.plan_end_datezdefault_list_if_empty.ordernoz"default_list_if_empty.perm_has_aclzdefault_list_if_empty.sys_typez"default_list_if_empty.logic_prefixz'default_list_if_empty.affect_gantt_taskdefault_attach_full_search_typesdesk_feedbackr   r   T)rD   r   cache_projectsru   r   
CmfProjectreadonly)rS  projects     r%   get_cache_projectrt  q  sg    ZJ  $$Z0G##'': 8?' 8r #G)0:&Nr&   c                  $   t         s\t        d      5 } | j                         }d d d        d}|vrt        d      |j	                  |d      }t
        j                  |      a t         j                  t        t                     S # 1 sw Y   dxY w)Nzdist/cmf-angular/index.htmlz<base href="/">z3Base href tag absent in dist/cmf-angular/index.htmlz<base href="{{ base_href }}" />)r   	base_href)
_index_template_cacheopenread
ValueErrorr   jinja2Templaterenderr   app_base_href)template_filetemplate_strbase_href_substrs      r%   _render_indexr    s     !/0 	0M(--/L	0 -</RSS#++,<>_` & = ''!}'GG	0 	0s   BBc                    |rd| dg}ng d}|D cg c]0  }t         j                  j                  t        j                  |      2 c}D ]  }t        ||       }t         j                  j                  |      s t         j                  j                  ||      }	 t         j                  j                  |      so	 t        j                  j                  |d      c S  t        j                  D ]/  } ||       }|st        j                  j                  |d      c S  t!               S c c}w # t        t        f$ r t        j                  j                         w xY w)Nzcustom/plugins/z/static)zcustom/static/zcommon/static/zcmf/static/zdist/cmf-angular/T)conditional)r`  pathrK   rb   PROJECT_DIRr   isabsisfilerJ  rz  flaskhelpers
BadRequest	send_filer   HOOK_STATIC_NOTFOUNDr  )req_filenamepluginsearch_dirsd	directoryfilenamehooks          r%   send_staticr    s4   (89!
 DOOabggll6#5#5q9O 	C	Y5ww}}X&ww||Ix8H	-77>>(+ , }}&&xT&BB	C (( G%==**8*FFG ? P :& 	---**,,	-s   5D+D00.Ec                       e Zd ZdZddej
                  dee   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y)CmfRedisMemoryWrapperut    Если есть self.redis - используется он
        Если нет - нужен фолбэк
    Nredisredis_instance_namec                 .    || _         i | _        || _        y r   )r  
memstorager  )r!   r  r  s      r%   r    zCmfRedisMemoryWrapper.__init__  s    
#6 r&   c                       fd}|S )Nc                    | j                   r'	  t        | j                   j                        |i |S t        d      # t         j                  $ r6}t        j
                  rt        j                  | j                         |d }~ww xY w)Nu&   Redis memory wrapper запрещен!)
r  r   r1   ConnectionErrorrb   CACHE_REDIS_FAILOWERREDIS_SETTINGS_MANAGERcheck_and_updater  CmfAbortError)r!   r"   r#   r   r4   s       r%   wrapperz/CmfRedisMemoryWrapper.fallback.<locals>.wrapper  sx    zz:74::qzz:DKFKK $$LMM ,, 22.??@X@XYGs   %A   B	1BB	r;   )r4   r  s   ` r%   fallbackzCmfRedisMemoryWrapper.fallback  s    		N 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                 8    | j                   j                  |      S r   r  ru   r!   r}   s     r%   ru   zCmfRedisMemoryWrapper.get      ""3''r&   c                 8    | j                   j                          y r   )r  clearrj   s    r%   rf   zCmfRedisMemoryWrapper.flushdb  s    r&   c                 8    | j                   j                  |      S r   )r  ttlr  s     r%   r  zCmfRedisMemoryWrapper.ttl  r  r&   c                 D    | j                   j                  ||||||      S )N)nxxxgtlt)r  expire)r!   r}   r1  r  r  r  r  s          r%   r  zCmfRedisMemoryWrapper.expire  s$    %%c4B2"%LLr&   c                 f    | j                   j                  |d      }||z  }|| j                   |<   |S r  r  )r!   r}   amountr   s       r%   rZ   zCmfRedisMemoryWrapper.incrby  s4    ##C+$r&   c                 &    | j                  ||      S r   )rZ   )r!   r}   r  s      r%   incrzCmfRedisMemoryWrapper.incr%  s    {{3''r&   c                 @    d}|D ]  }|| j                   v s|dz  } |S )Nr   r   r  )r!   namesr   ns       r%   r   zCmfRedisMemoryWrapper.exists)  s2     	ADOO#Q	 r&   c                 "    || j                   |<   y r   r  )r!   r}   r   s      r%   r   zCmfRedisMemoryWrapper.set1  s    $r&   r;  )FFFF)r   )r1   r/   r=   __doc__r  Redisr   rD   r    r  r  ru   rf   r  r  rZ   r  r   r   r;   r&   r%   r  r    s    7ekk 7xPS} 7
 " " " " ( (     ( ( M M   ( (   % %r&   r  c                       e Zd ZdZdZd Zdee   fdZdedee	j                     fdZddedefd	Zded
e	j                  fdZd Zdeeef   fdZdefdZddefdZy)RedisSettingsManageruR   
    Менеджер по управлению настройками Redis.
    rK  c                 F    t        j                  d      | _        d| _        y )Nzredis-settingsF)rI   	getLoggerlogger_terminatingrj   s    r%   r    zRedisSettingsManager.__init__?  s    ''(89!r&   r:  c                 <   d}t         j                  j                  }t         j                  j                  j                  j
                  }	 |j                  |      j                         }|j                  }|j                          |S # |j                          w xY w)uX   
        Возвращает название инстанса Redis из БД
        N)
r   CmfGlobalSettingsdp_modeldpdata_driverSessionqueryfirstcache_redis_primaryclose)r!   redis_instancer  sessionsettingss        r%   _get_instancez"RedisSettingsManager._get_instanceC  sz    
 ++44**--99AA	}}X.446H%99NMMO MMOs   +B	 	Binstancec                    t        t        d      rvt        j                  |   d   dk(  r\t        j                  |   j                         }|j	                  d       d|v r|j	                  d       t        j                  di |S y y )Ncache_settingsr   r  	celery_dbr;   )r   rb   r  copyr.   r  r  )r!   r  cfgs      r%   _init_redisz RedisSettingsManager._init_redisT  sy    6+,1F1Fx1PQW1X\c1c''1668CGGFOc!$;;%%% 2d,r&   
with_flushc                 f   t         j                  j                  }t         j                  j                  j                  j
                  }	 |j                  |      j                         j                         }|rS| j                  |      }| j                  j                  d       	 | j                  ||       t        j                          ||_        |j#                          |j%                          y # t        $ r | j                  j                  d       Y Nw xY w# |j%                          w xY w)Nu*   Выполняем очистку кешаu>   Не удалось выполнить очистку кеша)r   r  r  r  r  r  r  with_for_updater  r  r  warning
init_cacher  rf   r   r  commitr  )r!   r  r  r  r  r  r  s          r%   
save_to_dbzRedisSettingsManager.save_to_db]  s    ++44**--99AA	}}X.>>@FFHH!%!1!1(!;##$PQjOOHn=%%' ,4H(NNMMO ! jKK''(hij MMOs1   
AD &&C4 D 4$DD DD D0r  c                     t        t        d      rUt        j                  |   d   dk(  r|t        _        y t        j                  |   d   dk(  rdt        _        y t        d      y )Nr  r   r  rX   Tu&   Неизвестный тип кеша)r   rb   r  r  rW   rX   r   )r!   r  r  s      r%   r  zRedisSettingsManager.init_caches  s^    6+,$$X.v6'A%3	"&&x08HD#'	  HII -r&   c                    | j                         \  }}| j                  |      t        _        |t        _        t
        j                  r|s| j                  |       t        j                  j                  d      rt        j                  t        d      t        j                  |       | j                  |t        j                         y )N	run_uwsgiu?   При работе через uwsgi обязателен Redis)get_instancer  REDIS_DBr  r  rb   r  r  r`  ra  ru   r   socketiostart_with_redisr  )r!   is_db_instancer  s      r%   
init_rediszRedisSettingsManager.init_redis|  s    #'#4#4#6 ))(3'/$ &&~OOH%::>>+&~~% abb!!(+(..1r&   c                     t         j                  r*| j                         }|rd}||fS | j                  }d}||fS d}| j                  }||fS )NTF)rb   r  r  DEFAULT_REDIS_INSTANCE)r!   r  r  s      r%   r  z!RedisSettingsManager.get_instance  sj    &&))+H!% x'' !77!& x'' #N22Hx''r&   r  c                    | j                         }||k7  r| j                  sd| _        | j                  j                  d|       t	        j
                  dd      }|dk7  r3| j                  j                  d|       t        j                  |d       | j                  j                  d|       t        j                  t        j                         t        j                         y	y	y	)
u   
        Проверяем, обновилась ли конфигурация Redis в БД
        и если да, то терминейтим app
        Tu<   Получена конфигурация Redis %s из БДr   <   uU   Ожидание %d секунд для применения конфигурацииFr   uv   Остановка процесса приложения для применения конфигурации Redis %sN)r  r  r  r  r   randintr+  sleepinfor`  killr$  signalSIGTERM)r!   r  db_instancesleep_secondss       r%   r  z%RedisSettingsManager.check_and_update  s     ((*--d6G6G $DKK ^`kl"NN1b1M!##${  ~K  L]6 KK  V  Xc  dGGBIIK0 7H-r&   intervalc                 
   | j                   j                  d       | j                         \  }}	 	 | j                  |       t        j                  |d       *# t        $ r | j                   j                  d|       Y ?w xY w)u^   
        Переодический запуск проверки и смены Redis
        u,   Запуск periodic_check_and_update Redisu   Запуск periodic_check_and_update Redis завершился с ошибкой. Повторный запуск через %d секундFr  )r  r  r  r  r   	exceptionr+  r  )r!   r  r   r  s       r%   periodic_check_and_updatez.RedisSettingsManager.periodic_check_and_update  s    
 	GH!%!2!2!4%%&9: LLu-   %%QRZs   A %BBNr<  )r  )r1   r/   r=   r  r  r    r   rD   r  r  r  r  r   r  r  r  r   r  r  r   r  r;   r&   r%   r  r  8  s     '"x} "&C &HU[[,A &3 D ,J3 J J2&(eD#I. (1C 1&.# .r&   r  )Payloadr#  c                   ^    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zy)CmfSocketIOWrapperu   
    Функционал:
    1. Отложенная активация, после получания доступа к Redis
    c                     t         dt        j                  dd| _        d | _        d | _        g | _        g | _        g | _        g | _	        y )Nr   F)appcors_allowed_originsr  engineio_logger)
r   rb   rc   socketio_kwargsr  r  lazy_on_handlerslazy_on_namespace_handlerslazy_init_apps	lazy_runsrj   s    r%   r    zCmfSocketIOWrapper.__init__  sN     $'ll$ 
 " "*,' r&   c                 h   t        d|        | j                  r&| j                  |k(  rt        d       y t        d      | j	                  |       t        di | j                  | _        | j                          | j                          | j                          | j                          || _        y )Nz%CmfSocketIOWrapper: start_with_redis u=   Warning. CmfSocketIOWrapper.start() вызван дваждыu)   CmfSocketIOWrapper уже запущен!r;   )r3   r  r  r   _make_redis_connect_paramsrP  r  _start_lazy_on_handlers!_start_lazy_on_namespace_handlers_start_lazy_init_app_start_lazy_run)r!   r  s     r%   r  z#CmfSocketIOWrapper.start_with_redis  s    5n5EFG==""n4UVGHH''7 84#7#78$$&..0!!#,r&   c                       fd}|S )Nc                 D    j                   j                  | d       y )N)funcdec_args
dec_kwargs)r  r   )r  r  r  r!   s    r%   wrapz#CmfSocketIOWrapper.on.<locals>.wrap  s%    !!(($(* r&   r;   )r!   r  r  r  s   ``` r%   onzCmfSocketIOWrapper.on  s    	 r&   c                     | j                   j                  |       | j                  r*t        d|        | j                  j	                  |       y y )Nz!CmfSocketIOWrapper: on_namespace )r	  r   r  r3   on_namespace)r!   r*  s     r%   r  zCmfSocketIOWrapper.on_namespace  sD    ''..w7==5gY?@MM&&w/ r&   c                     | j                   j                  ||d       | j                  r.t        d| d|         | j                  j                  |i | y y )N)r"   r#   zCmfSocketIOWrapper: run rA   )r  r   r  r3   runr  s      r%   r  zCmfSocketIOWrapper.run  s\    
 	 ==,TF!F8<=DMMt.v. r&   c                 <     | j                   j                  |i | y r   )r  rz   r  s      r%   rz   zCmfSocketIOWrapper.emit  s    D+F+r&   c                     | j                   j                  |       | j                  r*t        d|        | j                  j	                  |       y y )NzCmfSocketIOWrapper: init_app )r
  r   r  r3   init_app)r!   r   s     r%   r  zCmfSocketIOWrapper.init_app
  sD    ""3'==1#78MM""3' r&   c                 b     | j                   j                  j                  j                  |i |S r   )r  servermanagerget_participantsr  s      r%   r#  z#CmfSocketIOWrapper.get_participants  s*    <t}}##++<<dMfMMr&   c                     | j                   D ];  }t        d|          | j                  j                  |d   i |d   |d          = y )Nu8   CmfSocketIOWrapper: регистрируем on handler r  r  r  )r  r3   r  r  )r!   lazy_on_handlers     r%   r  z*CmfSocketIOWrapper._start_lazy_on_handlers  s\    #44 	uOL_L]^_[DMMoj9[_\=Z[\klr\st	ur&   c                 x    | j                   D ]+  }t        d|        | j                  j                  |       - y )NuB   CmfSocketIOWrapper: регистрируем on_namespace handler )r	  r3   r  r  )r!   lazy_on_namespace_handlers     r%   r  z4CmfSocketIOWrapper._start_lazy_on_namespace_handlers  s?    )-)H)H 	B%VWpVqrsMM&&'@A	Br&   c                 x    | j                   D ]+  }t        d|        | j                  j                  |       - y )Nu2   CmfSocketIOWrapper: отложенный init_app )r
  r3   r  r  )r!   r  s     r%   r  z'CmfSocketIOWrapper._start_lazy_init_app  s9    && 	(CFseLMMM""3'	(r&   c                     | j                   D ]2  }t        d|         | j                  j                  |d   i |d    4 y )Nu-   CmfSocketIOWrapper: отложенный run r"   r#   )r  r3   r  r  )r!   lazy_runs     r%   r  z"CmfSocketIOWrapper._start_lazy_run"  sJ     	GHA(LMDMMx/F8H3EF	Gr&   c                    t        t        d      rKt        j                  |   d   dk(  r1t        j                  |   d   }t        j                  |   j                  d      r=dt        j                  |   d    d| }dd	lm}  ||d
d      }|| j                  d<   y d}dt        j                  |   v r|t        j                  |   d   z  }dt        j                  |   v r|dt        j                  |   d    dz  }|t        j                  |   d   z  }|dt        j                  |   j                  dd       z  }|d| z  }|| j                  d<   y t        d       y )Nr  r   r  dbunix_socket_pathzunix://z?db=r   )RedisManagerzflask-socketioF)r'  
write_onlyclient_managerzredis://usernamepasswordr   @hostport6379r-   message_queueu|   ERROR! CmfSocketIOWrapper: в cache_settings не найден коннект к Redis. Socketio не активирован)r   rb   r  ru   r  r.  r  r3   )r!   r  r,  r7   r.  r0  r7  s          r%   r  z-CmfSocketIOWrapper._make_redis_connect_params'  s~   6+,1F1Fx1PQW1X\c1c&&x06B$$X.223EF 5 5h ?@R STTXY[X\]1!-c;KX]!^9G$$%56"*!6!6x!@@!V%:%:8%DZ%PPM!6!6x!@@!q)>)>x)H)T(UUV%WWM!6!6x!@!HH1V%:%:8%D%H%HQW%X$Y!ZZ1RD)8E$$_5  Q  Sr&   N)r1   r/   r=   r  r    r  r  r  r  rz   r  r#  r  r  r  r  r  r;   r&   r%   r  r    sM     -0/,(Nu
B
(
G
Sr&   r  SOCKETIO_WORKER)postforkc                  ,    t         j                          y r   )r  r  r;   r&   r%   r  r  A  s    ))+r&   )r  z/custom/org_namec                    t        j                  d       t        j                   }t	        | t
              rs| j                         }| j                  | j                  d}|rt        j                         |d<   | j                  |d<   t        j                  |      |_        d|_        n>ddd}|r%t        j                         |d<   t!        |       |d<   t#        |      }d|_        t'        |       |S )Nz
App error:)coder@  	tracebackdescriptionapplication/jsonr  zUnknown error)rI   r  rb   
PRODUCTIONr   r   get_responser<  r@  r=  
format_excr>  rh   ri   r-  content_typerD   jsonifystatus_codeset_cors_headers)r   
show_traceresponseresponse_datas       r%   handle_exceptionrJ  S  s    l# &&&J!]#>>#FFFF
 )2)=)=)?M+&'(}}m$

=1 2 #
 )2)=)=)?M+&+.q6M-(=)"XOr&   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_vacationr^  does_not_workauth_inactive_blockis_admin
is_supportservicedesk_allow
first_name	last_nameztwo_factor.two_factor_optztwo_factor.application_verifiedztwo_factor.applicationlic_evaprojectlic_evawikilic_evaservicedesk
lic_evagitlic_evatestlic_evacicd
lic_evarmsc                    t         j                  sy 	 t        j                  s8t        j
                  j                  dt        j                        t        _        t        j                  S # t        $ r t        j                  d        w xY w)Nz.CmfPerson:00000000-0000-0000-0000-000000000001ro  zapp.system_person() error)rb   AUTH_ENABLEDr   system_personr   	CmfPersonru   current_person_fieldsr   rI   r  rj   s    r%   ri  ri    sy    
    & 0 0 4 4CCLeLe !5 !gC 	  56s   AA+ + Bc                     t         j                  j                  d      r t         j                  j	                  d      } n\t         j
                  sy	 t        j                  t         j
                        }|yt        |t              xr |j	                  dd      } | syt        |       }|j                  j                  d      sydt        _        t!        |j"                        j	                  d	dg      d
   }|rt%        |      dk7  ry|j                  j'                  d      d   }|syt)        j*                  d|      x}r|j-                         \  }}ny|dk(  s
|dk(  s|dk(  rt.        j0                  }nP|dk(  s|dk(  s
|dk(  s|dk(  rt.        j2                  }n+|dk(  s|dk(  rt.        j4                  }nt.        j0                  }t7        |t8        j.                  j:                        syd|v r%|j	                  |j<                   d| ddg      }	n|j	                  |ddg      }	|	sy|t?        |	j@                        k(  rdt        _!        |	t        _"        y# t        $ r t        j                  d       Y yw xY w)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_hashro  )r<  r   )#requestr  r   headersru   r-  ujsonrw   r   rI   r  r   rT   r   r   sharelink_access_requestr	   r  r   r0   r  r  groupsr   rt  rx  ry  r   r   	CmfEntityr   rD   r|  sharelink_access_grantedsharelink_access_obj)
ro  json_resr7   
hash_paramobj_keyr  rr  obj_coderv  r   s
             r%   _check_sharelink_accessr    sS    ||x(##I. ||	{{7<<0H 8T*Hx||GR/H
5/C 88y) "&A#))$(("6q9JZA-hhnnS!"%G FPPuP"\\^( 5H-]1J&&		T	X-Y1F(VaJa$$		Y	(e"3NN	 &&	 i!5!56
hmm)"6"6!7q
C$(*:#;  = mm$8H1ImJ S++,,%)"!$
U  	  \  ]	s   #I I?>I?c                     | t         _        | r8| 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&,0@0@&@#06!:T:T0T-r&   c                     t        | dd       }|dk(  r| j                  S t        j                  sy ||S t	        d       t        j                  t        j                         y )Nr  FAIL_recursionz#Warning!!! Lazy Calc Current Personr]   )	r   ri  rb   rh  r3   r=  print_stackrd   stdout)r!   cps     r%   current_personr  	  s\    	($	/B	!!!	~	 

/0szz*r&   c                 @   	 t         j                  st        j                  j	                  dg      }|j                  st
        j                  j                  j                         5  dd l	}dd l
|j                  |j                  z   dj                  fdt        d      D              |_        |j                          d d d        |j                  t         _        t         j                  S # 1 sw Y   .xY w# t         $ r t#        j$                  d        w xY w)Napp_keyr   r   r   c              3   @   K   | ]  }j                          y wr   )choice)rE   r   alphabetsecretss     r%   rG   zapp_key.<locals>.<genexpr>&	  s     .[Aw~~h/G.[s       zapp.app_key() error)r   r  r   r  ru   r   rj  rk  disable_aclstringr  ascii_lettersdigitsrK   rangesaver   rI   r  )r!   r  r  r  r  s      @@r%   r  r  	  s    {{//33I;3GH##XX%%113 $!"%33fmmCH')ww.[QVWYQZ.['[H$MMO$ #**CK
 ;;$ $  /0s%   A%C= )AC1C= 1C:6C= = Dc                    t        | dd       | j                  S 	 t        j                  s9t        j                  j                  ddt        j                        t        _        t        j                  | _        | j                  st        j                  j                  dd      }|j                          	 t        j                  j                  ddt        j                        | _        | j                  sst        j                  j                  j                         5  t        j                  j!                  | j"                        | _        d d d        t%        j&                          |j)                          | j                  S | j                  S # 1 sw Y   ExY w# |j)                          w xY w# 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   rj  ru   rk  r  r  lockacquirer   rj  rk  r  system_datacreate_anonymous_userri  ddcommit_all_dsreleaser   rI   r  r!   
redis_locks     r%   r  r  4	  s   t&-9###"""("2"2"6"6+T00 #7 #2C  #22##!,,-IST,UJ %'-'7'7';';/44 (< (6$ ++))557 i/2/T/TUYUgUg/h,i $$&""$###t###i i
 ""$ 78C   BF5 8A)F  !/FF  ,F5 F5 FF   F22F5 5 Gc                    t        | dd       | j                  S 	 t        j                  s9t        j                  j                  ddt        j                        t        _        t        j                  | _        | j                  st        j                  j                  dd      }|j                          	 t        j                  j                  ddt        j                        | _        | j                  sst        j                  j                  j                         5  t        j                  j!                  | j"                        | _        d d d        t%        j&                          |j)                          | j                  S | j                  S # 1 sw Y   ExY w# |j)                          w xY w# 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   r  r   r   rj  ru   rk  r  r  r  r  r   rj  rk  r  r  create_sharelink_anonymous_userri  r  r  r  r   rI   r  r  s     r%   r  r  T	  s   t0$7C---,,,2,<,<,@,@14,, -A -.C) *-)F)F&--!,,-S]^,_J %171A1A1E1E9444 2F 26. 55))557 09<9h9h ..:060 $$&""$---t---0 0 ""$ ABr  c                 ^   t        | dd       | j                  S 	 t        j                  j	                  ddt
        j                        | _        | j                  st        j                  j                  dd      }|j                          	 t        j                  j	                  ddt
        j                        | _        | j                  sst        j                  j                  j                         5  t        j                  j!                  | j"                        | _        d d d        t%        j&                          |j)                          | j                  S | j                  S # 1 sw Y   ExY w# |j)                          w xY w# 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   r  r   rj  ru   r   rk  r  r  r  r  r   rj  rk  r  r  create_test_guest_userri  r  r  r  r   rI   r  r  s     r%   test_guest_userr  v	  sl    t'.:$$$ & 0 0 4 4($,, !5 !. $$!,,-JTU,VJ %(.(8(8(<(<0$44 )= )6% ,,))557 k030V0VW[WiWi0j-k $$&""$$$$t$$$k k
 ""$ 89sC   A3F A)E7 8/E+'E7 F F +E40E7 7F		F  F,c                 >    t         j                  j                         S r   )r   r  get_settingsrj   s    r%   global_settingsr  	  s    ##0022r&   c                     t        | d      rt        | dd       | j                  S t        j                  j                  ddg      | _        | j                  S )N_global_varaccount_sync_statusaccount_sync_lastr   )r   r   r  r   CmfGlobalVarru   rj   s    r%   
global_varr  	  sU    t]#mT(J(V**..7LNa6b.cDr&   c           	         | j                  t        j                  dd      t        j                  dd      f      } | j                  |d      }t	        d|z         t        |d | d      D ]  \  }}|j                  d   }t        j                  j                  |j                  j                  t        j                        d	d        }t	        d
|||j                  |j                  dz  fz         t        j                  |j                  |j                        j!                         }|rt	        d|z         |j                  j#                         D ]  }	t	        |	         ||d  }
|
r.t%        d |
D              }t	        dt'        |
      |dz  fz         t%        d |D              }t	        d|dz  z         y )NFz<frozen importlib._bootstrap>z	<unknown>T)
cumulativezTop %s linesr   r   z#%s: %s:%s: %.1f KiBi   z    %sc              3   4   K   | ]  }|j                     y wr   sizerE   stats     r%   rG   zdisplay_top.<locals>.<genexpr>	  s     /499/   z%s other: %.1f KiBc              3   4   K   | ]  }|j                     y wr   r  r  s     r%   rG   zdisplay_top.<locals>.<genexpr>	  s     0d		0r  zTotal allocated size: %.1f KiB)filter_tracestracemallocFilter
statisticsr3   	enumerater=  r`  seprK   r  r0   linenor  	linecachegetlinestripformatsumr   )snapshotkey_typelimit	top_statsr,   r  framer  linellotherr  totals                r%   display_topr  	  s   %%5"AB5+.' H ##H#=I	.5
 ! 6E!2A6 
tq!66;;u~~33BFF;BC@A$%,,		D0@AB 	C  >DDF(T/"..'') 	B"I	
 efE///"c%j$+%>>?0i00E	
*edl
;<r&   c                 d   t         j                  j                  j                  dd      5  t        j
                  j                  | j                  t        j                        }|s| j                  d      D ci c]  \  }}|j                  d      s|dk7  r||  }}}t        j                  |d	<   t        j                  |d
<   t        j                  |d<   t	        j
                  di |}|r|d|_        |j                  j!                  t        j"                  j%                                d|_        |j                  j!                  t        j"                  j)                                |r@d|_        |j                  j!                  t        j"                  j                  d             t         j                  j                  j-                         5  |j/                  d       d d d        t1        j2                          |cd d d        S c c}}w # 1 sw Y   .xY w# 1 sw Y   y xY w)Nzcreate-current_person-lock
   r  )loginr   Tr   cmf_r   	cmf_owner
cmf_authorcmf_modified_byServiceDeskClient)r<  )	only_datar;   )r   rj  rk  CmfLockr   rj  ru   r  r   rk  r   r   r   r   r\  rN  r   CmfPersonGroupsupport_grouprR  
user_groupr]  r  r  r  r  )authr\  is_servicedeskr  r   r   person_valuess          r%   create_person_from_authr  	  s   				!	!">	!	K !!%%DJJs?X?X%Y !JJ$J7;Aq||F+T	 1;M ; *+M+&*+--M,'/0}}M+,%%66F$(!##**6+@+@+N+N+PQ$(!##**6+@+@+K+K+MN+/(##**6+@+@+D+DJ]+D+^_!!--/ ,d+, 5 
;", ,- s7   AH&>#H!D9H&H-H&H&H#	H&&H/)forcelevelc                 8   t        j                          }t        t        dd       s| s|r|!t        |t              r4t        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        j                  di       j                  dt                     }|j                  dd      }|j                  dd      }	|j                  d	d      }
t        j                  j                  d
      }t        j                   d|d| d| dd| d|	 d|
 d||	z   |
z    ddg|}t        j"                  |ddj%                  d |D                     t        j                          t        _        t'        t        j                          |z
  dz        }|dkD  rt        j"                  |dd| d       y y y )Nrc   rl   r   ro  select_countselectr   r%  insertmr-   z(+z)mszs zu zi r   r@   rA   c              3   2   K   | ]  }t        |        y wr   rC   )rE   parts     r%   rG   zdebug.<locals>.<genexpr>
  s     *G3t9*GrH   zPROF debug funcion got ms)r1  r   rb   r   rD   rI   INFOrc   roundr   debug_start	debug_nowru   rT   r}  r"   
request_idlogrK   r   )r  r  messagesdebug_str   r   r  scscsscuscir  parts	debug_ends                 r%   rJ   rJ   	  s   yy{Hvw%%%%/LLEMMEiiksQ]]*d2A67sQ[[(D0!45UU?B'++NDFCffXq!ffXq!ffXq!LLS!LLA3b3C53%r#bsS(9;

 
 	E4*G*G!HIiik X-t34	q=KKt'>yk%LM 9 38r&   c                  <   t         j                  j                  d      } t         j                  j	                  d      ra| r_t        t        |       j                        }|j	                  t                d      ry|j	                  d      s|j	                  d      ryyt         j                  j	                  d      ryt         j                  j	                  d	      st         j                  j	                  d      ry
t         j                  j	                  d      s>t         j                  j	                  d      st         j                  j	                  d      ryt         j                  j	                  d      ryt         j                  j	                  d      ryy)Nrn  /files/servicedesksd_api/docs/rp  pub_api/servicedesk/api/api/pub//auth/r  /with-contextsystemdeny)r}  r~  ru   r  r   rD   r   r~  )refererreferer_paths     r%   set_api_scoper  
  s"   oo!!),G||y)g8G,112""mo%6k#BC""8,0G0G	0R  
	 	 	0		 	 	)W\\-D-DY-O		 	 	)W\\-D-DX-NRYR^R^RiRijsRt		 	 	*		 	 	1r&   c                  *   t         j                  dk(  ryt        t        j                   t        j
                   t        j                  f      r<t        j                  5  t        j                  t        j                         ddd       ddlm t                t         j#                          t%        j&                          dt(        _        i t(        _        i t(        _        g t(        _        t2        j4                  j7                  d      dk(  t(        _        ddlm}  dd	lm}  |        t(        _         t(        j@                  t(        _!        d
jE                   |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(        _0        dt(        _1        dt(        _2        dt(        _3        dt(        _4        dt(        _5        dt(        _6        dt(        _7        dt(        _8        ts               t(        _:        dt(        _;        dt(        _<        dt(        _=        t|        j|                  j                  t|        j                  j                        t(        _B        defd	t(        _?        t(        j                  j                         t(        _D        defd	t(        _C        dt(        _E        i t(        _F        i t(        _G        g t(        _H        g t(        _I        g t(        _J        g t(        _K        g t(        _L        g t(        _M        g t(        _N        i t(        _O        g t(        _P        i t(        _Q        dt(        _R        dt(        _S        t               t(        _U        i t(        _V        g t(        _W        dt(        _X        dt(        _Y        dt(        _Z        g t(        _[        i t(        _\        i t(        _]        i t(        _^        t               t(        __        i t(        _`        i t(        _a        g t(        _b        i t(        _c        i t(        _d        g t(        _e        g t(        _f        t        t(        _g        dt(        _h        dt(        _i        dt(        _j        dt(        _k        t               t(        _l        dt(        _m        t        j                  j                          t        j                  j                          t        j                  st        d       yt         j                  j                  d      ryt        j                  st        j
                  sxt(        j                  dt3        j                          d       t        j                  5  t(        j                  dt3        j                          d       t        j                  st(        j                  dt3        j                          d       t        j                  t        j                          t                t                t        j                  r
t                t        j                  r
t                dt        _        t(        j                  dt3        j                          d       n+t(        j                  dt3        j                          d       ddd       t        j                   r/d
jE                  t=        j                  dd            t(        _m        d}d}t         j                  j                  d      s t         j                  j                  d      rGt         j                  j7                  d      }|sEt         j                  j7                  d      }|r#|j                  d      r|t        d      d }nd}|s t         j                  j7                  d       }|rt        j
                  j                  |      }t        j
                  j7                  |dt        j                  !      }t(        j                  d"|dd  d#| d$|        |sFt        j                  d%t         j                  t         j                         t        d&d'd()      S t         j                  d*k(  r1t        j                  j                  t        j                  +      }t         j                  j                  t                d,      rmd-}d.t         j                  v rt         j                  d.   }t        |      }|s(t!        d.|i      }t#        t                d/|       }t%        |       |S d0}	 |        }
|st         j&                  j7                  d1      }t         j&                  j7                  d2      }|r]t        j(                  j+                  |      \  t(        _'        t(        _<        t(        jz                  rCdt(        _=        t-                n,|r*t        j.                  j1                  |      t(        _'        t(        jN                  rut        j2                  xrD t        j.                  j7                  t(        jN                  jP                  j4                  3      }t        j2                  r|sdt(        _'        t(        jN                  rt(        jN                  jP                  j4                  t(        _(        d4d5t(        jN                  jP                  gg}t        j
                  j7                  |t        j                  6      }d7t(        jP                   d8}	|ru|j6                  r&t(        j                  d7|jP                   d9       d}nt9        |d:      r|j:                  rd7|jP                   d;}	t(        j                  |	       d}n|r(t=        |t(        jN                  j>                  <      }nt(        jN                  j>                  r6t=        t(        jN                  t(        jN                  j>                  <      }n8t(        j@                  jB                  rt=        t(        jN                  d=      } |        |
z
  d>kD  r t(        j                  d? |        |
z
          t         j                  j                  d@      xs@ t         j                  j                  dA      xs t         j                  j                  dB      }dC }|r|jP                  j4                  t(        _(        t(        jN                  rJt(        jN                  j>                  t(        _+        t(        jN                  jD                   t(        _)        n"dt(        _+        |jF                   t(        _)        dt(        _,        t        |       n|s |       r_t(        jH                  }tK                t(        jj                  rt(        jL                  }dt(        _*        dt(        _,        t        |       n%dt(        _,        t        t(        jN                         t(        j8                  xsq t         j                  j                  dD      xsO t         j                  dEk(  xs9 t         j                  j                  dF      xs t         j                  dGv xs t         j                  j                  dH      xs t         j                  j                  dI      xs t         j                  j                  dJ      xs t         j                  j                  dK      xsz t         j                  dLk(  xsd t         j                  j                  dM      xsB t         j                  j                  d      xr9 t         j                  j7                  dN      dOk(  xr t         jP                  dPk(  xs t         j                  j                  dQ      xs t         j                  dRk(  xs t         j                  j                  dS      xs t         j                  j                  dT      xr t         jP                  dPk(  xsS t         j                  j                  dU      xr t         jP                  dPk(  xs | xrA t         j                  j                  dV      xr  t        jR                  jU                         xs | xrA t         j                  j                  dW      xr  t        jR                  jU                         xs t         j                  j                  dX      xr t(        jP                  xsX tV        jY                  t         j                        xs1 t         j                  j                  dY      xr t(        jP                  }t(        jZ                  }t(        jN                  } |        }
t        j                  j]                           |        |
z
  d>kD  r t(        j                  dZ |        |
z
          |s |       ryt(        jt                  d[k(  rc|s(t(        jN                  rt_        |	      S t_        |	      S |j`                  s|jF                  st        j2                  sqt_               S t(        jN                  r|st_        |	      S t         j                  d-k(  rE|rC|jF                  s6t        j2                  s%|j`                  rt#        d\      S t#        d]      S |st_        d^      S |jF                  st        j2                  st_        d_      S t(        jX                  rt_               S t(        jX                  stc        t        d`d      r{|ry|jF                  rl |        }
t        jd                  jg                         st#        ti                da      S  |        |
z
  d>kD  r t(        j                  db |        |
z
          t        jj                  sJdt        _         |        }
tm                 |        |
z
  d>kD  r t(        j                  dc |        |
z
          t(        jx                  rX |        }
t(        jx                  jo                         } |        |
z
  d>kD  r t(        j                  dd |        |
z
          |r|S yy# 1 sw Y   xY w# 1 sw Y   [xY w)fuJ  
    Должны вернуть Response or None
    Особенности поведения:
      В случае web запроса:
        - response - view не выполняется, сразу отправляем response
        - None - выполняем view
        - Exception(в т.ч. и abort) - обработчик выводит трейс клиенту
      Системный контекст(shell, celery, socket, other with cmf_context):
        - None, Response - нет разницы
        - Exception - прерывает выполнение.
    OPTIONSNr   r   F
run_pytest1r1  )choicesr   0123456789abcdef   )r   c                 6    t         j                   |       z   S r   )r   _nowoffsetr   s    r%   <lambda>z before_request.<locals>.<lambda>i
  s    )9&)A A r&   c                 6    t         j                   |       z   S r   )r   _dater*  s    r%   r,  z before_request.<locals>.<lambda>k
  s    +;F+C!C 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=>qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM0123456789   r  r  zX-Eva-TokenAuthorizationzBearer token)api_token_hashrR  r   zAuth API Token(z...): hash=z	, person=z6Invalid API token: request.headers=%s, request.args=%szInvalid API token  
text/plainrC  /pub/webhookr   zauth/not_authorizedr-   next_urlauth/signin?uU   Требуется авторизация. Введите логин и пароль.session_tokenaccess_token)r  r  ==filterr   u   Учётная запись uQ    заблокирована. Обратитесь к администраторуu    заблокирована.rZ  uo    заблокирована за неактивность, обратитесь к администратору)r\  )r  g?z-PROF before_request get auth and session got z/pub/pub_apiz/docsz/sharec                      t         j                  j                  d      xs t         j                  j                  d      S )Nrm  /socket.io/)r}  r  r   r;   r&   r%   is_allow_publicz'before_request.<locals>.is_allow_publicV  s2     LL##H- 6||&&}5	7r&   z/health_check/z/metricsz
/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)   Требуется авторизация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   )r}  methodallr   first_request_init_donefirst_request_init_skiprb   r  first_request_init_lockr+  r,  r  r  cmf.util.cmfutilr   check_db_lockr  ri  r  before_requestr   rb  rh  flagsremove_filesr`  ra  ru   testr1  r   r%  r  r  rK   r  save_only_data_hackalertnoter  r  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  r  hack_session_need_commitr   r   r   r   r)  rF  r.  relaxed_bz_python_mode	emit_listsocket_eventsserver_eventsdeferred_audit_listdeffered_history_columnsdeferred_audit_notrans_listdeferred_job_listdeferred_comment_audit_listdeferred_statsdeferred_fullsearch_dirty_listdeferred_notify_messages"deferred_hide_closed_task_notifiesr  jscache_timelifer   r  r  r  TEXCOM_ENABLE_GROWCACHE_HACKr  r  r  acquired_locksacquired_locks_shacquired_lock_timignsrm  fulltext_search_headlinesfulltext_search_debug_labelr#  project_perm_browse_cache%project_perm_timetrackerhistory_cacheshow_bg_progressbarapi_hack_fieldsrJ   
new_acl_idapi_license_required license_disable_user_count_hooksbackbone_synccurrent_save_objects	csp_noncer   CmfDeferredJobinit_contextCmfAccessListrh  r  r  r   r$  r  r  r  app_init_aclapp_init_project_permissionWHATSAPP_MESSENGER_URLspawn_messenger_socketio_clientWHATSAPP_WEB_SOCKETspawn_whatsapp_socketio_clientCSP_ENABLEDsampler~  r   r"   rj  
hash_tokenrk  rI   r  r   
CmfWebhookget_token_personauth_base_hrefr   check_sso_redirectr
   redirectrF  cookies
CmfSession
from_token
cmf_commitCmfAuthfrom_jwtIS_AUTHORIZATORr   rY  r   rZ  r  jwt_is_supportr  servicedesk_allow_auth_guestsjwt_is_match_orgrR  r  r  r  r   remote_addr	CmfPlugincheck_secretSTATIC_URL_REr  ri  setup_contextreject_responser]  r   rF  license_ui_accessr~  prepare_plan_cache_doneprepare_plan_cachetfa_check_two_factor)r1  r%  auth_person	real_auth	api_tokenr5  r:  r   qserr_msgprof_str<  r=  _filteris_force_publicrC  anon_personis_allow_without_authr   r   s                      @r%   rN  rN  $
  sE    ~~"
''''''## 
 (( 	KLL/IIJ	K 2O%%'AAMAGANZZ^^L)S0AF&AKKKAM777#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!%A""8#4#4#8#89AFAAEffkkmAGCAF  %AAKAOAOA!#A$&A!A$&A!A')A$!#A+-A(A AAAJAJ%*A"AA$&A!AA A$'EA!"$A$&A!A"$A.0A+AAAGAL!A)-A& AO UAAK
&&(
%%' 4 ||v&
 &&s/J/J	4RYY[MCD (( 	PGG7		}AFG..8QGH >>)*557
 +-0035--24.2+7		}AFG?		}ANO/	P4 ggfmm,lnpqr
 KI ||w'7<<+B+B9+M
 OO''6	++O<I''	2 )#i./ :I $I ))'2Y#--88CN **..-$sG`G` / bKGGoim_K?OyYdXefg XZaZiZikrkwkwx"3cUU ||~%''88@Y@Y8Z ||."2!33FGH'~~j1Hx(J12BN,-\">?AeGfG++O<**>: & 1 1 < <] KAFAI ))-2*^^,,\:AF66.._6>>3E3EAFFLLL^L^3E3_I %%i66ffll((AG $-/G !**..gcF_F_.`K4QWWI  >O  PG ,,GG:;;L;L:MMijk #'K[*?@[EdEd <[=N=N<O  P  @GGGG$"&K5iAFFLaLab&&5affI^I^_""@@5affTR v#	?@P?QRS ll--n= -<<""7+-<<""8, 
7 ##))666600AL"#&&"9"99AO !AL"-"8"88AO $;'	O-&&!%%44K#;' #1==)
 FF F||&&'78F ||z)F ||&&|4	F
 ||IIF ||&&|4F ||&&'?@F ||&&'ABF ||&&'EFF ||CCF ||&&'9:F ||&&w/ 7GNN4F4Fv4NRX4X 7'';6F  ||&&}5!F$ ||66%F& ||&&~6'F* ||&&y1Xg6I6I[6X+F, ||&&v.U73F3F+3U-F0 #"kw||'>'>w'GkFL\L\LiLiLk1F2 #"kw||'>'>w'GkFL\L\LiLiLk3F6 ||&&{3?7F8 ""7<<09F< ||&&'89EaggA H 	
A	A fG
&&(v#	HRYIYHZ[\  1	
	 vv&w//"7++,,[5K5KTZTjTj"$$ 
w''		[5K5KTZTjTj((l,,f&&JKK##F,B,B NOO	
		    ""wv|T'J{_j_u_ufG$$668=?"3> BCCv#%FtvPWGWFXYZ &&&*#&6Gc!GGCDFWDTCUVW 	yy&II**,6Gc!GGEdfwFVEWXYH  m	K 	KF	P 	Ps    $AT<;D5AU	T<AUU	AUc                     g dg}t         j                  dk(  r|j                  g d       t        j                  j                  |      }|r|j                  |       S y )N)disabledr>  Fr  )servicedesk_supportr>  T)r@  )r   r_  r   r   CmfAuthOpenIdPluginru   login_redirect)r:  r  openids      r%   r  r    sU    ()G{{h:;''++7+;F$$X.. r&   c                    t         j                  dk7  st        j                  dk7  r`t	        j
                  dt         j                  t        j                  t        j                  t        j                  t        j                         t         j                  j                  d      s2t         j                  j                  d      st         j                  dk(  rt        | xs ddd	
      S t        t         j                        }d|i}| rt        | d       | |d<   t        |      }d }|st        |      }|sDt        j                  dk(  rt!        t#                d|       }nt!        t#                d|       }t%        |       |S )Nr  r  zJRequest reject access: path=%s, auth=%s, login=%s, api_scope=%s, person=%srB  r  r9  znot authorizedr6  r7  r8  r:  
auth_errormessager  zservicedesk/auth/signin?r;  )r}  r  r   r_  rI   r  r  r  r  r   r   r   r7   r   r
   r  r  r  rF  )r  skip_ssor:  paramsr  r   s         r%   r  r    s+   ||&!++*AXLL!&&!''1;;8I8I	K LL##M2||&&w/||~-3#3S|TT%h''<( 'F9v"8,A{{h& 011I"NO 01bTBCr&   c                  T    t        j                          t                t                y r   )r  r  emit_eventsemit_server_eventsr;   r&   r%   commit_with_eventr  '  s    Mr&   c           
         | ri t         _        y t         j                  d      sy t         j                  j                         D ]  \  }}d|v rd|d   v r|d   j	                  d       |d   rkt
        j                  j                  j                  |d         }|r=|j                         D ]*  }|d   j                  |j                  j                         , t        d|d    |d|j                  dd	      
        i t         _        y )Nrb  relation_persons__DEFERRED_all_relation_personsr   is_changed-r   r-   r  private)	namespacer  )r   rb  ru   r   rC  r   rj  rk  get_obj_by_idall_relation_personsr   r   r   r  )
only_cleanr   r   r   ps        r%   emit_list_applyr  /  s    55++##% 	o3$)JcRdNe)e"#**+LM4yhh&&44SY? 557 C./66qttzzBCS%6$78#SVSZSZ[aclSmn	o AKr&   c                 (   | j                         D ]  \  }}|D ]  }|d   }|d= t        |d         }|d= |d   j                         }	 t        j	                  |       t        j	                  |       t        j	                  |       t        |t              s! |j                  |g|d   i |d	|d	   i |d
   r1|d
   dk(  s)|d
   |d
<    |j                  |g|d   i |d	|d	   i |j                  d      rT|d   rOd|d   d   v r|j                  |d   d   d          d|d   d   v r!|d   d   d   D ]  }|j                  |        |D ]  }	t        |	t        j                  j                        r.t        d|	 d| d| d|        |	j                  j                   }
nt#        |	      }
|
|d
<    |j                  |g|d   i |d	|d	   i    y # t
        $ r"}t        d| d| d| d|        Y d }~d }~ww xY w)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   r  uY   DEV: INFO Кривой евент, в event_person попал объект, а не str: rA   )r   r   r  rh   ri   r   r3   r   rP  rz   r   r   r   r   r  r   r   rD   )
event_dictmsgevent_param_listevent_paramr  r	  emit_kwargsr   user_idevent_personevent_persons_strs              r%   emit_events_dictr  B  s   !+!1!1!3 ,q+ +	qK'8MO,O <=MO,%h/446K

3

;'

;'
 mX6"""3pV)<ppWbcnWop 6";v+>)+K&1&&9F#"""3pV)<ppWbcnWop~~l+v&-V1DQ1GG%))+f*=a*@AW*XY)[-@-CC'26':1'=>P'Q 7G)--g67 !. 
q lCJJ,@,@Au  wC  vD  DE  FI  EJ  JK  LW  KX  XY  Ze  Yf  g  h(4(=(=%(+L(9%&7F#"""3pV)<ppWbcnWop
qC+	q,q  hijhkk{  }J  |K  K[  \i  [j  jx  yD  xE  F  Gs   ?G&&	H/HHc                      t        d       y )Nr   delay)emit_events_with_delayr;   r&   r%   r  r  r  s
    #r&   c                 (   | ri t         _        y dd l}t         j                  d      sy i }|j                  t         j                        D ];  }|j	                  d      st         j                  |   ||<   t         j                  |= = t        |       y )Nr   rc  project_notify)r   rc  r  ru   r   r  )r  r  rc  r  s       r%   emit_project_eventsr  v  sx    55!Myy) %>>*+!"!5M#$% ]#r&   c                      t        |       |ri t        _        yt        j                  d      xs i i t        _        r r fd}t	        j
                  |       yrt               yy)u   Запускаемся в контексте, но отправляем в отдельном таске вне контекста, после паузы, чтобы не держать запрос.r  Nrc  c                  F    t        j                          t               y r   )r+  r  r  )r  rc  s   r%   emitterz'emit_events_with_delay.<locals>.emitter  s    LL]+r&   )r  r   rc  ru   r+  r,  r  )r  r  r  rc  s   `  @r%   r  r    sZ    z*EE/*0bMAO	, 	W	' 
r&   c                    | rg t         _        y t         j                  d      xs g }g t         _        |D ]S  \  }}t         j                  d| d|        t        j
                  j                  |t        j                  |             U y )Nrd  zemit_server_events: r  )	r   rd  ru   rJ   r  r  rg   rh   ri   )r  rd  r'  r-  s       r%   r  r    ss    EE/*0bMAO& :	&wir$89w

4(89:r&   c                  B    t        j                          i t        _        y r   )r  rollback_all_dsr   rc  r;   r&   r%   rollback_purge_eventr    s    AOr&   c                     | rg t         _        y t         j                  dg       D ]7  }t        j                  j                  |      s#t        j                  |       9 g t         _        y )NrP  )r   rP  ru   r`  r  r   rC  )r  r  s     r%   apply_deferred_remove_filesr    sN    EE."-  77>>(#IIh  ANr&   c                     t         j                  r/t        j                  j	                  t         j                  |        yy)u   Сессия может быть продлена через SSO, надо продлить куку

    Args:
        r (response): ответ браузеру в котором обновляем куки
    N)r   r  r   r  set_session_tokenr   s    r%   update_cookiesr    s(     	yy((A6 r&   c                 J   t         j                  rt        j                  j	                  d      st        j                  j	                  d      r3dt
        j                   dt
        j                   d| j                  d<   y dt
        j                   d| j                  d<   y y )Nz/servicedesk/auth/r  z-default-src 'self'; script-src 'self' 'nonce-z'; style-src 'self' 'nonce-z?'; base-uri 'self'; form-action 'self'; frame-ancestors 'self';zContent-Security-Policyz}'; style-src 'self' 'unsafe-inline'; base-uri 'self'; form-action 'self'; frame-ancestors 'self'; img-src 'self' data: blob:;)rb   r  r}  r  r   r   r~  r~  )rH  s    r%   set_csp_headersr    s    <<""#78GLL<S<ST\<]--.[[M :,,-KK= 9+, 67--.[[M :/0 67 r&   c                 L   t         j                  }t        j                  j	                  d      }t         j
                  r5|r3|j                  d      r|t        d      d  }|t         j
                  v r|}d| | j                  d<   d| j                  d<   d| j                  d<   y )NOriginhttps://zAccess-Control-Allow-Origintruez Access-Control-Allow-CredentialszContent-Type, x-ijtzAccess-Control-Allow-Headers)rb   APP_FQDNr}  r~  ru   CORS_ALLOWED_DOMAINSr   r   )rH  origin_domainrequest_origins      r%   rF  rF    s    OOM__((2N""~$$Z0+C
O,<=NV888*M8@6PH23;AH787LH34r&   c                     t        dd       t        |        t        |        t        |        d| j                  d<   | S )uk   
    Запускается только если небыло ошибок
    :param r:
    :return:
    Tr   )after_hooksevent_delaybyteszAccept-ranges)r  r  r  rF  r~  r  s    r%   acaor    s9     4Q/1AQ!(AIIoHr&   c                  P   ddl m}  t        j                  sy t        j                  t
        _        t        j                  j                  j                         5  t        j                  j                  j                  j                          d d d         |         y # 1 sw Y   xY w)Nr   spawn_server_event_listener)cmf.cmf_server_event_listenerr  rb   rh  DISABLE_PERMISSIONSr   disable_permissionsr   rj  rk  r  includer   r  load_acl_datar  s    r%   r  r    sn    I$88C				%	%	' 9((6689  !9 9s   3BB%c                  ,   t        t        j                  j                  d      sy t        j                  j
                  j                         5  t        j                  j                  j                  j                          d d d        y # 1 sw Y   y xY w)NCmfProjectPermScheme)	r   r   r  r   rj  rk  r  r  load_project_permission_datar;   r&   r%   r  r    se    3;;%%'=>				%	%	' O//LLNO O Os   3B

Bc                     t        t        d      dk7  ry t        j                  j                  j                         5  t        j                  j                         } t        j                  j                  | d         }|j                          d d d        t        j                  j                  dg      }|r |j                          |j                          g ddg dg d	gfD ]+  }|g d
g}t        j                  j                  |g d       - t        j                  j                  dg      }|r |j                          |j                          t        j                   j                  dg      }|r |j                          |j                          t        j"                  j                  dg      }|r!|j                          |j                          y y # 1 sw Y   SxY w)Nr  z/opt/eva-appr   )r   r  )order_by)cache_action=r  OR)r  r  r  )	cmf_modelr  CmfTask)json_filterjson_entry_pointjson_action	func_name	json_datar?  )r   rb   r   rj  rk  r  r   r	  create_dummy_taskru   delete_dummy_tasksave_prepare_load_perm_fields
CmfTriggerr   ry  
CmfComment	CmfNotify)dummy_task_data
dummy_taskr   _fr  cr  s          r%   r  r    s   v}%7 
			%	%	' ' ..::<^^''?4+@'A
$$&' 	TF+A		 -t5RTs.tu /0b1}~ 	TF+A		v.A		tf-A		 	7' 's   AG  G*c                     t        |        y )Nr  )cmf_rollbackr  s    r%   teardown_requestr  5  s
    9%r&   c           
         |rt         j                  sy|"|rt        j                  nt        j                  }t
        j                  d| d|d|d||       ||t         j                   k(  ry|rFdj                  t        j                               }t
        j                  d|        t        |       | t
        j                  vr t
        j                  j                  |        yy)	   
    Глобальная функция для оповещения фронта о предупреждениях
    :param msg:
    :return:
    Nzcmf_alert: msg=z abort= debug_only= devel_only=r  r   zcmf_alert Stack:
)rb   rc   rI   WARNINGr  r   rJ   r@  rK   r=  format_stackr  rS  r   )r  r  r   
devel_onlyr  	stack_strs         r%   r   r   <  s     &,,}#(gllGG#x*m
}EUGS*V5F5F1F"GIIi4467		$YK01C  
!''	s r&   c                     |rt         j                  sy|t        j                  }t        j                  d| d|d||       ||t         j                   k(  ry| t        j                  vr t        j                  j                  |        yy)r  Nzcmf_note: msg=r   r!  r"  )	rb   rc   rI   r  r   rJ   r@  rT  r   )r  r   r%  r  s       r%   cmf_noter(  V  s{     &,,}GGom
}Mj];5GI*V5F5F1F"G
!&&	c r&   r-   r  )r  r  r  r	  c                   |st         }	 dt        vrt               t        _        t        |      dk(  r=dt        j                  xr$ t        j                  j                  j                  xs d ig}t        |d         t        k(  rgdt        v rt        j                  |d   d<   nd|d   d<   t        j                  xr$ t        j                  j                  j                  xs d |d   d<   t        ||||      }t        j                  |       ||d<   d	}	d
D ]  }
| j                  |
      sd}	 n |	rt        dt                       |s)t        j                  g}|	st!        dt                       g }|D ]f  }t#        |t$        j&                  j(                        r&|j+                  |j                  j                         M|j+                  t-        |             h ||d<   t        j                  |d          t        j                  j/                  | g       }||vr|j+                  |       y y # t        $ r
}Y d }~y d }~ww xY w)Nrc  r   rp   rZ  r   r  )r"   r#   r  r  r  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	  )r  r   rT   rc  r   r   r  r   r   r   rZ  rh   ri   r   r3   localsr   r   r   r   r  r   rD   
setdefault)r  r  r  r  r	  r"   r#   r   event_paramsmuted
muted_debtr  r  
event_lists                 r%   r  r  k  s2     !#"fAO 4yA~$a&6&6&T1;K;K;N;N;T;T&\X\]^DG}q ()(8(8DG$%(*DG$%*+*:*:*Xq?O?O?R?R?X?X*`\`Q&'T&IDQLJJ|$1L!Ep 
>>*%E	
 STZT\S]^_))*  ~  E  G  ~H  I  J % 8lCJJ$8$89$$\__%:%:;$$S%67	8 %6L! 	JJ|O,-++C4J:%,' &_  s   H7 7	I
I
c                    |rdj                  |      nd}|rdnd}	|rdnd}
dj                  |	|| |
      g}|rddlm}  |       }t        j                  |dt        j                  t        j                  	      }|r|j                         \  }}|r |j                         }|j                         }|j                  }|rR|rPt        j                  d
|       t        j                  d|       t        j                  d|       t        d|       |g}|r#|j                  |       |j                  |       n|j                  |xs |       |r|j                          z
         |S y)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  re   u6   Произошла ошибка при вызове %sz
STDOUT: %sz
STDERR: %su4   Произошла ошибка при вызове r;  )r  r1  
subprocessPopenPIPEcommunicatert   
returncoderI   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_commandrJ    sM    9@$++G4SKH#E+I>EE	 	C Fs$&0oo&0oo7G &&(S**,C**,C$$xMMRTWXMM,,MM,,!UVYUZ[\\iJJsOJJsOJJszc"JJtvk)*
r&   c                 (   t        j                  t        j                        }t	        j                         }|j                  | j                                |j                  |      }t        j                  |      j                         }|  d| }|S )ua   
    Подписываем токен сертификатом
    :param jwt:
    :return:
    r*   )r   r  r   rsa_private_keyr   r%  r   signbase64	b64encodert   )jwtsignerdigestrM  r   s        r%   rsa_sign_pack_jwtrS    sp     ^^C//0FZZ\F
MM#**,;;vDD!((*DE4&/CJr&   c                 *   ddd}t        j                  t        j                  |      j	                               j                         }t        j                  t        j                  |       j	                               j                         } | d|  S )uD   
    Создаем токен
    :param payload:
    :return:
    RS256JWT)algtypr*   )rN  rO  rh   ri   r   rt   )payloadheaders     r%   
create_jwtr[    su     U+Fdjj0779:AACFtzz'299;<CCEGXQwi  r&   c                  "    t         j                  S )u2   
    Текущая версия
    :return:
    )rb   CMF_VERSIONr;   r&   r%   cmf_get_versionr^    s    
 r&   c                 h    | t         j                  vr t         j                  j                  |        yy)ux   
    Удаления файлов после коммита транзакции
    :param filename:
    :return:
    N)r   rP  r   )r  s    r%   cmf_remove_filer`    s'     q~~%	h' &r&   c                     t         j                  sy t         j                  j                  d      ry dt         j                  j                   dt         j
                   } t        j                  j                  j                  |       }|rSt        j                  j                  j                  |        t        |j                         j                  dd             y y )Nfield_options_list
DEFERRORS_r   r   z<br>)r   r  r   r   r   rZ  r   r  r  ru   rx   r   rt   r   )	redis_keyr8  s     r%   _deferred_errors_checkre    s    <<||12Q^^../q1A1A0BCILL""9-E!!),%,,.((v67 r&   c                    t         j                  j                  d       dt        j                   d}|t        j                         z  }dt        j                  j                   dt        j                   }t         j                  j                  j                  |      }|r|j                         dz   |z   }n|}t         j                  j                  j                  ||       y )Nr   uL   Ошибка в after_request, после выполнения метода z

rc  r   z


)r   r  r  r   r  r=  rB  r   r   rZ  r  r  ru   rt   r   )r   r  rd  r8  s       r%   _deferred_errors_saverg    s    JJ%XYZYeYeXffj
kC9!!CQ^^../q1A1A0BCILL""9-E)C/LL9e,r&   c                    t        j                  |        ddlm} |j                  j                  d       t        |j                  d      r|j                  j                  d       t        t        d      r@t        j                  r0t               5  |j                  j                  d       d d d        n|j                  j                  d       |j                  j                  d       t        |d	      r|j                   j#                  d       |j$                  j'                  d       t)        d       t+        d       t-        d       t/        d       t1        d       g t        _        y # 1 sw Y   xY w)
Nr  r   r   Tr  (apply_deferred_hide_closed_task_notifies)rollbackrg  CmfStat)r  r  cmf.includer   r  apply_deferred_notify_messagesr   r	  rj  r   rg  cmf_contextCmfAuditapply_deferred_auditCmfFullSearchapply_deferred_dirtyrl  apply_deferred_statsr  !apply_deferred_comment_audit_listapply_deferred_jobsr  r  r  r  rf  )r  r   s     r%   r  r  &  s0   y)" 33t3Dv~~HI???Nq./A4Q4Q] 	@OO00$0?	@ 	@ 	,,d,;
--->vy!++t+<
7747H4(4(d+$'40!#A	@ 	@s   E??Fc                 <   t        j                          | rt        j                         }ddlm} t
        j                          i }t        j                  |d<   g t        _        t        j                  |d<   i t        _	        t        j                  |d<   g t        _
        t        j                  |d<   g t        _        t        j                  |d<   i t        _        t        j                  |d<   g t        _        t        j                  |d	<   g t        _        t        j                  |d
<   g t        _        t        j                   |d<   i t        _        t        j"                  |d<   i t        _        t        j$                  |d<   g t        _        t        j&                  |d<   g t        _        t        j(                  |d<   g t        _        t+        |j-                               }|rat/        j0                  t2        t        j4                  j6                  t        j8                  t        j:                  t        j<                  |fi | t        j                          t        j                         |z
  dkD  r$t?        dt        j                         |z
          y y y )Nr   ri  rl  rm  re  rg  rk  rh  rj  ri  rc  rb  rd  rP  rf  {Gz?z PROF cmf_commit after_hooks got ) r  r  r1  rm  r   r  r  r   rl  rm  re  rg  rk  rh  rj  ri  rc  rb  rd  rP  rf  anyr   r+  r,  cmf_commit_after_requestr   r   rZ  r  r_  r3   )r  r  r  r   after_request_params
need_spawns         r%   r  r  @  s   ))+&'')  ";<;U;U78%'"EFEiEiAB/1,676K6K23 ">?>[>[:;(*%ABAaAa=>+-(454G4G01 121A1A-.>?>[>[:;(*%01_-,-KK[)01_-/0~~^,;<;U;U78%'"-4467
 LL11>>3D3DaFVFVXYXdXdfgfqfq%?)=? 	99; 4'4TYY[75J4KLM (Y r&   c                    t        d       t        j                         }t               5  	 t        t        j
                  j                  | t        j                  j                  j                               |t        _        |t        _        |t        _        |t        _        |t        _        |t        _        |t        _        |	t        _        |
t        _        |t        _        |t        _        |t        _        |t        _        |t        _        |t        _        |t        _        t        j8                  j;                          t=        t        j>                  d      rt        j>                  jA                          t        jB                  jE                          t        jF                  jI                          t        jJ                  jM                          tO                t=        t        d      rt        jP                  jS                          t        jT                  jW                          tY                t[        |       t]                t_                ta        jb                          t        j                         |z
  dkD  r-t        je                  dt        j                         |z
          d d d        y # tf        $ r}ti        |       |d }~ww xY w# 1 sw Y   y xY w)NzRun cmf_commit_after_requestr   rj  rl  r  rx  z"PROF cmf_commit_after_request got )5r3   r1  ro  r  r   rj  ru   r   r  r   rk  r   rZ  r  r_  rl  rm  re  rg  rk  rh  rj  ri  rc  rb  rd  rP  rf  r  rn  r   r	  rj  rp  rq  rr  rs  CmfOrmColumnHistoryapply_deffered_history_columnsrv  rl  rt  r  ru  r  r  r  r  r  r  rJ   r   rg  )current_user_idrZ  r  r_  r  rl  rm  re  rg  rk  rh  rj  ri  rc  rb  rd  rP  rf  after_request_prof_str   s                       r%   rz  rz  r  s    

() IIK 
 +*	v//33OCGGKKLmLm3no-A%AL#AK)AA&3UA0$7A!,GA)/MA,"3A-A,GA)+AO#AK+AO)AN)AA&;;=v~~&PQGGIOO002  557&&EEG!vy)335??A!"5 ')yy{22T9<TYY[K`=`<abcO+ +R  	!!$G	S+ +s)   KJJ<<	KKKKK#r+  c                     ddl m} | xs d} t        |      }|j                  dddd      }| j	                         r$| j                  d      j                         r| dz  } | ||       z   }t        |      S )Nr   r   r   hourminuter   r   +-r  )rL  r   _ensure_localr   r  lstripisdigit_to_utcr+  r   r   
base_localstart_locals        r%   start_of_dayr    sr    1\rFt$J$$!AaQ$OK||~&---557# 0 88K;r&   c                     ddl m} | xs d} t        |      }| j                         r$| j	                  d      j                         r| dz  } | ||       z   }|j                  dddd      }t        |      S )	Nr   r   r   r  r     ;   r  rL  r   r  r  r  r  r   r  )r+  r   r   r  	end_locals        r%   
end_of_dayr    sr    1\rFt$J||~&---557#.v66J""2aQ"OI9r&   c                 8   ddl m} | xs d} t        |      }| j                         r$| j	                  d      j                         r| dz  } |j                         dz   dz  }|t        |      z
  }|j                  dddd	      }| ||       z   }t        |      S )
Nr   r   r   r  wr   r   r   r  )
rL  r   r  r  r  r  weekdayr   r   r  )r+  r   r   r  days_since_sundayr  s         r%   start_of_weekr    s    1\rFt$J||~&---557##++-1Q6y.?@@K%%1Qqa%PK 0 88K;r&   c                 r   | xs d} t        |      }| j                         r$| j                  d      j                         r| dz  } |j	                         dz   dz  }|t        |      z
  j                  dddd      }|t        d	      z   j                  d
ddd      }|t        |       z   }t        |      S )Nr   r  r  r   r   r   r   r  r'  r  r  )	r  r  r  r  r  r   r   r   r  )r+  r   r  r  week_start_localweek_end_locals         r%   end_of_weekr    s    \rFt$J||~&---557##++-1Q6"Y4E%FFOOq P  ')::CC1! D N $&6v&>>N>""r&   c                     ddl m} t        |      }| j                         r$| j	                  d      j                         r| dz  } |j                  ddddd      }| ||       z   }t        |      S )Nr   r   r  Mr   dayr  r  r   r   r  r  s        r%   start_of_monthr    sl    1t$J||~&---557###!AST#UJ/77K;r&   c                 @   t        |      }| j                         r$| j                  d      j                         r| dz  } |j	                  ddddd      t        |       z   }|t        d      z   }|t        d      z
  }|j	                  dd	dd
      }t        |      S )Nr  r  r   r   r  )monthsr   r  r  r  )	r  r  r  r  r   r   r   r   r  )r+  r   r  start_month_localnext_month_locallast_day_localr  s          r%   end_of_monthr    s    t$J||~&---557##++!A[\+]+F34(=+BB%	q(99N&&Br!QR&SI9r&   c                     ddl m} | j                         r$| j                  d      j	                         r| dz  } t        |      }|j                  dddddd      }| ||       z   }t        |      S )Nr   r   r  yr   monthr  r  r  r   r   )rL  r   r  r  r  r  r   r  r  s        r%   start_of_yearr    sn    1||~&---557#t$J##!1Q\]#^J/77K;r&   c                 
   t        |      }| j                         r$| j                  d      j                         r| dz  } |j	                  dddddd      t        |       z   }|j	                  dddd	dd      }t        |      S )
Nr  r  r   r   r        r  r  )r  r  r  r  r   r   r  )r+  r   r  start_year_localend_year_locals        r%   end_of_yearr    s    t$J||~&---557#"**!TUcd*e*623%--BBRPR[\jk-lN>""r&   r   r:  c                     t         j                   j                         j                         }|j                  }| |S | j                  | j	                  |      S | j                  |      S )uP  Возвращает datetime в локальной зоне сервера (aware).

    - Если base=None, берём текущее локальное время.
    - Если base naive, присваиваем локальную зону.
    - Если base aware, конвертируем в локальную зону.
    rG  )r   r   r   rG  r   )r   	local_nowlocal_tzs      r%   r  r    sa     !!%%'224IH|{{||8|,,??8$$r&   dtc                     | j                   F| j                  t        j                  j                         j	                         j                         } | j	                  t        j
                  j                        S )un   Переводит aware datetime в UTC (aware). Для naive сначала делает локальным.r  )rG  r   r   r   r   r   r   )r  s    r%   r  r     sU    	yyZZx00446AACJJZK==**..//r&   c                   "    e Zd ZdddZd Zd Zy)ro  Nc                 T    t         j                  d      | _        || _        || _        y )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	                          | j
                  rt                t        j                          | j                  rt        j                          y y )Nr   )has_app_contextu;   Контекст нельзя включать дважды)r  r  r   r  	__enter__r  start_viewsr  init_dsr  r   )r!   r  s     r%   r  zcmf_context.__enter__,  sX    )YZZ!!MJJL""""$ #r&   c                     	 |rt        |       nt        d       | j                  j                  |||       y # | j                  j                  |||       w xY w)Nr  T)r  )r  r  r  __exit__)r!   excr   r=  s       r%   r  zcmf_context.__exit__7  sG    	5s+t,HHc5)4DHHc5)4s	   ; A)FTr9  )r1   r/   r=   r    r  r  r;   r&   r%   ro  ro  &  s    5
	%5r&   ro  c            
      8   g d} t        j                  | D cg c],  }t        j                  t        j
                   d| d      . c} }|D ]  \  }}}|j                  t        j
                  d      }|j                  d      s9|D ]  }|j                  d      s|j                  d      s&|j                  d	      r8d
j                  d |j                  d      D              }t        j                  |d
z   |j                  d
      d   z   d          t        j                  ddt               t        j                  ddt               t        j                  ddt               t        j                  ddt               t!                y c c}w )N)z	cmf/viewszcmf/modulescommonmoduleszcustom/commonzcustom/modulesr-   T)followlinksr   z/viewsz.pyz.pycz__init__.pyr*   c              3   &   K   | ]	  }|s|  y wr   r;   )rE   r   s     r%   rG   zstart_views.<locals>.<genexpr>K  s     *NA1*Ns   r   )packagerE  )r)   	view_funcz/<path:req_filename>distz/static/<path:req_filename>staticz,/plugins/<plugin>/static/<path:req_filename>plugins_static)	itertoolschainr`  walkrb   r  r   r   r   rK   r0   	importlibimport_moduler   r2   r  app_before_run)r  
search_dirsearch_iterdirnamedirnames	filenamesr  r5   s           r%   r  r  A  sw   fK//%$' 	6%%&a
|4$G$' (K )4 f$9//&"4"4b9H%% f%%e,0A0A&0IS[SfSfgtSu"%((*NgmmC6H*N"NK++K#,=s@STU@V,V`d+eff S6[A+fT%K   CN^juv/$'s   1Fc                       y r   r;   r;   r&   r%   r  r  ]  s    r&   c                 <   |j                  dd       ||d<   ||d<   t        t        j                  j                        |d<   t        j
                  |d<   t        j                  |d<   t        j                  |d<   t        j                  j                  | |g       y )	N	countdownr   r"   r#   g_current_user_idg_acl_admin_modeg_component_idg_session_tab_id)
r,  rD   r   r   r   acl_admin_moder[  rZ  rh  r   )jobr"   r#   r8   s       r%   schedule_deferred_jobr  a  s     {A&GFOGH#&q~~'8'8#9G "#"2"2G !G"#"2"2GW~.r&   c                    | rg t         _        y t         j                  sy t         j                  dt        t         j                         d       t         j                  D ]  \  }} |j                  di |  g t         _        y )Nz	Schedule z deferred job(s)r;   )r   rh  rJ   r   apply_async)r  r  r8   s      r%   rv  rv  o  sp     GGiA//011ABC++ #W"'"#Ar&   c                  \    d } t         j                  rt        j                  | dg       y y )Nc                     i }t         j                  j                  dd       rdt        j                  i}t
        j                  t        j                  | |       y )NSOCKETIOr  
namespacesr~  )r`  ra  ru   rb   ORG_NAMEwhatsapp_sioconnectr  r  s     r%   messenger_connectz:spawn_messenger_socketio_client.<locals>.messenger_connect|  sH    ::>>*d+v/GV::(2G 	 	Er&   z	/whatsapp)r  )rb   r  r+  r,  )r  s    r%   r  r  {  s)    E $$&K=A %r&   c                  h    t        j                  t        j                  t        j
                         y r   )r+  r,  whatsapp_go_sior  rb   r  r;   r&   r%   r  r    s    
LL((&*D*DEr&   c                      dd l } t        j                  ddt        j                   dt        j
                          | j                  t        j                  t        j
                  ddd       y )Nr   r@   uY   Подключаемся к удаленной отладке config.REMOTE_DEBUG_SERVER=z config.REMOTE_DEBUG_PORT=TF)r5  stdoutToServerstderrToServersuspend)pydevd_pycharmrI   r  rb   REMOTE_DEBUG_SERVERREMOTE_DEBUG_PORTsettrace)r  s    r%   cmf_pycharm_debugr    sh    LL''-'A'A&B
$V%=%=$>	@A
 F66V=U=Ufj+/  @r&   c                  N   t        t        j                  t        j                  t	        t        t        j                                     t	        t        t        j                         dz               t        j                  j                  d      } t        |       }t        |      S )Nr  guid)issorg_nameiatexpr  jti)rT   rb   r  r  rD   r   r1  r   r  r   r[  rS  )rY  rP  s     r%   gen_eva_app_tokenr    si    v"OO3tyy{+,3tyy{R/0199??G W
CS!!r&   urir-  c                 r   ddl m} t        j                  rt        j                  dk(  rJt	        t
        j                  |d         }|j                  dg       }|j                  di       } ||i |}n |       }ddd	d
|_        t                |  }t               |d<   |j                  |t        j                  |            }	|	j                  dk7  r(t        d| d|	j                   d|	j                          |	j                         }|rd|v rt        d|       t"        j%                  |       |S )Nr   )r  FalserG  r"   r#   r?  r7  r$  )zContent-typeAcceptzContent-Encodingeva_app_token)r-     u9   Не удалось отправить запрос, url=z, status_code=z, res=r8  u(   Сервер вернул ошибку: )requestsr  rb   EVA_ACCOUNT_USEr   r   r  ru   r~  r  r  postrh   ri   rE  r   contentr   rJ   )
r  r-  r  rG  method_argsmethod_kwargsresultr   r7   r   s
             r%   call_eva_accountr    s=    !!V%;%;w%Fh8hhvr*2.66I%7*(/1	  !"3%( 1 3_ffStzz$/f0??c!KC5P^_b_n_n^oouvy  wB  wB  vC  DE Eg'FvhOPPGGFOMr&   eva_db_upgrade_runningc                     | st        t        j                               } t        t        d      st
        j                          t        j                  j                  t        | dd      st        dt               y)u   Запускается перед миграций БД. Информирует приложение, что не следует открывать транзакции.r     T)exr  zCannot lock N)rD   r`  r$  r   r  r  r  r  r   _DB_LOCK_KEYCmfError)r   s    r%   app_db_upgrade_startr    s^    BIIK 8W%))+>>lEbTBl^455 Cr&   c                  J    t         j                  j                  t               y)u   Запускается после миграций БД. Информирует приложение, что можно продолжать работать.N)r  r  rx   r  r;   r&   r%   app_db_upgrade_stopr    s    NN,'r&   c                     d }d}t        j                          } |       rS| rt        j                          |z
  |kD  r|rt        dt               y|dz  }t        j                  d        |       rSy)u   Проверяем не заблокировано ли использование БД, если заблокировано, то можем дождаться разблокировки.c                     t         rt        j                         t         z
  dkD  r[t        t        d      st        j                          t        j                  j                  t              a	t        j                         a t        S )uW   используем кеш 1sec, чтобы часто не ходить в редисr   r  )
_db_lock_cache_tsr1  r   r  r  r  r  ru   r  _db_lock_cacher;   r&   r%   
check_lockz!check_db_lock.<locals>.check_lock  sX     !TYY[3D%D$I 8W-&113%^^//=N $		r&   r   z
DB locked Fr   T)r1  r  r  r  )r<  r  raise_errorr   rn   starts         r%   rM  rM    sk    
 EIIKE
,		e+w6L>:;;


1 , r&   c                      dd l } t        j                  rd}nt        j                  } | j                  |d        | j
                         }|j                  |       y )Nr   rc   z:%(asctime)s %(process)d %(name)s %(levelname)s %(message)s)r  r  )logging.handlersrb   rc   	LOG_LEVELbasicConfigr  setLevel)rI   r  r  s      r%   init_loggingr(    sK    ||  Ge,hiW F
OOEr&   c                     t         j                  xs d}|j                  d      s|dz  }| r>t         j                  rdt         j                   nd}| dt         j                   | | S |S )Nr-   r   r   z://)rb   	BASE_HREFr   EXTERNAL_PORT_HTTPSr  )full_urlprotocolrv  	port_specs       r%   r~  r~    so      'CIc"S	8>8R8Ra2234XZ	3v/	{9+FFr&   c                 *   t         j                  rt         j                  }n[| r@|rd}n=t         j                  rdt         j                   nd}dt         j                   | }nd}|t         j                  xs dz  }|j                  d      s|dz  }|S )Nzhttp://127.0.0.1:8080r   r   r  r-   )rb   AUTH_SERVER_URLr+  r  r*  r   )absoluteinternalrv  r.  s       r%   r  r    s    **	3	@F@Z@Za : :;<`b	&v&7	{C	IV%%,,	c"S	r&   r  )r  r  )FFr   r  r<  )r   F)FFNN)FNN)TNTFFFF)T)Tr   r;  )T   T)Fhttps)r  r  rI   r   rd   fcntlr`  r  rN  r   rv   r3  r1  r=  	threadingr  r   r   pathlibr   typingr   r   urllib.parser   r	   r
   r   werkzeug.utilsr   r+  r   r  Crypto.Hashr   Crypto.Signaturer   r  r   r   flask.json.providerr   werkzeug.exceptionsr   r   r   rm  cmf.data_providersr   r  cmf.system_datar  dateutil.relativedeltar   r   rL  r   r  r  r   rN   objectrP   rB  r1   rb   r  r   rh   ri  r  r  r  cache_in_project_roler  
rpc_modelsclean_attributesrJ  rI  LockrK  all_models_meta
SECRET_KEY
secret_keyflask_socketiorP  rQ  r  rR  r  rD   rt  rp  rw  r  r  r  r  r  r  r  engineio.payloadr   max_decode_packetsr  ra  ru   uwsgidecoratorsr9  r  rc   r  r  r  r   rx  r4   ry  r  r  REDIS_DB_IDREDIS_DB_ID_TIMERerrorhandlerr   rJ  register_error_handlerprivate_key_pathpublic_key_pathCrypto.PublicKeyrL  
import_key
read_bytesrL  rsa_public_keyrk  r  r  r  r  r  r   r  r  r  propertyr   r   r   r   r  r  r  r  rJ   r  rN  r  r  r  r  r  r  r  r  r  r  r  r  r  rF  after_requestr  r  r  r  r  r   r(  r  rJ  rS  r[  r^  r`  re  rg  r  r  rz  r  r  r  r  r  r  r  r  r  r  ro  r  r  r  rv  r  r  r  r  rT   r  cache_notify_scheme_rulecache_cmf_security_levelcache_person_notify_optcache_cust_field_config_schemecache_email_listr  r  r  r  r  r  rM  r(  r~  r  r;   r&   r%   <module>r_     s       
  	          0  "  = = $     ' ! 3 -   )  	 0  -

  f  gE ,B
qDv qDj/6, 6* HDF4F4FGc"   *+

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