
    oi                        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 Z$e% e&d      d               Z'e(jS                  dd      d        Z*e(jS                  dd      d        Z+e(jS                  dd      d        Z,e(jS                  dd      d        Z-e(jS                  dd      d        Z.e(jS                  dd      d        Z/d Z0d Z1d Z2 G d! d"ejf                  jh                        Z5y)#    N)OrderedDict)deepcopy)is_dataclass)isclass
isfunctionismethod	signature)time)uuid4)Responserequest)dumpsloads)*)	CMF_CACHEc                     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,   /   s'     CO LL)*GG$%r"   zjshash-invalidate-confirm/)	namespacec                 .    t        j                  |        y N)r   jshash_invalidate_confirm)confirm_dictr*   r+   s      r    handle_messager3   =   s    ''5r"   user_regisrtyc                     ddl m}m} t        j                  dd|         | j                  dd       }|r ||       t        j                  d| |       y )Nr   	join_room
leave_room%szhandle_user_regisrty: user_idzMe registered: roomflask_socketior7   r8   r%   r&   r   socketioemitparamsr7   r8   r:   s       r    handle_user_regisrtyrC   A   sM    4LL/x89jjD)G'MMOG9-GM<r"   r7   c                 d   ddl m} t        j                  dd|          || d          t        j                  d| d         }t        t        |            }t        j                  d| d	    d
| d    d|i| d          t        j                  d| d    || d   | d   | d	   d| d          y )Nr   )r7   r9   zhandle_user_join_room: 	room_namer-   r.   r<   zUser r:   z	 join to participantsr;   z
Joined to 	user_name
user_login)rG   rH   rI   r:   )	r>   r7   r%   r&   r?   get_participantslenlistr@   )rB   r7   rG   participantsSizes       r    handle_user_join_roomrN   K   s    (LL09:f[!",,sAT,UL4-.MME&+,If[6I5JKn^nMov|  ~I  wJM  KMM
VK()*){8K[abn[o  }C  DM  }N  	OK   r"   r8   c           	          ddl m} t        j                  dd|          || d          t        j                  d| d         }t        j                  dd	t        t        |            i| | d   
       y )Nr   )r8   r9   zhandle_user_leave_room: rE   r-   rF   zUser leave roomrG   r;   )	r>   r8   r%   r&   r?   rJ   r@   rK   rL   )rB   r8   rG   s      r    handle_user_leave_roomrP   \   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 )NrQ   rE   )r<   skip_sid)r?   r@   flaskr   sid)rB   s    r    handle_document_broadcastrV   d   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   r6   r9   zhandle_user_ping: r:   
user_pong_r=   rA   s       r    handle_user_pingrZ   i   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 r0   )pickler   sorteditems)r*   r+   hashfuncmemorys      r    memozmemoized.<locals>.memox   sF    ||T6&,,.#9:;v00F4Ld|r"    )ra   rc   rb   s   ` @r    memoizedre   u   s    F
 Kr"   c                 `    dt         vrt               t         _        |t         j                  | <   y )Nprofiler_data)r'   r   rg   )keymss     r    set_call_timerj      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)selfrn   	__class__s     r    rp   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)rt   __mro____name__)rs   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rz   )	cmfapp_deferred_errors_checkr%   r   r'   r   
api_callidr|   )rs   r   r   rz   ry   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                  |d<   |s%|s#t        j                  rt        j                  |d<   t        j                  rd|d	<   | j                  ||
      S )Nr~   rg   r   note)r   ry   metajsverr   jsurlrg   r   r   abortversion
invalidater   jscache_timelifeshow_bg_progressbarTlicense_requiredr   )r   r   r   r'   r   r   cmf_get_versionr!   r   r   api_license_requiredr|   )rs   ry   r   r   r   r   r   rz   s           r    _okzApiView._ok   s    &&(JllUU?3UU7^EE&M&($$
" )*););F%&Y1+@+@,-,A,AF()!!)-F%&'')'DDr"   c                 &    | j                  dd      S )NiDzParse errorr   rs   s    r    parse_errorzApiView.parse_error   s    {{6=11r"   c                 D    d}| j                  d||      S | d|       S )NzInvalid Requestiz: r   )rs   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   )rs   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   )rs   r   r   rz   s       r    server_errorzApiView.server_error   s.    uVVR0000{{4I{>>r"   rn   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) rL   r   r   modelsr   joinr   r   
rpc_modelsr   dirr   getattrrx   
issubclassabstractr   	api_allowapi_methodsinspectgetattr_static
isinstanceclassmethodstaticmethodCmfDeferredJobWrapperlowerfieldsr_   CmfM2MCmfGenericM2MCmfJsonr	   )rn   objrh   
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    rq   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	qweqweqwerd   )rs   tokens     r    check_tokenzApiView.check_tokenB  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)rr   r   )	r   r*   r   re	fullmatchr   render_with_paramsrr   r   )rs   m_params     r    r   zApiView.getE  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)config
PRODUCTIONr   rL   rK   	cmf_alertr'   
api_methodr%   WARNINGdatetimedatetodayr   cmfutil	cmf_dumpsr   sub_BIG_INT_JSON_HACK_REr   r   	TypeErrorr   encoder(   response_okr   )rs   result_dictr   r   r   r   r   r   response	json_dataeactual_sizes               r    r	  zApiView.response_okR  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                    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                  |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_idzapi_cache_add endr   zapi_cache_add failed)r'   no_jscache_forceosenvironr   
startswithr(   r   utcnowstrftimecurrent_personidvaluer   _obj_dict_setr]   r   )rs   r`   	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                     t         j                  j                  d      ry |j                  d      sy t	        j
                  |      }|sy t        j                  |      }t        j                  d|        |S )Nr  r  zAPI CACHE HIT )
r  r  r   r  r   _obj_dict_getr]   r   r%   r&   )rs   r`   _resress       r    api_cache_getzApiView.api_cache_get  s`    ::>>*%y)&&t,ll4 ~dV,-
r"   c                 .     | j                   |g|i |S r0   full_cache_validationrs   jshash_list_args_kwargss       r    public_full_cache_validationz$ApiView.public_full_cache_validation      )t))+IIIIr"   c                 .     | j                   |g|i |S r0   r'  r)  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"  r]   r   r   r	  r'   r   )rs   r*  r+  r,  ry   jshash
redis_data
cache_datas           r    r(  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   rL   sTr   _use_simple)split
ValueErrorrr   disable_simple)rs   r   rE  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                 @2   d t         _        | j                         s| j                  dd      S 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       t        j                  j                         }t        t        j                         }t         j                  dt        j"                   d	t        j$                   d
| d       t'        |t(              s| j+                         S |j-                  d      t         _        |j-                  d      t         _        |j-                  d      t         _        |j-                  d      t         _        t         j                  s8t5        ddt6        j8                         t;        t=                     t         _        d|vr| j?                  d      S |d   t         _         t         j2                  r8t7        jB                  dt         j@                   dt         jD                   d       |j-                  dd      }|t         _#        |j-                  d      xs i }|t         _$        tK        |jM                               }|j-                  d      xs i }tK        |jM                               }h d}|jO                  |      s|jO                  |      r(t        j"                  dk7  r| jQ                  d| d      S |j-                  d      xs g }	|	t         _)        |j-                  d       }
|
d!k(  r|j-                  d"      xs i }|r||d"<   |j-                  d#d       }|r||d#<   |j-                  d$d       }|r||d$<   |j-                  d%d       }|r||d%<   |j-                  d&d       }|r||d&<   |j-                  d'd       }|r||d'<   |j-                  d#g       t         _*        h d(}t         jT                  D ]3  }||v r|jW                  |       |d)z   |v s |jW                  |d)z          5 |t         _,        |j-                  d*i       t         _-        t         jZ                  j-                  d+      rt\        j^                  ja                          |j-                  d,d       }|r||d,<   | jQ                  d-      S t        jb                  rt         jd                  |d   |	|jg                         t         jZ                  d.}|d   ji                         D ]?  \  }}t'        |t:              stk        |      d/k\  s&d0tk        |       d|d d1  |d   |<   A tm        d2tn        jq                  |              |j-                  d3      }|j-                  d4d       }|j-                  d5      }|d   }g }|d6k(  r | jr                  |	i |S |d7k(  r | jt                  |	i |S |d8k(  r | jv                  |	i |S d }|j-                  d9d       }| jy                  ||      }|s| j{                         S |d:   }|d;   }|d<   } d=}!d>D ]  }"|"|d   v sd}!d=t         _>        t         j~                  j                  |j                         d?|d   v rkd=}#|
d!k(  r9r7|d@   dAk(  r/t'        |dB   t:              rt        j                  |dB   dC       d}#|r dA|v rt        j                  |dA   dC       d}#|r dD|v rt        j                  |dD   dC       d}#|rd"|v r|d"   d@   dAk(  r5t'        |d"   dB   t:              rt        j                  |d"   dB   dC       d}#|d"   d@   dDk(  r5t'        |d"   dB   t:              rt        j                  |d"   dB   dC       d}#|	r#dE|	d@   v rt        j                  |	d@   dC       d}#dF|d   k(  r	 g dG}$|$D ]  }%|%|d   v sd}# n |#st         j                  dH|d            n dI|d   v rd=}!|r|j-                  dJ      rd=}!t        |dKd=      rd=}!|j-                  dL      }&|j-                  dM      }'|'rt\        j                  j                          |'t         _G        |!r#|'!t5        dN| dt6        j8                         d=}!|!r|rt         j                  dO       n|&rt        j                  j                         }t         j                  dP       | j                  |'      }(t        dQt        j                  j                         |z
  j                  dRz         t         j                  dS       |(ro|&|(j-                  dL      k(  rF|rt        j                  |      }t         j                  dT       | j                  d d |(dL   || |U      S t         j                  dV       |dW   s
|dX   s|dY   rn|j-                  dZ|!       })t         j@                  j                  d[      d\   d]k(  }*|
d!k(  rt         j                  d^       d"|v rmdA|d"   v rf|d"   d@   dAk(  r[t         j                  d_       t)               }+|d"   |+d"<   dAg|+d#<   |*|+d`<    |j,                  di |+}tk        |d"         dak(  r|d"= n|j-                  dA      s/r-t         j                  d_       |j-                  |dAg|*b      }n|r|dA|v rx|)r$t        j                  |j-                  dA             t)               }+dAdc|j-                  dA      g|+d"<   dAg|+d#<   |*|+d`<    |j,                  di |+}|j                  dAd       n|r3|jg                         }+g |+d"<   dAg|+d#<   |*|+d`<    |j,                  di |+}n| j                  ddde      S tk        |	      d@k(  sdE|	d@   vr| j                  dddf      S |	j                  d@      },|)rt        j                  |,       t)               }+dAdc|,g|+d"<   dAg|+d#<   |*|+d`<   t         j@                  dgk(  r|+d#   j                  dh       |di   djk(  r(t         j                  j                  t;        |,              |j,                  di |+}|di   djk(  rt        |      D ]  }-|j                  j-                  |-      }.|.s!|.j                  s1t5        dk|- dlt6        j8                  m       |j                  |-       ^t        |j                  |-   t        j                  j                        s||-   t        k(  st5        dnt6        j8                  m       |j                  |-        |rv|)rtt        j                  |j                  j                         t        |dD      r?|j                  j                  s)t        j                  |j                  j                         |s5t         j                  do       t                | j                  d i d |dpq      S t'        |t        j\                  j                        xr |j                  j                  }/t'        |t        j\                  j                        xr |j                  j                  }0t'        |t        j\                  j                        xr |j                  j                  }1t'        |t        j\                  j                        xr |j                  j                  }2t\        j^                  j                  |/|j                  |0|j                  j                  |1|dr|2d=s	      skt         j                  dt       t\        j                  j                  dr|j                  |duv       t                | j                  d i d |dwt               x      S t         j                  dy       d[|di   v r|di   j                  d[dz{      \  }}3t\        j^                  j                  |/|j                  ||0|j                  j                  |1|dr|2d=|
      skt         j                  d}       t\        j                  j                  dr|j                  |duv       t                | j                  d i d |d~t               x      S t        ||      }4t        |4|3      }nt        ||di         }t        dt        j                  j                         |z
  j                  dRz         t        j                  j                         }t         j                  d|d           	 |dY   r|j                  |	|      }5n ||	i |}5t         j                  d       t        dt        j                  j                         |z
  j                  dRz         t        j                  j                         }|rG|j                  r;t         j                  d       	 |j                          t         j                  d       t        dt        j                  j                         |z
  j                  dRz         t        j                  j                         }t                t        dt        j                  j                         |z
  j                  dRz         t        j                  j                         }|di   dv r|5xr |5j                  j                  }5n*|di   djk(  r"t        |5dA      r|5j                  j                  }5t        j                  |5|      }:t         j                  d       | r|:j                          n|:j                          t        dt        j                  j                         |z
  j                  dRz         |:j                  |:j                  }<};|di   dv r|<rd}=t'        |<t(              r|<j-                  d      dk(  rdu}=|j                  dk(  s|=duk(  rt'        |<t(              r1t\        j                  j                  dr|j                  |<dA   |=v       nOt        |<      r8t\        j                  j                  dr|j                  |<j                  |=v       nt        |<d      |di   dv rd}=d=}>d=}?|<D ],  }@t'        |@t(              r@j-                  dd       dk(  rd}>+d}?. |>r|?rd}=n|>rdu}=|j                  dk(  s|=duk(  r,t\        j                  j                  dr|j                  |=       t        d|:j                         t         j                  d       t        j                  j                         }|!r"t        t         dd       s| j                  |'      }&|rt        j                  |      }	 | j                  |<|;|&|||       }At        dt        j                  j                         |z
  j                  dRz         t        j                  rːt               t         j                  z
  }Bd }C|d   dgk(  rr|st         j                  d       d}CnXtk        |      dzkD  rt         j                  d|        d}Cn/t        |      d@   j	                  d      rd}Cnt        |      d@   }Ct        j
                  j                  j                  |d   BC       t         j                  d       AS # t        $ r}6t                t7        j                  d       t;        |6      }7t'        t        |6dd       t        t        f      r8dj                  |6j                  D 8cg c]  }8t;        |8       nc c}8w c}8      }7| j                  d i d ||7|6x      cY d }6~6S d }6~6wt        $ rg}6t        j                  j                  d       t                d|d    d}9|9t        j                         z  }9| j                  d|9|6      cY d }6~6S d }6~6ww xY w# t        $ r}6t                t7        j                  d       t;        |6      }7t'        t        |6dd       t        t        f      r8dj                  |6j                  D 8cg c]  }8t;        |8       nc c}8w c}8      }7| j                  d i d ||7|6x      cY d }6~6S d }6~6ww xY w# t         $ r!}6t         j                  d| d|<         d }6~6ww xY w)Ni  u   Нет правu>   Версия Eva отличается от версии БД: z != u   . Вероятно была запущен несовместимый образ Eva, либо были проблемы во время обновления и патчи применились частично.zAPI request start ()zrequest.remote_addr=z request.url=z
 json_res= session_tab_idcomponent_idr   TECHCOM_HACK3441zAPI: No callid specifiedT)
devel_onlyr   r   zNo method specifiedr9   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+   rj     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_validationrE  r   r   rB  F)z.get_getz.list_listz.select_selectz.sum_sumz.count_countz.max_maxz.min_minr   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   r3  ur   ошибка на frontend методы list get и тп должны быть с jshash, кроме тестов z$api_cache_get skip due to no_jscachezapi_cache_get startr%  i  zapi_cache_get endzapi_cache_get hit!)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   )rV  r   rX  r  z==i  u   Необходимо указать filter или kwargs для получения объекта перед вызовом его методаu1   Необходимо указать id в args[0]zCmfTask.updater\  r   r>  u	   Поле u1    не доступно для изменения.r   uB   Не задано новое значение для пароля.zAPI object get Noneu>   Объект не найден, возможно удалён.)ry   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   Объект недоступен: недостаточно прав.)ry   r   r   r   r   rz   zAPI object get endr   r:  )
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commit)r=  upsertcreate_from_template)rq  zAPI json dump startresult_to_dict_ms)r   sgetok_acl_objdenyCmfAuditz$get result must be dict or dataclass)rL   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_cf)r   durationadditional_labelzAPI request endrd   )r'   r   r8  r   global_settingseva_versionr   EVA_VERSIONr(   r  r   r  r   nowr   r   dataremote_addrurlr   dictr   r   rN  rO  rP  r   r%   r   r   r   r   r   r&   current_userr   
api_kwargsr   keysintersectionr   api_args
api_fieldsr   api_hack_fieldsrj  r   CmfAccessListactivate_admin_mode	API_TRACErm  copyr_   rK   printjsonr   r(  r-  r0  rJ  r   in_memory_cachein_memory_cache_skip_modelsr   r   r  cache_obj_lock_getr   
CmfLicenselicense_api_notifyr3  r%  rj   microsecondsr   jshash_invalidate_confirm_listr	  rC  popskipcache_select_for_updateaddrL   r   r   r   r   CmfPassword_PASSWORD_MASKr  hasattrvirtualcmf_rollbackr   	CmfEntityrg  CmfModelcmf_owner_id	parent_idrh  oldcheck_accessr  audit_eventCmfPermissionErrorapply_asyncCmfUserErrorrz   tupler   r*   r  r   logger	traceback
format_excr   
is_changedr  
cmf_commitCmfResultSplittersplit_simpler   ry   r   r  r  r   rD  METRICS_API_STATS_COLLECTr
   debug_startr  utilmetricswrite_api_time)Drs   
start_datejson_resr   r+   
kwargs_setrR  save_kwargs_setblock_kwargsr*   jsonrpc_ver_filterr   rW  rX  rY  rZ  r  r   rl  
trace_datakvrp  rq  rr  r   invalidate_listr   rE  rG  r   rI  api_use_cacherA  cache_lock_ok_cachelock_skip_methodsr   r   r3  r5  r  r  
tmp_kwargsr  argfieldr  obj_owner_idobj_parent_idrh  field_method	obj_fieldry   r  	abort_msgimsgsplitterr   r
  check_result_statuscheck_result_have_denycheck_result_have_ok_objrespmetric_durationmetric_additional_labelsD                                                                       r    postzApiView.post  s   !!#;;s$566 ((!!--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E&&**,
&	&w':':&;=U_`h_iijkl(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0A0A0E0E0G*0T/b/bei/ij+,
w 77#.7.V.VW_.`O 45#//(,4",W"5"'$.'6  0  8 8  ?@()[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>Q;;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("3"3"7"7"9J"F!T!TW[![\&&**,
	#HX$6#789	?9%++f+E00. 	
 !&):):)>)>)@:)M([([^b(bc&&**,
3>>GG$%
a
 GGN#fx00446CQQTXXY&&**,
h!2!2!6!6!8:!E S SVZ Z[&&**,
 v"NN/		F H,vt$,,VW,E	%&!!#NN)H,=,=,A,A,Cj,P+^+^ae+ef$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 	-0A0A0E0E0G*0T/b/bei/ij
 ++"fq}}4O&*# !%55!GG  G  H.7+_q(GGrs}r~  A.4+*%a(33E:.2+.2:.>q.A+HH++8H3EP_  sJ+  K	!"o  	]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   F	!A\$ H9Aa W"Ac2 \$	A`?\-A$A_^A^$
^##A__A`?_A`?_AA`:`4A`?`:A`?a	Ac/aA$Ac*b/Ac
c#Ac*c$Ac/c*Ac/c2
Adc<AddAdr0   )returnN)NNN)r   )FNF)F)$rx   
__module____qualname____url__rp   r|   r   r   r   r   r   r   r   r   r   rL   rq   r   r   viewsactionr   r   compiler  r	  r   r%  r-  r0  r(  r8  r   rJ  r	  __classcell__)rt   s   @r    rl   rl      s    GE	EE:2X7A5? k#$ k# k#Z$ 	YYP P 'BJJ'cd;@z("
JJ	\* *X 	YYd dr"   rl   )6decimal	ipaddressr%   sysr   r]   stringrandomr   r  collectionsr   r  r   dataclassesr   r   r   r   r   r	   r
   uuidr   rT   r   r   ujsonr   r   
cmf.modelsr   cmf.includecmf.appr   cmf.util.metricsr!   r   on_server_eventr,   r?   onr3   rC   rN   rP   rV   rZ   re   rj   r  r  BaseViewrl   rd   r"   r    <module>r"     sf      
     	  #  $ < <   #     ( +,& - & 
(C86 96 
_,= -= 
[C( )  
\S)u *u 
!S1f 2f 
[C(. ). Pcii   Pr"   