U
    r;d                     @   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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+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' Z0d(d) Z1G d*d+ d+Z2G d,d- d-ej3j4Z5d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: roomflask_socketior3   r4   printgetsocketioemitparamsr3   r4   r5   r   r   r   handle_user_regisrty3   s    r@   r3   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   )r3   handle_user_join_room: 	room_namer,   r-   r7   zUser r5   z	 join to participantsr6   z
Joined to 	user_name
user_login)rD   rE   rF   r5   )
r9   r3   r:   r<   servermanagerget_participantslenlistr=   )r?   r3   rD   ZparticipantsSizer   r   r   handle_user_join_room=   s    ,rL   r4   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   )r4   rA   rB   r,   rC   zUser leave roomrD   r6   )
r9   r4   r:   r<   rG   rH   rI   r=   rJ   rK   )r?   r4   rD   r   r   r   handle_user_leave_roomN   s
    rM   document_broadcastc                 C   s   t jd| | d tjjd d S )NrN   rB   )r7   Zskip_sid)r<   r=   flaskr   Zsid)r?   r   r   r   handle_document_broadcastV   s    rP   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_r8   r>   r   r   r   handle_user_ping[   s
    rQ   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_dumpsd   s
    
rW   c                    s   i  fdd}|S )Nc                     s4   t | t| f}|kr, | ||< | S r.   )pickler   sortedr&   )r/   r0   hashfuncZmemoryr   r   memoo   s    zmemoized.<locals>.memor   )r\   r]   r   r[   r   memoizedl   s    r^   c                 C   s   dt krt t _|t j| < d S )Nprofiler_data)rU   r   r_   )keymsr   r   r   set_call_timew   s    rb   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)   rm   ro   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 )N   
   r   )rl   AssertionError)rp   r/   r0   retfnr   r   wrap   s    
z,CmfResultSplitter._check_depth.<locals>.wrapr   )rw   rx   r   rv   r   _check_depth   s    zCmfResultSplitter._check_depth)oc                 C   s"   |j | jkrt|j| j|j < d S r.   )r   re   r   Zui_metarp   rz   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rB| drBtj||sBd}t }| dd	rtt|}d|krl|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	pHt }|dkr`|r`t }|dkrX|rX|drX|| jkr| j| sXd|krXt|}|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rNd|krBt|}|d d	| j|< n
d| j|< |d"kr~|d#kr~t|}| 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:r   perm_inherit_acl_idperm_parent_owner_id)r   r   r   object_fieldr   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   zCmfProject:root_parent_id)fieldsinclude_deletedzPPP-COM-ADD)r)   r   codeZ
CmfProjectZ_acl_fields_acl_obj)!r;   getattrr#   CmfAccessListcheck_accessrf   
issubclassr"   	CmfEntityZacl_parent_field	partitionr   ro   r   Zcheck_visibilityremovetuplerK   keysrU   
api_methodendswithappendapi_hack_fields
startswithrn   ZcmfutilZget_obj_by_idr   valuer   Zcheck_project_role_accessadd)rp   Zobj_dictr   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   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 )Nrr   r   T)
is_definedrl   Zpublic_read)
rj   rm   r|   r   valuesr   _process_cmf_typero   Zacl_typer   )rp   rz   rl   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 Nrr   )rj   rm   r   r#   r   r|   r%   r&   rg   r   _processro   r   )rp   r)   rl   r   r*   r   r   r   r   r   _process_simple_model4  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>E  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   H  s      zSCmfResultSplitter._process_json_as_model.<locals>.proccess_json.<locals>.<dictcomp>r   rr   r   )r   rK   dictr;   r&   r   rj   r"   r   ZCmfTUUIDZget_cls_by_tuuid_strrm   r|   rg   r   r   ro   r   )r)   r   datar   r   r   rp   r   r   r   C  s"    





z?CmfResultSplitter._process_json_as_model.<locals>.proccess_jsonr   r{   r   r   r   _process_json_as_modelB  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 )Nrr   r   .)rj   rm   rg   r   instancer   r   r"   r   ZCmfObjectJsonr   r   ZCmfObjectList_process_listZ	CmfObjectr   ZCmfRelationBaser   rk   Zis_nullr   Z
CmfRelBaser   ZjsonrR   )rp   rz   rl   resr*   ipr   r   r   r   W  s@    


z#CmfResultSplitter._process_cmf_typec                    s$     j d7  _  fdd|D }|S )Nrr   c                    s   g | ]}  |qS r   )r   )r   erp   r   r   r     s     z3CmfResultSplitter._process_list.<locals>.<listcomp>)rj   )rp   rz   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| |}|S )Nrr   r   r   r   r   )rj   r   r&   r   rm   r   r   r   r#   splitr|   r   rg   r   r   r;   ro   r   )rp   rz   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 r   )rj   r   rK   r   r"   r   r   r   r#   r$   r   r   r   r   r   r   r   r    r!   r   datetimedateZ	isoformat)rp   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   )re   r&   rK   rg   rp   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 )Nrr   .r   r   r   )rj   r   r   r#   r   r|   r%   r&   rg   r   r   r"   r$   r   r   rK   r   r;   r   r   )	r)   rl   r   Zsub_attrZ	sub_valueZ	sub_fieldsubr   Zsub_keyprocess_jsonrp   r   r   r     s6    




z<CmfResultSplitter._process_simple_meta.<locals>.process_jsonr   )r   )rd   re   r&   rK   rg   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  )rh   ri   intr   r   r   r   ra     s    zCmfResultSplitter.msc                 C   s0   t  | _| | j| _| js$|   t  | _d S r.   )r	   rh   r   rd   r*   re   r   ri   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	   rh   rU   Zdisable_permissionsrd   r   r*   rm   r   ri   r   r   r   r   split_simple  s
    zCmfResultSplitter.split_simple)NF)r   )r   )r   )__name__
__module____qualname__rq   ry   r"   r#   CmfModelZBaseModelMetar|   r   r$   r   r   r   r   r   r   r   r   r   r   r   ra   r   r   r   r   r   r   rc   }   s$   
 

0&rc   c                       s  e Zd ZdZdd fddZd4ddZd5dd	Zd6d
dZdd Zd7ddZ	dd Z
d8ddZdd Zd9ddZe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    |  | _d S r.   )superrq   get_rpcrpcr   r(   r   r   rq     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__)rp   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   )rU   r;   
api_callidr   )rp   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   r_   r   )r   r*   re   jsverr   jsurlr_   r   abortversion
invalidatejscache_timelifer   )rU   r   r;   Zcmf_get_versionr   r   )rp   r*   re   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   )rp   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   )rp   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   )rangert   r   )rp   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   )rp   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   1  sj    



	
zApiView.get_rpcc                 C   s   |dkS )NZ	qweqweqwer   )rp   tokenr   r   r   check_tokenx  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s>|s>t|tkr>t|dkr>tdt| dtj d | |||||}|rrt	|}	t
| jd|	 }	nt|ddd}	t
| j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"\g<attr>":"\g<value>"r   F)indentZensure_asciii   uq   Разработчик внимание! Слишком большой размер данных через API.  T)orjson_r   	recursionzapplication/json)Zmimetype)configZ
PRODUCTIONtyperK   rJ   	cmf_alertrU   r   r   rW   rer   _BIG_INT_JSON_HACK_REdecoder   sys	getsizeofresponse_okr   )
rp   result_dictre   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)rU   Zno_jscache_forceosenvironr;   r   rV   r   utcnowstrftimecurrent_personr   r   r   Z_obj_dict_set)rp   rZ   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 )	r&  r'  r;   r   r   _obj_dict_getrX   r   r:   )rp   rZ   Z_resr   r   r   r   api_cache_get  s    


zApiView.api_cache_getc                 O   s   | j |f||S r.   full_cache_validationrp   jshash_list_args_kwargsr   r   r   public_full_cache_validation  s    z$ApiView.public_full_cache_validationc                 O   s   | j |f||S r.   r.  r0  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)re   r   r   r  )r   r(  r)  r   r   r,  rX   r   r;   r   rU   r   )rp   r1  r2  r3  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)rU   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  rr   maxsplitNr	  F)r;   rK   sTr
  _use_simple)r   
ValueErrorr   disable_simple)rp   r  r?  Zproc_cls_nameproc_methodZproc_clsr  
use_simpler   r   r   rpc_prepare_method  s$    


zApiView.rpc_prepare_methodc           7      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} qq~d;|d krd9}|r|d<rd9}|j)rd9}|d=}|d>}|t _*|r|d krtd?| dd d9}|r|r*t d@ n|rtj }t dA | +|}t,dBtj | j-dC  t dD |r||d=kr|rt./|}t dE | j0d d |d= |||dFS t dG |dH s|dI s|dJ rn|dK| } t j1dLdM dNk}!|dkrt dO d|krdP|d kr|d dQ dPkrt dR t }"|d |"d< dPg|"d< | |"dK< |!|"dS< |jf |"}t2|d dTkr|d= n|dPs|rt dR |j|dPg|| |!dU}n|r6dP|kr6t }"dPdV|dPg|"d< dPg|"d< | |"dK< |!|"dS< |jf |"}|3dPd nJ|rt|4 }"g |"d< dPg|"d< | |"dK< |!|"dS< |jf |"}n| dWdXS nlt2|dQksdY|dQ kr| dWdZS |3dQ}#t }"dPdV|#g|"d< dPg|"d< | |"dK< |!|"dS< |jf |"}|st d[ t5  | j6d i d |d\d]S t|t7j!j8o.|j9j}$t|t7j!j:oF|j;j}%t|t7j!j:o^|j<j}&t|t7j!j8ov|j=j>}'t!j"j?|$|j@|%|jAj|&|d^|'d9d_	st d` t!jBjCd^|j@|dadb t5  | j6d i d |dctD ddS t de dL|df kr|df j1dLdgdh\}}(t!j"j?|$|j@||%|jAj|&|d^|'d9di
spt dj t!jBjCd^|j@|dadb t5  | j6d i d |dktD ddS tE||})tE|)|(}ntE||df }t,dltj | j-dC  tj }t dm|d   z4|dJ r|jF||dn}*|*o|*jA}+n
|||}+W n tGk
	r }, zftH|, tIJdo tK|,}-ttE|,dd tLtMf	r\dpNdqdr |,jOD }-| j6d i d ||-|,dd W Y S d },~,X Y nh tPk
	r }, zHtQjRJds tH|, dt|d  du}.|.tST 7 }.| jUdv|.|,dw W Y S d },~,X Y nX t dx t,dytj | j-dC  tj }|
r|jV
rt dz z|W  W n tGk

r }, zftH|, tIJdo tK|,}-ttE|,dd tLtMf
rdpNd{dr |,jOD }-| j6d i d ||-|,dd W Y S d },~,X Y nX t d| t,d}tj | j-dC  tj }tH  t,d~tj | j-dC  tj }|df dkr>|+o:|+jAj}+n"|df dkr`tX|+dPr`|+jAj}+tY|+|d}/t d |r|/Z  n|/1  t,dtj | j-dC  |/j[|/j\ }0}1|df dkrZ|1rZd}2t|1tr|1ddkrda}2|j]dks|2dakrZt|1tr,t!jBjCd^|j@|1dP |2db n.t^|1rPt!jBjCd^|j@|1jA|2db n
t_|1d|df dkrd}2d9}3d9}4|1D ].}5t|5tr|5dd dkrd}3nd}4qx|3r|4rd}2n
|3rda}2|j]dks|2dakrt!jBjCd^|j@|2d t,d|/j` t d tj }|r,tEt dd s,| a|}|r<t./|}z| j0|1|0||||d}6W n< tbk
r }, zt d| d|1   W 5 d },~,X Y nX t,dtj | j-dC  t d |6S )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   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_jscacherm   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   r7  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!  re   r   r   r  r   zapi_cache_get jsver mismatch!r  r  r  
for_updater  r   ZrestorezAPI object get startr   r   u~   deprecated id объекта нужно передавать в kwargs или может вообще параметром RPCr      )rF  r   rH  rO  r   z==i  u   Необходимо указать filter или kwargs для получения объекта перед вызовом его методаr   u1   Необходимо указать id в args[0]zAPI object get Noneu>   Объект не найден, возможно удалён.)r*   re   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*   re   r   r   r   r   zAPI object get endr  rr   r:  )
r   r   r   r   r   r   rQ  rR  r   r   z"API object field access prohibiteduQ   Поле объекта не доступно: недостаточно прав.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   rW  rX  r   r   r   r   2  s     zAPI save endsaveZcommit)ZcreateZupsertZcreate_from_templateupdate)rm   zAPI json dump startZresult_to_dict_ms)r;   sgetokr   r   z$get result must be dict or dataclass)rK   ZslistZ	partially)rS  rT  rV  rj   zAPI json dump endZcache_store_error)r   r  uQ   Ошибка конвертации результата запроса json_res=z result_dict=Zresult_to_response_mszAPI request end)crU   r   r9  r   Zglobal_settingsZeva_versionr  ZEVA_VERSIONrV   r*  r   r   r   Znowr   r   r   r   r   r   r;   rD  r  r
   r   r   r   Zremote_addrr   Z
api_fieldsr   r   rJ  r#   r   Zactivate_admin_moder/  r4  r5  rB  r   rK  r7  r-  rb   Zmicrosecondsr   Zjshash_invalidate_confirm_listr   r   rJ   popcopyr   r   r"   r   r}   r   r~   r   r   oldr   r   r   ZCmfAuditZaudit_eventZCmfPermissionErrorr   Zapply_asyncZCmfUserErrorr   Zloggingr   r   rK   r   joinr/   rY  ZAPPlogger	traceback
format_excr   Z
is_changedrZ  hasattrrc   r   re   r*   Zacl_default_user_policyr   r'   rj   r+  r>  )7rp   Z
start_dateZjson_resr   r0   rE  r/   Zjsonrpc_verZ_filterr   rG  rH  rI  r   r   r   rK  rL  rm   rM  r  Zinvalidate_listr)   r?  r@  r  rA  Zapi_use_cacher<  r   r7  r8  rO  r   Z
tmp_kwargsr   r   r   r   r   Zfield_methodZ	obj_fieldZtaskr*   r   Z	abort_msgmsgZsplitterre   r!  Zcheck_result_statusZcheck_result_have_denyZcheck_result_have_okrd   Zrespr   r   r   post  s    





 


       


















 


*







        
    
     
    



     	&



     




  
  





zApiView.post)N)N)NNN)N)r   )N)FNF)F)#r   r   r   Z__url__rq   r   r   r   r   r   r   r   r   r   r^   r   r  r"   viewsactionr;   r  compiler  r   r+  r-  r4  r5  r/  r9  r   rB  rg  __classcell__r   r   r   r   r     s6   

	




F


	(r   )6r    r   r  r   rX   r  rc  collectionsr   r_  r   Zdataclassesr   r  r   r   r   r   r	   Zuuidr
   rO   r   r   Zujsonr   r   rT   Z
cmf.modelsr"   Zcmf.data_providers.baser   r   Z
cmf.fieldsr   Zcmf.includeZcmf.appr   r+   r<   Zonr1   r@   rL   rM   rP   rQ   rW   r^   rb   rc   rh  ZBaseViewr   r   r   r   r   <module>   sP   

	



  w