U
    hU                     @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	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 m!Z!m"Z" d dl#T d dl$m%Z% dd Z&e'e(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# Z0e*j+d$ddd%d& Z1d'd( Z2d)d* Z3d+Z4G d,d- d-ej5j6Z7dS ).    N)OrderedDict)deepcopy)is_dataclass)isclass
isfunctionismethod	signature)time)uuid4)Responserequest)dumpsloads)commit_all_dsrollback_all_ds)*)	CMF_CACHEc                  C   sj   t jrt t j dk rt jS t jd} | sNttt }t jjd|dd n| 	 }|t _t t _t jS )N   redis_idT)Znx)
APPREDIS_DB_IDr	   ZREDIS_DB_ID_TIMERZREDIS_DBgetstrintsetdecode)Zraw_redis_idr    r   ./modules/api/views/index.pyget_redis_id   s    r   zCmfCache:flushdb)Zchannelc                  O   s   d t _td td d S )NzAPP.REDIS_DB_ID = NONE)r   r   logginginfogdebugargskwargsr   r   r   flush_redis_id/   s    
r&   zjshash-invalidate-confirm/)	namespacec                 O   s   t |  d S N)r   Zjshash_invalidate_confirm)Zconfirm_dictr$   r%   r   r   r   handle_message=   s    r*   Zuser_regisrtyc                 C   sR   ddl m}m} tdd|   | dd }|r:|| tjd| |d d S )Nr   	join_room
leave_room%szhandle_user_regisrty: user_idzMe registered: roomflask_socketior,   r-   r   r    r   socketioemitparamsr,   r-   r/   r   r   r   handle_user_regisrtyA   s    r8   r,   c                 C   s   ddl m} tdd|   || d  t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   )r,   r.   zhandle_user_join_room: 	room_namer'   r(   r1   zUser r/   z	 join to participantsr0   z
Joined to 	user_name
user_login)r;   r<   r=   r/   )	r3   r,   r   r    r4   get_participantslenlistr5   )r7   r,   r;   ZparticipantsSizer   r   r   handle_user_join_roomK   s    ,rA   r-   c                 C   sd   ddl m} tdd|   || d  tjd| d d}tjdd	tt|i| | d d
 d S )Nr   )r-   r.   zhandle_user_leave_room: r9   r'   r:   zUser leave roomr;   r0   )	r3   r-   r   r    r4   r>   r5   r?   r@   )r7   r-   r;   r   r   r   handle_user_leave_room\   s
    rB   document_broadcastc                 C   s   t jd| | d tjjd d S )NrC   r9   )r1   Zskip_sid)r4   r5   flaskr   Zsid)r7   r   r   r   handle_document_broadcastd   s    rE   Z	user_pingc                 C   sF   ddl m}m} tdd|   | dd }|rBtd|  d S )Nr   r+   r.   zhandle_user_ping: r/   Z
user_pong_r2   r6   r   r   r   handle_user_pingi   s
    rF   c                    s   i  fdd}|S )Nc                     s4   t | t| f}|kr, | ||< | S r)   )pickler   sorteditems)r$   r%   hashfuncZmemoryr   r   memox   s    zmemoized.<locals>.memor   )rL   rM   r   rK   r   memoizedu   s    rN   c                 C   s   dt krt t _|t j| < d S )Nprofiler_data)r!   r   rO   )keymsr   r   r   set_call_time   s    rR   z******c                       s  e Zd ZdZd5dd fddZd6ddZd7dd	Zd8d
dZdd Zd9ddZ	dd Z
d:ddZdd Zd;ddZed<edddZdd Zejjdd Zed Zd=d"d#Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd>e d0d1d2Z!ejjd3d4 Z"  Z#S )?ApiViewr'   N)returnc                    s   t    | j|d| _d S )Nextra_models_list)super__init__get_rpcrpc)selfrV   	__class__r   r   rX      s    
zApiView.__init__c                 C   s   |rdd |j jD |d< |S )Nc                 S   s   g | ]
}|j qS r   )__name__).0Ze_clsr   r   r   
<listcomp>   s     z/ApiView._add_exception_info.<locals>.<listcomp>Zexception_types)r]   __mro__)r[   result	exceptionr   r   r   _add_exception_info   s    zApiView._add_exception_infoc                 C   sB   t j  td|| d||dtdtjd}| j||dS )Nz%s, exception=%s2.0)codemessagealert)jsonrpcerrorrh   callidrc   )	cmfapp_deferred_errors_checkr   rj   r!   r   
api_callidrd   )r[   rf   rg   rc   rb   r   r   r   _error   s    
zApiView._errorc                 C   s   t j  |sg }d|||tj|tdtdtd|t |t d}tjrZtj|d< |sr|srtj	rrtj	|d< tj
rd|d	< | j||d
S )Nre   rO   rh   note)ri   rb   metajsverrk   jsurlrO   rh   rr   abortversion
invalidater   jscache_timelifeshow_bg_progressbarTZlicense_requiredrl   )rm   rn   ro   r!   rp   r   Zcmf_get_versionr   ry   rz   Zapi_license_requiredrd   )r[   rb   rs   rt   ru   rx   rv   rc   r   r   r   _ok   s0    


zApiView._okc                 C   s   |  ddS )NiDzParse errorrq   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[   rg   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[   rg   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 irl   )rangeAssertionErrorrq   )r[   rf   rg   rc   r   r   r   server_error   s    zApiView.server_errorrU   c                 C   sJ  | s
g } nt | } | tjj ddd | D }tj|rJtj| S i tj|< t	t| D ]}t
|r|}t|d|j}n<tt|d pttj|d }t
|sq`t|tjjsq`|jrq`|dkrtdddd	d
dddddg
}n|jsq`n
t|j}i }tt	||@ }|D ]\}t||}t||}t|t}	t|t}
t|t}|| |	|
|dd}|||d < qt|tjjr |j D ]\}}g }t|tjjtjjfrddddg}nt|tjjrddg}|D ]D}| d| }t||}||t|ddddd|| d| < q֐q|||d}|tj| |d < q`tj| S )Nr   c                 S   s   g | ]}t |qS r   r   )r_   objr   r   r   r`      s     z#ApiView.get_rpc.<locals>.<listcomp>
class_name	BaseModelZall_models_metaZget_metaZget_ui_full_pathZubql2bqlZpublic_get_ui_full_pathZpublic_all_models_metaZpublic_noneZpublic_none_classmethodZsdesk_get_ui_full_pathZsdesk_all_models_metaF)_methodnameis_class_methodis_static_methodis_taskis_field_methodr   appendremoveextendZ
all_nested.T)r   r   r   r   r   r   r   )_classr   methods)r@   r   rm   modelsr   joinr   Z
rpc_modelsr   dirr   getattrr^   
issubclassZabstractr   	api_allowZapi_methodsinspectZgetattr_static
isinstanceclassmethodstaticmethodZCmfDeferredJobWrapperlowerfieldsrI   ZCmfM2MZCmfGenericM2MZCmfJsonr   )rV   rP   Z
model_nameclsZapi_methods_setZrpc_methodsmethod_namemethodZmethod_attrr   r   r   Z
rpc_method
field_nameZ	field_clsZ
submethodsZ	submethodr   Z	rpc_modelr   r   r   rY      s    






	
zApiView.get_rpcc                 C   s   |dkS )NZ	qweqweqwer   )r[   tokenr   r   r   check_tokenB  s    zApiView.check_tokenc                 C   s<   t jdd}|r*td|s*| ddS | jd| jtdS )Nmr   z[a-zA-Z0-9_]+i  u   Недопустимые символы в параметре m. Разрешены только буквы, цифры и подчеркивания.z
index.html)rZ   r
   )	r   r$   r   re	fullmatchrq   Zrender_with_paramsrZ   r
   )r[   Zm_paramr   r   r   r   E  s    zApiView.getz9"(?P<attr>(cmf|doc|obj|approved)_version)":(?P<value>\d+)Fc              
   C   s  t js|st|trt|dkrBtdt| dtj tj	d nDt|dkrt
j t
dddkrtd	t| dtj tj	d | |||||}|rt|}	t| jd
|	 }	nXzt|ddd}	W n4 tk
r }
 ztd|
|  W 5 d }
~
X Y nX t| jd
|	}	t js|st|	d}|dkrxtd| dtj tj	d td | j||||||ddS |dkrt
j t
dddkrtd| dtj tj	d td | j||||||ddS t|	ddS )Ni  u    !!!Блокирующая задача критикал баг! Обратитесь в техком!!! Используй slice u   , метод leveli,  i        uw   Разработчик внимание! Слишком много строк через API. Используй slice z"\g<attr>":"\g<value>"r   F)indentZensure_asciiz"Json dumps error: %s | response=%szutf-8i   uh   !!!Блокирующая задача критикал баг! Обратитесь в техком!!! u    байт, метод uI   response_ok: повторный вызов из-за размера >10MBT)orjson_rx   	recursioni   uq   Разработчик внимание! Слишком большой размер данных через API. uH   response_ok: повторный вызов из-за размера >1MBzapplication/json)Zmimetype)configZ
PRODUCTIONr   r@   r?   	cmf_alertr!   
api_methodr   WARNINGdatetimedateZtodayr{   cmfutilZ	cmf_dumpsr   sub_BIG_INT_JSON_HACK_REr   r   	TypeErrorrj   encoder"   response_okr   )r[   result_dictrs   rt   ru   r   rx   r   ZresponseZ	json_dataeZactual_sizer   r   r   r   R  sN    

$


$
zApiView.response_okc                 C   s   t jr
d S tjdrd S |ds2t d d S tj 	dd d t j
jjd}t|t|rzt d |d S t d	 d S )
NNO_CACHEjshash:z$api_cache_add failed, invalid jshash%Y%m%d%H%M%S%f)rt   Zcurrent_person_idzapi_cache_add endrt   zapi_cache_add failed)r!   Zno_jscache_forceosenvironr   
startswithr"   r   utcnowstrftimecurrent_personidvaluer   Z_obj_dict_setrG   r   )r[   rJ   Z	res_cacher   r   r   api_cache_add  s    


zApiView.api_cache_addc                 C   sN   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_getrG   r   r   r    )r[   rJ   Z_resresr   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   rt   T)rs   rt   ru   r   )r   r   r   r   r   r   rG   r   r   r   r!   ru   )r[   r   r   r   rb   jshashZ
redis_data
cache_datar   r   r   r     s    


zApiView.full_cache_validationc                 C   s   t jrt jt jkrdS dS )u;   
        Проверяем доступ к апи
        FT)r!   r   Zanonymous_userr}   r   r   r   _check_access  s    zApiView._check_access)r   c                 C   s   z|j ddd\}}W n tk
r,   Y dS X |dkrH|dkrHd| }|| jkrVdS | j| }|d }d	}|d
kr|js|sd| }d}||d krdS |d | }||d< ||d< |S )u  
        Поиск метода rpc

        находит метод в rpc_json
        проверяет его разрешенность
        возвращает указатель на функцию

        Возвращает не метод, а структуру из self.get_rpc + доп.поля:
         - use_simple - когда решили использовать slist или sget
         - _class - указатель на модель
        r   r   maxsplitNZCmfAttachment)createupdatedeleteZapi_r   F)r   r@   sTr   _use_simple)split
ValueErrorrZ   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           A      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j d	tj d
| d t|ts|  S |dt _|dt _|dt _|dt _t jstddtjd tt t _d|kr| dS |d t _ t jrFt!dt j  dt j" d |dd}|t _#|dpfi }|t _$t%|& }|dpi }t%|& }dddh}|'|s|'|rtjdkr| (d| d S |d!pg }	|	t _)|d"}
|
d#kr|d$pi }|r||d$< |d%d }|r8||d%< |d&d }|rR||d&< |d'd }|rl||d'< |d(d }|r||d(< |d)d }|r||d)< |d%g t _*d*d+d,d-d.d/d0d1d2d3d4d5d6d7h}t j*D ]6}||kr|+| |d8 |kr|+|d8  q|t _,|d9i t _-t j-d:r8t.j/0  |d;d }|r\||d;< | (d<S tj1rt j2|d |	|3 t j-d=}|d 4 D ]H\}}t|trt5|d>krd?t5| d|d d@  |d |< qt6dAt78|  |dB}|dCd }|dD}|d }g }|dEkr,| j9|	|S |dFkrB| j:|	|S |dGkrX| j;|	|S d }|dHd }| <||}|s| = S |dI }|dJ }|dK } dL}!dMD ]}"|"|d krd}!dLt _>t j?@|jA dN|d krdL}#|
d#kr$|r$|dO dPkr$t|dQ tr$tBjC|dQ ddR d}#|rJdP|krJtBjC|dP ddR d}#|rpdS|krptBjC|dS ddR d}#|r d$|kr |d$ dO dPkrt|d$ dQ trtBjC|d$ dQ ddR d}#|d$ dO dSkr t|d$ dQ tr tBjC|d$ dQ ddR d}#|	r*dT|	dO kr*tBjC|	dO ddR d}#dU|d kr8dVdWdXdYdZg}$|$D ]}%|%|d krJd}# qjqJ|#st d[|d    qqdV|d krdL}!|r|d\rdL}!tD|d]dLrdL}!|d^}&|d_}'|'rt.jEF  |'t _G|!r|'d krtd`| dtjd dL}!|!r|r4t da n|&rtj }t db | H|'}(tIdctj | jJdd  t de |(r|&|(d^kr|rtKL|}t df | jMd d |(d^ || |dgS t dh |di s|dj s|dk rn|dl|! })t j Ndmdn dok}*|
d#k	rt dp d$|krdP|d$ kr|d$ dO dPkrt dq t }+|d$ |+d$< dPg|+d%< |*|+dr< |jf |+}t5|d$ dsk	r|d$= n|dPs|rt dq |j|dPg||*dt}n|	rDdP|k	rD|)rtBC|dP t }+dPdu|dPg|+d$< dPg|+d%< |*|+dr< |jf |+}|OdPd nB|	rz|3 }+g |+d$< dPg|+d%< |*|+dr< |jf |+}n| dvdwS nt5|	dOk	sdT|	dO k	r| dvdxS |	OdO},|)	rtBC|, t }+dPdu|,g|+d$< dPg|+d%< |*|+dr< t j dyk
r
|+d% @d4 |dz d{k
r(t jPQt|, |jf |+}|dz d{k
rtR|D ]~}-|jS|-}.|.
rJ|.jT
std||- d}tjd~ |O|- n<tU|jS|- tVjSjW
rJ||- tXk
rJtdtjd~ |O|- 
qJ|r|)rtBC|jYj tZ|dSr|j
j[stBC|j
j |s2t d t\  | j]d i d |ddS t|tVj.j^oH|j_j}/t|tVj.j`o`|jaj}0t|tVj.j`ox|jbj}1t|tVj.j^o|jcjd}2t.j/je|/|jA|0|jYj|1|d|2dLd	st d t.jfjgd|jA|dd t\  | j]d i d |dth dS t d dm|dz kr|dz jNdmdd\}}3t.j/je|/|jA||0|jYj|1|d|2dLd
st d t.jfjgd|jA|dd t\  | j]d i d |dth dS tD||}4tD|4|3}ntD||dz }tIdtj | jJdd  tj }t d|d   z(|dk r|ji|	|d}5n
||	|}5W n tjk
r }6 zftk|6 tld t|6}7ttD|6d!d tRtmfrjdndd |6joD }7| j]d i d ||7|6d W Y S d }6~6X Y nh tpk
r }6 zHtqjrld tk|6 d|d  d}8|8tst 7 }8| jud|8|6d W Y S d }6~6X Y nX t d tIdtj | jJdd  tj }|r|jvrt d z|w  W n tjk
r }6 zftk|6 tld t|6}7ttD|6d!d tRtmfrdndd |6joD }7| j]d i d ||7|6d W Y S d }6~6X Y nX t d tIdtj | jJdd  tj }tk  tIdtj | jJdd  tj }|dz dkrL|5oH|5jYj}5n"|dz d{krntZ|5dPrn|5jYj}5tBjx|5|d}9t d | r|9y  n|9N  tIdtj | jJdd  |9jz|9j{ }:};|dz dkrj|;rjd}<t|;tr|;ddkrd}<|jAdks|<dkrjt|;tr<t.jfjgd|jA|;dP |<d n.t||;r`t.jfjgd|jA|;jY|<d n
t}|;d|dz dkrd}<dL}=dL}>|;D ].}?t|?tr|?dd dkrd}=nd}>q|=r|>rd}<n
|=rd}<|jAdks|<dkrt.jfjgd|jA|<d tId|9j~ t d tj }|!r<tDt dd s<| |'}&|rLtKL|}z| jM|;|:|&||| d}@W n< tk
r }6 zt d| d|;   W 5 d }6~6X Y nX tIdtj | jJdd  t d |@S )Ni  u   Нет правu>   Версия Eva отличается от версии БД: z != u   . Вероятно была запущен несовместимый образ Eva, либо были проблемы во время обновления и патчи применились частично.zAPI request start ()zrequest.remote_addr=z request.url=z
 json_res= session_tab_idcomponent_idrk   TECHCOM_HACK3441zAPI: No callid specifiedT)Z
devel_onlyr   r   zNo method specifiedr.   z TECHCOM_HACK3441ru   r   r%   save_kwargsZ	only_dataauditnotifyz	127.0.0.1u!   SPEC0 Использование u#    через API запрещено.r$   ri   re   filterr   sliceorder_bygroup_byinclude_deletedperm_effective_acl_idZperm_inherit_acl_idZperm_parent_idZperm_parent_owner_idZ
user_localZvacation_endZvacation_startZperm_encryptZimport_original%perm_security_level_allowed_ids_cacheZis_dummyZis_templateZsl_owner_locksystemZ_idflagsZ
admin_modeno_cacheu)   no_cache запрещен go to spec0 osv)loginr   r$   r%   r      zLONG_STRING    z
API_TRACE 
no_jscacheno_metacache_idzCache.full_cache_validationz"Cache.public_full_cache_validationz!Cache.sdesk_full_cache_validationr   r   r   r   F)z.getZ_getz.listZ_listz.selectZ_selectz.sumZ_sumz.count_countz.maxZ_maxz.minZ_minr   r   r      )readrf   :zCmfPersonVar.getZget_current_userZget_settingsZCmfRFilezCmfPersonVar.get_metaZCmfMenuTreez+Possible cache return invalid_data: method=Zsearch_stringZTEXKOM_no_cachert   r   ur   ошибка на frontend методы list get и тп должны быть с jshash, кроме тестов z$api_cache_get skip due to no_jscachezapi_cache_get startr   i  zapi_cache_get endzapi_cache_get hit!)r   rs   rt   ru   r   rx   zapi_cache_get jsver mismatch!r   r   r   
for_updater   r   ZrestorezAPI object get startu~   deprecated id объекта нужно передавать в kwargs или может вообще параметром RPCcmf_deleted   )r   r   r   r	  z==i  u   Необходимо указать filter или kwargs для получения объекта перед вызовом его методаu1   Необходимо указать id в args[0]zCmfTask.updater   r   u	   Поле u1    не доступно для изменения.r   uB   Не задано новое значение для пароля.zAPI object get Noneu>   Объект не найден, возможно удалён.)rb   rs   rt   ru   rv   r  )	initial_acl_keyobject_modelobject_owner_id	object_idobject_parent_idobject_instanceaccess_levelperm_security_level_allowed_idsraise_errorzAPI object access prohibitedZfail)operatecmf_model_nameparentresult_statusuE   Объект недоступен: недостаточно прав.)rb   rs   rt   ru   rv   rc   zAPI object get endr   r   )
r  r  Zobject_fieldr  r  r  r  r  r  r  z"API object field access prohibiteduQ   Поле объекта не доступно: недостаточно прав.ZpreparezAPI method start r#   zUserError Trace:c                 S   s   g | ]}t |qS r   r   r_   ir   r   r   r`     s     z ApiView.post.<locals>.<listcomp>	Exceptionu/   Ошибка выполнения метода z

irl   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saveZcommit)r   ZupsertZcreate_from_template)r  zAPI json dump startZresult_to_dict_ms)r   sgetokZ_acl_objZdenyCmfAuditz$get result must be dict or dataclass)r@   ZslistZ	partially)r  r  r  number_of_objectszAPI json dump endZcache_store_error)rx   r   uQ   Ошибка конвертации результата запроса json_res=z result_dict=Zresult_to_response_mszAPI request end)r!   rp   r   rq   Zglobal_settingsZeva_versionr   ZEVA_VERSIONr"   r   rf   r   r   Znowr   r   dataZremote_addrurlr   dictr~   r   r   r   r   r   r   r   r   r
   r   r   r    Zcurrent_userru   Z
api_kwargsr   keysintersectionr   Zapi_argsZ
api_fieldsr   api_hack_fieldsr   r   ZCmfAccessListZactivate_admin_modeZ	API_TRACEr   copyrI   r?   printZjsonr   r   r   r   r   r   Zin_memory_cacheZin_memory_cache_skip_modelsr   r   r   Zcache_obj_lock_getr   Z
CmfLicenseZlicense_api_notifyr   r   rR   Zmicrosecondsr   Zjshash_invalidate_confirm_listr   r   popZskipcache_select_for_updateaddr@   r   r   r   rm   ZCmfPassword_PASSWORD_MASKr   hasattrZvirtualr   r{   Z	CmfEntityr   ZCmfModelZcmf_owner_idZ	parent_idr   oldZcheck_accessr  Zaudit_eventZCmfPermissionErrorZapply_asyncZCmfUserErrorr   rc   tupler   r$   r  r   logger	traceback
format_excr   Z
is_changedr  ZCmfResultSplitterZsplit_simplers   rb   r   r   r  r   r   )Ar[   Z
start_dateZjson_resru   r%   Z
kwargs_setr   Zsave_kwargs_setZblock_kwargsr$   Zjsonrpc_verZ_filterr   r   r   r   r   r%  r   r   Z
trace_datakvr  r  r  r   Zinvalidate_listr   r   r   r   r   Zapi_use_cacher   Zcache_lock_okZ_cachelock_skip_methodsr   rt   r   r   r  r	  Z
tmp_kwargsr   argZfieldr  Zobj_owner_idZobj_parent_idr   Zfield_methodZ	obj_fieldrb   r   Z	abort_msgmsgZsplitterrs   r   Zcheck_result_statusZcheck_result_have_denyZcheck_result_have_okZ_objZrespr   r   r   post  s    

"
 





           




(





.&&
   




 





 


*







$
        
    
     
    



     	&



     




  
  





zApiView.post)N)N)N)NNN)N)r   )N)N)FNF)F)$r^   
__module____qualname__Z__url__rX   rd   rq   r{   r~   r   r   r   r   r   r   r@   rY   r   rm   viewsactionr   r   compiler   r   r   r   r   r   r   r   r   r   r5  __classcell__r   r   r\   r   rS      s6   





m



=	,rS   )8decimal	ipaddressr   sysr   rG   stringZrandomr   r/  collectionsr   r&  r   Zdataclassesr   r   r   r   r   r   r	   Zuuidr
   rD   r   r   Zujsonr   r   Z
cmf.modelsrm   Zcmf.data_providers.baser   r   Zcmf.includeZcmf.appr   r   r   Zon_server_eventr&   r4   Zonr*   r8   rA   rB   rE   rF   rN   rR   r*  r8  ZBaseViewrS   r   r   r   r   <module>   sR   

	



