Merge branch 'main' of http://gitlab.fecribd.com/wuchunquan/cockpit
This commit is contained in:
commit
c1efed6d33
|
@ -1,4 +1,6 @@
|
|||
from typing import TypeVar, Generic, Any, List, get_args, Union, Optional, Tuple
|
||||
|
||||
from sqlalchemy import func
|
||||
from sqlalchemy.orm import Session
|
||||
from datetime import datetime, date
|
||||
from Utils.CommonUtils import get_sqlalchemy_model_fields
|
||||
|
@ -40,7 +42,11 @@ class CRUDBase(Generic[DbModelType, ModelType, IdSchemaType, CreateSchemaType, U
|
|||
id_schema_type: IdSchemaType,
|
||||
create_schema_type: CreateSchemaType,
|
||||
update_schema_type: UpdateSchemaType,
|
||||
query_schema_type: QuerySchemaType, name: str, chinese_name: str = ''):
|
||||
query_schema_type: QuerySchemaType,
|
||||
name: str,
|
||||
chinese_name: str = '',
|
||||
array_keys=[],
|
||||
):
|
||||
self.db_model = db_model
|
||||
self.name = name
|
||||
self.model_type = model_type
|
||||
|
@ -49,6 +55,8 @@ class CRUDBase(Generic[DbModelType, ModelType, IdSchemaType, CreateSchemaType, U
|
|||
self.update_schema_type = update_schema_type
|
||||
self.query_schema_type = query_schema_type
|
||||
self.summary_name = chinese_name if chinese_name else self.name
|
||||
self.query_func = None
|
||||
self.array_keys = array_keys
|
||||
|
||||
def mount(self, router: APIRouter):
|
||||
for key in self.__dir__():
|
||||
|
@ -146,6 +154,17 @@ class CRUDBase(Generic[DbModelType, ModelType, IdSchemaType, CreateSchemaType, U
|
|||
query = db.query(self.db_model)
|
||||
for key, value in params_dict.items():
|
||||
if key not in ['page', 'page_size'] and value is not None:
|
||||
# 在存储的数组值内查询 如存的 1,2,3,4 查询时则使用的 [1,2]这样的数据来查
|
||||
if key in self.array_keys:
|
||||
for item in value:
|
||||
query = query.filter(func.find_in_set(str(item), getattr(self.db_model, key)))
|
||||
continue
|
||||
# 如果执行query_func后有返回值即使用了key,value则跳过后面操作
|
||||
if self.query_func:
|
||||
query_temp = self.query_func(query, key, value)
|
||||
if query_temp:
|
||||
query = query_temp
|
||||
continue
|
||||
if type(value) == str:
|
||||
query = query.filter(getattr(self.db_model, key).like(f'%{value}%'))
|
||||
if type(value) in [int, float, bool]:
|
||||
|
@ -172,13 +191,15 @@ class CRUDBase(Generic[DbModelType, ModelType, IdSchemaType, CreateSchemaType, U
|
|||
return db.query(self.db_model).get(item_id)
|
||||
|
||||
|
||||
def create_crud_model(db_model: Base, name, auto_create_keys=['id'], index_key='id'):
|
||||
def create_crud_model(db_model: Base, name, auto_create_keys=['id'], index_key='id',
|
||||
array_keys=[]):
|
||||
"""
|
||||
创建CRUD所需模型
|
||||
:param db_model: 数据库模型
|
||||
:param name: 名称
|
||||
:param auto_create_keys: 自动生成的keys
|
||||
:param index_key: 索引key
|
||||
:param array_keys: 用id数组存储数据的key的列表
|
||||
:return:
|
||||
"""
|
||||
fields_dict = get_sqlalchemy_model_fields(db_model)
|
||||
|
@ -195,7 +216,12 @@ def create_crud_model(db_model: Base, name, auto_create_keys=['id'], index_key='
|
|||
eval(f'Optional[{item[0].__name__}]', globals()), item[1]) for key, item in
|
||||
fields_dict.items() if key not in auto_create_keys})
|
||||
query_fields_dic = {}
|
||||
|
||||
for key, item in fields_dict.items():
|
||||
if key in array_keys:
|
||||
query_fields_dic[key] = (
|
||||
eval(f'Optional[List[Union[int,str]]]', globals(), locals()), None)
|
||||
else:
|
||||
if item[0].__name__ == 'datetime':
|
||||
query_fields_dic[key] = (
|
||||
eval(f'Optional[List[Optional[int]]]', globals(), locals()), None)
|
||||
|
@ -206,15 +232,25 @@ def create_crud_model(db_model: Base, name, auto_create_keys=['id'], index_key='
|
|||
return [model, model_id, model_create, model_update, model_query]
|
||||
|
||||
|
||||
def auto_create_crud(db_model: Base, name, chinese_name="", auto_create_keys=['id'], index_key='id'):
|
||||
def auto_create_crud(db_model: Base, name, chinese_name="", auto_create_keys=['id'], index_key='id',
|
||||
array_keys=[]):
|
||||
"""
|
||||
自动创建CRUD类
|
||||
:param db_model:
|
||||
:param name:
|
||||
:param chinese_name:
|
||||
:param auto_create_keys: 自动生成的字段key
|
||||
:param index_key:
|
||||
:param array_keys: 由id数组组成的字符串key列表
|
||||
:return:
|
||||
"""
|
||||
[model, model_id, model_create, model_update, model_query] = create_crud_model(db_model, name,
|
||||
auto_create_keys, index_key)
|
||||
auto_create_keys, index_key,
|
||||
array_keys=array_keys)
|
||||
|
||||
class Crud(CRUDBase[db_model, model, model_id, model_create, model_update, model_query]):
|
||||
pass
|
||||
|
||||
crud = Crud(db_model, model, model_id, model_create, model_update, model_query, name, chinese_name)
|
||||
crud = Crud(db_model, model, model_id, model_create, model_update, model_query, name, chinese_name,
|
||||
array_keys=array_keys)
|
||||
return crud
|
||||
|
|
Loading…
Reference in New Issue