U
    [Sef                    @   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Z8d2Z9G d3d4 d4ej:j;Z<dS )5    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   sV   zt j| tt jdW S  tk
rP } ztd| d|   |W 5 d }~X Y nX d S )N)defaultoptionzorjson.dumps error e=z, obj=)orjsonr   r<   ZOPT_NON_STR_KEYSr8   r!   r"   )r:   er   r   r   	cmf_dumps   s
    rc   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   )rh   ri   r   rg   r   memoized   s    rj   c                 C   s   dt krt t _|t j| < d S )Nprofiler_data)r!   r   rk   )keymsr   r   r   set_call_time   s    rn   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:   rx   rz   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   )rw   AssertionError)r{   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-   rq   r   Zui_metar{   r   r   r   r   _add_class_to_meta   s    z$CmfResultSplitter._add_class_to_metac                 C   sT  | d}| d}| d}| d}| d}| d}| d}	tt|}
i }d}d}|
jst|D ]}|d	krxqj||= qjd
|d< |S tjj|||d||||	|d	pt }t|
t	jj
rH|
jrH|rH|dd }tt|d}|j |
j}| d}| d}|r|jsHtjj||||
j|||d|d	}t|t|@ }|dkrx| drxtj||sxd}t }| ddrt|}d|kr|d t|}d|krd|krdnd
}t| }tjdstjdrd|
jkrd|kr|d |D ]}|tjkr.||= q|d	kr<q|
j |}|r|jrZq|jst||= d
||< qt|t	jjrt||< d}tjj||||||||	d|d
pt }|dkr|rt }|dkr|r|dr|| jkr | j| sd|krt|}|d nt|}tj|ddgdd }|jj pN|j!j }|s~d|krrt|}|d d| j|< nH|j"d!|dd"dkrd|krt|}|d d| j|< n
d| j|< |d#kr|d$krt|}|#d d|krd|krdnd
}|r|||< |d
kr||kr||= q|rB||d%< |rP||d< |S )&u;  
        Чтобы код не дблировать для модели, простой модели и дикта, можно проверять итоговый json
        Правда в таком случае, мы обходим все данные, даже если они не доступны.
        perm_effective_acl_idcmf_owner_idid	parent_idr-   perm_parent_id%perm_security_level_allowed_ids_cacheN)r   r-   deny_acl_objF)	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.getz.ui_getZcomments)
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)$r   getattrr4   	api_allowrX   CmfAccessListcheck_accessr   
issubclassr3   	CmfEntityZacl_parent_field	partitionr   rz   r   Zcheck_visibilityremovetuplekeysr!   
api_methodendswithappendapi_hack_fieldsCmfPassword_PASSWORD_MASK
startswithry   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_idr-   r   r   modelZ
acl_fieldsZacl_objZcomment_deny
field_nameZaccess_levelsZparent_class_nameZparent_modelZparent_fieldr   r   Zparent_access_levelsZ_tmpZobj_keysr+   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rw   Zpublic_read_acl_policyr   )ru   rx   r   r-   valuesr   _process_cmf_typerz   Zacl_typer   r   )r{   r   rw   r;   vr   r   r   _process_cmf_modelX  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   )ru   rx   r   r4   r-   r   r6   r7   rr   r   _processrz   r   )r{   r:   rw   r   r;   r*   r   r   r   r   _process_simple_modelg  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>x  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,   {  s      zSCmfResultSplitter._process_json_as_model.<locals>.proccess_json.<locals>.<dictcomp>r   r   r-   r   r   )r'   rX   dictr   r7   r0   ru   r3   r   ZCmfTUUIDZget_cls_by_tuuid_strrx   r   rr   r   r-   rz   r   )r:   r   datar   r   r   r{   r   r   r   v  s"    




z?CmfResultSplitter._process_json_as_model.<locals>.proccess_jsonr   r   r   r   r   _process_json_as_modelu  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   .)ru   rx   rr   r   instancer-   r'   r3   r   ZCmfObjectJsonr   r   ZCmfObjectList_process_listZ	CmfObjectr   ZCmfRelationBaser   rv   Zis_nullr   Z
CmfRelBaser   Zjsonr_   )r{   r   rw   resr;   ipr   r   r   r     s@    


z#CmfResultSplitter._process_cmf_typec                    s$     j d7  _  fdd|D }|S )Nr   c                    s   g | ]}  |qS r   )r   )r)   rb   r{   r   r   r     s     z3CmfResultSplitter._process_list.<locals>.<listcomp>)ru   )r{   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   )ru   r   r7   r   rx   r'   r0   r   r4   splitr   r   rr   r   r-   r   rz   r   )r{   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   )ru   r'   rX   r   r3   r   r   r   r4   r5   r   r   r   r   r   r.   r/   r1   r2   r0   datetimedateZ	isoformat)r{   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   )rq   r7   rX   rr   r{   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   )ru   r   r   r4   r-   r   r6   r7   rr   r   r'   r3   r5   r   r(   rX   r   r   r0   r   )	r:   rw   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   )rp   rq   r7   rX   rr   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  )rs   rt   r   r   r   r   r   rm     s    zCmfResultSplitter.msc                 C   s0   t  | _| | j| _| js$|   t  | _d S r?   )r	   rs   r   rp   r;   rq   r   rt   r   r   r   r   r     s
    zCmfResultSplitter.splitc                 C   s0   t  | _| | j| _| js$|   t  | _d S r?   )r	   rs   r   rp   r;   rx   r   rt   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   rm   r   r   r   r   r   r   ro      s$   

  
0&ro   z******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)r{   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   4  s     z/ApiView._add_exception_info.<locals>.<listcomp>Zexception_types)r9   __mro__)r{   r;   	exceptionr   r   r   _add_exception_info2  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   r;   r   r   r   _error8  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   rk   r   )r   r;   rq   jsverr   jsurlrk   r   abortversion
invalidater   jscache_timelifer   )r!   r   r   Zcmf_get_versionr   r  r   )r{   r;   rq   r   r   r  r   r   r   r   r   _okA  s$    
zApiView._okc                 C   s   |  ddS )NiDzParse errorr   r   r   r   r   parse_errorV  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_requestY  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_found c                 C   s   |  dd| S )NizInvalid params: r  )r{   r   r   r   r   invalid_params`  s    zApiView.invalid_paramsc                 C   s   |  ddS )NizInternal errorr  r   r   r   r   internal_errorc  s    zApiView.internal_errorc                 C   s$   |t dddkst| j|||dS )Ni ir   )ranger~   r   )r{   r   r   r   r   r   r   server_errorf  s    zApiView.server_errorc                 C   s(  i }|sg }nt |}|tjj tt|D ]}t|rR|}t|d|j}nDtt|d pjttj|d }t|svq0t	|tjjsq0|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}n0t	|tjjrddg}nt	|tjjrdg}|D ]D}| d| }t||}||t|ddddd|| d| < qqZ|||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_nestedZdecrypt.T)r  r  r   r  r  r  r  )_classr  methods)rX   r   r3   r4   r5   dirr   r   r   r   r   ZabstractinspectZgetattr_staticr   r   r   r'   Z
celery_appZTaskclassmethodstaticmethodlowerr   r7   ZCmfM2MZCmfGenericM2MZCmfJsonr   r   )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   k  s    



	

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   sb  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^zt|d	d
d}	W n: tk
r }
 ztd|
 d|  |
W 5 d }
~
X Y nX t| jd|	}	t jsV|sVt|	dkrVtj tdddkr>tdt|	 dt	j
 d | j||||||ddS t|	ddS )Ni,  i  r}      uw   Разработчик внимание! Слишком много строк через API. Используй slice z, z...z"\g<attr>":"\g<value>"r   F)indentZensure_asciizJson dumps error: e=z
 response=i   uq   Разработчик внимание! Слишком большой размер данных через API.  T)orjson_r  	recursionzapplication/json)Zmimetype)configZ
PRODUCTIONtyperX   rW   r   r   Ztoday	cmf_alertr!   r   r  rc   rer   _BIG_INT_JSON_HACK_REr   r   r8   r    sys	getsizeofresponse_okr   )r{   result_dictrq   r   r   r'  r  r(  ZresponseZ	json_datarb   r   r   r   r0    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_setrd   r   )r{   rf   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 )Nr2  r3  zAPI CACHE HIT )	r6  r7  r   r   r   _obj_dict_getrd   r   r    )r{   rf   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?   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otherr4  r5  r3  r   T)rq   r   r   r'  )r   r8  r9  r   r   r<  rd   r   r   r0  r!   r   )r{   rA  rB  rC  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!   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   rX   sTr  _use_simple)r   
ValueErrorr   disable_simple)r{   r!  rO  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|dId9rd9}|dJ} |dK}!|!t _1|r|!d krtdL| dd d9}|r|rt dM n| rtj }t dN | 2|!}"t3dOtj | j4dP  t dQ |"r| |"dJkrv|rRt56|}t dR | j7d d |"dJ |||dSS t dT |dU 
s|dV 
s|dW rnT|dX| }#t j8dYdZ d[k}$|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< |#|%dX< |$|%d^< |jf |%}t9|d d_kr:|d= n|d=s|rt d] |j|d=g||#|$d`}n|rd=|krt }%d=da|d=g|%d< d=g|%d< |#|%dX< |$|%d^< |jf |%}|:d=d nJ|r.|; }%g |%d< d=g|%d< |#|%dX< |$|%d^< |jf |%}n| dbdcS nt9|d<ksXd@|d< krd| dbddS |:d<}&t }%d=da|&g|%d< d=g|%d< |#|%dX< |$|%d^< |de dfkrt j<=t-|& |jf |%}|de dfk	rPt>|D ]r}'|j?|'}(|(r|(j@	stdg|' dh |:|' n6tA|j?|' tBj?jCr||' tDkrtdi |:|' q|	szt dj tE  | jFd i d |dkdlS t|tBj!jG	o|jHj})t|tBj!jI	o|jJj}*t|tBj!jI	o|jKj}+t|tBj!jG	o|jLjM},t!j"jN|)|j,|*|jOj|+|dm|,d9dn	
s>t do t!jPjQdm|j,|dpdq tE  | jFd i d |drtR dsS t dt dY|de k
r|de j8dYdudv\}}-t!j"jN|)|j,||*|jOj|+|dm|,d9dw

st dx t!jPjQdm|j,|dpdq tE  | jFd i d |dytR dsS t0||}.t0|.|-}nt0||de }t3dztj | j4dP  tj }t d{|d   z4|dW rV|jS||d|}/|/oR|/jO}0n
|||}0W n tTk
r }1 zftU|1 tVWd} t-|1}2tt0|1dd t>tXfrd~Ydd |1jZD }2| jFd i d ||2|1ds W Y S d }1~1X Y nh t[k
rN }1 zHt\j]Wd tU|1 d|d  d}3|3t^_ 7 }3| j`d|3|1d W Y S d }1~1X Y nX t d t3dtj | j4dP  tj }|r4|jar4t d z|b  W n tTk
r( }1 zftU|1 tVWd} t-|1}2tt0|1dd t>tXfrd~Ydd |1jZD }2| jFd i d ||2|1ds W Y S d }1~1X Y nX t d t3dtj | j4dP  tj }tU  t3dtj | j4dP  tj }|de dkr|0o|0jOj}0n"|de dfkrtc|0d=r|0jOj}0td|0|d}4t d |r|4e  n|48  t3dtj | j4dP  |4jf|4jg }5}6|de dkr|6rd}7t|6trP|6ddkrPdp}7|j,dksf|7dpkrt|6trt!jPjQdm|j,|6d= |7dq n.th|6rt!jPjQdm|j,|6jO|7dq n
ti|6d|de dkrPd}7d9}8d9}9|6D ].}:t|:tr|:dd dkrd}8nd}9q|8r|9rd}7n
|8r&dp}7|j,dks<|7dpkrPt!jPjQdm|j,|7d t3d|4jj t d tj }|rt0t dd s| k|!} |rt56|}z| j7|6|5| |||d};W n< tlk
r }1 zt d| d|6   W 5 d }1~1X Y nX t3dtj | j4dP  t d |;S )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_jscacherx   cache_idzCache.full_cache_validationz"Cache.public_full_cache_validationz!Cache.sdesk_full_cache_validationrO  r  r  rM  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_stringZTEXKOM_no_cacher   rG  ur   ошибка на frontend методы list get и тп должны быть с jshash, кроме тестов z$api_cache_get skip due to no_jscachezapi_cache_get startr=  r   zapi_cache_get endzapi_cache_get hit!)r1  rq   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      )rV  r   rX  r`  r   z==i  u   Необходимо указать filter или kwargs для получения объекта перед вызовом его методаu1   Необходимо указать id в args[0]r  updateu	   Поле u1    не доступно для изменения.uB   Не задано новое значение для пароля.zAPI object get Noneu>   Объект не найден, возможно удалён.)r;   rq   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;   rq   r   r   r   r   zAPI object get endr   rJ  )
r   r   r   r   r   r   rc  rd  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   ri  rj  r   r   r   r     s     zAPI save endsaveZcommit)ZcreateZupsertZcreate_from_template)rx   zAPI json dump startZresult_to_dict_ms)r   sgetokr   r   CmfAuditz$get result must be dict or dataclass)rX   ZslistZ	partially)re  rf  rh  ru   zAPI json dump endZcache_store_error)r  r'  uQ   Ошибка конвертации результата запроса json_res=z result_dict=Zresult_to_response_mszAPI request end)mr!   r   rI  r   Zglobal_settingsZeva_versionr)  ZEVA_VERSIONr"   r:  r   r   r   Znowr   r   r   r'   r   r  r   rT  r+  r
   r  r   r   Zremote_addrr  Z
api_fieldsr   r   rZ  r4   r   Zactivate_admin_moder?  rD  rE  rR  r	  Zin_memory_cacheZin_memory_cache_skip_modelsr   r-   r0   r   Zcache_obj_lock_getr   rG  r=  rn   Zmicrosecondsr   Zjshash_invalidate_confirm_listr0  r   rW   popcopyZskipcache_select_for_updater   rX   r   r   r   r3   r   r   r   r  r   r   r   r   r   r   oldr   r   ro  Zaudit_eventZCmfPermissionErrorZapply_asyncZCmfUserErrorr   Zloggingr   r   joinr$   rk  r   logger	traceback
format_excr  Z
is_changedrl  hasattrro   r   rq   r;   r   r8   ru   r;  rN  )<r{   Z
start_dateZjson_resr   r%   rU  r$   Zjsonrpc_verZ_filterr   rW  rX  rY  r   r   r   r[  r\  rx   r]  r!  Zinvalidate_listr:   rO  rP  r   rQ  Zapi_use_cacherL  Zcache_lock_okZ_cachelock_skip_methodsr   r   rG  rH  r`  r   Z
tmp_kwargsr   argr+   r   r   r   r   Zfield_methodZ	obj_fieldZtaskr;   rb   Z	abort_msgmsgZsplitterrq   r1  Zcheck_result_statusZcheck_result_have_denyZcheck_result_have_okrp   Zrespr   r   r   postK  sD    





 


       










.&&
   









 


*






$
        
    
     
    



     	&



     




  
  





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  rj   r   r#  r3   viewsactionr   r,  compiler-  r0  r;  r=  rD  rE  r?  rI  r0   rR  rz  __classcell__r   r   r   r   r   +  s6   

	



W


	(r   )=r1   r.   r.  r   rd   stringZrandomr,  ru  collectionsr   rq  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^   rc   rj   rn   ro   r   r{  ZBaseViewr   r   r   r   r   <module>   s`   	

	



   