o
    li                     @   s   d dl Z d dlmZmZ d dlmZ d dlZd dlZd dlmZm	Z	m
Z
 G dd de jZdedefd	d
ZG dd dZdddZdddZdS )    N)Responsecurrent_app)datetime)AnyOptionalDictc                       sD   e Zd ZdZ fddZ fddZdd Zdd	 Zd
d Z  Z	S )CustomJSONEncoderu4   扩展的JSON序列化器（含复杂对象处理）c                    s   d|d< t  j|i | d S )NFensure_ascii)super__init__)selfargskwargs	__class__ %/var/www/my_crm/app/utils/response.pyr   
   s   zCustomJSONEncoder.__init__c                    sR   t |dr
| |S t |drdd |j D S t|tr#| |S t |S )N__tablename____dict__c                 S   s    i | ]\}}| d s||qS )_)
startswith).0kvr   r   r   
<dictcomp>   s    z-CustomJSONEncoder.default.<locals>.<dictcomp>)	hasattrserialize_sqlalchemy_modelr   items
isinstance	Exceptionget_exception_detailsr
   default)r   objr   r   r   r!      s   




zCustomJSONEncoder.defaultc                 C   sV   i }|j jD ]"}t||j}t|tr| }nt|r#d|j d}|||j< q|S )u   序列化SQLAlchemy模型实例z
<function >)		__table__columnsgetattrnamer   r   	isoformatcallable__name__)r   modelresultcolumnvaluer   r   r   r      s   

z,CustomJSONEncoder.serialize_sqlalchemy_modelc              
   C   s\   t t d }g }|D ]}||j|j|j| |j|jd qt	|j
t||dS )u!   获取异常的详细调试信息   )filelinefunctioncode)typemessageframes)	traceback
extract_tbsysexc_infoappendfilenamelinenor'   get_source_liner4   r*   str)r   etb_listr6   tbr   r   r   r    ,   s   
z'CustomJSONEncoder.get_exception_detailsc                 C   s   zGt |ddd5}| }d|  k rt|kr4n n||d   W  d   W S W d   W dS W d   W dS 1 s@w   Y  W dS  tyQ   Y dS w )u   获取源代码行内容rzutf-8)encodingr      N)open	readlineslenstripr   )r   r<   line_numberflinesr   r   r   r>   ?   s$   z!CustomJSONEncoder.get_source_line)
r*   
__module____qualname____doc__r   r!   r   r    r>   __classcell__r   r   r   r   r      s    r   datareturnc                 C   sz   zt j| td}t|ddW S  ty< } z"tt jdt|t| jt| dd ddd	ddd
W  Y d}~S d}~ww )u'   使用自定义序列化器生成响应)clszapplication/json; charset=utf-8)mimetypeu   JSON序列化失败N  )errordetailsraw_typeraw_dataF)r	   )statusrT   )jsondumpsr   r   	TypeErrorr?   r4   r*   )rQ   json_strr@   r   r   r   custom_jsonifyJ   s*   r_   c                   @   sl   e Zd ZedefddZe			ddeded	e	fd
dZ
e				dded	e	dedee fddZdS )APIResponser@   c                 C   sn   t jdd}|dkrtdddt |t  ddfS tdddt	|j
t|dt  ddfS )	u0   全局异常处理器（含详细调试信息）ENV
productiondevelopmentrU   Fu   服务器内部错误)r3   successr5   rV   	timestamp)r4   r5   )r   configgetr_   r   r    r   utcnowr(   r4   r*   r?   )rS   r@   envr   r   r   handle_exception`   s,   

	
	zAPIResponse.handle_exceptionN   操作成功   rQ   r5   r3   c                 K   s.   |d|| t   d}|| t||fS )NTr3   rd   r5   rQ   re   r   rh   r(   updater_   )rQ   r5   r3   r   response_datar   r   r   rd   {   s   

zAPIResponse.success   操作失败  errorsc                 K   s:   |d| |t   d}|r||d< || t||fS )NFrm   rs   rn   )r5   r3   rQ   rs   r   rp   r   r   r   rV      s   	

zAPIResponse.errorNrk   rl   rq   rr   NN)r*   rM   rN   classmethodr   rj   staticmethodr   r?   intrd   r   r   rV   r   r   r   r   r`   _   s8    r`   rk   rl   c                 K   s   t j| ||fi |S N)r`   rd   )rQ   r5   r3   r   r   r   r   rd      s   rd   rq   rr   c                 K   s   t j| |||fi |S ry   )r`   rV   )r5   r3   rQ   rs   r   r   r   r   rV      s   rV   rt   ru   )r[   flaskr   r   r   r7   r9   typingr   r   r   JSONEncoderr   r_   r`   rd   rV   r   r   r   r   <module>   s    B
B