
    j|                        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 d dlmZ d dlmZ d dlmZmZmZmZ d dlmZ d dlmZ d dlmZmZ d d	lmZmZ d dlZd d
l  d dl!m"Z" d dl#Zddl$m$Z$ d Z%e& e'd      d               Z(e)jU                  dd      d        Z+e)jU                  dd      d        Z,e)jU                  dd      d        Z-e)jU                  dd      d        Z.e)jU                  dd      d        Z/e)jU                  dd      d        Z0d  Z1d! Z2d"Z3 G d# d$ejh                  jj                        Z6y)%    N)OrderedDict)deepcopy)is_dataclass)isclass
isfunctionismethod	signature)time)uuid4)Responserequest)dumpsloads)*)	CMF_CACHE   )metricsc                     t         j                  r.t               t         j                  z
  dk  rt         j                  S t         j                  j                  d      } | s?t        t        t                           }t         j                  j                  d|d       n| j                         }|t         _        t               t         _        t         j                  S )N   redis_idT)nx)
APPREDIS_DB_IDr
   REDIS_DB_ID_TIMERREDIS_DBgetstrintsetdecode)raw_redis_idr   s     ./modules/api/views/index.pyget_redis_idr#      s    
46C$9$99A=<<##J/Ls46{# 	X$7&&(CO FC??    zCmfCache:flushdb)channelc                  n    d t         _        t        j                  d       t        j                  d       y )NzAPP.REDIS_DB_ID = NONE)r   r   logginginfogdebugargskwargss     r"   flush_redis_idr.   0   s'     CO LL)*GG$%r$   zjshash-invalidate-confirm/)	namespacec                 .    t        j                  |        y N)r   jshash_invalidate_confirm)confirm_dictr,   r-   s      r"   handle_messager5   >   s    ''5r$   user_regisrtyc                    ddl m}m} t        j                  dd|         t
        j                  rt        j                  j                  d       | j                  dd       }|r ||       t        j                  d| |       y )	Nr   	join_room
leave_room%szhandle_user_regisrty: r   user_idzMe registered: room)flask_socketior9   r:   r'   r(   configMETRICS_SOCKETIOr   socketio_user_regisrtywriter   socketioemitparamsr9   r:   r<   s       r"   handle_user_regisrtyrH   B   sj    4LL/x89&&,,Q/jjD)G'MMOG9-GM<r$   r9   c                    ddl m} t        j                  dd|          || d          t        j                  d| d         }t        t        |            }t        j                  rHt        j                  j                  d| d   	       t        j                  j                  || d   	       t        j                  d
| d    d| d    d|i| d   	       t        j                  d| d    || d   | d   | d   d| d   	       y )Nr   )r9   r;   zhandle_user_join_room: 	room_namer/   r0   r>   r   r=   zUser r<   z	 join to participantsz
Joined to 	user_name
user_login)rL   rM   rN   r<   )r?   r9   r'   r(   rD   get_participantslenlistr@   rA   r   socketio_join_roomrC   socketio_room_membersrE   )rG   r9   rL   participantsSizes       r"   handle_user_join_roomrU   N   s4   (LL09:f[!",,sAT,UL4-.""((1D(E%%++,<6+CV+W MME&+,If[6I5JKn^nMov|  ~I  wJM  KMM
VK()*){8K[abn[o  }C  DM  }N  	OK   r$   r:   c           	          ddl m} t        j                  dd|          || d          t        j                  d| d         }t        j                  dd	t        t        |            i| | d   
       y )Nr   )r:   r;   zhandle_user_leave_room: rJ   r/   rK   zUser leave roomrL   r=   )	r?   r:   r'   r(   rD   rO   rE   rP   rQ   )rG   r:   rL   s      r"   handle_user_leave_roomrW   d   sp    )LL1&:;vk"#,,sAT,ULMMO~s4;M7N&YRX&Y`fgr`sMtr$   document_broadcastc                 l    t         j                  d| | d   t        j                  j                         y )NrX   rJ   )r>   skip_sid)rD   rE   flaskr   sid)rG   s    r"   handle_document_broadcastr]   l   s+     MM&VK5HSXS`S`SdSdMer$   	user_pingc                     ddl m}m} t        j                  dd|         | j                  dd       }|rt        j                  d|        y y )Nr   r8   r;   zhandle_user_ping: r<   
user_pong_)r?   r9   r:   r'   r(   r   rD   rE   rF   s       r"   handle_user_pingra   q   sF    4LL+F845jjD)G
7),- r$   c                      i  fd}|S )Nc                      t        j                  | t        |j                               f      }|vr | i ||<   |   S r2   )pickler   sorteditems)r,   r-   hashfuncmemorys      r"   memozmemoized.<locals>.memo   sF    ||T6&,,.#9:;v00F4Ld|r$    )rh   rj   ri   s   ` @r"   memoizedrl   }   s    F
 Kr$   c                 `    dt         vrt               t         _        |t         j                  | <   y )Nprofiler_data)r)   r   rn   )keymss     r"   set_call_timerq      s!    a%-AOOCr$   z******c                   T    e Zd ZdZdd fdZddZddZddZd ZddZ	d Z
dd	Zd
 ZddZeddefd       Zd Zej&                  j(                  d        Z ej.                  d      ZddZd Zd Zd Zd Zd Zd Zd de fdZ!ej&                  j(                  d        Z" xZ#S )!ApiViewr/   c                 P    t         |           | j                  |      | _        y )N)extra_models_list)super__init__get_rpcrpc)selfru   	__class__s     r"   rw   zApiView.__init__   s!    <<2C<Dr$   c                 v    |r1|j                   j                  D cg c]  }|j                   c}|d<   |S c c}w )Nexception_types)r{   __mro____name__)rz   result	exceptione_clss       r"   _add_exception_infozApiView._add_exception_info   s6    ENEXEXE`E`(aE(aF$% )bs   6c                     t         j                  j                          t        j                  d||       d||dt
        j                  d      t
        j                  d}| j                  ||      S )Nz%s, exception=%s2.0)codemessagealert)jsonrpcerrorr   callidr   )	cmfapp_deferred_errors_checkr'   r   r)   r   
api_callidr   )rz   r   r   r   r   s        r"   _errorzApiView._error   s_    &&(('9="w7UU7^ll	
 '')'DDr$   c                 ^   t         j                  j                          |sg }d|||t        j                  |t        j                  d      t        j                  d      t        j                  d      |t               |t               d}t        j                  r#t        j                  rt        j                  |d<   t        j                  rt        j                  |d<   |s%|s#t        j                  rt        j                  |d<   t        j                  rd	|d
<   | j                  ||      S )Nr   rn   r   note)r   r   metajsverr   jsurlrn   r   r   abortversion
invalidater   touched_cache_clustersjscache_timelifeshow_bg_progressbarTlicense_requiredr   )r   r   r   r)   r   r   cmf_get_versionr#   r@   CACHE_USE_V2%cache2_collect_touched_cache_clusterscache2_touched_cache_clustersr   r   api_license_requiredr   )rz   r   r   r   r   r   r   r   s           r"   _okzApiView._ok   s    &&(JllUU?3UU7^EE&M&($$
 66343R3R/0 )*););F%&Y1+@+@,-,A,AF()!!)-F%&'')'DDr$   c                 &    | j                  dd      S )NiDzParse errorr   rz   s    r"   parse_errorzApiView.parse_error   s    {{6=11r$   c                 D    d}| j                  d||      S | d|       S )NzInvalid Requestiz: r   )rz   r   titles      r"   invalid_requestzApiView.invalid_request   s/    !{{6GO5WWE7"WIAVWWr$   c                 &    | j                  dd      S )NizMethod not foundr   r   s    r"   method_not_foundzApiView.method_not_found   s    {{6#566r$   c                 ,    | j                  dd|       S )NizInvalid params: r   )rz   r   s     r"   invalid_paramszApiView.invalid_params   s    {{6%5gY#?@@r$   c                 &    | j                  dd      S )NizInternal errorr   r   s    r"   internal_errorzApiView.internal_error   s    {{6#344r$   c                 L    |t        ddd      v sJ | j                  |||      S )Ni ir   )ranger   )rz   r   r   r   s       r"   server_errorzApiView.server_error   s.    uVVR0000{{4I{>>r$   ru   c                 p   | sg } nt        |       } | j                  t        j                  j                         dj                  | D cg c]  }t        |       c}      }t        j                  j                  |      rt        j                  |   S i t        j                  |<   g t        t              | D ]a  }t        |      r|}t        |d|j                        }nlt        t        |d       xs t        t        j                  |d       }t        |      sct        |t        j                  j                        s|j                  r|dk(  rt!        g d      }n"|j"                  st!        |j$                        }i }t!        t        |            |z  }|D ]s  }t        ||      }t&        j)                  ||      }	t+        |	t,              }
t+        |	t.              }t+        |t0              }||j3                         |
||dd}|||d   <   u t        |t        j                  j                        r|j4                  j7                         D ]  \  }}g }t        |t        j4                  j8                  t        j4                  j:                  f      rg d}n(t        |t        j4                  j<                        rd	d
g}|D ]0  }| d| }t        ||      }||t?        |      ddddd|| d| <   2  |||d}|t        j                  |   |d   <   d t        j                  |   S c c}w )N 
class_name	BaseModel)
all_models_metaget_metaget_ui_full_pathubql2bqlpublic_get_ui_full_pathpublic_all_models_metapublic_nonepublic_none_classmethodsdesk_get_ui_full_pathsdesk_all_models_metaF)_methodnameis_class_methodis_static_methodis_taskis_field_methodr   )appendremoveextend
all_nestedr   r   .T)r   r   r	   r   r   r   r   )_classr   methods) rQ   r   r   modelsr   joinr   r   
rpc_modelsr   dirr   getattrr   
issubclassabstractr   	api_allowapi_methodsinspectgetattr_static
isinstanceclassmethodstaticmethodCmfDeferredJobWrapperlowerfieldsrf   CmfM2MCmfGenericM2MCmfJsonr	   )ru   objro   
model_nameclsapi_methods_setrpc_methodsmethod_namemethodmethod_attrr   r   r   
rpc_method
field_name	field_cls
submethods	submethodr   	rpc_models                       r"   rx   zApiView.get_rpc   s     " $%6 7  !5!56gg+<=Cs3x=>>>c">>#&& s<CK<*;< _	?Jz" $S,E
fj$7`73::z[_;`s|!#szz';';< <<
 [("% ' # ]]"%coo"6K "#c(mo=O. = k2%44S+F
 #-[+"F#-k<#H $V-BC
  &'--/'6(8&',
 3=Jv.//=2 #szz334-0ZZ-=-=-? )J	!#J!)cjj.?.?AYAY-Z[%Q
#Iszz/A/AB&.%9
 &0 	",Qyk:!(I!>'-$()26):/405',/3Dzl!I;$?@. "&I
 6?CNN3	& 12_	?@ ~~c""I >s   	L3c                     |dk(  S )N	qweqweqwerk   )rz   tokens     r"   check_tokenzApiView.check_tokenN  s    ##r$   c                     t         j                  j                  dd      }|r(t        j                  d|      s| j                  dd      S | j                  d| j                  t              S )Nmr   z[a-zA-Z0-9_]+i  u   Недопустимые символы в параметре m. Разрешены только буквы, цифры и подчеркивания.z
index.html)ry   r   )	r   r,   r   re	fullmatchr   render_with_paramsry   r   )rz   m_params     r"   r   zApiView.getQ  sb     ,,""3+2<<(8'B;;s  %}  ~  ~&&|&OOr$   z9"(?P<attr>(cmf|doc|obj|approved)_version)":(?P<value>\d+)c           	         t         j                  s|st        |t              rt	        |      dkD  r9t        dt	        |       dt        j                   t        j                         n|t	        |      dkD  rnt        j                  j                         t        j                  ddd      kD  r8t        d	t	        |       dt        j                   t        j                         | j                  |||||      }|rEt        j                  |      }	t!        j"                  | j$                  d
|	j'                               }	n0	 t)        |dd      }	t!        j"                  | j$                  d
|	      }	t         j                  s|st	        |	j/                  d            }|dkD  r\t        d| dt        j                   t        j                         t        j0                  d       | j3                  ||||||d      S |dkD  rt        j                  j                         t        j                  ddd      kD  r\t        d| dt        j                   t        j                         t        j0                  d       | j3                  ||||||d      S t5        |	d      S # t*        $ r}
t        j,                  d|
|        d }
~
ww xY w)Ni  u    !!!Блокирующая задача критикал баг! Обратитесь в техком!!! Используй slice u   , метод leveli,  i        uw   Разработчик внимание! Слишком много строк через API. Используй slice z"\g<attr>":"\g<value>"r   F)indentensure_asciiz"Json dumps error: %s | response=%szutf-8i   uh   !!!Блокирующая задача критикал баг! Обратитесь в техком!!! u    байт, метод uI   response_ok: повторный вызов из-за размера >10MBT)orjson_r   	recursioni   uq   Разработчик внимание! Слишком большой размер данных через API. uH   response_ok: повторный вызов из-за размера >1MBzapplication/json)mimetype)r@   
PRODUCTIONr   rQ   rP   	cmf_alertr)   
api_methodr'   WARNINGdatetimedatetodayr   cmfutil	cmf_dumpsr   sub_BIG_INT_JSON_HACK_REr    r   	TypeErrorr   encoder*   response_okr   )rz   result_dictr   r   r   r  r   r  response	json_dataeactual_sizes               r"   r  zApiView.response_ok^  s     +t,{#d*4474D3E]STS_S_R`b%oo/
 %+0C0C0EVZ\^`bHc0c 4474D3E]STS_S_R`b%oo/ 88KueZH ))(3It99;TV_VfVfVhiI!(15I	
 t99;TV_`I  i..w78K--~"m#9!,,I!//+ ij''T5%QXeo{'  A  A_,1D1D1FW[]_acId1d  H"m#9!,,I!//+ hi''T5%QXeo{'  A  A 	,>??=  BAxPs   J% %	K.KKc                 l   t         j                  ry t        j                  j	                  d      ry |j                  d      st         j                  d       y t        j                  j                         j                  d      d d t         j                  j                  j                  d}t        j                  rt        j                   j#                  d       t%        j&                  |t)        j*                  |            rt         j                  d       |d	   S t         j                  d
       y )NNO_CACHEjshash:z$api_cache_add failed, invalid jshash%Y%m%d%H%M%S%f)r   current_person_idr   zapi_cache_add endr   zapi_cache_add failed)r)   no_jscache_forceosenvironr   
startswithr*   r
  utcnowstrftimecurrent_personidvaluer@   METRICS_API_CACHEr   api_cache_setrC   r   _obj_dict_setrd   r   )rz   rg   	res_caches      r"   api_cache_addzApiView.api_cache_add  s    ::>>*%y)GG:;&&--/889IJ3BO!"!1!1!4!4!:!:<	 ##!!''*""4i)@AGG'(W%%	&'r$   c                 R   t         j                  j                  d      ry |j                  d      sy t	        j
                  |      }|s0t        j                  rt        j                  j                  d       y t        j                  |      }t        j                  d|        |S )Nr  r  r   zAPI CACHE HIT )r   r!  r   r"  r   _obj_dict_getr@   r(  r   api_cache_missrC   rd   r   r'   r(   )rz   rg   _resress       r"   api_cache_getzApiView.api_cache_get  s}    ::>>*%y)&&t,''&&,,Q/ll4 ~dV,-
r$   c                 .     | j                   |g|i |S r2   full_cache_validationrz   jshash_list_args_kwargss       r"   public_full_cache_validationz$ApiView.public_full_cache_validation      )t))+IIIIr$   c                 .     | j                   |g|i |S r2   r4  r6  s       r"   sdesk_full_cache_validationz#ApiView.sdesk_full_cache_validation  r;  r$   c                 b   dt         j                   j                         j                  d      d d i}|D ]U  }|j                  d      st	        j
                  |      }|s-t        j                  |      }|j                  d      ||<   W | j                  |d d t        j                  d      S )Notherr  r  r  r   T)r   r   r   r  )r
  r#  r$  r"  r   r.  rd   r   r   r  r)   r   )rz   r7  r8  r9  r   jshash
redis_data
cache_datas           r"   r5  zApiView.full_cache_validation  s    8,,335>>?OPQTRTUV! 	9F$$Y/"008J#\\*5
!+!8v	9 TQWWVZ[[r$   c                 h    t         j                  r!t         j                  t         j                  k(  ryy)u;   
        Проверяем доступ к апи
        FT)r)   r%  anonymous_userr   s    r"   _check_accesszApiView._check_access  s&    
 1#3#3q7G7G#Gr$   r   c                    	 |j                  dd      \  }}|dk(  r	|dv rd| }|| j                  vry| j                  |   }|d   }d	}|d
v r|j                  s	|sd| }d}||d   vry|d   |   }||d<   ||d<   |S # t        $ r Y yw xY w)u  
        Поиск метода rpc

        находит метод в rpc_json
        проверяет его разрешенность
        возвращает указатель на функцию

        Возвращает не метод, а структуру из self.get_rpc + доп.поля:
         - use_simple - когда решили использовать slist или sget
         - _class - указатель на модель
        r   r   maxsplitNCmfAttachment)createupdatedeleteapi_r   F)r   rQ   sTr   _use_simple)split
ValueErrorry   disable_simple)rz   r   rR  proc_cls_nameproc_methodproc_clsr   
use_simples           r"   rpc_prepare_methodzApiView.rpc_prepare_method  s    	)/cA)F&M; O+<< $[M2(88M*x  
/)#2D2D^k]+KJhy11 y)+6 #H%/M"7  		s   B   	BBc                 1   d t         _        | j                         s| j                  dd      S dt        j                  dt
        fd}t         j                  j                  rjt         j                  j                  t        j                  k7  r?| j                  ddt         j                  j                   dt        j                   d      S t         j                  d	t         j                  j                  j                   d
       dt         _        t        j                  j                         }dt         t"        t$        f   dt"        fd}t'        t(        j*                        } ||      }t         j                  dt(        j,                   dt(        j.                   d| d       t1        |t2              s| j5                         S |j7                  d      t         _        |j7                  d      t         _        |j7                  d      t         _        |j7                  d      t         _        t         j                  s8t?        ddt@        jB                         t#        tE                     t         _        d|vr| jG                  d      S |d   t         _$        t         j<                  r8tA        jJ                  dt         jH                   dt         jL                   d       |j7                  dd      }|t         _'        |j7                  d      xs i }|t         _(        tS        |jU                               }|j7                  d      xs i }	tS        |	jU                               }
h d }|jW                  |      s|
jW                  |      r(t(        j,                  d!k7  r| jY                  d"| d#      S |j7                  d$      xs g }|t         _-        |j7                  d%      }|d&k(  r|j7                  d'      xs i }|r||d'<   |j7                  d(d       }|r||d(<   |j7                  d)d       }|r||d)<   |j7                  d*d       }|r||d*<   |j7                  d+d       }|r||d+<   |j7                  d,d       }|r||d,<   |j7                  d(g       t         _.        h d-}t         j\                  D ]3  }||v r|j_                  |       |d.z   |v s |j_                  |d.z          5 |t         _0        |j7                  d/i       t         _1        t         jb                  j7                  d0      rtd        jf                  ji                          |j7                  d1d       }|r||d1<   | jY                  d2      S t        jj                  rt         jl                  |d   ||jo                         t         jb                  d3}|d   jq                         D ]?  \  }}t1        |t"              sts        |      d4k\  s&d5ts        |       d|d d6  |d   |<   A tu        d7tv        jy                  |              |j7                  d8      }|j7                  d9d       }|j7                  d:      }|d   }g }|d;k(  r | jz                  |i |S |d<k(  r | j|                  |i |S |d=k(  r | j~                  |i |S d }|j7                  d>d       } | j                  ||       }!|!s| j                         S |!d?   }|!d@   }"|!dA   }#dB}$dCD ]  }%|%|d   v sd}$dBt         _B        t         j                  j                  |"j                         dD|d   v rkdB}&|d&k(  r9r7|dE   dFk(  r/t1        |dG   t"              rt        j                  |dG   dH       d}&|r dF|v rt        j                  |dF   dH       d}&|r dI|v rt        j                  |dI   dH       d}&|rd'|v r|d'   dE   dFk(  r5t1        |d'   dG   t"              rt        j                  |d'   dG   dH       d}&|d'   dE   dIk(  r5t1        |d'   dG   t"              rt        j                  |d'   dG   dH       d}&|r#dJ|dE   v rt        j                  |dE   dH       d}&dK|d   k(  r	 g dL}'|'D ]  }(|(|d   v sd}& n |&st         j                  dM|d            n dN|d   v rdB}$|r|j7                  dO      rdB}$t        |"dPdB      rdB}$|j7                  dQ      })|j7                  dR      }*|*rtd        j                  j                          |*t         _K        |$r#|*!t?        dS| dt@        jB                         dB}$|$rV|rt         j                  dT       n=|)r:t        j                  j                         }t         j                  dU       | j                  |*      }+t        dV ||             t         j                  dW       |+r|)|+j7                  dQ      k(  ru|rt        j                  |      }t         j                  dX       t        j                  rt        j                  j                  dY       | j                  d d |+dQ   ||#|Z      S t        j                  rt        j                  j                  dY       t         j                  d[       |!d\   s
|!d]   s|!d^   rn|j7                  d_|$       },t         jH                  j                  d`      da   dbk(  }-|d&k(  rt         j                  dc       d'|v rmdF|d'   v rf|d'   dE   dFk(  r[t         j                  dd       t3               }.|d'   |.d'<   dFg|.d(<   |-|.de<    |"j6                  di |.}ts        |d'         dfk(  r|d'= n|j7                  dF      s/r-t         j                  dd       |"j7                  |dFg|-g      }n|r|dF|v rx|,r$t        j                  |j7                  dF             t3               }.dFdh|j7                  dF      g|.d'<   dFg|.d(<   |-|.de<    |"j6                  di |.}|j                  dFd       n/|r3|jo                         }.g |.d'<   dFg|.d(<   |-|.de<    |"j6                  di |.}n| j                  didj      S ts        |      dEk(  st1        |dE   t"              rdJ|dE   vr| j                  didk      S |j                  dE      }/|,rt        j                  |/       t3               }.dFdh|/g|.d'<   dFg|.d(<   |-|.de<   t         jH                  dlk(  r|.d(   j                  dm       |!dn   dok(  r(t         j                  j                  t#        |/              |"j6                  di |.}|!dn   dok(  rt        |      D ]  }0|"j                  j7                  |0      }1|1s!|1j                  s1t?        dp|0 dqt@        jB                  r       |j                  |0       ^t        |"j                  |0   t        j                  j                        s||0   t        k(  st?        dst@        jB                  r       |j                  |0        |rv|,rtt        j                  |j                  j                         t        |dI      r?|j                  j                  s)t        j                  |j                  j                         |s5t         j                  dt       t                | j                  d i d |duv      S t1        |t        jd                  j                        xr |j                  j                  }2t1        |t        jd                  j                        xr |j                  j                  }3t1        |t        jd                  j                        xr |j                  j                  }4t1        |t        jd                  j                        xr |j                  j                  }5td        jf                  j                  |2|j                  |3|j                  j                  |4|dw|5dBx	      skt         j                  dy       td        j                  j                  dw|j                  |dz{       t                | j                  d i d |d|t               }      S t         j                  d~       d`|!dn   v r|!dn   j                  d`dY      \  }}6td        jf                  j                  |2|j                  ||3|j                  j                  |4|dw|5dB
      skt         j                  d       td        j                  j                  dw|j                  |dz{       t                | j                  d i d |dt               }      S t        ||      }7t        |7|6      }nt        ||!dn         }t        d ||             t        j                  j                         }t         j                  d|d           	 |!d^   r|j                  ||      }8n ||i |}8t         j                  d       t        d ||             t        j                  j                         }|rG|j                  r;t         j                  d       	 |j                          t         j                  d       t        d ||             t        j                  j                         }t        dB       t        d ||             t        j                  j                         }|!dn   dv r|8xr |8j                  j                  }8n*|!dn   dok(  r"t        |8dF      r|8j                  j                  }8t        j                  |8|      }=t         j                  d       |#r|=j                          n|=j                          t        d ||             |=j                  |=j                  }?}>|!dn   dv r|?rd}@t1        |?t2              r|?j7                  d      dk(  rdz}@|"j                  dk(  s@dzk(  rt1        |?t2              r1td        j                  j                  dw|"j                  |?dF   @{       nQt	        |?      r8td        j                  j                  dw|"j                  |?j                  @{       nt        |?d      |!dn   dv rd}@dB}AdB}B|?D ],  }Ct1        |Ct2              rCj7                  dd       dk(  rd}A+d}B. ArBrd}@nArdz}@|"j                  dk(  s@dzk(  r,td        j                  j                  dw|"j                  @       t        d|=j                         t         j                  d       t        j                  j                         }|$r#t        t         dd       s| j                  |*      })|rt        j                  |      }	 | j                  |?|>|)|||#      }Dt        d ||             t        j                  rt               t         j                  z
  }Ed }F|d   dlk(  rx|dhz
  }G|Gst         j                  d       d}FnXts        G      dYkD  rt         j                  dG        d}Fn/t        G      dE   j                  d      rd}Fnt        G      dE   }Ft        j                  |d   t        Edz        F       t        j                  |d   |F       t         j                  d       DS # t        $ r}9t                tA        j                  d       t#        |9      }:t1        t        |9d$d       t        t        f      r8dj                  |9j                  D ;cg c]  };t#        |;       nc c};w c};      }:| j                  d i d ||:|9}      cY d }9~9S d }9~9wt        $ rg}9t        j                  j                  d       t                d|d    d}<|<t        j                         z  }<| j                  d|<|9      cY d }9~9S d }9~9ww xY w# t        $ r}9t                tA        j                  d       t#        |9      }:t1        t        |9d$d       t        t        f      r8dj                  |9j                  D ;cg c]  };t#        |;       nc c};w c};      }:| j                  d i d ||:|9}      cY d }9~9S d }9~9ww xY w# t        $ r!}9t         j                  d| d|?         d }9~9ww xY w)Ni  u   Нет прав
start_datereturnc                 b    t         j                   j                         | z
  j                  }|dz  S )N  )r
  nowmicroseconds)rY  diff_uss     r"   datetime_diff_msz&ApiView.post.<locals>.datetime_diff_ms
  s+    ((,,.;IIGd?"r$   u>   Версия Eva отличается от версии БД: z != u   . Вероятно была запущен несовместимый образ Eva, либо были проблемы во время обновления и патчи применились частично.zAPI request start ()Tr1  c                 L    d}t        |       }t        |      |k  r|S |d | dz   S )Ni  z...[truncated])r   rP   )r1  max_logres_strs      r"   truncate_json_resz'ApiView.post.<locals>.truncate_json_res  s3    G#hG!'lg57_78G;LO_;__r$   zrequest.remote_addr=z request.url=z
 json_res= session_tab_idcomponent_idr   TECHCOM_HACK3441zAPI: No callid specified)
devel_onlyr   r   zNo method specifiedr;   z TECHCOM_HACK3441r   r   r-   save_kwargs>   auditnotify	only_dataz	127.0.0.1u!   SPEC0 Использование u#    через API запрещено.r,   r   r   filterr   sliceorder_bygroup_byinclude_deleted>   systemis_dummy
user_localis_templateperm_encryptvacation_endsl_owner_lockperm_parent_idvacation_startimport_originalperm_inherit_acl_idperm_parent_owner_idperm_effective_acl_id%perm_security_level_allowed_ids_cache_idflags
admin_modeno_cacheu)   no_cache запрещен go to spec0 osv)loginr   r,   r-   r     zLONG_STRING    z
API_TRACE 
no_jscacheno_metacache_idzCache.full_cache_validationz"Cache.public_full_cache_validationz!Cache.sdesk_full_cache_validationrR  r   r   rO  F)z.get_getz.list_listz.select_selectz.sum_sumz.count_countz.max_maxz.min_minr   r   r&  r   )readr   :zCmfPersonVar.get)get_current_userget_settingsCmfRFilezCmfPersonVar.get_metaCmfMenuTreez+Possible cache return invalid_data: method=r  search_stringTEXKOM_no_cacher   r@  ur   ошибка на frontend методы list get и тп должны быть с jshash, кроме тестов z$api_cache_get skip due to no_jscachezapi_cache_get startr2  zapi_cache_get endzapi_cache_get hit!r   )r  r   r   r   r  r   zapi_cache_get jsver mismatch!r   r   r   
for_updater   r   restorezAPI object get startu~   deprecated id объекта нужно передавать в kwargs или может вообще параметром RPCcmf_deleted   )ro  r   rq  r  z==i  u   Необходимо указать filter или kwargs для получения объекта перед вызовом его методаu1   Необходимо указать id в args[0]zCmfTask.updateru  r   rK  u	   Поле u1    не доступно для изменения.r   uB   Не задано новое значение для пароля.zAPI object get Noneu>   Объект не найден, возможно удалён.)r   r   r   r   r   r  )	initial_acl_keyobject_modelobject_owner_id	object_idobject_parent_idobject_instanceaccess_levelperm_security_level_allowed_idsraise_errorzAPI object access prohibitedfail)operatecmf_model_nameparentresult_statusuE   Объект недоступен: недостаточно прав.)r   r   r   r   r   r   zAPI object get endrG  )
r  r  object_fieldr  r  r  r  r  r  r  z"API object field access prohibiteduQ   Поле объекта не доступно: недостаточно прав.preparezAPI method start r+   zUserError Trace:	Exceptionu/   Ошибка выполнения метода z

ir   zAPI method endcall_method_mszAPI save startzAPI save endsave)synccommit)rJ  upsertcreate_from_template)r  zAPI json dump startresult_to_dict_ms)r   sgetok_acl_objdenyCmfAuditz$get result must be dict or dataclass)rQ   slist	partially)r  r  r  number_of_objectszAPI json dump endcache_store_error)r   r  uQ   Ошибка конвертации результата запроса json_res=z result_dict=result_to_response_msuh   Metrics. Warning: не смогли распарсить список обновляемых полей.unknownuT   Metrics. Warning: у задачи обновлено множество полей: manycf_cfr\  )r   duration_msadditional_label)r   r  zAPI request endrk   )r)   r   rE  r   r
  r   global_settingseva_versionr@   EVA_VERSIONr*   r%  r   r'  r   r]  Dictr   Anyr   r   dataremote_addrurlr   dictr   r   rg  rh  ri  r  r'   r	  r   r   r  r(   current_userr   
api_kwargsr   keysintersectionr   api_args
api_fieldsr   api_hack_fieldsr  r   CmfAccessListactivate_admin_mode	API_TRACEr  copyrf   rP   printjsonr   r5  r:  r=  rW  r   in_memory_cachein_memory_cache_skip_modelsr   r   r  cache_obj_lock_getr   
CmfLicenselicense_api_notifyr@  r2  rq   r   jshash_invalidate_confirm_listr(  r   api_cache_hitrC   r  api_cache_miss_jsverrP  popskipcache_select_for_updateaddrQ   r   r   r   r   CmfPassword_PASSWORD_MASKr&  hasattrvirtualcmf_rollbackr   	CmfEntityr  CmfModelcmf_owner_id	parent_idr  oldcheck_accessr  audit_eventCmfPermissionErrorapply_asyncCmfUserErrorr   tupler   r,   r  r   logger	traceback
format_excr   
is_changedr  
cmf_commitCmfResultSplittersplit_simpler   r   r   r  r  r,  rQ  METRICS_API_STATS_COLLECTr
   debug_startr"  write_api_timingswrite_profiler_data)Hrz   r`  rY  re  json_resjson_res_logr   r-   
kwargs_setrk  save_kwargs_setblock_kwargsr,   jsonrpc_ver_filterr   rp  rq  rr  rs  r  r   r  
trace_datakvr  r  r  r   invalidate_listr   rR  rT  r   rV  api_use_cacherN  cache_lock_ok_cachelock_skip_methodsr   r   r@  rB  r  r  
tmp_kwargsr&  argfieldr  obj_owner_idobj_parent_idr  field_method	obj_fieldr   r  	abort_msgimsgsplitterr   r  check_result_statuscheck_result_have_denycheck_result_have_ok_objrespmetric_durationmetric_additional_labelupdate_fieldssH                                                                           r"   postzApiView.post  s   !!#;;s$566	#):): 	#s 	#
 ((!!--1C1CC;;s&defevev  fC  fC  eD  DH  IO  I[  I[  H\ \U %V W W 	
%a&6&6&;&;&A&A%B!DE26/&&**,
	`4S> 	`c 	`
 &(2	&w':':&;=U_`l_mmnop(D)##%%#<<(89!n5||H-%\\*<=||*w8 uw<AL8#''(=>>) LL!,,q0@@QRSWb)h'-2'
jj/52k..017""<0O4P4PQ]4^""k1**-N|n\  ,A  B  B||F#)r
ll9-%ll8,2G#*x \\(D1F#)x LL$/E"'w||J5H%-z"||J5H%-z"&ll+<dCO,;()zz(B/k ,, 	9J_,&&z2%?2&&z%'78		9
 , ,,w+77;;|$  446<<
D1!)F:&&'RSS "8, ++-J #8,224 P1a%#a&C-0<SVHAagY.OJx(+P Jtzz*5678 \\,/
,,y$/<<
+(# 22-4--t>v>>994444dEfEE883433TDVDD!&6=--fnE((**Y'(# /

 D 8	A HX&& $ %*!--44S^^D
 HX..$)M"e+GAJ$<NS]^efg^hjmSn2271:D2I(,$&.226$<d2K(,&F"2226&>2M(,(f"4!(+A.$6:fXFVWXFY[^;_#66vh7G7JQU6V,0M!(+A.&8ZxHXYZH[]`=a#66vh7G7JQU6V,0MtAw22472F(,)Xh-??/+ 5 " 22,0M!"
 )"MhW_N`Ma bcq8	r (!33!Mfjj1!M 3)51!MW%h' 002 V^ E  FN  EO  Pw8 "M >?%..224
-.!//7
o/?
/KL+,
w 77#.7.V.VW_.`O 45!33#1177:#//(,4",W"5"'$.'6  0  8 8 "33#88>>qA ?@()[9K-LP[\ePf  Lm2CDJ,,,,S1"5BKe#./v%$&2B*BvhGWXYGZ^bGbGG  ]  ^!%J+1(+;Jx(,06Jx(0;J}-!#''/J/C6(+,1"8,D)gGG  ]  ^''$(`k'lC!226::d3CD!%J,0$

48H+IJx(,06Jx(0;J}-!#''/J/CJJtR(!'J+-Jx(,06Jx(0;J}-!#''/J/C;;s -E F F t9>DGS)APTUVPW;;s,_``XXa[..r2!V
(,dB'7
8$(,v
8$,7
=) <<#33x(//
;v&(21155c"g>cgg+
+6"h.< 
,CJJNN3/E$%	#6g&hpwpp  A"JJsO'

39O9OPU[\_U`drUr%(jsz  tC  tC  D"JJsO
, z**366<<8 3'0@0@..sxx~~>-.xxbEZ   \ \ )cjj.B.BCgHaHaHgHgO%c3::+>+>?ZCDTDTDZDZL&sCJJ,?,?@XS]]EXEXM4>sCJJDXDX4Y  5L^a  _H  _H  _L  _L1''44$3#..bn!ffll]\_!'4Ygl	 5 n
 67++F3>>be:@ , BxxbEam  nB   C C GG()k&))+6v+>+D+DSST+D+U(
L++88(7%(^^*^j"%&&,,`c%+8]kp 9 r GG@AOO//s~~fi>D 0 F N88#"Dq  ~P  ~R $ S S $C4	 L9
 !k&&9:i!1*!=>&&**,
	#HX$6#789	?9%++f+E00. 	
 !&(8(DE&&**,
3>>GG$%
a
 GGN#f.z:;&&**,
h 0 <=&&**,
 v"NN/		F H,vt$,,VW,E	%&!!#NN)+;J+GH$MM8??k v/1k"&+t,1LPV1V&,# ~~+/Bf/Lk40OO// &s~~*40@S 0 U "+.OO// &s~~*~~=P 0 R $K1WXXv"33"&%*"#(  $ 0dD)dhhz4.HF.R-1*+/(	0
 &*>&1#'&,# ~~+/Bf/L++F3>>:M , O 	)8+E+EF	#$&&**,
 ,?!F&&v.E'FFxPO	##KueP_is#tD 	-/?
/KL
 ++"fq}}4O&*# !%55 *m_ <$GG  G  H.7+'!+GGr  tA  sB  C  D.4+-(+66u=.2+.2=.A!.D+%%Xh-?SQ`aeQeMf  zQ  R''x/ATkl	!"s  	]N01AI'!VT2T5MBHHaff%=c!f%=%=>	88"DYZ[  ] ]  	?JJ  -NCHXDVCWW[\C9''))C$$VSA$>>	?   a!!"45F	ga6uF #!&&)AQ#a&)A)A BIxxbE^_   a aa|  	GGghpgqq~  @K  L  M  N	s   G8!A[6 JA` WAc [6	A`[?A$A^]#A]6
]5#A^^A`^A`^*AA``A``A``	Ac`A$Ab<bAb
b#Ab<b6Acb<Acc
Ac/cAc*c*Ac/r2   )rZ  N)NNN)r   )FNF)F)$r   
__module____qualname____url__rw   r   r   r   r   r   r   r   r   r   r   rQ   rx   r   r   viewsactionr   r   compiler  r  r,  r2  r:  r=  r5  rE  r   rW  r$  __classcell__)r{   s   @r"   rs   rs      s    GE	EEB2X7A5? k#$ k# k#Z$ 	YYP P 'BJJ'cd;@z(&JJ	\* *X 	YYw wr$   rs   )7decimal	ipaddressr'   sysr
  rd   stringrandomr   r  collectionsr   r  r   dataclassesr   r   r   r   r   r	   r
   uuidr   r[   r   r   ujsonr   r   
cmf.modelsr   cmf.includecmf.appr   cmf.util.metricsr   r#   r   on_server_eventr.   rD   onr5   rH   rU   rW   r]   ra   rl   rq   r  r(  BaseViewrs   rk   r$   r"   <module>r<     si      
     	  #  $ < <   #      ( +,& - & 
(C86 96 
_,	= -	= 
[C( )* 
\S)u *u 
!S1f 2f 
[C(. ). kcii   kr$   