U
    @d                     @   s^   d dl T d dlmZ d dlmZmZmZmZ d dlm	Z	 e
jdd ZG dd dejjZd	S )
    )*)request)isclass	signature
isfunctionismethod)uuid4c                 C   s   d| j d< d| j d< | S )Nr   zAccess-Control-Allow-OriginzContent-TypezAccess-Control-Allow-Headers)Zheaders)r r
   ,./cmf/contrib/api/modules/api/views/index.pyacao   s    

r   c                   @   s   e Zd Z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d Zdd ZdddZdd Zejjdd Zejjdd ZdS ) ApiView/Nc                 C   s   d||d|dS )N2.0)codemessage)jsonrpcerrorcallidr
   selfr   r   r   r
   r
   r   _error   s    zApiView._errorc                 C   s   d|||dS )Nr   )r   resultmetar   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S )NizInvalid Requestr   r   r
   r
   r   invalid_request#   s    zApiView.invalid_requestc                 C   s   |  dd|S )NizMethod not foundr   r   r   r
   r
   r   method_not_found&   s    zApiView.method_not_foundc                 C   s   |  dd|S )NizInvalid paramsr   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dkst| ||S )Ni i)step)rangeAssertionErrorr   r   r
   r
   r   server_error/   s    zApiView.server_errorc           
      C   s   i }t tD ]}tt|}t|s$qt|tjjs4q|jjr>qi }t |D ]X}t||}t	|sjt
|sjqJ|drvqJt|}|| |d|jkd}|||d < qJ|||d}	|	||	d < q|S )N_r   )_methodnamer   is_class_methodr*   )_classr*   methods)dirmodelsgetattrr   
issubclasscmf	BaseModelMetaZabstractr   r   
startswithr   lowerZ
parameters)
r   Z
rpc_models
model_nameclsZrpc_methodsZmethod_namemethodZsigZ
rpc_methodZ	rpc_modelr
   r
   r   get_rpc3   s:    


zApiView.get_rpcr   c                    s    fdd|d krd S t |ttfr: fdd|D S t |tr^ fdd| D S tt|tjj	r|dkr|d7 }j
|j |d	S d S nLtt|tjjri }|j D ]&\}}|d
rq|dkrq|||< q|S |S )Nc                    s    d krdS |  kS )NTr
   )ffilter_fieldsr
   r   is_field_fineW   s    z%ApiView.asdict.<locals>.is_field_finec                    s   g | ]}j | d qS r<   asdict).0i)r=   r   r
   r   
<listcomp>_   s     z"ApiView.asdict.<locals>.<listcomp>c                    s(   i | ] \}}|r|j | d qS r?   r@   )rB   kvr=   r>   r   r
   r   
<dictcomp>a   s       z"ApiView.asdict.<locals>.<dictcomp>      )r=   model_depthr(   )Z
base_modelZmodel)
isinstancelisttupledictitemsr1   typer2   r/   r3   rA   Zvalues_dictfieldsZ	BaseField__dict__r5   )r   objr=   rK   r	   rE   rF   r
   rG   r   rA   V   s4    


zApiView.asdictc                 C   s   |dkS )NZ	qweqweqwer
   )r   tokenr
   r
   r   check_tokenw   s    zApiView.check_tokenc                 C   s   |   }| jd|tdS )Nz
index.html)rpcr   )r:   Zrender_with_paramsr   )r   rW   r
   r
   r   get   s    zApiView.getc                 C   s  t jdd}|d kr|  S d|kr,|  S d|kr<|  S d|krL|  S |d }|d }|d }|dppi }|dd }z|jdd	d
\}}W n tk
r   | | Y S X |  }	||	kr| |S |	| }|d }
|
j	}||d kr| |S |d | }|d }|d s<|d s<|
|d }t
||j}d }zN|d krT| }n8t|trj|| }n"t|tr|f |}n
|  W S W nV tk
r   tjd | | Y S  tk
r   tjd | | Y S X i }|j D ]`\}}|d k	r||krq| |||< |jj|| d< || d dkr|j|| d< q| || |jd}| j||d}| |}t| |||S )NT)Zsilentr9   r   access_tokenparamsrR   .rJ   )maxsplitr,   r-   r)   r+   Zis_static_methodidz
Type Error	ExceptionrQ   ZRelationshipFieldr7   )rR   fields_orderr<   )r   Zget_jsonr   r   rX   split
ValueErrorr    r:   r4   r0   __name__rL   rM   rO   	TypeErrorAPPloggerZ	exceptionr!   r^   r"   rR   rP   rA   	__class__r7   r_   Zjsonifyr   )r   Zjsonr   r9   rY   rZ   rR   Zproc_clsZproc_methodrW   r8   r   rT   r   Zresult_fieldsrE   rF   Zresult_dictZ	meta_dictr
   r
   r   post   sx    





zApiView.post)N)Nr   )rb   
__module____qualname__Z__url__r   r   r   r   r    r!   r"   r'   r:   rA   rV   r2   viewsactionrX   rg   r
   r
   r
   r   r      s    
#
!
r   N)Zcmf.includeZflaskr   inspectr   r   r   r   Zuuidr   rd   Zafter_requestr   r2   rj   ZBaseViewr   r
   r
   r
   r   <module>   s   
