U
    CPd                     @   s  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Zd d
l m!Z!m"Z" d dl#m$Z$ d dl%T d dl&m'Z' dd Z(e)e*dddd Z+dd Z,e-j.ddddd Z/e-j.ddddd Z0e-j.ddddd  Z1e-j.d!ddd"d# Z2e-j.d$ddd%d& Z3e-j.d'ddd(d) Z4d*d+ Z5d,d- Z6d.d/ Z7G d0d1 d1Z8G d2d3 d3ej9j:Z;dS )4    N)OrderedDict)deepcopy)is_dataclass)isclass
isfunctionismethod	signature)time)uuid4)Responserequest)dumpsloads)commit_all_dsrollback_all_ds)CmfType)*)	CMF_CACHEc                     s   t jrt t j dk rt jS t jdsdtjtj tj	  d
 fddtdD } t jd|  t jd t _t t _t jS )N   redis_id c                 3   s   | ]}t  V  qd S N)randomchoice.0iZletters ./modules/api/views/index.py	<genexpr>"   s     zget_redis_id.<locals>.<genexpr>   )APPREDIS_DB_IDr	   ZREDIS_DB_ID_TIMERZREDIS_DBexistsstringZascii_lowercaseZascii_uppercasedigitsjoinrangesetgetdecode)r   r   r   r   get_redis_id   s    r,   zCmfCache:flushdb)Zchannelc                  O   s   d t _td td d S )NzAPP.REDIS_DB_ID = NONE)r"   r#   printgdebugargskwargsr   r   r   flush_redis_id(   s    r3   c                 C   s   t | tjrt| S t | tjr(t| S t | tjjrdd | j	
 D }| j	
 D ]$\}}t |trT|jrT| ||< qT| j|d< |S t| | jd S )Nc                 S   s,   i | ]$\}}t |tr|jd k	r||jqS ).)
isinstancer   _value)r   attrfieldr   r   r   
<dictcomp>:   s
   
 
 z%cmf_dumps_default.<locals>.<dictcomp>
class_name)r4   	ipaddressIPv4AddressstrdecimalDecimalcmfmodels	BaseModel__dict__itemsr   ZvirtualZvirtual_getterr9   	TypeError	__class__)objresultr6   r7   r   r   r   cmf_dumps_default3   s    
rH   zjshash-invalidate-confirm/)	namespacec                 O   s   t |  d S r   )r   Zjshash_invalidate_confirm)Zconfirm_dictr1   r2   r   r   r   handle_messageG   s    rK   Zuser_regisrtyc                 C   sN   ddl m}m} td|   | dd }|r6|| tjd| |d d S )Nr   	join_room
leave_roomzhandle_user_regisrty: user_idzMe registered: roomflask_socketiorM   rN   r-   r*   socketioemitparamsrM   rN   rO   r   r   r   handle_user_regisrtyK   s    rX   rM   c                 C   s   ddl m} td|   || d  tjjjd| d d}tt|}tj	d| d  d	| d  d
|i| d d tj	d| d  || d | d | d d| d d d S )Nr   )rM   handle_user_join_room: 	room_namerI   rJ   rQ   zUser rO   z	 join to participantsrP   z
Joined to 	user_name
user_login)r\   r]   r^   rO   )
rS   rM   r-   rT   servermanagerget_participantslenlistrU   )rW   rM   r\   ZparticipantsSizer   r   r   handle_user_join_roomU   s    ,rd   rN   c                 C   sd   ddl m} td|   || d  tjjjd| d d}tjddtt	|i| | d d	 d S )
Nr   )rN   rY   rZ   rI   r[   zUser leave roomr\   rP   )
rS   rN   r-   rT   r_   r`   ra   rU   rb   rc   )rW   rN   r\   r   r   r   handle_user_leave_roomf   s
    re   document_broadcastc                 C   s   t jd| | d tjjd d S )Nrf   rZ   )rQ   Zskip_sid)rT   rU   flaskr   Zsid)rW   r   r   r   handle_document_broadcastn   s    rh   Z	user_pingc                 C   sB   ddl m}m} td|   | dd }|r>td|  d S )Nr   rL   zhandle_user_ping: rO   Z
user_pong_rR   rV   r   r   r   handle_user_pings   s
    ri   c                 C   s:   zt j| tt jdW S  tk
r4   td  Y nX d S )N)defaultoptionzorjson.dumps error)orjsonr   rH   ZOPT_NON_STR_KEYSrD   r.   r/   )rF   r   r   r   	cmf_dumps|   s
    
rm   c                    s   i  fdd}|S )Nc                     s4   t | t| f}|kr, | ||< | S r   )pickler   sortedrC   )r1   r2   hashfuncZmemoryr   r   memo   s    zmemoized.<locals>.memor   )rr   rs   r   rq   r   memoized   s    rt   c                 C   s   dt krt t _|t j| < d S )Nprofiler_data)r.   r   ru   )keymsr   r   r   set_call_time   s    rx   c                   @   s   e Zd Zd%ddZdd Zejjp(ejjddd	Z	d&d
dZ
d'ejjdddZd(ddZdd Zed)ejjdddZdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ ZdS )*CmfResultSplitterNFc                 C   sP   || _ i | _t | _d | _d | _d | _d| _t | _d| _	|| _
i | _|| _d S )Nr   )_objmetar)   meta_fields_keeprG   startendnumber_of_objectsm2m_id_cachedepthno_meta3_CmfResultSplitter__project_perm_add_comments_cacheno_acl)selfrF   r   r   r   r   r   __init__   s    zCmfResultSplitter.__init__c                    s    fdd}|S )Nc                    sL   |  j d7  _ | j dkrd S  | f||}|  j d8  _ | j dksHt|S )Nr   
   r   )r   AssertionError)r   r1   r2   retfnr   r   wrap   s    
z,CmfResultSplitter._check_depth.<locals>.wrapr   )r   r   r   r   r   _check_depth   s    zCmfResultSplitter._check_depth)oc                 C   s"   |j | jkrt|j| j|j < d S r   )r9   r{   r   Zui_metar   r   r   r   r   _add_class_to_meta   s    z$CmfResultSplitter._add_class_to_metac                 C   s  | d}| d}| d}| d}| d}| d}| d}	tt|}
i }d}d}tjj|||d	||||	|d
	p~t }t|
tjjr|
j	r|r|
dd }tt|d}|j |
j	}| d}| d}|r|jstjj||||
j	|||d	|d	}t|t|@ }|dkrF| drFtj||sFd}t }| dd	rxt|}d|krp|d t|}d|krd|krdnd}t| }tjdstjdrd|
jkrd|kr|d |D ]}|tjkr||= q|
j |}|dks|r$|jr$qd}tjj||||||||	d	|d
pNt }|dkrf|rft }|dkr^|r^|dr^|| jkr| j| s^d|kr^t|}|d nt|}tj|ddgdd}|jjp|jj}|sd|kr
t|}|d d	| j|< nH|jd |d	d!d	krTd|krHt|}|d d	| j|< n
d| j|< |d"kr|d#krt|}| d d|krd|krdnd}|r|||< |dkr||kr||= q|r||d$< |r||d%< |S )&u;  
        Чтобы код не дблировать для модели, простой модели и дикта, можно проверять итоговый json
        Правда в таком случае, мы обходим все данные, даже если они не доступны.
        perm_effective_acl_idcmf_owner_idid	parent_idr9   perm_parent_id%perm_security_level_allowed_ids_cacheNF)	initial_acl_keyobject_modelobject_owner_idraise_error	object_idobject_parent_idobject_dictperm_security_level_allowed_idschecked_policy:r   perm_inherit_acl_idperm_parent_owner_id)	r   r   r   object_fieldr   r   r   r   r   
CmfCommentZprivateTcmf_deletedwritereadreadonlydeny.getz.ui_getZcomments)r   r9   )
r   r   r   r   r   r   r   r   r   r   zCmfProject:root_parent_id)fieldsinclude_deletedzPPP-COM-ADD)rF   r   codeZ
CmfProjectZ_acl_fields_acl_obj)!r*   getattrr@   CmfAccessListcheck_accessr)   
issubclassr?   	CmfEntityZacl_parent_field	partitionr   r   r   Zcheck_visibilityremovetuplerc   keysr.   
api_methodendswithappendapi_hack_fields
startswithr   cmfutilZget_obj_by_idr   valuer   Zcheck_project_role_accessadd)r   Zobj_dict
acl_policyr   obj_owner_idobj_idobj_parent_idr9   r   r   modelZ
acl_fieldsZacl_objZcomment_denyZaccess_levelsZparent_class_nameZparent_modelZparent_fieldr   r   Zparent_access_levelsZ_tmpZobj_keys
field_namer7   Z	acl_fieldZfield_access_levelsZproject_Zobj_Zproject_id_r   r   r   _acl_obj_dict   s    







     

     




     








zCmfResultSplitter._acl_obj_dictr   c                 C   s   |  j d7  _ | js| | d|ji}|jddD ]$}|js@q4| j||d d||j< q4| js|jdkr| j	|t
|dd d}|S )	Nr   r9   T)
is_definedr   Zpublic_read_acl_policyr   )r   r   r   r9   valuesr   _process_cmf_typer   Zacl_typer   r   )r   r   r   rG   vr   r   r   _process_cmf_model?  s    

z$CmfResultSplitter._process_cmf_modelc                 C   s   |  j d7  _ | js*tt|j}| | i }|j D ].\}}| jsX| j	|j|f | 
|||< q8| js| j|t|dd d}|S )Nr   r   r   )r   r   r   r@   r9   r   rB   rC   r|   r   _processr   r   )r   rF   r   r   rG   r6   r   r   r   r   _process_simple_modelN  s    
z'CmfResultSplitter._process_simple_modelc                    s    fdd  |S )Nc                    s   t | tr fdd| D S t | tr| d} fdd|  D }t |trd|krĈ jd7  _tjj	
|}js| | D ]}j|j|f q|j|d< jsĈj|| d	d
}|S | S )Nc                    s   g | ]} |qS r   r   )r   elproccess_jsonr   r   
<listcomp>_  s     zSCmfResultSplitter._process_json_as_model.<locals>.proccess_json.<locals>.<listcomp>r   c                    s   i | ]\}}| |qS r   r   )r   kr   r   r   r   r8   b  s      zSCmfResultSplitter._process_json_as_model.<locals>.proccess_json.<locals>.<dictcomp>r   r   r9   r   r   )r4   rc   dictr*   rC   r<   r   r?   r   ZCmfTUUIDZget_cls_by_tuuid_strr   r   r|   r   r9   r   r   )rF   r   datar   r   r   r   r   r   r   ]  s"    




z?CmfResultSplitter._process_json_as_model.<locals>.proccess_jsonr   r   r   r   r   _process_json_as_model\  s    z(CmfResultSplitter._process_json_as_modelc                 C   sb  |  j d7  _ | js*| j|jj|jf t|tjj	rD| 
|jS t|tjjr^| |jS t|tjjrx| |jS t|tjjrt|| jkrd S | jt| |jrd S | j|j|d d}| jt| |S t|tjjrFt|| jkrg S | jt| g }|jD ]}| |}|| q| jt| |S |j}|dkr\|jS |jS )Nr   r   .)r   r   r|   r   instancer9   r4   r?   r   ZCmfObjectJsonr   r   ZCmfObjectList_process_listZ	CmfObjectr   ZCmfRelationBaser   r   Zis_nullr   Z
CmfRelBaser   Zjsonrj   )r   r   r   resrG   r   pr   r   r   r   q  s@    


z#CmfResultSplitter._process_cmf_typec                    s$     j d7  _  fdd|D }|S )Nr   c                    s   g | ]}  |qS r   )r   )r   er   r   r   r     s     z3CmfResultSplitter._process_list.<locals>.<listcomp>)r   )r   r   rG   r   r   r   r     s    zCmfResultSplitter._process_listc                 C   s   |  j d7  _ t }| D ]v\}}| |||< | js|dkr|rt|trtt|	dd d }|r| 
| | D ]}| j|j|f qzq|dr|dr| js| j||dd}|S )Nr   r   r   r   r9   r   r   )r   r   rC   r   r   r4   r<   r   r@   splitr   r   r|   r   r9   r*   r   r   )r   r   rG   r   r   mr   r   r   r   _process_dict  s    
zCmfResultSplitter._process_dictc                 C   s   |  j d7  _ t|tr"| |S t|tjjr:| |S t|tjj	rR| 
|S t|rd| |S t|trx| |S t|tjtjfrt|S t|tjtjfr| S |S )Nr   )r   r4   rc   r   r?   r   r   r   r@   rA   r   r   r   r   r   r:   r;   r=   r>   r<   datetimedateZ	isoformat)r   rF   r   r   r   r     s     






zCmfResultSplitter._processc                 C   sB   | j  D ]2\}}t|d D ]}||f| jkr|d |= qq
d S )Nr   )r{   rC   rc   r|   r   r9   Zclass_valuer   r   r   r   _process_meta  s    zCmfResultSplitter._process_metac                    s\   d fdd	  j  j D ]2\}}t|d D ]}||fjkr8|d |= q8q$d S )Nr   c           	         s   j d7  _ t| rdtt| j}| | j D ](\}}j	|j|f  ||d  q6n t
| tjjrtt| j}| | j D ]>\}}t
|tr|jdk	rj	|j|f  |j|d  qnt
| tr| D ]} ||d  qnt
| trd }| d}|rJt
|trJtt|dd d  }rJ| |  D ]0\}}|rrj	|j|f  ||d  qRd S )Nr   .r   r   r   )r   r   r   r@   r9   r   rB   rC   r|   r   r4   r?   rA   r   r5   rc   r   r*   r<   r   )	rF   r   r   Zsub_attrZ	sub_valueZ	sub_fieldsubr   Zsub_keyprocess_jsonr   r   r   r     s6    




z<CmfResultSplitter._process_simple_meta.<locals>.process_jsonr   )r   )rz   r{   rC   rc   r|   r   r   r   r   _process_simple_meta  s    
z&CmfResultSplitter._process_simple_metac                 C   s$   | j r| jsd S t| j| j  d S )N  )r}   r~   intr   r   r   r   rw     s    zCmfResultSplitter.msc                 C   s0   t  | _| | j| _| js$|   t  | _d S r   )r	   r}   r   rz   rG   r{   r   r~   r   r   r   r   r     s
    zCmfResultSplitter.splitc                 C   s<   t  | _tjr| jn
| | j| _| js0|   t  | _	d S r   )
r	   r}   r.   Zdisable_permissionsrz   r   rG   r   r   r~   r   r   r   r   split_simple  s
    zCmfResultSplitter.split_simple)NF)N)r   )r   )r   )__name__
__module____qualname__r   r   r?   r@   CmfModelZBaseModelMetar   r   rA   r   r   r   r   r   r   r   r   r   r   r   rw   r   r   r   r   r   r   ry      s$   

 
0&ry   c                       s  e Zd ZdZd4dd fddZd5ddZd6dd	Zd7d
dZdd Zd8ddZ	dd Z
d9ddZdd Zd:ddZed;ddZdd Zejjdd ZedZd<d!d"Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd=ed/d0d1Z ejjd2d3 Z!  Z"S )>ApiViewrI   N)returnc                    s   t    | j|d| _d S )N)extra_models_list)superr   get_rpcrpc)r   r   rE   r   r   r     s    
zApiView.__init__c                 C   s   |rdd |j jD |d< |S )Nc                 S   s   g | ]
}|j qS r   )r   )r   Ze_clsr   r   r   r     s     z/ApiView._add_exception_info.<locals>.<listcomp>Zexception_types)rE   __mro__)r   rG   	exceptionr   r   r   _add_exception_info  s    zApiView._add_exception_infoc                 C   s*   d||dt dt jd}| j||dS )N2.0)r   messagealert)jsonrpcerrorr   callidr   )r.   r*   
api_callidr   )r   r   r   r   rG   r   r   r   _error  s    zApiView._errorc                 C   sV   |sg }d|||t j|t dt d|t |t d}t jrHt j|d< | j||dS )Nr   ru   r   )r   rG   r{   jsverr  jsurlru   r   abortversion
invalidater   jscache_timelifer  )r.   r  r*   Zcmf_get_versionr,   r  r   )r   rG   r{   r  r  r
  r  r   r   r   r   _ok"  s$    
zApiView._okc                 C   s   |  ddS )NiDzParse errorr  r   r   r   r   parse_error7  s    zApiView.parse_errorc                 C   s&   d}|  d|d kr|n| d| S )NzInvalid Requestiz: r  )r   r   titler   r   r   invalid_request:  s    zApiView.invalid_requestc                 C   s   |  ddS )NizMethod not foundr  r   r   r   r   method_not_found>  s    zApiView.method_not_foundr   c                 C   s   |  dd| S )NizInvalid params: r  )r   r   r   r   r   invalid_paramsA  s    zApiView.invalid_paramsc                 C   s   |  ddS )NizInternal errorr  r   r   r   r   internal_errorD  s    zApiView.internal_errorc                 C   s$   |t dddkst| j|||dS )Ni ir  )r(   r   r  )r   r   r   r   r   r   r   server_errorG  s    zApiView.server_errorc                 C   s  i }|sg }nt |}|tjj tt|D ]}t|rR|}t|d|j}n<tt|d pjttj|d }t|svq0t	|tjjsq0|j
rq0i }t|D ]}t||}t||}|drqt|st|st|tjsq|tjjkr|dkrqt|t}	t|t}
t|tj}|| |	|
|dd}|||d < qt	|tjjr|j D ]\}}g }t	|tjjtjjfrddd	d
g}nt	|tjjrddg}|D ]D}| d| }t||}||t|ddddd|| d| < qqR|||d}|||d < q0|S )Nr9   _)Zall_models_metaZpublic_all_models_metaZget_ui_full_pathZpublic_get_ui_full_pathZsdesk_get_ui_full_pathZpublic_noneZpublic_none_classmethodF)_methodnameis_class_methodis_static_methodis_taskis_field_methodr  r   r   extendZ
all_nested.T)r  r  r   r  r  r  r  )_classr  methods)rc   r   r?   r@   rA   dirr   r   r   r   ZabstractinspectZgetattr_staticr   r   r   r4   Z
celery_appZTaskclassmethodstaticmethodlowerr   rC   ZCmfM2MZCmfGenericM2MZCmfJsonr   )r   r   Z
rpc_modelsZ
model_nameclsZrpc_methodsZmethod_namemethodZmethod_attrr  r  r  Z
rpc_methodr   Z	field_clsZ
submethodsZ	submethodr  Z	rpc_modelr   r   r   r   L  sz    



	
zApiView.get_rpcc                 C   s   |dkS )NZ	qweqweqwer   )r   tokenr   r   r   check_token  s    zApiView.check_tokenc                 C   s   | j d| jtdS )Nz
index.html)r   r
   )Zrender_with_paramsr   r
   r   r   r   r   r*     s    zApiView.getz9"(?P<attr>(cmf|doc|obj|approved)_version)":(?P<value>\d+)Fc           
   	   C   s   t jsV|sVt|tkrVt|dkrVtj tdddkrVtdt| dt	j
 d | |||||}|rt|}	t| jd|	 }	nt|d	d
d}	t| jd|	}	t js|st|	dkrtj tdddkrtdt|	 dt	j
 d | j||||||ddS t|	ddS )Ni,  i  r   r   uw   Разработчик внимание! Слишком много строк через API. Используй slice z, z...z"\g<attr>":"\g<value>"r   F)indentZensure_asciii   uq   Разработчик внимание! Слишком большой размер данных через API.  T)orjson_r
  	recursionzapplication/json)Zmimetype)configZ
PRODUCTIONtyperc   rb   r   r   Ztoday	cmf_alertr.   r   r  rm   rer   _BIG_INT_JSON_HACK_REr+   r   sys	getsizeofresponse_okr   )
r   result_dictr{   r  r  r,  r
  r-  ZresponseZ	json_datar   r   r   r5    s     
zApiView.response_okc                 C   s   t jr
d S tjdrd S |ds2t d d S tj 	dd d t j
jjd}t||rtt d |d S t d	 d S )
NNO_CACHEjshash:z$api_cache_add failed, invalid jshash%Y%m%d%H%M%S%f)r  Zcurrent_person_idzapi_cache_add endr  zapi_cache_add failed)r.   Zno_jscache_forceosenvironr*   r   r/   r   utcnowstrftimecurrent_personr   r   r   Z_obj_dict_set)r   rp   Z	res_cacher   r   r   api_cache_add  s    


zApiView.api_cache_addc                 C   sL   t jdrd S |dsd S t|}|s0d S t|}td|  |S )Nr7  r8  zAPI CACHE HIT )	r;  r<  r*   r   r   _obj_dict_getrn   r   r-   )r   rp   Z_resr   r   r   r   api_cache_get  s    


zApiView.api_cache_getc                 O   s   | j |f||S r   full_cache_validationr   jshash_list_args_kwargsr   r   r   public_full_cache_validation  s    z$ApiView.public_full_cache_validationc                 O   s   | j |f||S r   rC  rE  r   r   r   sdesk_full_cache_validation  s    z#ApiView.sdesk_full_cache_validationc                 O   sn   dt j  dd d i}|D ]6}|ds0q t|}|r t|}|d||< q | j	|d d t
jddS )Notherr9  r:  r8  r  T)r{   r  r  r,  )r   r=  r>  r   r   rA  rn   r   r*   r5  r.   r  )r   rF  rG  rH  rG   jshashZ
redis_data
cache_datar   r   r   rD    s    


zApiView.full_cache_validationc                 C   s   t jrt jt jkrdS dS )u;   
        Проверяем доступ к апи
        FT)r.   r?  Zanonymous_userr   r   r   r   _check_access  s    zApiView._check_access)r'  c                 C   s   z|j ddd\}}W n tk
r,   Y dS X || jkr<dS | j| }|d }d}|dkrr|jsr|srd| }d	}||d
 krdS |d
 | }||d< ||d< |S )u  
        Поиск метода rpc

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

        Возвращает не метод, а структуру из self.get_rpc + доп.поля:
         - use_simple - когда решили использовать slist или sget
         - _class - указатель на модель
        r  r   maxsplitNr  F)r*   rc   sTr   _use_simple)r   
ValueErrorr   disable_simple)r   r'  rT  Zproc_cls_nameproc_methodZproc_clsr&  
use_simpler   r   r   rpc_prepare_method  s$    


zApiView.rpc_prepare_methodc           :      C   s  d t _|  s| ddS t jjrPt jjtjkrP| ddt jj dtj dS t dt j	j
j d tj }ttj}t d|  t|ts|  S |d	t _|d
t _t jstddd t t _d|kr| dS |d t _|dd}|t _|dpi }|d}d|ks8t|trNd|krNtjdkrN| dS |dp\g }|d}|dkr|dpi }|r||d< |dd }	|	r|	|d< |dd }
|
r|
|d< |dd }|r||d< |dd }|r||d< |dd }|r||d< |dg t _d d!d"d#d$d%d&d'd(d)h
}t jD ]6}||krV|| |d* |kr>||d*  q>|t _|d+i t _ t j d,rt!j"#  |d-d }|r||d-< | d.S |d/}|d0d }|d1}|d }g }|d2kr| j$||S |d3kr| j%||S |d4kr4| j&||S d }|d5d }| '||}|s^| ( S |d6 }|d7 }|d8 }d9}d:D ]}||d kr~d}d9t _)d;|d krd9}|dkr|r|d< d=krt|d> t*rt+,|d>  d}|rd=|krt+,|d=  d}|r2d?|kr2t+,|d?  d}|rd|kr|d d< d=kr~t|d d> t*r~t+,|d d>  d}|d d< d?krt|d d> t*rt+,|d d>  d}|rd@|d< krt+,|d<  d}dA|d kr>dB|krt+,|dB  d}n2d|kr>|d d< dCkr>t+,|d d>  d}dDdEdFdGdHg}|D ]}||d krPd} qpqP|st dI|d    qq~dD|d krd9}|r|dJrd9}t-|d-d9rd9}|dK} |dL}!|!t _.|r|!d krtdM| dd d9}|r|r&t dN n| rtj }t dO | /|!}"t0dPtj | j1dQ  t dR |"r| |"dKkr|rt23|}t dS | j4d d |"dK |||dTS t dU |dV 
s|dW 
s|dX rn|dY| }#t j5dZd[ d\k}$|dkr~t d] d|krd=|d kr|d d< d=krt d^ t }%|d |%d< d=g|%d< |#|%dY< |$|%d_< |jf |%}t6|d d`kr||d= n|d=s|rt d^ |j|d=g||#|$da}n|r2d=|kr2t }%d=db|d=g|%d< d=g|%d< |#|%dY< |$|%d_< |jf |%}|7d=d nJ|rp|8 }%g |%d< d=g|%d< |#|%dY< |$|%d_< |jf |%}n| dcddS nlt6|d<ksd@|d< kr| dcdeS |7d<}&t }%d=db|&g|%d< d=g|%d< |#|%dY< |$|%d_< |jf |%}|	st df t9  | j:d i d |dgdhS t|t;j!j<	o*|j=j}'t|t;j!j>	oB|j?j}(t|t;j!j>	oZ|j@j})t|t;j!j<	or|jAjB}*t!j"jC|'|jD|(|jEj|)|di|*d9dj		st dk t!jFjGdi|jD|dldm t9  | j:d i d |dntH doS t dp dZ|dq k
r|dq j5dZdrds\}}+t!j"jC|'|jD||(|jEj|)|di|*d9dt

slt du t!jFjGdi|jD|dldm t9  | j:d i d |dvtH doS t-||},t-|,|+}nt-||dq }t0dwtj | j1dQ  tj }t dx|d   z4|dX 
r|jI||dy}-|-
o|-jE}.n
|||}.W n tJk
r }/ zftK|/ tLMdz t*|/}0tt-|/dd tNtOfrXd{Pd|d} |/jQD }0| j:d i d ||0|/do W Y S d }/~/X Y nh tRk
r }/ zHtSjTMd~ tK|/ d|d  d}1|1tUV 7 }1| jWd|1|/d W Y S d }/~/X Y nX t d t0dtj | j1dQ  tj }|r|jXrt d z|Y  W n tJk
r }/ zftK|/ tLMdz t*|/}0tt-|/dd tNtOfrd{Pdd} |/jQD }0| j:d i d ||0|/do W Y S d }/~/X Y nX t d t0dtj | j1dQ  tj }tK  t0dtj | j1dQ  tj }|dq dkr:|.o6|.jEj}.n"|dq dkr\tZ|.d=r\|.jEj}.t[|.|d}2t d |r|2\  n|25  t0dtj | j1dQ  |2j]|2j^ }3}4|dq dkrV|4rVd}5t|4tr|4ddkrdl}5|j_dks |5dlkrVt|4tr(t!jFjGdi|jD|4d= |5dm n.t`|4rLt!jFjGdi|jD|4jE|5dm n
ta|4d|dq dkrd}5d9}6d9}7|4D ].}8t|8tr|8dd dkrd}6nd}7qt|6r|7rd}5n
|6rdl}5|j_dks|5dlkrt!jFjGdi|jD|5d t0d|2jb t d tj }|r(t-t dd s(| c|!} |r8t23|}z| j4|4|3| |||d}9W n< tdk
r }/ zt d| d|4   W 5 d }/~/X Y nX t0dtj | j1dQ  t d |9S )Ni  u   Нет правu>   Версия Eva отличается от версии БД: z != u   . Вероятно была запущен несовместимый образ Eva, либо были проблемы во время обновления и патчи применились частично.zAPI request start ()z	json_res=session_tab_idr  zAPI: No callid specifiedT)Z
devel_onlyr'  zNo method specifiedr  r   r2   save_kwargsZ	only_dataz	127.0.0.1uM   SPEC0 Использование only_data через API запрещено.r1   r   r   filterr   sliceorder_bygroup_byr   r   r   r   r   Z
user_localZvacation_endZvacation_startZperm_encryptZimport_originalr   Z_idflagsZ
admin_modeno_cacheu)   no_cache запрещен go to spec0 osv
no_jscacher   cache_idzCache.full_cache_validationz"Cache.public_full_cache_validationz!Cache.sdesk_full_cache_validationrT  r  r  rR  F)r   Z_getz.listZ_listz.selectZ_selectz.sumZ_sumz.count_countz.maxZ_maxz.minZ_minr*   r   r      r   r   zCmfPersonVar.getZ	person_idZpersonZget_current_userZget_settingsZCmfRFilezCmfPersonVar.get_metaZCmfMenuTreez+Possible cache return invalid_data: method=Zsearch_stringr  rL  ur   ошибка на frontend методы list get и тп должны быть с jshash, кроме тестов z$api_cache_get skip due to no_jscachezapi_cache_get startrB  r   zapi_cache_get endzapi_cache_get hit!)r6  r{   r  r  r,  r
  zapi_cache_get jsver mismatch!r  r  r  
for_updater  r  ZrestorezAPI object get startu~   deprecated id объекта нужно передавать в kwargs или может вообще параметром RPCr      )r[  r   r]  re  r   z==i  u   Необходимо указать filter или kwargs для получения объекта перед вызовом его методаu1   Необходимо указать id в args[0]zAPI object get Noneu>   Объект не найден, возможно удалён.)rG   r{   r  r  r  r   )	r   r   r   r   r   object_instanceaccess_levelr   r   zAPI object access prohibitedZfail)operatecmf_model_nameparentresult_statusuE   Объект недоступен: недостаточно прав.)rG   r{   r  r  r  r   zAPI object get endr  r   rO  )
r   r   r   r   r   r   rg  rh  r   r   z"API object field access prohibiteduQ   Поле объекта не доступно: недостаточно прав.ZpreparezAPI method start r0   zUserError Trace:r+  c                 S   s   g | ]}t |qS r   r<   r   r   r   r   r   s  s     z ApiView.post.<locals>.<listcomp>	Exceptionu/   Ошибка выполнения метода z

ir  zAPI method endZcall_method_mszAPI save startc                 S   s   g | ]}t |qS r   rm  r   r   r   r   r     s     zAPI save endsaveZcommit)ZcreateZupsertZcreate_from_templateupdate)r   zAPI json dump startZresult_to_dict_ms)r*   sgetokr   r   z$get result must be dict or dataclass)rc   ZslistZ	partially)ri  rj  rl  r   zAPI json dump endZcache_store_error)r
  r,  uQ   Ошибка конвертации результата запроса json_res=z result_dict=Zresult_to_response_mszAPI request end)er.   r  rN  r  Zglobal_settingsZeva_versionr.  ZEVA_VERSIONr/   r?  r   r   r   Znowr   r   r   r4   r   r  r*   rY  r0  r
   r  r   r  Zremote_addrr  Z
api_fieldsr   r   r_  r@   r   Zactivate_admin_moderD  rI  rJ  rW  r  Zin_memory_cacher<   r   Zcache_obj_lock_getr   rL  rB  rx   Zmicrosecondsr   Zjshash_invalidate_confirm_listr5  r   rb   popcopyr   r  r?   r   r   r   r   r   r   oldr   r9   r   ZCmfAuditZaudit_eventZCmfPermissionErrorZapply_asyncZCmfUserErrorr   Zloggingr   rc   r   r'   r1   rn  r"   logger	traceback
format_excr  Z
is_changedro  hasattrry   r   r{   rG   Zacl_default_user_policyr   rD   r   r@  rS  ):r   Z
start_dateZjson_resr  r2   rZ  r1   Zjsonrpc_verZ_filterr   r\  r]  r^  r   r   r   r`  ra  r   rb  r'  Zinvalidate_listrF   rT  rU  r&  rV  Zapi_use_cacherQ  Zcache_lock_okZ_cachelock_skip_methodsr   r  rL  rM  re  r   Z
tmp_kwargsr   r   r   r   r   Zfield_methodZ	obj_fieldZtaskrG   r   Z	abort_msgmsgZsplitterr{   r6  Zcheck_result_statusZcheck_result_have_denyZcheck_result_have_okrz   Zrespr   r   r   post$  s6    





 


       










.&&
   









 


*







        
    
     
    



     	&



     




  
  





zApiView.post)N)N)N)NNN)N)r   )N)N)FNF)F)#r   r   r   Z__url__r   r   r  r  r  r  r  r  r  r  rt   r   r)  r?   viewsactionr*   r1  compiler2  r5  r@  rB  rI  rJ  rD  rN  r<   rW  r{  __classcell__r   r   r   r   r     s6   

	



S


	(r   )<r=   r:   r3  r   rn   r%   r   r1  rw  collectionsr   rt  r   Zdataclassesr   r"  r   r   r   r   r	   Zuuidr
   rg   r   r   Zujsonr   r   rl   Z
cmf.modelsr?   Zcmf.data_providers.baser   r   Z
cmf.fieldsr   Zcmf.includeZcmf.appr   r,   r$  Zon_server_eventr3   rH   rT   ZonrK   rX   rd   re   rh   ri   rm   rt   rx   ry   r|  ZBaseViewr   r   r   r   r   <module>   s\   	

	



  y