U
    4e^                     @   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                  C   sd   t jrt t j dk rt jS t jdsDtt } t jjd| dd t jd	 t _t t _t jS )N   redis_idT)Znx)
APPREDIS_DB_IDr	   ZREDIS_DB_ID_TIMERZREDIS_DBexistsintsetgetdecode)r    r   ./modules/api/views/index.py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    r&   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).0attrfieldr   r   r   
<dictcomp>?   s
   
 
 z%cmf_dumps_default.<locals>.<dictcomp>
class_name)r'   	ipaddressIPv4AddressstrdecimalDecimalcmfmodels	BaseModel__dict__itemsr   ZvirtualZvirtual_getterr-   	TypeError	__class__)objresultr*   r+   r   r   r   cmf_dumps_default8   s    
r<   zjshash-invalidate-confirm/)	namespacec                 O   s   t |  d S N)r   Zjshash_invalidate_confirm)Zconfirm_dictr$   r%   r   r   r   handle_messageL   s    r@   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_socketiorB   rC   r    r   socketioemitparamsrB   rC   rD   r   r   r   handle_user_regisrtyP   s    rM   rB   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   )rB   handle_user_join_room: 	room_namer=   r>   rF   zUser rD   z	 join to participantsrE   z
Joined to 	user_name
user_login)rQ   rR   rS   rD   )
rH   rB   r    rI   servermanagerget_participantslenlistrJ   )rL   rB   rQ   ZparticipantsSizer   r   r   handle_user_join_roomZ   s    ,rY   rC   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   )rC   rN   rO   r=   rP   zUser leave roomrQ   rE   )
rH   rC   r    rI   rT   rU   rV   rJ   rW   rX   )rL   rC   rQ   r   r   r   handle_user_leave_roomk   s
    rZ   document_broadcastc                 C   s   t jd| | d tjjd d S )Nr[   rO   )rF   Zskip_sid)rI   rJ   flaskr   Zsid)rL   r   r   r   handle_document_broadcasts   s    r]   Z	user_pingc                 C   sB   ddl m}m} td|   | dd }|r>td|  d S )Nr   rA   zhandle_user_ping: rD   Z
user_pong_rG   rK   r   r   r   handle_user_pingx   s
    r^   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   r<   ZOPT_NON_STR_KEYSr8   r!   r"   )r:   r   r   r   	cmf_dumps   s
    
rb   c                    s   i  fdd}|S )Nc                     s4   t | t| f}|kr, | ||< | S r?   )pickler   sortedr7   )r$   r%   hashfuncZmemoryr   r   memo   s    zmemoized.<locals>.memor   )rg   rh   r   rf   r   memoized   s    ri   c                 C   s   dt krt t _|t j| < d S )Nprofiler_data)r!   r   rj   )keymsr   r   r   set_call_time   s    rm   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_keepr;   startendnumber_of_objectsm2m_id_cachedepthno_meta3_CmfResultSplitter__project_perm_add_comments_cacheno_acl)selfr:   rw   ry   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   )rv   AssertionError)rz   r$   r%   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?   )r-   rp   r   Zui_metarz   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_idr-   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   r-   )
r   r   r   r   r   r   r   r   r   r   zCmfProject:root_parent_id)fieldsinclude_deletedzPPP-COM-ADD)r:   r   codeZ
CmfProjectZ_acl_fields_acl_obj)!r   getattrr4   CmfAccessListcheck_accessr   
issubclassr3   	CmfEntityZacl_parent_field	partitionr   ry   r   Zcheck_visibilityremovetuplerX   keysr!   
api_methodendswithappendapi_hack_fields
startswithrx   cmfutilZget_obj_by_idr   valuer   Zcheck_project_role_accessadd)rz   Zobj_dict
acl_policyr   obj_owner_idobj_idobj_parent_idr-   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_namer+   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   r-   T)
is_definedrv   Zpublic_read_acl_policyr   )rt   rw   r   r-   valuesr   _process_cmf_typery   Zacl_typer   r   )rz   r   rv   r;   vr   r   r   _process_cmf_modelD  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   )rt   rw   r   r4   r-   r   r6   r7   rq   r   _processry   r   )rz   r:   rv   r   r;   r*   r   r   r   r   _process_simple_modelS  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>d  s     zSCmfResultSplitter._process_json_as_model.<locals>.proccess_json.<locals>.<listcomp>r   c                    s   i | ]\}}| |qS r   r   )r)   kr   r   r   r   r,   g  s      zSCmfResultSplitter._process_json_as_model.<locals>.proccess_json.<locals>.<dictcomp>r   r   r-   r   r   )r'   rX   dictr   r7   r0   rt   r3   r   ZCmfTUUIDZget_cls_by_tuuid_strrw   r   rq   r   r-   ry   r   )r:   r   datar   r   r   rz   r   r   r   b  s"    




z?CmfResultSplitter._process_json_as_model.<locals>.proccess_jsonr   r   r   r   r   _process_json_as_modela  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   .)rt   rw   rq   r   instancer-   r'   r3   r   ZCmfObjectJsonr   r   ZCmfObjectList_process_listZ	CmfObjectr   ZCmfRelationBaser   ru   Zis_nullr   Z
CmfRelBaser   Zjsonr_   )rz   r   rv   resr;   ipr   r   r   r   v  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rz   r   r   r     s     z3CmfResultSplitter._process_list.<locals>.<listcomp>)rt   )rz   r   r;   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   r-   r   r   )rt   r   r7   r   rw   r'   r0   r   r4   splitr   r   rq   r   r-   r   ry   r   )rz   r   r;   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   )rt   r'   rX   r   r3   r   r   r   r4   r5   r   r   r   r   r   r.   r/   r1   r2   r0   datetimedateZ	isoformat)rz   r:   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   )rp   r7   rX   rq   rz   r-   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   )rt   r   r   r4   r-   r   r6   r7   rq   r   r'   r3   r5   r   r(   rX   r   r   r0   r   )	r:   rv   r   Zsub_attrZ	sub_valueZ	sub_fieldsubr   Zsub_keyprocess_jsonrz   r   r   r     s6    




z<CmfResultSplitter._process_simple_meta.<locals>.process_jsonr   )r   )ro   rp   r7   rX   rq   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  )rr   rs   r   r   r   r   r   rl     s    zCmfResultSplitter.msc                 C   s0   t  | _| | j| _| js$|   t  | _d S r?   )r	   rr   r   ro   r;   rp   r   rs   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	   rr   r!   Zdisable_permissionsro   r   r;   rw   r   rs   r   r   r   r   split_simple  s
    zCmfResultSplitter.split_simple)NF)N)r   )r   )r   )__name__
__module____qualname__r{   r   r3   r4   CmfModelZBaseModelMetar   r   r5   r   r   r   r   r   r   r   r   r   r   r   rl   r   r   r   r   r   r   rn      s$   

 
0&rn   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 )>ApiViewr=   N)returnc                    s   t    | j|d| _d S )N)extra_models_list)superr{   get_rpcrpc)rz   r   r9   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)r9   __mro__)rz   r;   	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   )rz   r   r   r   r;   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   rj   r   )r   r;   rp   jsverr   jsurlrj   r   abortversion
invalidater   jscache_timelifer   )r!   r   r   Zcmf_get_versionr   r   r   )rz   r;   rp   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_error<  s    zApiView.parse_errorc                 C   s&   d}|  d|d kr|n| d| S )NzInvalid Requestiz: r  )rz   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_foundC  s    zApiView.method_not_found c                 C   s   |  dd| S )NizInvalid params: r  )rz   r   r   r   r   invalid_paramsF  s    zApiView.invalid_paramsc                 C   s   |  ddS )NizInternal errorr  r   r   r   r   internal_errorI  s    zApiView.internal_errorc                 C   s$   |t dddkst| j|||dS )Ni ir   )ranger}   r   )rz   r   r   r   r   r   r   server_errorL  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 )Nr-   _)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)rX   r   r3   r4   r5   dirr   r   r   r   ZabstractinspectZgetattr_staticr   r   r   r'   Z
celery_appZTaskclassmethodstaticmethodlowerr   r7   ZCmfM2MZCmfGenericM2MZCmfJsonr   )rz   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   Q  sz    



	
zApiView.get_rpcc                 C   s   |dkS )NZ	qweqweqwer   )rz   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typerX   rW   r   r   Ztoday	cmf_alertr!   r   r  rb   rer   _BIG_INT_JSON_HACK_REr   r   sys	getsizeofresponse_okr   )
rz   result_dictrp   r   r   r#  r   r$  ZresponseZ	json_datar   r   r   r,    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|t|rzt 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_setrc   r   )rz   re   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 )Nr.  r/  zAPI CACHE HIT )	r2  r3  r   r   r   _obj_dict_getrc   r   r    )rz   re   Z_resr   r   r   r   api_cache_get  s    


zApiView.api_cache_getc                 O   s   | j |f||S r?   full_cache_validationrz   jshash_list_args_kwargsr   r   r   public_full_cache_validation  s    z$ApiView.public_full_cache_validationc                 O   s   | j |f||S r?   r:  r<  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otherr0  r1  r/  r   T)rp   r   r   r#  )r   r4  r5  r   r   r8  rc   r   r   r,  r!   r   )rz   r=  r>  r?  r;   jshashZ
redis_data
cache_datar   r   r   r;    s    


zApiView.full_cache_validationc                 C   s   t jrt jt jkrdS dS )u;   
        Проверяем доступ к апи
        FT)r!   r6  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   rX   sTr  _use_simple)r   
ValueErrorr   disable_simple)rz   r  rK  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 _)t j*+|j, d;|d krHd9}|dkr|r|d< d=krt|d> t-rt./|d>  d}|rd=|krt./|d=  d}|r@d?|kr@t./|d?  d}|rd|kr|d d< d=krt|d d> t-rt./|d d>  d}|d d< d?krt|d d> t-rt./|d d>  d}|rd@|d< krt./|d<  d}dA|d krdBdCdDdEdFg}|D ]}||d krd} q.q|sHt dG|d    qRq~dB|d krdd9}|rz|dHrzd9}t0|d-d9rd9}|dI} |dJ}!|!t _1|r|!d krtdK| dd d9}|r|rt dL n| rtj }t dM | 2|!}"t3dNtj | j4dO  t dP |"r| |"dIkrv|rRt56|}t dQ | j7d d |"dI |||dRS t dS |dT 
sl|dU 
sl|dV rn|dW| }#t j8dXdY dZk}$|dkr<t d[ d|kr^d=|d kr^|d d< d=kr^t d\ t }%|d |%d< d=g|%d< |#|%dW< |$|%d]< |jf |%}t9|d d^kr:|d= n|d=s|rt d\ |j|d=g||#|$d_}n|rd=|krt }%d=d`|d=g|%d< d=g|%d< |#|%dW< |$|%d]< |jf |%}|:d=d nJ|r.|; }%g |%d< d=g|%d< |#|%dW< |$|%d]< |jf |%}n| dadbS nt9|d<ksXd@|d< krd| dadcS |:d<}&t }%d=d`|&g|%d< d=g|%d< |#|%dW< |$|%d]< |dd dekrt j<=t-|& |jf |%}|st df t>  | j?d i d |dgdhS t|t@j!jA	o|jBj}'t|t@j!jC	o|jDj}(t|t@j!jC	o6|jEj})t|t@j!jA	oN|jFjG}*t!j"jH|'|j,|(|jIj|)|di|*d9dj		st dk t!jJjKdi|j,|dldm t>  | j?d i d |dntL doS t dp dX|dd k
r^|dd j8dXdqdr\}}+t!j"jH|'|j,||(|jIj|)|di|*d9ds

sHt dt t!jJjKdi|j,|dldm t>  | j?d i d |dutL doS t0||},t0|,|+}nt0||dd }t3dvtj | j4dO  tj }t dw|d   z4|dV 
r|jM||dx}-|-
o|-jI}.n
|||}.W n tNk
r^ }/ zftO|/ tPQdy t-|/}0tt0|/dd tRtSfr4dzTd{d| |/jUD }0| j?d i d ||0|/do W Y S d }/~/X Y nh tVk
r }/ zHtWjXQd} tO|/ d~|d  d}1|1tYZ 7 }1| j[d|1|/d W Y S d }/~/X Y nX t d t3dtj | j4dO  tj }|r|j\rt d z|]  W n tNk
r }/ zftO|/ tPQdy t-|/}0tt0|/dd tRtSfrtdzTdd| |/jUD }0| j?d i d ||0|/do W Y S d }/~/X Y nX t d t3dtj | j4dO  tj }tO  t3dtj | j4dO  tj }|dd dkr|.o|.jIj}.n"|dd dekr8t^|.d=r8|.jIj}.t_|.|d}2t d |r^|2`  n|28  t3dtj | j4dO  |2ja|2jb }3}4|dd dkr2|4r2d}5t|4tr|4ddkrdl}5|jcdks|5dlkr2t|4trt!jJjKdi|j,|4d= |5dm n.td|4r(t!jJjKdi|j,|4jI|5dm n
te|4d|dd dkrd}5d9}6d9}7|4D ].}8t|8trx|8dd dkrxd}6nd}7qP|6r|7rd}5n
|6rdl}5|jcdks|5dlkrt!jJjKdi|j,|5d t3d|2jf t d tj }|rt0t dd s| g|!} |rt56|}z| j7|4|3| |||d}9W n< thk
rj }/ zt d| d|4   W 5 d }/~/X Y nX t3dtj | j4dO  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  r%   save_kwargsZ	only_dataz	127.0.0.1uM   SPEC0 Использование only_data через API запрещено.r$   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_jscacherw   cache_idzCache.full_cache_validationz"Cache.public_full_cache_validationz!Cache.sdesk_full_cache_validationrK  r  r  rI  F)r   Z_getz.listZ_listz.selectZ_selectz.sumZ_sumz.count_countz.maxZ_maxz.minZ_minr   r   r      r   r   zCmfPersonVar.getZget_current_userZget_settingsZCmfRFilezCmfPersonVar.get_metaZCmfMenuTreez+Possible cache return invalid_data: method=Zsearch_stringr   rC  ur   ошибка на frontend методы list get и тп должны быть с jshash, кроме тестов z$api_cache_get skip due to no_jscachezapi_cache_get startr9  r   zapi_cache_get endzapi_cache_get hit!)r-  rp   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      )rR  r   rT  r\  r   z==i  u   Необходимо указать filter или kwargs для получения объекта перед вызовом его методаu1   Необходимо указать id в args[0]r  updatezAPI object get Noneu>   Объект не найден, возможно удалён.)r;   rp   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   Объект недоступен: недостаточно прав.)r;   rp   r   r   r   r   zAPI object get endr   rF  )
r   r   r   r   r   r   r_  r`  r   r   z"API object field access prohibiteduQ   Поле объекта не доступно: недостаточно прав.ZpreparezAPI method start r#   zUserError Trace:r"  c                 S   s   g | ]}t |qS r   r0   r)   r   r   r   r   r   ~  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   re  rf  r   r   r   r     s     zAPI save endsaveZcommit)ZcreateZupsertZcreate_from_template)rw   zAPI json dump startZresult_to_dict_ms)r   sgetokr   r   z$get result must be dict or dataclass)rX   ZslistZ	partially)ra  rb  rd  rt   zAPI json dump endZcache_store_error)r   r#  uQ   Ошибка конвертации результата запроса json_res=z result_dict=Zresult_to_response_mszAPI request end)ir!   r   rE  r   Zglobal_settingsZeva_versionr%  ZEVA_VERSIONr"   r6  r   r   r   Znowr   r   r   r'   r   r  r   rP  r'  r
   r  r   r   Zremote_addrr  Z
api_fieldsr   r   rV  r4   r   Zactivate_admin_moder;  r@  rA  rN  r  Zin_memory_cacheZin_memory_cache_skip_modelsr   r-   r0   r   Zcache_obj_lock_getr   rC  r9  rm   Zmicrosecondsr   Zjshash_invalidate_confirm_listr,  r   rW   popcopyZskipcache_select_for_updater   r   r  r3   r   r   r   r   r   r   oldr   r   ZCmfAuditZaudit_eventZCmfPermissionErrorZapply_asyncZCmfUserErrorr   Zloggingr   rX   r   joinr$   rg  r   logger	traceback
format_excr  Z
is_changedrh  hasattrrn   r   rp   r;   Zacl_default_user_policyr   r8   rt   r7  rJ  ):rz   Z
start_dateZjson_resr   r%   rQ  r$   Zjsonrpc_verZ_filterr   rS  rT  rU  r   r   r   rW  rX  rw   rY  r  Zinvalidate_listr:   rK  rL  r  rM  Zapi_use_cacherH  Zcache_lock_okZ_cachelock_skip_methodsr   r   rC  rD  r\  r   Z
tmp_kwargsr   r   r   r   r   Zfield_methodZ	obj_fieldZtaskr;   r   Z	abort_msgmsgZsplitterrp   r-  Zcheck_result_statusZcheck_result_have_denyZcheck_result_have_okro   Zrespr   r   r   post)  s0    





 


       










.&&
   









 


*







        
    
     
    



     	&



     




  
  





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  ri   r   r   r3   viewsactionr   r(  compiler)  r,  r7  r9  r@  rA  r;  rE  r0   rN  rt  __classcell__r   r   r   r   r     s6   

	



S


	(r   )<r1   r.   r*  r   rc   stringZrandomr(  rp  collectionsr   rl  r   Zdataclassesr   r  r   r   r   r   r	   Zuuidr
   r\   r   r   Zujsonr   r   ra   Z
cmf.modelsr3   Zcmf.data_providers.baser   r   Z
cmf.fieldsr   Zcmf.includeZcmf.appr   r   r  Zon_server_eventr&   r<   rI   Zonr@   rM   rY   rZ   r]   r^   rb   ri   rm   rn   ru  ZBaseViewr   r   r   r   r   <module>   s\   	

	



  y