o
    li5                     @   s   d dl m Z mZ d dlmZ d dlmZmZmZmZm	Z	m
Z
 d dlmZ d dlmZmZmZmZmZmZmZmZ G dd dejZdS )	    )datetimedate)Decimal)ListDictAnyOptionalTupleUnion)db)StringIntegerBooleanDateTimeTextNumericascdescc                   @   sf  e Zd ZdZdZd(ddZedd Zdd	 Ze		
			d)de	de	de	de
eeee f  deeef f
ddZedeeef fddZe	
				d*de	de	deeeef  dee dee deeef fddZedeeeef  fddZe	
			d+de	de	ded edeeef f
d!d"Zed#eeef deeef fd$d%Zed,d&d'ZdS )-	BaseModelu*   所有模型的基类，提供通用功能TNc                 C   s|   i }| j jD ]5}|j}|r||v rq|r||vrqt| |}t|ttfr.|r+| nd}n	t|tr7t	|}|||< q|S )uD  
        自动将数据库查询结果转为字典（否则json处理时会出错）
        
        Args:
            exclude (list): 要排除的字段名列表
            include (list): 只包含的字段名列表（优先级高于exclude）
            
        Returns:
            dict: 转换后的字典
        N)
	__table__columnsnamegetattr
isinstancer   r   	isoformatr   float)selfexcludeincluderesultcolumncolumn_namevalue r#   !/var/www/my_crm/app/base_model.pyto_dict   s   


zBaseModel.to_dictc                    s    fdd|D S )u'   将查询结果列表转为字典列表c                    s   g | ]
}|j d i  qS )r#   r%   .0itemkwargsr#   r$   
<listcomp>0   s    z*BaseModel.to_dict_list.<locals>.<listcomp>r#   )clsquery_resultr+   r#   r*   r$   to_dict_list-   s   zBaseModel.to_dict_listc                 C   s:   | j j}t| dd}|durd| d| dS d| dS )u   默认的repr方法idN< >)	__class____name__r   )r   
class_nameprimary_keyr#   r#   r$   __repr__2   s
   zBaseModel.__repr__      d   pageper_pagemax_per_pagesortreturnc                 K   s   ddl m}m} |dk rd}t||}|d u r| j}| ||}|d urmg }	t|tr.|gn|}
|
D ]5}t}|	drD|dd  }t
}n|	drO|dd  }t| |rat| |}|	|| q2td| |j|	 }|j||d}|S )Nr   and_or_r9   -+u   无效的排序字段: )r<   r=   )
sqlalchemyrB   rC   minquery_apply_filtersr   strr   
startswithr   hasattrr   append
ValueErrororder_bypaginate)r-   rH   r<   r=   r>   r?   filtersrB   rC   order_by_clauses	sort_list
sort_field	directionr    	page_datar#   r#   r$   paginate_query:   s0   





zBaseModel.paginate_queryrQ   c                 C   s  ddl m}m} g }| D ]\}}|du rqd|v r|dd\}}	t| |d}
|
du r.q|	dkrDt|ttfrC|rC|	|

| q|	dkrQ|	|
| q|	dkr^|	|
| q|	d	krj|	|
|k q|	d
krv|	|
|k q|	dkr|	|
|k  q|	dkr|	|
|k q|	dkr|	|
|k q|	dkr|r|	|
d q|	|
d q|	dkrt|ttfrt|dkr|	|
|d |d  qt| |d}
|
dur|	|
|k q|r||| }|S )u   
        应用过滤条件到查询
        
        Args:
            query: SQLAlchemy 查询对象
            filters: 过滤条件字典
        
        Returns:
            应用过滤后的查询对象
        r   rA   N__r9   inlikeilikegtgteltlteneisnullbetween   )rF   rB   rC   itemssplitr   r   listtuplerM   in_rZ   r[   is_isnotlenrb   filter)r-   rH   rQ   rB   rC   
conditionskeyr"   
field_nameoperatorfieldr#   r#   r$   rI   o   sV   zBaseModel._apply_filtersrO   r   r   c           	         s^   | j }|r| ||}|r| ||}| jd|||d|} fdd|d D |d< |S )u  
        分页查询并直接返回字典格式
        
        Args:
            page: 页码
            per_page: 每页数量
            order_by: 排序规则，格式为 [(字段名, 是否降序), ...]
            include: 只包含的字段
            exclude: 排除的字段
            **filters: 过滤条件
        
        Returns:
            包含分页信息的字典，items已经转为字典格式
        rH   r<   r=   c                    s   g | ]	}|j  d qS ))r   r   r&   r'   r   r   r#   r$   r,      s    z.BaseModel.paginate_to_dict.<locals>.<listcomp>rd   Nr#   )rH   rI   _apply_order_byrW   )	r-   r<   r=   rO   r   r   rQ   rH   r   r#   rs   r$   paginate_to_dict   s    
zBaseModel.paginate_to_dictc                 C   sH   |D ]\}}t | |d}|dur!|r|| }q|| }q|S )u   
        应用排序规则
        
        Args:
            query: SQLAlchemy 查询对象
            order_by: 排序规则列表
        
        Returns:
            应用排序后的查询对象
        N)r   rO   r   r   )r-   rH   rO   ro   
descendingrq   r#   r#   r$   rt      s   zBaseModel._apply_order_byr0   order_fieldr   c                 K   s   | j }| D ]\}}|dur t| |d}	|	dur ||	|k}qt| |d}
|
dur<|r5||
 }n||
 }| j|||dS )u=  
        简化版分页方法
        
        Args:
            page: 页码
            per_page: 每页数量
            order_field: 排序字段
            desc: 是否降序
            **filters: 简单过滤条件（仅支持精确匹配）
        
        Returns:
            分页结果字典
        Nrr   )rH   rd   r   rl   rO   r   r   rW   )r-   r<   r=   rw   r   rQ   rH   rn   r"   rq   order_by_fieldr#   r#   r$   simple_paginate   s"   zBaseModel.simple_paginatepage_resultc              	   C   s6   |d |d |d |d |d |d |d |d d	S )
u   
        提取分页信息（不包含items）
        
        Args:
            page_result: paginate_query 返回的结果
        
        Returns:
            纯分页信息字典
        totalr<   r=   pageshas_prevhas_nextprev_numnext_num)r{   r<   r=   r|   r}   r~   r   r   r#   )r-   rz   r#   r#   r$   get_page_info#  s   zBaseModel.get_page_infoc                 C   s   i }t tttttttttttt	fi}| j
jD ]D}|r|jrq|j}t|j}d}| D ]\}}	t||r9|	} nq,|du r?q|j |d}
t|jt rV|jjrV|jj|
d< |
||< q|S )u   
        根据当前模型的字段定义，自动生成参数验证规则字典。
        返回格式：{field_name: {"required": bool, "type": type, "max_len": int (optional)}}
        N)requiredtypemax_len)r   rJ   r   r   intr   boolr   r   r   r   r   r7   r   r   rd   
issubclassnullabler   length)r-   skip_primary_keyrulestype_mappingr    ro   col_type_classpy_typesa_typepy_truler#   r#   r$   generate_validation_rules9  s8   	



z#BaseModel.generate_validation_rules)NN)Nr9   r:   r;   N)r9   r:   NNN)r9   r:   r0   T)T)r5   
__module____qualname____doc____abstract__r%   classmethodr/   r8   r   r   r
   rJ   r   r   r   rW   rI   r	   r   ru   rt   ry   r   r   r#   r#   r#   r$   r      s    
"

4?
1
,$r   N)r   r   decimalr   typingr   r   r   r   r	   r
   app.databaser   rF   r   r   r   r   r   r   r   r   Modelr   r#   r#   r#   r$   <module>   s     (