U
    )kc                     @   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   sh   t | tjrt| S t | tjr(t| S t | tjjrXdd | j	
 D }| 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   	TypeError	__class__)objresultr   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    r3   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_socketior4   r5   printgetsocketioemit)paramsr4   r5   r6   r   r   r   handle_user_regisrty/   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
    
rD   c                    s   i  fdd}|S )Nc                     s4   t | t| f}|kr, | ||< | S r.   )pickler   sortedr&   )r1   r2   hashfuncmemoryr   r   memoE   s    zmemoized.<locals>.memor   )rI   rK   r   rH   r   memoizedB   s    rL   c                 C   s   dt krt t _|t j| < d S )Nprofiler_data)rB   r   rM   )keymsr   r   r   set_call_timeM   s    rP   c                   @   s   e Zd Zd$ddZdd Zejjp(ejjdddZ	e
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 )(CmfResultSplitterNc                 C   sD   || _ i | _t | _d | _d | _d | _d| _t | _d| _	|| _
d S )Nr   )_objmetasetmeta_fields_keepr*   startendnumber_of_objectsm2m_id_cachedepthno_meta)selfr)   r[   r   r   r   __init__U   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   )rZ   AssertionError)r\   r1   r2   retfnr   r   wrapb   s    
z,CmfResultSplitter._check_depth.<locals>.wrapr   )rc   rd   r   rb   r   _check_deptha   s    zCmfResultSplitter._check_depth)oc                 C   s"   |j | jkrt|j| j|j < d S r.   )r   rS   r   ui_metar\   rf   r   r   r   _add_class_to_metal   s    z$CmfResultSplitter._add_class_to_metac                 C   sB  |  d}|  d}|  d}|  d}|  d}|  d}tt|}i }d}	tjj|||d||| d	plt }
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|
krdnd}	t|  D ]}|j |}|dks"|rN|jrNq"d}tjj|||||| |ddptt }d|krd|krdnd}|r|||< |dkr"| |= q"ddddddddg}|D ]T}dtkr|tjks|dd tjkrq|| kr| |= ||kr||= q|r0|| 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   writereadreadonlyZdeny)rl   r   )ro   rp   ry   rq   rs   ru   rt   rr   
user_localvacation_endvacation_startperm_encrypt
api_fieldsZ_acl_fieldsZ_acl_obj)r:   getattrr#   CmfAccessListcheck_accessrT   
issubclassr"   	CmfEntityacl_parent_field	partitionfieldsno_acllistkeysrB   r   )Zobj_dictro   obj_owner_idobj_idobj_parent_idr   rn   modelZ
acl_fieldsZacl_objZaccess_levelsparent_class_nameparent_modelparent_fieldrw   rx   Zparent_access_levels
field_namer   Z	acl_fieldZfield_access_levelsZhack_fieldsZhackr   r   r   _acl_obj_dictp   s    






     


    
     


   *


zCmfResultSplitter._acl_obj_dictr   c                 C   sh   |  j d7  _ | js| | d|ji}|jddD ]$}|js@q4| j||d d||j< q4| |}|S )Nr^   r   T)
is_definedrZ   )rX   r[   ri   r   valuesr   _process_cmf_typer   )r\   rf   rZ   r*   vr   r   r   _process_cmf_model   s    


z$CmfResultSplitter._process_cmf_modelc                 C   sv   |  j d7  _ | js*tt|j}| | i }|j D ].\}}| jsX| j	|j|f | 
|||< q8| |}|S Nr^   )rX   r[   r   r#   r   ri   r%   r&   rU   add_processr   )r\   r)   rZ   r   r*   r   valuer   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< |}|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   dictr:   r&   r   rX   r"   r   CmfTUUIDget_cls_by_tuuid_strr[   ri   rU   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   .)rX   r[   rU   r   instancer   r   r"   r   CmfObjectJsonr   r   CmfObjectList_process_list	CmfObjectr   CmfRelationBaserl   rY   is_nullremove
CmfRelBaseappendjsonr?   )r\   rf   rZ   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   er\   r   r   r   #  s     z3CmfResultSplitter._process_list.<locals>.<listcomp>)rX   )r\   rf   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| |}|S )Nr^   rl   rv   r   r   )rX   r   r&   r   r[   r   r   r   r#   splitri   r   rU   r   r   r:   r   )r\   rf   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   )rX   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   6  s     






zCmfResultSplitter._processc                 C   sB   | j  D ]2\}}t|d D ]}||f| jkr|d |= qq
d S )Nr   )rS   r&   r   rU   r\   r   Zclass_valuer   r   r   r   _process_metaH  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   )rX   r   r   r#   r   ri   r%   r&   rU   r   r   r"   r$   r   r   r   r   r:   r   r   )	r)   rZ   r   Zsub_attrZ	sub_valueZ	sub_fieldsubr   Zsub_keyprocess_jsonr\   r   r   r   P  s6    




z<CmfResultSplitter._process_simple_meta.<locals>.process_jsonr   )r   )rR   rS   r&   r   rU   r   r   r   r   _process_simple_metaO  s    
z&CmfResultSplitter._process_simple_metac                 C   s$   | j r| jsd S t| j| j  d S )N  )rV   rW   intr   r   r   r   rO   u  s    zCmfResultSplitter.msc                 C   s0   t  | _| | j| _| js$|   t  | _d S r.   )r	   rV   r   rR   r*   rS   r   rW   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	   rV   rB   disable_permissionsrR   r   r*   r[   r   rW   r   r   r   r   split_simple  s
    zCmfResultSplitter.split_simple)N)r   )r   )r   )__name__
__module____qualname__r]   re   r"   r#   CmfModelBaseModelMetari   staticmethodr   r$   r   r   r   r   r   r   r   r   r   r   r   rO   r   r   r   r   r   r   rQ   S   s$   

Q
0&rQ   c                       s   e Zd ZdZdd fddZd1ddZd2dd	Zd3d
dZdd Zd4ddZ	dd Z
d5ddZdd Zd6ddZedd Zdd Zejjdd Zd7d d!Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd8ed,d-d.Zejjd/d0 Z  ZS )9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   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   rM   r   )r   r*   rS   jsverr   jsurlrM   r   abortversion
invalidatejscache_timelifer   )rB   r   r:   cmf_get_versionr   r   )r\   r*   rS   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   )ranger`   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}
t|}|| |d|jk|	|
dd}|||d < qj|j D ]\}}g }t|tjjtjjfrTdd	d
dg}nt|tjjrldd	g}|D ]D}| d| }t||}||t|ddddd|| d| < qpq"|||d}|||d < q|S )Nr$   _)all_models_metaZpublic_all_models_metaget_ui_full_pathr\   F)_methodnamer   is_class_methodis_static_methodis_taskZis_field_methodr   r   r   extend
all_nested.T)_classr   methods)r$   )dirr#   r   r"   r   r   r$   abstractinspectgetattr_static
startswithr   r   r   
celery_appTaskclassmethodr   r   lower
parametersr   r&   CmfM2MCmfGenericM2MCmfJson)r\   Z
rpc_models
model_nameclsZrpc_methodsmethod_namemethodZmethod_attrZ_is_class_methodr   r   sigZ
rpc_methodr   	field_clsZ
submethodsZ	submethodr   Z	rpc_modelr   r   r   r     sn    



	
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
   )render_with_paramsr   r
   r   r   r   r   r:     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_alertrB   
api_methodr   rD   rer   decoder   sys	getsizeofresponse_okr   )
r\   result_dictrS   r   r   r  r   r   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%fr   )r   current_person_idzapi_cache_add endr   zapi_cache_add failed)rB   no_jscache_forceosenvironr:   r
  rC   r   utcnowstrftimecurrent_personrl   r   r   _obj_dict_set)r\   rG   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/  r0  zAPI CACHE HIT )	r4  r5  r:   r
  r   _obj_dict_getrE   r   r9   )r\   rG   Z_resr   r   r   r   api_cache_get6  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_validationB  s    z$ApiView.public_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otherr1  r   r0  r   T)rS   r   r   r  )r   r6  r7  r
  r   r;  rE   r   r:   r,  rB   r   )r\   r>  r?  r@  r*   jshashZ
redis_data
cache_datar   r   r   r=  F  s    


zApiView.full_cache_validationc                 C   s   t jrt jt jkrdS dS )u;   
        Проверяем доступ к апи
        FT)rB   r8  anonymous_userr   r   r   r   _check_accessQ  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:   r   sTr  _use_simple)r   
ValueErrorr   disable_simple)r\   r  rL  proc_cls_nameproc_methodZproc_clsr  
use_simpler   r   r   rpc_prepare_methodZ  s$    


zApiView.rpc_prepare_methodc           /      C   s  d t _|  s| ddS t dt jjj d tj	 }t
tj}t d|  |d krf|  S t|tox|dt _t|to|dt _t js| dS d	|kr| d
S |d	 t _|dd}|t _|dpi }|d}d|kst|trd|krtjdkr| dS |dp,g }|d}|dkr|dpPi }|r`||d< |dd }	|	rz|	|d< |dd }
|
r|
|d< |dd }|r||d< |dd }|r||d< |dg t _|di t _t jdrtj  |dd }|r ||d< | dS |d}|dd }|d }|d	 }g }|d!krb| j||S |d"krx| j||S d }|d#d }| ||}|s|  S |d$ }|d% }|d& }d'}d(D ]}||d	 krd)} qqd*|d	 krd'}|r
|d+r
d'}|j rd'}|d,}|d-}|t _!|rR|d krRt"d.|  d'}|r|rjt d/ n|rtj	 }t d0 | #|}t$d1tj	 | j%d2  t d3 |r||d,kr|rt&'|}t d4 | j(d d |d, |||d5S t d6 |d7 sV|d8 sV|d9 r(n.|d:| }|dkrt d; d|krd<|d kr|d d= d<krt d> t }|d |d< d<g|d< ||d:< |jf |}t)|d d?kr|d= n|d<s|rt d> |j|d<g||d@}n|rPd<|krPt }d<dA|d<g|d< d<g|d< ||d:< |jf |}|*d<d nB|r|+ }g |d< d<g|d< ||d:< |jf |}n| dBdCS ndt)|d=ksdD|d= kr| dBdES |*d=}t }d<dA|g|d< d<g|d< ||d:< |jf |}|s"t dF t,  | j-d i d |dGdHS t|t.jj/o8|j0j} t|t.jj1oP|j2j}!t|t.jj1oh|j3j}"tjj4| |j5|!|j6j|"|dId'dJst dK t,  | j-d i d |dLt7 dMS t dN dO|dP krH|dP j8dOdQdR\}#}$tjj4| |j5|#|!|j6j|"|dId'dS	s2t dT t,  | j-d i d |dUt7 dMS t9||#}%t9|%|$}nt9||dP }t$dVtj	 | j%d2  tj	 }t dW|d	   z4|d9 r|j:||dX}&|&o|&j6}'n
|||}'W n t;k
rH }( zft<|( t=>dY t?|(})tt9|(dd t@tAfrdZBd[d\ |(jCD })| j-d i d ||)|(dM W Y S d }(~(X Y nh tDk
r }( zHtEjF>d] t<|( d^|d	  d_}*|*tGH 7 }*| jId`|*|(da W Y S d }(~(X Y nX t db t$dctj	 | j%d2  tj	 }|	r|jJ	rt dd z|K  W n t;k
	r }( zft<|( t=>dY t?|(})tt9|(dd t@tAf	r^dZBded\ |(jCD })| j-d i d ||)|(dM W Y S d }(~(X Y nX t df t$dgtj	 | j%d2  tj	 }t<  t$dhtj	 | j%d2  tj	 }|dP dik
r |'	o|'j6j}'n"|dP djk
r"tL|'d<
r"|'j6j}'tM|'|dk}+t dl |
rH|+N  n|+8  t$dmtj	 | j%d2  |+jO|+jP },}-t$dn|+jQ t do tj	 }|
rt9t dpd 
s| R|}|
rt&'|}| j(|-|,||||dq}.t$drtj	 | j%d2  t ds |.S )tNi  u   Нет правzAPI request start ()z	json_res=session_tab_idr   zNo callid specifiedr  zNo method specifiedr   r   r2   save_kwargs	only_dataz	127.0.0.1uM   SPEC0 Использование only_data через API запрещено.r1   r   r   filterr   sliceorder_bygroup_byflagsZ
admin_modeno_cacheu)   no_cache запрещен go to spec0 osv
no_jscacher[   cache_idzCache.full_cache_validationz"Cache.public_full_cache_validationrL  r   r  rJ  F)z.get_getz.list_listz.select_selectz.sumZ_sumz.count_countz.maxZ_maxz.minZ_minTZget_current_usersearch_stringr   rC  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-  rS   r   r   r  r   zapi_cache_get jsver mismatch!r   r   r   
for_updatezAPI object get startrl   r   u~   deprecated id объекта нужно передавать в kwargs или может вообще параметром RPC   )rU  r   rW  rb  z==i  u   Необходимо указать filter или kwargs для получения объекта перед вызовом его методаrv   u1   Необходимо указать id в args[0]zAPI object get Noneu>   Объект не найден, возможно удалён.)r*   rS   r   r   r   r{   )ro   rp   rq   rs   rt   object_instanceaccess_levelrr   zAPI object access prohibiteduG   Объект не доступен: не достаточно прав.)r*   rS   r   r   r   r   zAPI object get endr  r   r^   rG  )	ro   rp   ry   rq   rs   rt   rd  re  rr   z"API object field access prohibiteduR   Поле объекта не доступно: не достаточно прав.preparezAPI method start )r1   r2   zUserError Trace:r  c                 S   s   g | ]}t |qS r   r   r   r   r   r   r   r   w  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   rg  rh  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_msrX   zAPI json dump endcache_store_error)r   r  Zresult_to_response_mszAPI request end)SrB   r   rF  r   rC   r8  r   r   r   nowr   r   r   r   r   r   r:   rR  r   r'  r   remote_addrr   r   rY  r#   r   Zactivate_admin_moder=  rA  rP  r   rZ  rC  r&  r<  rP   microsecondsr   jshash_invalidate_confirm_listr,  r%  popcopyr   r   r"   r   rj   r   rk   rm   r   r   rl   CmfPermissionErrorr   r   apply_asyncCmfUserErrorr   loggingr   r   r   tuplejoinr1   ri  APPlogger	traceback
format_excr   
is_changedrj  hasattrrQ   r   rS   r*   rX   r:  )/r\   Z
start_datejson_resr   r2   rS  r1   Zjsonrpc_ver_filterr   rV  rW  rX  rZ  r[  r[   r\  r  invalidate_listr)   rL  rN  r  rO  Zapi_use_cacherI  r   rC  rD  rb  Z
tmp_kwargsrl   ro   r   r   r   Zfield_method	obj_fieldtaskr*   r   Z	abort_msgmsgsplitterrS   r-  respr   r   r   post  s6   





 

















 


*







        
    
     
    



     	&



     









zApiView.post)N)N)NNN)N)r   )N)FNF)F)r   r   r   __url__r]   r   r   r   r   r   r   r   r   r   rL   r   r  r"   viewsactionr:   r,  r:  r<  rA  r=  rF  r   rP  r  __classcell__r   r   r   r   r     s2   

	




B

	(r   )2r    r   r*  r   rE   r(  r~  collectionsr   ru  r   dataclassesr   r  r   r   r   r   r	   uuidr
   flaskr   r   ujsonr   r   rA   
cmf.modelsr"   cmf.data_providers.baser   r   Z
cmf.fieldsr   cmf.includecmf.appr   r+   r;   onr3   r>   rD   rL   rP   rQ   r  BaseViewr   r   r   r   r   <module>   s@   


  :