U
    /5Qd                     @   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*dd Z+dd Z,dd Z-G dd dZ.G d d! d!ej/j0Z1d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   %/opt/crm/./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   virtual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   jshash_invalidate_confirm)confirm_dictargskwargsr   r   r   handle_message/   s    r5   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_socketior6   r7   printgetsocketioemit)paramsr6   r7   r8   r   r   r   handle_user_regisrty3   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_dumps>   s
    
rF   c                    s   i  fdd}|S )Nc                     s4   t | t| f}|kr, | ||< | S r0   )pickler   sortedr&   )r3   r4   hashfuncmemoryr   r   memoI   s    zmemoized.<locals>.memor   )rK   rM   r   rJ   r   memoizedF   s    rN   c                 C   s   dt krt t _|t j| < d S )Nprofiler_data)rD   r   rO   )keymsr   r   r   set_call_timeQ   s    rR   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+   r]   r_   r   r   r   __init__Y   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   )r\   AssertionError)r`   r3   r4   retfnr   r   wraph   s    
z,CmfResultSplitter._check_depth.<locals>.wrapr   )rg   rh   r   rf   r   _check_depthg   s    zCmfResultSplitter._check_depth)oc                 C   s"   |j | jkrt|j| j|j < d S r0   )r   rU   r   ui_metar`   rj   r   r   r   _add_class_to_metar   s    z$CmfResultSplitter._add_class_to_metac                 C   sx  | 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|krJd|krFdnd}
t| }tjdsrt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p t }|dkr|rt }|dkr|r|dr|| jkrj| j| sd|krt|}|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rd|krt|}|d d| j|< n
d| j|< d|kr,d|kr(dnd}|r:||	|< |dkr||kr||= q|	rf|	|d < |
rt|
|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)rs   rt   ru   object_fieldrw   rx   ry   rv   
CmfCommentprivateTwritereadreadonlydeny.getz.ui_getcomments)rp   r   )rs   rt   r}   ru   rw   ry   rx   rv   zCmfProject:root_parent_id)fieldsinclude_deletedzPPP-COM-ADD)r+   rv   Z_acl_fields_acl_obj)r<   getattrr#   CmfAccessListcheck_accessrV   
issubclassr"   	CmfEntityacl_parent_field	partitionr   r_   r~   Zcheck_visibilitylistkeysrD   
api_methodendswithappendapi_hack_fields
startswithr^   removecmfutilget_obj_by_idr   valuerq   check_project_role_access)r`   Zobj_dictrs   obj_owner_idobj_idobj_parent_idr   rr   modelZ
acl_fieldsZacl_objZcomment_denyZaccess_levelsparent_class_nameparent_modelparent_fieldr{   r|   Zparent_access_levelsZobj_keys
field_namer   Z	acl_fieldZfield_access_levelsZproject_obj_Zproject_id_r   r   r   _acl_obj_dictv   s    






     


    


     







zCmfResultSplitter._acl_obj_dictr   c                 C   sn   |  j d7  _ | js| | d|ji}|jddD ]$}|js@q4| j||d d||j< q4| jsj| |}|S )Nrb   r   T)
is_definedr\   )	rZ   r]   rm   r   valuesr   _process_cmf_typer_   r   )r`   rj   r\   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 Nrb   )rZ   r]   r   r#   r   rm   r%   r&   rW   add_processr_   r   )r`   r+   r\   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>rp   c                    s   i | ]\}}| |qS r   r   )r   kr   r   r   r   r     s      zSCmfResultSplitter._process_json_as_model.<locals>.proccess_json.<locals>.<dictcomp>rz   rb   r   )r   r   dictr<   r&   r   rZ   r"   r   CmfTUUIDget_cls_by_tuuid_strr]   rm   rW   r   r   r_   r   )r+   r   datar   r   r   r`   r   r   r     s"    





z?CmfResultSplitter._process_json_as_model.<locals>.proccess_jsonr   rl   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 )Nrb   r   .)rZ   r]   rW   r   instancer   r   r"   r   CmfObjectJsonr   r   CmfObjectList_process_list	CmfObjectr   CmfRelationBaserp   r[   is_nullr   
CmfRelBaser   jsonrA   )r`   rj   r\   resr,   ipr   r   r   r   $  s@    


z#CmfResultSplitter._process_cmf_typec                    s$     j d7  _  fdd|D }|S )Nrb   c                    s   g | ]}  |qS r   )r   )r   er`   r   r   r   W  s     z3CmfResultSplitter._process_list.<locals>.<listcomp>)rZ   )r`   rj   r,   r   r   r   r   U  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 )Nrb   rp   rz   r   r   )rZ   r   r&   r   r]   r   r   r   r#   splitrm   r   rW   r   r   r<   r_   r   )r`   rj   r,   r   r   mr   r   r   r   _process_dictZ  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   )rZ   r   r   r   r"   r   r   r   r#   r$   r   r   r   r   r   r   r   r    r!   r   datetimedate	isoformat)r`   r+   r   r   r   r   j  s     






zCmfResultSplitter._processc                 C   sB   | j  D ]2\}}t|d D ]}||f| jkr|d |= qq
d S )Nr   )rU   r&   r   rW   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 )Nrb   .rp   rz   r   )rZ   r   r   r#   r   rm   r%   r&   rW   r   r   r"   r$   r   r   r   r   r<   r   r   )	r+   r\   r   Zsub_attrZ	sub_valueZ	sub_fieldsubr   Zsub_keyprocess_jsonr`   r   r   r     s6    




z<CmfResultSplitter._process_simple_meta.<locals>.process_jsonr   )r   )rT   rU   r&   r   rW   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  )rX   rY   intr   r   r   r   rQ     s    zCmfResultSplitter.msc                 C   s0   t  | _| | j| _| js$|   t  | _d S r0   )r	   rX   r   rT   r,   rU   r   rY   r   r   r   r   r     s
    zCmfResultSplitter.splitc                 C   s<   t  | _tjr| jn
| | j| _| js0|   t  | _	d S r0   )
r	   rX   rD   disable_permissionsrT   r   r,   r]   r   rY   r   r   r   r   split_simple  s
    zCmfResultSplitter.split_simple)NF)r   )r   )r   )__name__
__module____qualname__ra   ri   r"   r#   CmfModelBaseModelMetarm   r   r$   r   r   r   r   r   r   r   r   r   r   r   rQ   r   r   r   r   r   r   rS   W   s"   
}
0&rS   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 r0   )superra   get_rpcrpcr   r*   r   r   ra     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   )rD   r<   
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   rO   r   )r   r,   rU   jsverr   jsurlrO   r   abortversion
invalidatejscache_timelifer   )rD   r   r<   cmf_get_versionr   r   )r`   r,   rU   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   )rangerd   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$   _)all_models_metaZpublic_all_models_metaget_ui_full_pathpublic_get_ui_full_pathpublic_nonepublic_none_classmethodF)_methodnameis_class_methodis_static_methodis_taskis_field_methodr  r   r   extend
all_nested.T)r  r  r   r  r  r  r  )_classr  methods)r$   )dirr#   r   r"   r   r   r$   abstractinspectgetattr_staticr   r   r   r   
celery_appTaskclassmethodstaticmethodlowerr   r&   CmfM2MCmfGenericM2MCmfJsonr   )r`   Z
rpc_models
model_nameclsZrpc_methodsmethod_namemethodZmethod_attrr  r  r  Z
rpc_methodr   	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_tokenE  s    zApiView.check_tokenc                 C   s   | j d| jtdS )Nz
index.html)r   r
   )render_with_paramsr   r
   r   r   r   r   r<   H  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)indentensure_asciii   uq   Разработчик внимание! Слишком большой размер данных через API.  T)orjson_r   	recursionzapplication/json)mimetype)config
PRODUCTIONtyper   len	cmf_alertrD   r   r   rF   rer   decoder   sys	getsizeofresponse_okr   )
r`   result_dictrU   r   r   r-  r   r.  responseZ	json_datar   r   r   r9  L  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   current_person_idzapi_cache_add endr   zapi_cache_add failed)rD   no_jscache_forceosenvironr<   r   rE   r   utcnowstrftimecurrent_personrp   r   r   _obj_dict_set)r`   rI   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 )	rB  rC  r<   r   r   _obj_dict_getrG   r   r;   )r`   rI   _resr   r   r   r   api_cache_getn  s    


zApiView.api_cache_getc                 O   s   | j |f||S r0   full_cache_validationr`   jshash_list_args_kwargsr   r   r   public_full_cache_validationz  s    z$ApiView.public_full_cache_validationc                 O   s   | j |f||S r0   rL  rN  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)rU   r   r   r-  )r   rD  rE  r   r   rI  rG   r   r<   r9  rD   r   )r`   rO  rP  rQ  r,   jshashZ
redis_data
cache_datar   r   r   rM    s    


zApiView.full_cache_validationc                 C   s   t jrt jt jkrdS dS )u;   
        Проверяем доступ к апи
        FT)rD   rF  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  rb   maxsplitNr  F)r<   r   sTr  _use_simple)r   
ValueErrorr   disable_simple)r`   r%  r^  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 dt jjj d tj	 }t
tj}t d|  t|tsh|  S |dt _|dt _t jstdd	d
 t t _d|kr| dS |d t _|dd}|t _|dpi }|d}d|kst|trd|krtjdkr| dS |dp"g }|d}|dkr|dpFi }|rV||d< |dd }	|	rp|	|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r|| |d& |kr||d&  q|t _|d'i t _t jd(rftj  |d)d }|r||d)< | d*S |d+}|d,d }|d-}|d }g }|d.kr| j ||S |d/kr| j!||S |d0kr| j"||S d }|d1d }| #||}|s"| $ S |d2 }|d3 }|d4 }d5}d6D ]}||d krBd	} qbqBd7|d krtd5}|r|d8rd5}|j%rd5}|d9}|d:}|t _&|r|d krtd;| d	d
 d5}|r|rt d< n|rtj	 }t d= | '|}t(d>tj	 | j)d?  t d@ |r||d9kr|r\t*+|}t dA | j,d d |d9 |||dBS t dC |dD s<|dE s<|dF rn|dG| } t j-dHdI dJk}!|dkrFt dK d|krhdL|d krh|d dM dLkrht dN t }"|d |"d< dLg|"d< | |"dG< |!|"dO< |jf |"}t.|d dPkrD|d= n|dLs|rt dN |j|dLg|| |!dQ}n|rdL|krt }"dLdR|dLg|"d< dLg|"d< | |"dG< |!|"dO< |jf |"}|/dLd nJ|r8|0 }"g |"d< dLg|"d< | |"dG< |!|"dO< |jf |"}n| dSdTS nlt.|dMksbdU|dM krn| dSdVS |/dM}#t }"dLdR|#g|"d< dLg|"d< | |"dG< |!|"dO< |jf |"}|st dW t1  | j2d i d |dXdYS t|t3jj4o|j5j}$t|t3jj6o
|j7j}%t|t3jj6o"|j8j}&tjj9|$|j:|%|j;j|&|dZd5d[st d\ tj<j=dZ|j:|d]d^ t1  | j2d i d |d_t> d`S t da dH|db kr.|db j-dHdcdd\}}'tjj9|$|j:||%|j;j|&|dZd5de	st df tj<j=dZ|j:|d]d^ t1  | j2d i d |dgt> d`S t?||}(t?|(|'}nt?||db }t(dhtj	 | j)d?  tj	 }t di|d   z4|dF r|j@||dj})|)o|)j;}*n
|||}*W n tAk
	r. }+ zftB|+ tCDdk tE|+},tt?|+dd tFtGf	rdlHdmdn |+jID },| j2d i d ||,|+d` W Y S d }+~+X Y nh tJk
	r }+ zHtKjLDdo tB|+ dp|d  dq}-|-tMN 7 }-| jOdr|-|+ds W Y S d }+~+X Y nX t dt t(dutj	 | j)d?  tj	 }|
rz|jP
rzt dv z|Q  W n tAk

rn }+ zftB|+ tCDdk tE|+},tt?|+dd tFtGf
rDdlHdwdn |+jID },| j2d i d ||,|+d` W Y S d }+~+X Y nX t dx t(dytj	 | j)d?  tj	 }tB  t(dztj	 | j)d?  tj	 }|db d{k
r|*
o|*j;j}*n"|db d|krtR|*dLr|*j;j}*tS|*|d}}.t d~ |r.|.T  n|.-  t(dtj	 | j)d?  |.jU|.jV }/}0|db dkr|0rd}1t|0tr|0ddkrd]}1|jWdks|1d]krt|0trtj<j=dZ|j:|0dL |1d^ n.tX|0rtj<j=dZ|j:|0j;|1d^ n
tY|0d|db dkrd}1d5}2d5}3|0D ].}4t|4trH|4dd dkrHd	}2nd	}3q |2rb|3rbd}1n
|2rld]}1|jWdks|1d]krtj<j=dZ|j:|1d t(d|.jZ t d tj	 }|rt?t dd s| [|}|rt*+|}| j,|0|/||||d}5t(dtj	 | j)d?  t d |5S )Ni  u   Нет правzAPI request start ()z	json_res=session_tab_idr   zAPI: No callid specifiedT)
devel_onlyr%  zNo method specifiedr   r   r4   save_kwargs	only_dataz	127.0.0.1uM   SPEC0 Использование only_data через API запрещено.r3   r   r   filterr   sliceorder_bygroup_byr   rn   r{   rr   r|   
user_localvacation_endvacation_startperm_encryptimport_original_idflagsZ
admin_modeno_cacheu)   no_cache запрещен go to spec0 osv
no_jscacher]   cache_idzCache.full_cache_validationz"Cache.public_full_cache_validationz!Cache.sdesk_full_cache_validationr^  r  r  r\  F)r   _getz.list_listz.select_selectz.sumZ_sumz.count_countz.maxZ_maxz.minZ_minget_current_userZsearch_stringr   rU  ur   ошибка на frontend методы list get и тп должны быть с jshash, кроме тестов z$api_cache_get skip due to no_jscachezapi_cache_get startrK  r   zapi_cache_get endzapi_cache_get hit!)r:  rU   r   r   r-  r   zapi_cache_get jsver mismatch!r  r  r  
for_updater  r  restorezAPI object get startrp   r   u~   deprecated id объекта нужно передавать в kwargs или может вообще параметром RPCcmf_deleted   )rh  r   rj  r{  r}  z==i  u   Необходимо указать filter или kwargs для получения объекта перед вызовом его методаrz   u1   Необходимо указать id в args[0]zAPI object get Noneu>   Объект не найден, возможно удалён.)r,   rU   r   r   r   r   )rs   rt   ru   rw   rx   object_instanceaccess_levelrv   zAPI object access prohibitedfail)operatecmf_model_nameparentresult_statusuG   Объект не доступен: не достаточно прав.)r,   rU   r   r   r   r   zAPI object get endr  rb   rY  )	rs   rt   r}   ru   rw   rx   r  r  rv   z"API object field access prohibiteduR   Поле объекта не доступно: не достаточно прав.preparezAPI method start )r3   r4   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   r  r  r   r   r   r     s     zAPI save endsavecommit)createupsertZcreate_from_templateupdate)r]   zAPI json dump startZresult_to_dict_ms)r<   sgetokr   r   z$get result must be dict or dataclass)r   slistZ	partially)r  r  r  rZ   zAPI json dump endcache_store_error)r   r-  Zresult_to_response_mszAPI request end)\rD   r   rX  r   rE   rF  r   r   r   nowr   r   r   r   r   r   r<   rd  r4  r
   r   r   r   remote_addrr   Z
api_fieldsr   r   rr  r#   r   Zactivate_admin_moderM  rR  rS  rb  r   rs  rU  rK  rR   microsecondsr   jshash_invalidate_confirm_listr9  r   r3  popcopyr   r   r"   r   rn   r   ro   rq   r   r   rp   CmfAuditaudit_eventCmfPermissionErrorr   apply_asyncCmfUserErrorr   loggingr   r   r   tuplejoinr3   r  APPlogger	traceback
format_excr  
is_changedr  hasattrrS   r   rU   r,   acl_default_user_policyr   r)   rZ   rH  )6r`   Z
start_datejson_resr   r4   rf  r3   Zjsonrpc_ver_filterr   ri  rj  rk  r   r   r   rs  rt  r]   ru  r%  Zinvalidate_listr+   r^  r`  r#  ra  Zapi_use_cacher[  r   rU  rV  r{  r}  Z
tmp_kwargsrp   rs   r   r   Zfield_method	obj_fieldtaskr,   r   Z	abort_msgmsgsplitterrU   r:  Zcheck_result_statusZcheck_result_have_denyZcheck_result_have_okrT   respr   r   r   post  s   








       


















 


*







        
    
     
    



     	&



     




  
  





zApiView.post)N)N)NNN)N)r   )N)FNF)F) r   r   r   __url__ra   r   r   r   r   r   r   r   r  r  rN   r   r(  r"   viewsactionr<   r9  rH  rK  rR  rS  rM  rX  r   rb  r  __classcell__r   r   r   r   r     s4   

	




F

	(r   )2r    r   r7  r   rG   r5  r  collectionsr   r  r   dataclassesr   r  r   r   r   r   r	   uuidr
   flaskr   r   ujsonr   r   rC   
cmf.modelsr"   cmf.data_providers.baser   r   Z
cmf.fieldsr   cmf.includecmf.appr   r-   r=   onr5   r@   rF   rN   rR   rS   r  BaseViewr   r   r   r   r   <module>   s@   


  j