U
    艭d                     @   st  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'j(ddddd Z)e'j(ddddd Z*e'j(ddddd Z+dd Z,dd Z-dd  Z.G d!d" d"Z/G d#d$ d$ej0j1Z2dS )%    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   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field r   ./modules/api/views/index.py
<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_default   s    
r+   zjshash-invalidate-confirm/)	namespacec                 O   s   t |  d S N)r   Zjshash_invalidate_confirm)Zconfirm_dictargskwargsr   r   r   handle_message/   s    r1   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: )ZroomZflask_socketior3   r4   printgetsocketioemitparamsr3   r4   r5   r   r   r   handle_user_regisrty3   s    r=   Z	user_pingc                 C   sB   ddl m}m} td|   | dd }|r>td|  d S )Nr   r2   zhandle_user_ping: r5   Z
user_pong_r6   r;   r   r   r   handle_user_ping=   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_KEYSr'   gdebug)r)   r   r   r   	cmf_dumpsF   s
    
rD   c                    s   i  fdd}|S )Nc                     s4   t | t| f}|kr, | ||< | S r.   )pickler   sortedr&   )r/   r0   hashfuncZmemoryr   r   memoQ   s    zmemoized.<locals>.memor   )rI   rJ   r   rH   r   memoizedN   s    rK   c                 C   s   dt krt t _|t j| < d S )Nprofiler_data)rB   r   rL   )keymsr   r   r   set_call_timeY   s    rO   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 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metasetmeta_fields_keepr*   startendnumber_of_objectsm2m_id_cachedepthno_meta3_CmfResultSplitter__project_perm_add_comments_cacheno_acl)selfr)   rZ   r\   r   r   r   __init__a   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 )N   
   r   )rY   AssertionError)r]   r/   r0   retfnr   r   wrapp   s    
z,CmfResultSplitter._check_depth.<locals>.wrapr   )rd   re   r   rc   r   _check_deptho   s    zCmfResultSplitter._check_depth)oc                 C   s"   |j | jkrt|j| j|j < d S r.   )r   rR   r   Zui_metar]   rg   r   r   r   _add_class_to_metaz   s    z$CmfResultSplitter._add_class_to_metac                 C   s  | d}| d}| d}| d}| d}| d}tt|}i }	d}
d}tjj|||d|||d	ppt }t|tjjr|j	r|r|
d
d }tt|d}|j |j	}| d}| d}|r|jstjj||||j	|||dd}t|t|@ }|dkr.| dr.tj||s.d}t }| ddr`t|}d|krX|d t|}d|kr|d|krxd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p2t }|dkrJ|rJt }|dkrB|rB|drB|| jkr| j| sBd|krBt|}|d nt|}tj|ddgdd}|jjp|jj}|sd|krt|}|d d| j|< nH|jd|dd dkr8d|kr,t|}|d d| j|< n
d| j|< d|kr^d|krZdnd}|rl||	|< |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_idNF)initial_acl_keyobject_modelobject_owner_idraise_error	object_idobject_parent_idobject_dict:r   perm_inherit_acl_idperm_parent_owner_id)ro   rp   rq   object_fieldrs   rt   ru   rr   
CmfCommentZprivateTcmf_deletedwritereadreadonlydeny.getz.ui_getZcomments)rl   r   )ro   rp   ry   rq   rs   ru   rt   rr   zCmfProject:root_parent_id)fieldsinclude_deletedzPPP-COM-ADD)r)   rr   Z_acl_fields_acl_obj) r8   getattrr#   CmfAccessListcheck_accessrS   
issubclassr"   	CmfEntityZacl_parent_field	partitionr   r\   rz   Zcheck_visibilityremovetuplelistkeysrB   
api_methodendswithappendapi_hack_fields
startswithr[   ZcmfutilZget_obj_by_idr   valuerm   Zcheck_project_role_access)r]   Zobj_dictro   obj_owner_idobj_idobj_parent_idr   rn   modelZ
acl_fieldsZacl_objZcomment_denyZaccess_levelsZparent_class_nameZparent_modelZparent_fieldrw   rx   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   sx   |  j d7  _ | js| | d|ji}|jddD ]$}|js@q4| j||d d||j< q4| jst|jdkrt| 	|}|S )Nr_   r   T)
is_definedrY   Zpublic_read)
rW   rZ   ri   r   valuesr   _process_cmf_typer\   Zacl_typer   )r]   rg   rY   r*   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sx| |}|S Nr_   )rW   rZ   r   r#   r   ri   r%   r&   rT   add_processr\   r   )r]   r)   rY   r   r*   r   r   r   r   r   _process_simple_model  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|}|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>rl   c                    s   i | ]\}}| |qS r   r   )r   kr   r   r   r   r   $  s      zSCmfResultSplitter._process_json_as_model.<locals>.proccess_json.<locals>.<dictcomp>rv   r_   r   )r   r   dictr8   r&   r   rW   r"   r   ZCmfTUUIDZget_cls_by_tuuid_strrZ   ri   rT   r   r   r\   r   )r)   r   datar   r   r   r]   r   r   r     s"    





z?CmfResultSplitter._process_json_as_model.<locals>.proccess_jsonr   rh   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   .)rW   rZ   rT   r   instancer   r   r"   r   ZCmfObjectJsonr   r   ZCmfObjectList_process_listZ	CmfObjectr   ZCmfRelationBaserl   rX   Zis_nullr   Z
CmfRelBaser   Zjsonr?   )r]   rg   rY   resr*   ipr   r   r   r   3  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   f  s     z3CmfResultSplitter._process_list.<locals>.<listcomp>)rW   )r]   rg   r*   r   r   r   r   d  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| |}|S )Nr_   rl   rv   r   r   )rW   r   r&   r   rZ   r   r   r   r#   splitri   r   rT   r   r   r8   r\   r   )r]   rg   r*   r   r   mr   r   r   r   _process_dicti  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 r   )rW   r   r   r   r"   r   r   r   r#   r$   r   r   r   r   r   r   r   r    r!   r   datetimedateZ	isoformat)r]   r)   r   r   r   r   y  s     






zCmfResultSplitter._processc                 C   sB   | j  D ]2\}}t|d D ]}||f| jkr|d |= qq
d S )Nr   )rR   r&   r   rT   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_   .rl   rv   r   )rW   r   r   r#   r   ri   r%   r&   rT   r   r   r"   r$   r   r   r   r   r8   r   r   )	r)   rY   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   )rQ   rR   r&   r   rT   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  )rU   rV   intr   r   r   r   rN     s    zCmfResultSplitter.msc                 C   s0   t  | _| | j| _| js$|   t  | _d S r.   )r	   rU   r   rQ   r*   rR   r   rV   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	   rU   rB   Zdisable_permissionsrQ   r   r*   rZ   r   rV   r   r   r   r   split_simple  s
    zCmfResultSplitter.split_simple)NF)r   )r   )r   )__name__
__module____qualname__r^   rf   r"   r#   CmfModelZBaseModelMetari   r   r$   r   r   r   r   r   r   r   r   r   r   r   rN   r   r   r   r   r   r   rP   _   s$   
 
0&rP   c                       s   e Zd ZdZdd fddZd3ddZd4dd	Zd5d
dZdd Zd6ddZ	dd Z
d7ddZdd Zd8ddZedd Zdd Zejjdd Zd9d d!Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd:ed.d/d0Zejjd1d2 Z  ZS );ApiViewr,   N)returnc                    s   t    |  | _d S r.   )superr^   get_rpcrpcr   r(   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)r(   __mro__)r]   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)codemessagealert)jsonrpcerrorr   callidr   )rB   r8   
api_callidr   )r]   r   r   r   r*   r   r   r   _error  s    zApiView._errorc                 C   sR   |sg }d|||t j|t dt d|t |d}t jrDt j|d< | j||dS )Nr   rL   r   )r   r*   rR   jsverr   jsurlrL   r   abortversion
invalidatejscache_timelifer   )rB   r   r8   Zcmf_get_versionr   r   )r]   r*   rR   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   )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_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_error  s    zApiView.internal_errorc                 C   s$   |t dddkst| j|||dS )Ni ir   )rangera   r   )r]   r   r   r   r   r   r   server_error  s    zApiView.server_errorc                 C   s  i }dt tD ]}tt|d p.ttj|d }t|s:qt|tjjsJq|jr^|tjjk	r^qi }t |D ]}t||}t	||}|
drqjt|st|st|tjsqj|tjjkr|dkrqjt|t}t|t}	t|tj}
|| ||	|
dd}|||d < qj|j D ]\}}g }t|tjjtjjfrDddd	d
g}nt|tjjr\ddg}|D ]D}| d| }t||}||t|ddddd|| d| < q`q|||d}|||d < q|S )Nr$   _)Zall_models_metaZpublic_all_models_metaZget_ui_full_pathZpublic_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)r$   )dirr#   r   r"   r   r   r$   ZabstractinspectZgetattr_staticr   r   r   r   Z
celery_appZTaskclassmethodstaticmethodlowerr   r&   ZCmfM2MZCmfGenericM2MZCmfJsonr   )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     sj    



	
zApiView.get_rpcc                 C   s   |dkS )NZ	qweqweqwer   )r]   tokenr   r   r   check_tokenT  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   r8   W  s    zApiView.getFc           
   	   C   s   t js>|s>t|tkr>t|dkr>tdt| dtj d | |||||}|rpt	|}	t
dd|	 }	nt|ddd	}	t
dd|	}	t js|st|	d
krtdt|	 dtj d | j||||||ddS t|	ddS )Ni,  uw   Разработчик внимание! Слишком много строк через API. Используй slice z, z...z"cmf_version":(\d+)z"cmf_version":"\1"r   F)indentZensure_asciii   uq   Разработчик внимание! Слишком большой размер данных через API.  T)orjson_r   	recursionzapplication/json)Zmimetype)configZ
PRODUCTIONtyper   len	cmf_alertrB   r   r   rD   rer   decoder   sys	getsizeofresponse_okr   )
r]   result_dictrR   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||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)rB   Zno_jscache_forceosenvironr8   r   rC   r   utcnowstrftimecurrent_personrl   r   r   Z_obj_dict_set)r]   rG   Z	res_cacher   r   r   api_cache_addl  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 )	r  r  r8   r   r   _obj_dict_getrE   r   r7   )r]   rG   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otherr  r  r  r   T)rR   r   r   r  )r   r  r  r   r   r  rE   r   r8   r  rB   r   )r]   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)rB   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)r8   r   sTr   _use_simple)r   
ValueErrorr   disable_simple)r]   r   r+  Zproc_cls_nameproc_methodZproc_clsr   
use_simpler   r   r   rpc_prepare_method  s$    


zApiView.rpc_prepare_methodc           6      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(h	}t jD ]6}||krT|| |d) |kr<||d)  q<|t _|d*i t _ t j d+rt!j"#  |d,d }|r||d,< | d-S |d.}|d/d }|d0}|d }g }|d1kr| j$||S |d2kr| j%||S |d3kr2| j&||S d }|d4d }| '||}|s\| ( S |d5 }|d6 }|d7 }d8}d9D ]}||d kr|d} qq|d:|d krd8}|r|d;rd8}|j)rd8}|d<}|d=}|t _*|r|d krtd>| dd d8}|r|r(t d? n|rtj }t d@ | +|}t,dAtj | j-dB  t dC |r||d<kr|rt./|}t dD | j0d d |d< |||dES t dF |dG sv|dH sv|dI rn|dJ| } t j1dKdL dMk}!|dkrt dN d|krdO|d kr|d dP dOkrt dQ t }"|d |"d< dOg|"d< | |"dJ< |!|"dR< |jf |"}t2|d dSkr~|d= n|dOs|rt dQ |j|dOg|| |!dT}n|r4dO|kr4t }"dOdU|dOg|"d< dOg|"d< | |"dJ< |!|"dR< |jf |"}|3dOd nJ|rr|4 }"g |"d< dOg|"d< | |"dJ< |!|"dR< |jf |"}n| dVdWS nlt2|dPksdX|dP kr| dVdYS |3dP}#t }"dOdU|#g|"d< dOg|"d< | |"dJ< |!|"dR< |jf |"}|st dZ t5  | j6d i d |d[d\S t|t7j!j8o,|j9j}$t|t7j!j:oD|j;j}%t|t7j!j:o\|j<j}&t!j"j=|$|j>|%|j?j|&|d]d8d^st d_ t!j@jAd]|j>|d`da t5  | j6d i d |dbtB dcS t dd dK|de krh|de j1dKdfdg\}}'t!j"j=|$|j>||%|j?j|&|d]d8dh	sRt di t!j@jAd]|j>|d`da t5  | j6d i d |djtB dcS tC||}(tC|(|'}ntC||de }t,dktj | j-dB  tj }t dl|d   z4|dI r|jD||dm})|)o|)j?}*n
|||}*W n tEk
	rh }+ zftF|+ tGHdn tI|+},ttC|+dd tJtKf	r>doLdpdq |+jMD },| j6d i d ||,|+dc W Y S d }+~+X Y nh tNk
	r }+ zHtOjPHdr tF|+ ds|d  dt}-|-tQR 7 }-| jSdu|-|+dv W Y S d }+~+X Y nX t dw t,dxtj | j-dB  tj }|
r|jT
rt dy z|U  W n tEk

r }+ zftF|+ tGHdn tI|+},ttC|+dd tJtKf
r~doLdzdq |+jMD },| j6d i d ||,|+dc W Y S d }+~+X Y nX t d{ t,d|tj | j-dB  tj }tF  t,d}tj | j-dB  tj }|de d~kr |*o|*j?j}*n"|de dkrBtV|*dOrB|*j?j}*tW|*|d}.t d |rh|.X  n|.1  t,dtj | j-dB  |.jY|.jZ }/}0|de dkr<|0r<d}1t|0tr|0ddkrd`}1|j[dks|1d`kr<t|0trt!j@jAd]|j>|0dO |1da n.t\|0r2t!j@jAd]|j>|0j?|1da n
t]|0d|de dkrd}1d8}2d8}3|0D ].}4t|4tr|4dd dkrd}2nd}3qZ|2r|3rd}1n
|2rd`}1|j[dks|1d`krt!j@jAd]|j>|1d t,d|.j^ t d tj }|rtCt dd s| _|}|rt./|}| j0|0|/||||d}5t,dtj | j-dB  t d |5S )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   r0   save_kwargsZ	only_dataz	127.0.0.1uM   SPEC0 Использование only_data через API запрещено.r/   r   r   filterr   sliceorder_bygroup_byr   rj   rw   rn   rx   Z
user_localZvacation_endZvacation_startZperm_encryptZimport_originalZ_idflagsZ
admin_modeno_cacheu)   no_cache запрещен go to spec0 osv
no_jscacherZ   cache_idzCache.full_cache_validationz"Cache.public_full_cache_validationz!Cache.sdesk_full_cache_validationr+  r   r   r)  F)r   Z_getz.listZ_listz.selectZ_selectz.sumZ_sumz.count_countz.maxZ_maxz.minZ_minZget_current_userZsearch_stringr   r#  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!)r  rR   r   r   r  r   zapi_cache_get jsver mismatch!r   r   r   
for_updater   r   ZrestorezAPI object get startrl   r   u~   deprecated id объекта нужно передавать в kwargs или может вообще параметром RPCr{      )r2  r   r4  r;  r{   z==i  u   Необходимо указать filter или kwargs для получения объекта перед вызовом его методаrv   u1   Необходимо указать id в args[0]zAPI object get Noneu>   Объект не найден, возможно удалён.)r*   rR   r   r   r   r}   )ro   rp   rq   rs   rt   object_instanceaccess_levelrr   zAPI object access prohibitedZfail)operatecmf_model_nameparentresult_statusuG   Объект не доступен: не достаточно прав.)r*   rR   r   r   r   r   zAPI object get endr   r_   r&  )	ro   rp   ry   rq   rs   rt   r=  r>  rr   z"API object field access prohibiteduR   Поле объекта не доступно: не достаточно прав.ZpreparezAPI method start )r/   r0   zUserError Trace:r  c                 S   s   g | ]}t |qS r   r   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   rC  rD  r   r   r   r     s     zAPI save endsaveZcommit)ZcreateZupsertZcreate_from_templateupdate)rZ   zAPI json dump startZresult_to_dict_ms)r8   sgetokr   r   z$get result must be dict or dataclass)r   ZslistZ	partially)r?  r@  rB  rW   zAPI json dump endZcache_store_error)r   r  Zresult_to_response_mszAPI request end)`rB   r   r%  r   Zglobal_settingsZeva_versionr  ZEVA_VERSIONrC   r  r   r   r   Znowr   r   r   r   r   r   r8   r0  r  r
   r   r   r   Zremote_addrr   Z
api_fieldsr   r   r6  r#   r   Zactivate_admin_moder  r   r!  r.  r   r7  r#  r  rO   Zmicrosecondsr   Zjshash_invalidate_confirm_listr  r   r  popcopyr   r   r"   r   rj   r   rk   rm   r   r   rl   ZCmfAuditZaudit_eventZCmfPermissionErrorr   Zapply_asyncZCmfUserErrorr   Zloggingr   r   r   r   joinr/   rE  ZAPPlogger	traceback
format_excr   Z
is_changedrF  hasattrrP   r   rR   r*   Zacl_default_user_policyr   r'   rW   r  )6r]   Z
start_dateZjson_resr   r0   r1  r/   Zjsonrpc_verZ_filterr   r3  r4  r5  r   r   r   r7  r8  rZ   r9  r   Zinvalidate_listr)   r+  r,  r   r-  Zapi_use_cacher(  r   r#  r$  r;  r{   Z
tmp_kwargsrl   ro   r   r   Zfield_methodZ	obj_fieldZtaskr*   r   Z	abort_msgmsgZsplitterrR   r  Zcheck_result_statusZcheck_result_have_denyZcheck_result_have_okrQ   Zrespr   r   r   post  s    





 


       


















 


*







        
    
     
    



     	&



     




  
  





zApiView.post)N)N)NNN)N)r   )N)FNF)F) r   r   r   Z__url__r^   r   r   r   r   r   r   r   r   r   rK   r   r   r"   viewsactionr8   r  r  r  r   r!  r  r%  r   r.  rR  __classcell__r   r   r   r   r     s4   

	




F

	(r   )3r    r   r
  r   rE   r  rN  collectionsr   rK  r   Zdataclassesr   r   r   r   r   r   r	   Zuuidr
   Zflaskr   r   Zujsonr   r   rA   Z
cmf.modelsr"   Zcmf.data_providers.baser   r   Z
cmf.fieldsr   Zcmf.includeZcmf.appr   r+   r9   Zonr1   r=   r>   rD   rK   rO   rP   rS  ZBaseViewr   r   r   r   r   <module>   sD   

	
  q