fastgenerateapi 1.2.7__tar.gz → 1.2.9__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/PKG-INFO +1 -1
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/__version__.py +1 -1
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/base_view.py +16 -29
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/delete_view.py +1 -1
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/controller/filter_controller.py +11 -1
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/schemas_factory/common_function.py +84 -4
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/schemas_factory/create_schema_factory.py +12 -3
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/schemas_factory/filter_schema_factory.py +23 -15
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/schemas_factory/get_all_schema_factory.py +21 -5
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/schemas_factory/get_one_schema_factory.py +19 -3
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/schemas_factory/update_schema_factory.py +16 -3
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/settings/all_settings.py +3 -6
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/settings/app_settings.py +35 -31
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi.egg-info/PKG-INFO +1 -1
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/LICENSE +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/README.md +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/__init__.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/__init__.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/api_view.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/create_view.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/delete_filter_view.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/delete_tree_view.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/get_all_view.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/get_one_view.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/get_relation_view.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/get_tree_view.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/mixin/__init__.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/mixin/base_mixin.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/mixin/dbmodel_mixin.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/mixin/get_mixin.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/mixin/response_mixin.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/mixin/save_mixin.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/mixin/tool_mixin.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/mixin/utils/__init__.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/mixin/utils/docx_util.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/mixin/utils/file_util.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/mixin/utils/pdf_util.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/mixin/utils/xlsx_util.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/mixin/utils/zip_util.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/sql_get_view.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/switch_view.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/update_relation_view.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/update_view.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/cache/__init__.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/cache/cache_decorator.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/cache/key_builder.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/channel/__init__.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/channel/connection_manager.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/channel/consumer.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/channel/websocket_view.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/controller/__init__.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/controller/router_controller.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/controller/rpc_controller.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/controller/search_controller.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/controller/ws_controller.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/data_type/__init__.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/data_type/data_type.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/data_type/mysql_data_type.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/deps/__init__.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/deps/filter_params_deps.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/deps/paginator_deps.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/deps/tree_params_deps.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/example/__init__.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/example/models.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/example/routers.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/example/schemas.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/example/views.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/fastapi_utils/__init__.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/fastapi_utils/all.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/fastapi_utils/param_utils.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/fastapi_utils/response_utils.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/fastapi_utils/tortoise_utils.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/model/__init__.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/model/base_model.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/my_fields/__init__.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/my_fields/aes_field.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/my_fields/enum_field.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/my_fields/pk_field.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/my_fields/pwd_field.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/my_fields/soft_delete_field.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/my_fields/validator.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/pydantic_utils/__init__.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/pydantic_utils/base_model.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/pydantic_utils/base_settings.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/pydantic_utils/json_encoders.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/schemas_factory/__init__.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/schemas_factory/common_schema_factory.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/schemas_factory/get_relation_schema_factory.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/schemas_factory/get_tree_schema_factory.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/schemas_factory/response_factory.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/schemas_factory/sql_get_all_schema_factory.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/settings/__init__.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/settings/db_settings.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/settings/etcd_settings.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/settings/file_settings.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/settings/jwt_settings.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/settings/otlp_settings.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/settings/redis_settings.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/settings/sms_settings.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/settings/system_settings.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/utils/__init__.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/utils/aes.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/utils/auto_discover.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/utils/exception.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/utils/file_utils.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/utils/pwd_utils.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/utils/ramdom_utils.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/utils/snowflake.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/utils/str_util.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/utils/swagger_to_js.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi.egg-info/SOURCES.txt +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi.egg-info/dependency_links.txt +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi.egg-info/top_level.txt +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/script/__init__.py +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/setup.cfg +0 -0
- {fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/setup.py +0 -0
|
@@ -29,7 +29,7 @@ class BaseView(BaseMixin, ResponseMixin, ToolMixin, DBModelMixin):
|
|
|
29
29
|
schema: Optional[Type[BaseModel]] = None # 返回序列化[未使用]
|
|
30
30
|
dependencies: Optional[Sequence[params.Depends]] = None
|
|
31
31
|
tags: Optional[List[str]] = None # swagger标签
|
|
32
|
-
check_ignore_error_fields: List[str] = None # 检查唯一字段报错时,不展示这个字段
|
|
32
|
+
check_ignore_error_fields: Optional[List[str]] = None # 检查唯一字段报错时,不展示这个字段
|
|
33
33
|
|
|
34
34
|
"""
|
|
35
35
|
# 增加外键字段显示
|
|
@@ -143,9 +143,8 @@ class BaseView(BaseMixin, ResponseMixin, ToolMixin, DBModelMixin):
|
|
|
143
143
|
)
|
|
144
144
|
return schema.model_validate(model_dict)
|
|
145
145
|
|
|
146
|
-
@classmethod
|
|
147
146
|
async def check_unique_field(
|
|
148
|
-
|
|
147
|
+
self,
|
|
149
148
|
data_dict: dict,
|
|
150
149
|
model_class: Type[Model],
|
|
151
150
|
model: Union[Model, None] = None,
|
|
@@ -159,15 +158,21 @@ class BaseView(BaseMixin, ResponseMixin, ToolMixin, DBModelMixin):
|
|
|
159
158
|
:param check_ignore_error_fields: 错误提示忽略字段,会合并类上的字段
|
|
160
159
|
:return:
|
|
161
160
|
"""
|
|
162
|
-
check_unique_fields =
|
|
163
|
-
check_unique_together_fields =
|
|
161
|
+
check_unique_fields = self._get_unique_fields(model_class)
|
|
162
|
+
check_unique_together_fields = self._get_unique_together_fields(model_class)
|
|
164
163
|
for unique_field in check_unique_fields:
|
|
165
164
|
if unique_field in data_dict:
|
|
166
165
|
unique_field_value = data_dict.get(unique_field)
|
|
167
166
|
if model and unique_field_value == getattr(model, unique_field):
|
|
168
167
|
continue
|
|
169
168
|
if await model_class.filter(**{unique_field: unique_field_value}).first():
|
|
170
|
-
return
|
|
169
|
+
return self.error(msg=f"{self.get_field_description(model_class, unique_field)}已存在相同值:{unique_field_value}")
|
|
170
|
+
# 聚合忽略错误提示字段
|
|
171
|
+
ignore_error_field_list = check_ignore_error_fields or []
|
|
172
|
+
if settings.app_settings.CHECK_IGNORE_ERROR_FIELDS:
|
|
173
|
+
ignore_error_field_list.extend(settings.app_settings.CHECK_IGNORE_ERROR_FIELDS.split(","))
|
|
174
|
+
if self.check_ignore_error_fields:
|
|
175
|
+
ignore_error_field_list.extend(self.check_ignore_error_fields)
|
|
171
176
|
for unique_together_fields in check_unique_together_fields:
|
|
172
177
|
filter_fields = {}
|
|
173
178
|
is_equal = True
|
|
@@ -192,33 +197,15 @@ class BaseView(BaseMixin, ResponseMixin, ToolMixin, DBModelMixin):
|
|
|
192
197
|
continue
|
|
193
198
|
|
|
194
199
|
if await model_class.filter(**filter_fields).first():
|
|
195
|
-
ignore_error_field_list = check_ignore_error_fields or []
|
|
196
200
|
if settings.app_settings.WHETHER_DELETE_FIELD in description_fields:
|
|
197
201
|
description_fields.remove(settings.app_settings.WHETHER_DELETE_FIELD)
|
|
198
|
-
|
|
199
|
-
|
|
202
|
+
for ignore_error_field in ignore_error_field_list:
|
|
203
|
+
if ignore_error_field in description_fields:
|
|
204
|
+
description_fields.remove(ignore_error_field)
|
|
205
|
+
return self.error(
|
|
206
|
+
msg=f"{self.get_field_description(model_class, description_fields)}已存在相同值:{[filter_fields.get(field) for field in description_fields]}"
|
|
200
207
|
)
|
|
201
208
|
|
|
202
|
-
# @staticmethod
|
|
203
|
-
# async def setattr_model_rpc(
|
|
204
|
-
# rpc_class,
|
|
205
|
-
# model: Model,
|
|
206
|
-
# rpc_param: Union[Dict[str, Dict[str, List[Union[str, tuple]]]], Type[RPCParam]],
|
|
207
|
-
# *args, **kwargs
|
|
208
|
-
# ) -> Model:
|
|
209
|
-
# if rpc_class is None or not model or not rpc_param:
|
|
210
|
-
# return model
|
|
211
|
-
# if not isinstance(rpc_param, RPCParam):
|
|
212
|
-
# rpc_param = RPCParam(rpc_param, model)
|
|
213
|
-
# rpc_obj = rpc_class(**rpc_param.request_param)
|
|
214
|
-
# await rpc_obj.get_data()
|
|
215
|
-
# for base_rpc_param in rpc_param.data:
|
|
216
|
-
# setattr(
|
|
217
|
-
# model,
|
|
218
|
-
# base_rpc_param.response_field_alias_name,
|
|
219
|
-
# rpc_obj.filter(base_rpc_param.model_field_value).get(base_rpc_param.response_field_name))
|
|
220
|
-
# return model
|
|
221
|
-
|
|
222
209
|
@staticmethod
|
|
223
210
|
async def get_params(request: Request) -> dict:
|
|
224
211
|
result = {}
|
|
@@ -69,7 +69,7 @@ class DeleteView(BaseView):
|
|
|
69
69
|
self.delete_response_schema_factory = response_factory(self.delete_response_schema, name="Delete")
|
|
70
70
|
if not self.delete_summary:
|
|
71
71
|
doc = self.destroy.__doc__
|
|
72
|
-
|
|
72
|
+
self.delete_summary = doc.strip().split("\n")[0] if doc else "Delete"
|
|
73
73
|
path = f"/{settings.app_settings.ROUTER_DELETE_SUFFIX_FIELD}" if settings.app_settings.ROUTER_WHETHER_ADD_SUFFIX else ""
|
|
74
74
|
self._add_api_route(
|
|
75
75
|
path=path,
|
{fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/controller/filter_controller.py
RENAMED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from datetime import datetime, date, time
|
|
2
2
|
from typing import Union, Any, Optional
|
|
3
3
|
|
|
4
|
+
from pydantic.fields import FieldInfo
|
|
4
5
|
from tortoise.expressions import Q
|
|
5
6
|
from tortoise.queryset import QuerySet
|
|
6
7
|
|
|
@@ -56,11 +57,17 @@ class BaseFilter:
|
|
|
56
57
|
"""
|
|
57
58
|
:param filter_str: Union[str, tuple]
|
|
58
59
|
当tuple时,第一个为str,后面参数无顺序和数量要求,可以是 类型、重命名字符串、用于修改传值的方法
|
|
59
|
-
example:
|
|
60
|
+
example:
|
|
61
|
+
name__contains
|
|
62
|
+
(create_at__gt, datetime)
|
|
63
|
+
(create_at__gt, datetime, create_time)
|
|
64
|
+
(publish_date, datetime, FilterUtils.date_to_datetime_23)
|
|
65
|
+
(publish_date, datetime, FieldInfo())
|
|
60
66
|
"""
|
|
61
67
|
field_type = str
|
|
62
68
|
model_field = filter_str
|
|
63
69
|
filter_field = None
|
|
70
|
+
field_info = None
|
|
64
71
|
filter_func = None
|
|
65
72
|
# 判断filter表达式的类型
|
|
66
73
|
if isinstance(filter_str, tuple):
|
|
@@ -71,6 +78,8 @@ class BaseFilter:
|
|
|
71
78
|
field_type = f
|
|
72
79
|
elif type(f) == str:
|
|
73
80
|
filter_field = f
|
|
81
|
+
elif isinstance(f, FieldInfo):
|
|
82
|
+
field_info = f
|
|
74
83
|
elif callable(f):
|
|
75
84
|
filter_func = f
|
|
76
85
|
if not filter_field:
|
|
@@ -81,6 +90,7 @@ class BaseFilter:
|
|
|
81
90
|
self.field_type = field_type
|
|
82
91
|
self.model_field = model_field
|
|
83
92
|
self.filter_field = filter_field
|
|
93
|
+
self.field_info = field_info
|
|
84
94
|
self.filter_func = filter_func
|
|
85
95
|
|
|
86
96
|
def generate_q(self, value: Union[str, list, bool]) -> Q:
|
{fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/schemas_factory/common_function.py
RENAMED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
from typing import Type, Optional, Union
|
|
1
|
+
from typing import Type, Optional, Union, List
|
|
2
2
|
|
|
3
|
-
from pydantic import field_validator
|
|
3
|
+
from pydantic import field_validator, model_validator
|
|
4
4
|
from pydantic.fields import FieldInfo
|
|
5
5
|
from tortoise import Model
|
|
6
6
|
|
|
7
7
|
from fastgenerateapi.api_view.mixin.dbmodel_mixin import DBModelMixin
|
|
8
|
+
from fastgenerateapi.pydantic_utils.base_model import alias_generator
|
|
8
9
|
from fastgenerateapi.settings.all_settings import settings
|
|
9
10
|
|
|
10
11
|
|
|
@@ -26,8 +27,12 @@ def get_field_info(value, description="", default_field_type=None) -> (Type, Fie
|
|
|
26
27
|
field_type = value.field_type
|
|
27
28
|
required = True
|
|
28
29
|
field_info_dict["required"] = required
|
|
29
|
-
|
|
30
|
-
|
|
30
|
+
|
|
31
|
+
if not required:
|
|
32
|
+
if hasattr(value, "default") and not hasattr(value.default, '__call__'):
|
|
33
|
+
field_info_dict.setdefault("default", value.default)
|
|
34
|
+
else:
|
|
35
|
+
field_info_dict["default"] = None
|
|
31
36
|
if hasattr(value, "description"):
|
|
32
37
|
field_info_dict.setdefault("description", description + (value.description or ""))
|
|
33
38
|
if hasattr(value, "alias"):
|
|
@@ -141,5 +146,80 @@ def get_validate_dict_from_fields(fields_info: dict) -> dict:
|
|
|
141
146
|
return validator_dict
|
|
142
147
|
|
|
143
148
|
|
|
149
|
+
def get_model_validate_text_to_list(fields: Optional[List[str]]) -> dict:
|
|
150
|
+
"""
|
|
151
|
+
详情列表用于返回
|
|
152
|
+
:param fields:
|
|
153
|
+
:return:
|
|
154
|
+
"""
|
|
155
|
+
if not fields:
|
|
156
|
+
return {}
|
|
157
|
+
def func(cls, data):
|
|
158
|
+
if isinstance(data, dict):
|
|
159
|
+
for field in fields:
|
|
160
|
+
value_str = data.get(field, None)
|
|
161
|
+
if isinstance(value_str, (list, tuple, set)):
|
|
162
|
+
field_value = list(value_str)
|
|
163
|
+
elif isinstance(value_str, str):
|
|
164
|
+
field_value = value_str.split(settings.app_settings.TEXT_TO_LIST_SPLIT_VALUE)
|
|
165
|
+
else:
|
|
166
|
+
field_value = value_str
|
|
167
|
+
data[field] = field_value
|
|
168
|
+
else:
|
|
169
|
+
for field in fields:
|
|
170
|
+
if hasattr(data, field):
|
|
171
|
+
value_str = getattr(data, field)
|
|
172
|
+
if isinstance(value_str, (list, tuple, set)):
|
|
173
|
+
field_value = list(value_str)
|
|
174
|
+
elif isinstance(value_str, str):
|
|
175
|
+
field_value = getattr(data, field).split(settings.app_settings.TEXT_TO_LIST_SPLIT_VALUE)
|
|
176
|
+
else:
|
|
177
|
+
field_value = []
|
|
178
|
+
setattr(data, field, field_value)
|
|
179
|
+
return data
|
|
180
|
+
|
|
181
|
+
return {
|
|
182
|
+
"text_to_list_func": model_validator(mode='before')(func)
|
|
183
|
+
}
|
|
144
184
|
|
|
145
185
|
|
|
186
|
+
def get_model_validate_list_to_text(fields: Optional[List[str]]) -> dict:
|
|
187
|
+
"""
|
|
188
|
+
创建修改用于保存
|
|
189
|
+
:param fields:
|
|
190
|
+
:return:
|
|
191
|
+
"""
|
|
192
|
+
if not fields:
|
|
193
|
+
return {}
|
|
194
|
+
def func(cls, data: dict):
|
|
195
|
+
if isinstance(data, dict):
|
|
196
|
+
for field in fields:
|
|
197
|
+
if alias_generator:
|
|
198
|
+
field = alias_generator(field)
|
|
199
|
+
value_list = data.get(field, None)
|
|
200
|
+
if isinstance(value_list, (list, tuple, set)):
|
|
201
|
+
field_value = settings.app_settings.TEXT_TO_LIST_SPLIT_VALUE.join(list(value_list))
|
|
202
|
+
elif isinstance(value_list, str):
|
|
203
|
+
field_value = value_list
|
|
204
|
+
else:
|
|
205
|
+
field_value = None
|
|
206
|
+
data[field] = field_value
|
|
207
|
+
else:
|
|
208
|
+
for field in fields:
|
|
209
|
+
if alias_generator:
|
|
210
|
+
field = alias_generator(field)
|
|
211
|
+
if hasattr(data, field):
|
|
212
|
+
value_list = getattr(data, field)
|
|
213
|
+
if isinstance(value_list, (list, tuple, set)):
|
|
214
|
+
field_value = settings.app_settings.TEXT_TO_LIST_SPLIT_VALUE.join(list(value_list))
|
|
215
|
+
elif isinstance(value_list, str):
|
|
216
|
+
field_value = value_list
|
|
217
|
+
else:
|
|
218
|
+
field_value = None
|
|
219
|
+
setattr(data, field, field_value)
|
|
220
|
+
return data
|
|
221
|
+
|
|
222
|
+
return {
|
|
223
|
+
"list_to_text_func": model_validator(mode='before')(func)
|
|
224
|
+
}
|
|
225
|
+
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from typing import Type, Union, Optional
|
|
1
|
+
from typing import Type, Union, Optional, List
|
|
2
2
|
|
|
3
3
|
from fastgenerateapi.settings.all_settings import settings
|
|
4
4
|
|
|
@@ -8,7 +8,7 @@ from tortoise import Model
|
|
|
8
8
|
|
|
9
9
|
from fastgenerateapi.data_type.data_type import T
|
|
10
10
|
from fastgenerateapi.schemas_factory.common_function import get_dict_from_model_fields, get_dict_from_pydanticmeta, \
|
|
11
|
-
get_validate_dict_from_fields
|
|
11
|
+
get_validate_dict_from_fields, get_model_validate_list_to_text
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
def create_schema_factory(
|
|
@@ -23,6 +23,7 @@ def create_schema_factory(
|
|
|
23
23
|
pydantic_meta_save_exclude: Optional[bool] = True,
|
|
24
24
|
pydantic_meta_create_include: Optional[bool] = True,
|
|
25
25
|
pydantic_meta_create_exclude: Optional[bool] = True,
|
|
26
|
+
pydantic_meta_text_to_list: Optional[bool] = True,
|
|
26
27
|
name: Optional[str] = None
|
|
27
28
|
) -> Type[T]:
|
|
28
29
|
"""
|
|
@@ -71,6 +72,7 @@ def create_schema_factory(
|
|
|
71
72
|
|
|
72
73
|
include_fields = set()
|
|
73
74
|
exclude_fields = set()
|
|
75
|
+
text_to_list_fields = set()
|
|
74
76
|
if include:
|
|
75
77
|
include_fields_dict = get_dict_from_pydanticmeta(model_class, include)
|
|
76
78
|
all_fields_info.update(include_fields_dict)
|
|
@@ -102,6 +104,12 @@ def create_schema_factory(
|
|
|
102
104
|
exclude_fields.update(model_class.PydanticMeta.save_exclude)
|
|
103
105
|
if pydantic_meta_create_exclude and hasattr(model_class.PydanticMeta, "create_exclude"):
|
|
104
106
|
exclude_fields.update(model_class.PydanticMeta.create_exclude)
|
|
107
|
+
if pydantic_meta_text_to_list and hasattr(model_class.PydanticMeta, "text_to_list"):
|
|
108
|
+
text_to_list_fields = getattr(model_class.PydanticMeta, "text_to_list")
|
|
109
|
+
for field in text_to_list_fields:
|
|
110
|
+
field_info = all_fields_info.get(field)[1]
|
|
111
|
+
field_type = Union[List[str], str] if field_info.is_required() else Union[List[str], str, None]
|
|
112
|
+
all_fields_info.update({field: (field_type, field_info)})
|
|
105
113
|
else:
|
|
106
114
|
include_fields.update(all_fields_info.keys())
|
|
107
115
|
|
|
@@ -128,11 +136,12 @@ def create_schema_factory(
|
|
|
128
136
|
schema_name = name if name else model_class.__name__ + "CreateSchema"
|
|
129
137
|
schema_field_dict = {field: all_fields_info[field] for field in all_fields}
|
|
130
138
|
validators_dict = get_validate_dict_from_fields(schema_field_dict)
|
|
139
|
+
text_to_list_validators_dict = get_model_validate_list_to_text(text_to_list_fields)
|
|
131
140
|
schema: Type[T] = create_model(
|
|
132
141
|
schema_name,
|
|
133
142
|
**schema_field_dict,
|
|
134
143
|
__config__=model_config,
|
|
135
|
-
__validators__=validators_dict,
|
|
144
|
+
__validators__={**validators_dict, **text_to_list_validators_dict},
|
|
136
145
|
)
|
|
137
146
|
return schema
|
|
138
147
|
|
|
@@ -18,21 +18,29 @@ def filter_schema_factory(model_class: Type[Model], fields: list[str, tuple[str,
|
|
|
18
18
|
"""
|
|
19
19
|
model_fields = {}
|
|
20
20
|
|
|
21
|
-
for
|
|
22
|
-
if not isinstance(
|
|
23
|
-
|
|
24
|
-
f =
|
|
25
|
-
t =
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
21
|
+
for base_field in fields or []:
|
|
22
|
+
if not isinstance(base_field, BaseFilter):
|
|
23
|
+
base_field = BaseFilter(base_field)
|
|
24
|
+
f = base_field.filter_field
|
|
25
|
+
t = base_field.field_type
|
|
26
|
+
if base_field.field_info:
|
|
27
|
+
model_fields.update({
|
|
28
|
+
f: (
|
|
29
|
+
Optional[t],
|
|
30
|
+
base_field.field_info
|
|
31
|
+
)
|
|
32
|
+
})
|
|
33
|
+
else:
|
|
34
|
+
description = DBModelMixin.get_field_description(model_class, base_field.model_field)
|
|
35
|
+
model_fields.update({
|
|
36
|
+
f: (
|
|
37
|
+
Optional[t],
|
|
38
|
+
FieldInfo(
|
|
39
|
+
title=f"{description}",
|
|
40
|
+
default=Query("", description=description),
|
|
41
|
+
description=f"{description}"
|
|
42
|
+
))
|
|
43
|
+
})
|
|
36
44
|
|
|
37
45
|
filter_params_model: Type[BaseModel] = create_model(
|
|
38
46
|
model_class.__name__+"CommonFilterParams",
|
|
@@ -7,7 +7,8 @@ from pydantic import create_model
|
|
|
7
7
|
|
|
8
8
|
from fastgenerateapi.data_type.data_type import T
|
|
9
9
|
from fastgenerateapi.pydantic_utils.base_model import model_config
|
|
10
|
-
from fastgenerateapi.schemas_factory.common_function import get_dict_from_model_fields, get_dict_from_pydanticmeta
|
|
10
|
+
from fastgenerateapi.schemas_factory.common_function import get_dict_from_model_fields, get_dict_from_pydanticmeta, \
|
|
11
|
+
get_model_validate_text_to_list
|
|
11
12
|
from fastgenerateapi.settings.all_settings import settings
|
|
12
13
|
|
|
13
14
|
|
|
@@ -29,6 +30,7 @@ def get_all_schema_factory(
|
|
|
29
30
|
pydantic_meta_get_exclude: Optional[bool] = True,
|
|
30
31
|
pydantic_meta_get_all_include: Optional[bool] = True,
|
|
31
32
|
pydantic_meta_get_all_exclude: Optional[bool] = True,
|
|
33
|
+
pydantic_meta_text_to_list: Optional[bool] = True,
|
|
32
34
|
name: Optional[str] = None,
|
|
33
35
|
) -> Optional[Type[T]]:
|
|
34
36
|
"""
|
|
@@ -86,6 +88,7 @@ def get_all_schema_factory(
|
|
|
86
88
|
|
|
87
89
|
include_fields = set()
|
|
88
90
|
exclude_fields = set()
|
|
91
|
+
text_to_list_fields = set()
|
|
89
92
|
if include:
|
|
90
93
|
include_fields_dict = get_dict_from_pydanticmeta(model_class, include)
|
|
91
94
|
all_fields_info.update(include_fields_dict)
|
|
@@ -119,6 +122,12 @@ def get_all_schema_factory(
|
|
|
119
122
|
include_fields.update(get_all_include_fields_dict.keys())
|
|
120
123
|
if pydantic_meta_get_all_exclude and hasattr(model_class.PydanticMeta, "get_all_exclude"):
|
|
121
124
|
exclude_fields.update(model_class.PydanticMeta.get_all_exclude)
|
|
125
|
+
if pydantic_meta_text_to_list and hasattr(model_class.PydanticMeta, "text_to_list"):
|
|
126
|
+
text_to_list_fields = getattr(model_class.PydanticMeta, "text_to_list")
|
|
127
|
+
for field in text_to_list_fields:
|
|
128
|
+
field_info = all_fields_info.get(field)[1]
|
|
129
|
+
field_type = List[str] if field_info.is_required() else Optional[List[str]]
|
|
130
|
+
all_fields_info.update({field: (field_type, field_info)})
|
|
122
131
|
else:
|
|
123
132
|
include_fields.update(all_fields_info.keys())
|
|
124
133
|
|
|
@@ -137,20 +146,27 @@ def get_all_schema_factory(
|
|
|
137
146
|
...
|
|
138
147
|
|
|
139
148
|
schema_name = name if name else model_class.__name__ + "GetAllSchema"
|
|
149
|
+
text_to_list_validators_dict = get_model_validate_text_to_list(text_to_list_fields)
|
|
140
150
|
schema: Type[T] = create_model(
|
|
141
|
-
schema_name,
|
|
151
|
+
schema_name,
|
|
152
|
+
**{field: all_fields_info[field] for field in all_fields},
|
|
153
|
+
__config__=model_config,
|
|
154
|
+
__validators__={**text_to_list_validators_dict},
|
|
155
|
+
)
|
|
142
156
|
return schema
|
|
143
157
|
|
|
144
158
|
|
|
145
|
-
def get_list_schema_factory(schema_cls: Type[T] = None, name: str = "") -> Type[T]:
|
|
159
|
+
def get_list_schema_factory(schema_cls: Type[T] = None, response_field: Optional[str] = None, name: str = "") -> Type[T]:
|
|
160
|
+
if not response_field:
|
|
161
|
+
response_field = settings.app_settings.LIST_RESPONSE_FIELD
|
|
146
162
|
if schema_cls:
|
|
147
163
|
fields = {
|
|
148
|
-
|
|
164
|
+
response_field: (Optional[List[schema_cls]], FieldInfo(default=[], description="数据返回")),
|
|
149
165
|
}
|
|
150
166
|
name = schema_cls.__name__ + name + "GetListSchema"
|
|
151
167
|
else:
|
|
152
168
|
fields = {
|
|
153
|
-
|
|
169
|
+
response_field: (Optional[List], FieldInfo(default=[], description="数据返回")),
|
|
154
170
|
}
|
|
155
171
|
name = name + "GetListSchema"
|
|
156
172
|
schema: Type[T] = create_model(name, **fields, __config__=model_config)
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
from typing import Type, Optional, Union
|
|
1
|
+
from typing import Type, Optional, Union, List
|
|
2
|
+
|
|
3
|
+
from pydantic_core import PydanticUndefined
|
|
2
4
|
|
|
3
5
|
from fastgenerateapi.settings.all_settings import settings
|
|
4
6
|
|
|
@@ -8,7 +10,8 @@ from tortoise import Model
|
|
|
8
10
|
|
|
9
11
|
from fastgenerateapi.data_type.data_type import T
|
|
10
12
|
from fastgenerateapi.pydantic_utils.base_model import model_config
|
|
11
|
-
from fastgenerateapi.schemas_factory.common_function import get_dict_from_model_fields, get_dict_from_pydanticmeta
|
|
13
|
+
from fastgenerateapi.schemas_factory.common_function import get_dict_from_model_fields, get_dict_from_pydanticmeta, \
|
|
14
|
+
get_model_validate_text_to_list
|
|
12
15
|
|
|
13
16
|
|
|
14
17
|
def get_one_schema_factory(
|
|
@@ -22,6 +25,7 @@ def get_one_schema_factory(
|
|
|
22
25
|
pydantic_meta_get_exclude: Optional[bool] = True,
|
|
23
26
|
pydantic_meta_get_one_include: Optional[bool] = True,
|
|
24
27
|
pydantic_meta_get_one_exclude: Optional[bool] = True,
|
|
28
|
+
pydantic_meta_text_to_list: Optional[bool] = True,
|
|
25
29
|
name: Optional[str] = None
|
|
26
30
|
) -> Type[T]:
|
|
27
31
|
"""
|
|
@@ -76,6 +80,7 @@ def get_one_schema_factory(
|
|
|
76
80
|
|
|
77
81
|
include_fields = set()
|
|
78
82
|
exclude_fields = set()
|
|
83
|
+
text_to_list_fields = set()
|
|
79
84
|
if include:
|
|
80
85
|
include_fields_dict = get_dict_from_pydanticmeta(model_class, include)
|
|
81
86
|
all_fields_info.update(include_fields_dict)
|
|
@@ -109,6 +114,12 @@ def get_one_schema_factory(
|
|
|
109
114
|
include_fields.update(get_one_include_fields_dict.keys())
|
|
110
115
|
if pydantic_meta_get_one_exclude and hasattr(model_class.PydanticMeta, "get_one_exclude"):
|
|
111
116
|
exclude_fields.update(model_class.PydanticMeta.get_one_exclude)
|
|
117
|
+
if pydantic_meta_text_to_list and hasattr(model_class.PydanticMeta, "text_to_list"):
|
|
118
|
+
text_to_list_fields = getattr(model_class.PydanticMeta, "text_to_list")
|
|
119
|
+
for field in text_to_list_fields:
|
|
120
|
+
field_info = all_fields_info.get(field)[1]
|
|
121
|
+
field_type = List[str] if field_info.is_required() else Optional[List[str]]
|
|
122
|
+
all_fields_info.update({field: (field_type, field_info)})
|
|
112
123
|
else:
|
|
113
124
|
include_fields.update(all_fields_info.keys())
|
|
114
125
|
|
|
@@ -128,8 +139,13 @@ def get_one_schema_factory(
|
|
|
128
139
|
...
|
|
129
140
|
|
|
130
141
|
schema_name = name if name else model_class.__name__ + "GetOneSchema"
|
|
142
|
+
text_to_list_validators_dict = get_model_validate_text_to_list(text_to_list_fields)
|
|
131
143
|
schema: Type[T] = create_model(
|
|
132
|
-
schema_name,
|
|
144
|
+
schema_name,
|
|
145
|
+
**{field: all_fields_info[field] for field in all_fields},
|
|
146
|
+
__config__=model_config,
|
|
147
|
+
__validators__={**text_to_list_validators_dict},
|
|
148
|
+
)
|
|
133
149
|
return schema
|
|
134
150
|
|
|
135
151
|
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
from typing import Type, Union, Optional
|
|
1
|
+
from typing import Type, Union, Optional, List
|
|
2
|
+
|
|
3
|
+
from pydantic_core import PydanticUndefined
|
|
2
4
|
|
|
3
5
|
from fastgenerateapi.settings.all_settings import settings
|
|
4
6
|
|
|
@@ -8,7 +10,7 @@ from tortoise import Model
|
|
|
8
10
|
|
|
9
11
|
from fastgenerateapi.data_type.data_type import T
|
|
10
12
|
from fastgenerateapi.schemas_factory.common_function import get_dict_from_model_fields, get_dict_from_pydanticmeta, \
|
|
11
|
-
get_validate_dict_from_fields
|
|
13
|
+
get_validate_dict_from_fields, get_model_validate_list_to_text
|
|
12
14
|
|
|
13
15
|
|
|
14
16
|
def update_schema_factory(
|
|
@@ -23,6 +25,7 @@ def update_schema_factory(
|
|
|
23
25
|
pydantic_meta_save_exclude: Optional[bool] = True,
|
|
24
26
|
pydantic_meta_update_include: Optional[bool] = True,
|
|
25
27
|
pydantic_meta_update_exclude: Optional[bool] = True,
|
|
28
|
+
pydantic_meta_text_to_list: Optional[bool] = True,
|
|
26
29
|
name: Optional[str] = None
|
|
27
30
|
) -> Type[T]:
|
|
28
31
|
"""
|
|
@@ -71,6 +74,7 @@ def update_schema_factory(
|
|
|
71
74
|
|
|
72
75
|
include_fields = set()
|
|
73
76
|
exclude_fields = set()
|
|
77
|
+
text_to_list_fields = set()
|
|
74
78
|
if include:
|
|
75
79
|
include_fields_dict = get_dict_from_pydanticmeta(model_class, include)
|
|
76
80
|
all_fields_info.update(include_fields_dict)
|
|
@@ -102,6 +106,14 @@ def update_schema_factory(
|
|
|
102
106
|
exclude_fields.update(model_class.PydanticMeta.save_exclude)
|
|
103
107
|
if pydantic_meta_update_exclude and hasattr(model_class.PydanticMeta, "update_exclude"):
|
|
104
108
|
exclude_fields.update(model_class.PydanticMeta.update_exclude)
|
|
109
|
+
if pydantic_meta_text_to_list and hasattr(model_class.PydanticMeta, "text_to_list"):
|
|
110
|
+
text_to_list_fields = getattr(model_class.PydanticMeta, "text_to_list")
|
|
111
|
+
for field in text_to_list_fields:
|
|
112
|
+
field_info = all_fields_info.get(field)[1]
|
|
113
|
+
field_type = Union[List[str], str] if field_info.is_required() else Union[List[str], str, None]
|
|
114
|
+
all_fields_info.update({field: (field_type, field_info)})
|
|
115
|
+
else:
|
|
116
|
+
include_fields.update(all_fields_info.keys())
|
|
105
117
|
|
|
106
118
|
if extra_include:
|
|
107
119
|
include_fields_dict = get_dict_from_pydanticmeta(model_class, extra_include)
|
|
@@ -126,10 +138,11 @@ def update_schema_factory(
|
|
|
126
138
|
schema_name = name if name else model_class.__name__ + "UpdateSchema"
|
|
127
139
|
schema_field_dict = {field: all_fields_info[field] for field in all_fields}
|
|
128
140
|
validators_dict = get_validate_dict_from_fields(schema_field_dict)
|
|
141
|
+
text_to_list_validators_dict = get_model_validate_list_to_text(text_to_list_fields)
|
|
129
142
|
schema: Type[T] = create_model(
|
|
130
143
|
schema_name,
|
|
131
144
|
**schema_field_dict,
|
|
132
145
|
__config__=model_config,
|
|
133
|
-
__validators__=validators_dict,
|
|
146
|
+
__validators__={**validators_dict, **text_to_list_validators_dict},
|
|
134
147
|
)
|
|
135
148
|
return schema
|
|
@@ -109,7 +109,6 @@ class SettingsModel(BaseModel):
|
|
|
109
109
|
yaml_dict = yaml.safe_load(res)
|
|
110
110
|
data_dict = {**yaml_dict, **data_dict}
|
|
111
111
|
|
|
112
|
-
setting_dict = {}
|
|
113
112
|
setting_models = cls.model_fields.copy()
|
|
114
113
|
for k, v in setting_models.items():
|
|
115
114
|
if isinstance(v, FieldInfo):
|
|
@@ -125,15 +124,13 @@ class SettingsModel(BaseModel):
|
|
|
125
124
|
}
|
|
126
125
|
else:
|
|
127
126
|
annotation_dict = data_dict.get(v.annotation.__name__, {})
|
|
128
|
-
|
|
127
|
+
setattr(cls, k, v.annotation(**annotation_dict))
|
|
129
128
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
return setting_data
|
|
129
|
+
return cls
|
|
133
130
|
|
|
134
131
|
def watch(self):
|
|
135
132
|
"""
|
|
136
|
-
|
|
133
|
+
监听文件或者etcd变化,待完善
|
|
137
134
|
借用 etcd.watch(target)
|
|
138
135
|
:return:
|
|
139
136
|
"""
|
|
@@ -7,10 +7,10 @@ from fastgenerateapi.pydantic_utils.base_settings import BaseSettings
|
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
class AppSettings(BaseSettings):
|
|
10
|
+
# ####################################### 请求参数相关 ###############################################
|
|
10
11
|
# 字段配置 驼峰格式:新版本(pydantic.alias_generators:to_camel)、老版本(pydantic.utils.to_lower_camel)
|
|
11
12
|
# 下划线:pydantic.alias_generators.to_snake
|
|
12
13
|
ALIAS_GENERATOR: Optional[str] = Field(default="pydantic.alias_generators.to_snake", description="序列化参数命名方法路径")
|
|
13
|
-
|
|
14
14
|
# 分页对应字段以及配置默认值
|
|
15
15
|
CURRENT_PAGE_FIELD: Optional[str] = Field(default="page", description="当前页字段")
|
|
16
16
|
PAGE_SIZE_FIELD: Optional[str] = Field(default="page_size", description="每页数量字段")
|
|
@@ -20,18 +20,36 @@ class AppSettings(BaseSettings):
|
|
|
20
20
|
DEFAULT_WHETHER_PAGE: Optional[bool] = Field(default=False, description="默认是否分页")
|
|
21
21
|
DEFAULT_PAGE_SIZE: Optional[int] = Field(default=10, description="默认每页数量")
|
|
22
22
|
DEFAULT_MAX_PAGE_SIZE: Optional[int] = Field(default=200, description="默认最大每页数量")
|
|
23
|
+
# GetAll 筛选是否双下划线转单下划线
|
|
24
|
+
FILTER_UNDERLINE_WHETHER_DOUBLE_TO_SINGLE: Optional[bool] = Field(default=True, description="筛选是否双下划线转单下划线")
|
|
25
|
+
SCHEMAS_UNDERLINE_WHETHER_DOUBLE_TO_SINGLE: Optional[bool] = Field(default=True, description="序列化字段是否双下划线转单下划线")
|
|
26
|
+
|
|
27
|
+
# ####################################### 返回值相关 ###############################################
|
|
28
|
+
# 返回格式字段配置默认值
|
|
29
|
+
CODE_RESPONSE_FIELD: Optional[bool] = Field(default=True, description="code返回字段")
|
|
30
|
+
CODE_SUCCESS_DEFAULT_VALUE: Optional[int] = Field(default=200, description="code成功返回值")
|
|
31
|
+
CODE_FAIL_DEFAULT_VALUE: Optional[int] = Field(default=-1, description="code失败返回值")
|
|
32
|
+
SUCCESS_RESPONSE_FIELD: Optional[bool] = Field(default=True, description="success返回字段")
|
|
33
|
+
MESSAGE_RESPONSE_FIELD: Optional[str] = Field(default="msg", description="消息返回字段")
|
|
34
|
+
DATA_RESPONSE_FIELD: Optional[str] = Field(default="data", description="数据返回字段")
|
|
35
|
+
LIST_RESPONSE_FIELD: Optional[str] = Field(default="list", description="列表页返回字段")
|
|
23
36
|
|
|
37
|
+
# ####################################### 业务代码相关 ###############################################
|
|
38
|
+
# 检查为一只忽略部分字段错误提示
|
|
39
|
+
CHECK_IGNORE_ERROR_FIELDS: Optional[str] = Field(default=None, description="【多个字段,分割】创建和修改联合索引时,错误提示忽略部分字段")
|
|
40
|
+
# Pydantic适用
|
|
41
|
+
TEXT_TO_LIST_SPLIT_VALUE: Optional[str] = Field(default="**@**", description="数据库字段TEXT返回前端List适用的分割值")
|
|
24
42
|
# 方法优化项
|
|
25
43
|
METHOD_TREE_CHOICE: Optional[str] = Field(default="map", description="树状查询方式{sql: sql循环查询,map: 内存查询}")
|
|
44
|
+
# 创建和修改是否返回详情
|
|
45
|
+
WHETHER_CREATE_RESPONSE_DATA: Optional[bool] = Field(default=False, description="创建是否返回详情")
|
|
46
|
+
WHETHER_UPDATE_RESPONSE_DATA: Optional[bool] = Field(default=False, description="修改是否返回详情")
|
|
47
|
+
# 递归字段
|
|
48
|
+
DEFAULT_TREE_PARENT_FIELD: Optional[str] = Field(default="parent", description="默认递归父级字段")
|
|
49
|
+
DEFAULT_TREE_CHILDREN_FIELD: Optional[str] = Field(default="children", description="默认递归子级字段")
|
|
50
|
+
DEFAULT_TREE_FILTER_FIELD: Optional[str] = Field(default="node_id", description="默认递归筛选开始节点字段")
|
|
26
51
|
|
|
27
|
-
#
|
|
28
|
-
CACHE_GET_ONE_WHETHER_OPEN: Optional[bool] = Field(default=False, description="查询详情是否打开缓存")
|
|
29
|
-
CACHE_GET_ONE_SECONDS: int = Field(default=300, description="查询详情缓存时间,单位秒")
|
|
30
|
-
CACHE_GET_ALL_WHETHER_OPEN: Optional[bool] = Field(default=False, description="查询列表是否打开缓存")
|
|
31
|
-
CACHE_GET_ALL_SECONDS: int = Field(default=300, description="查询列表缓存时间,单位秒")
|
|
32
|
-
CACHE_TREE_WHETHER_OPEN: Optional[bool] = Field(default=False, description="树状查询是否打开缓存")
|
|
33
|
-
CACHE_TREE_SECONDS: int = Field(default=3600, description="树状查询缓存时间,单位秒")
|
|
34
|
-
|
|
52
|
+
# ####################################### 路由相关 ###############################################
|
|
35
53
|
# 路由后缀字段是否添加以及配置默认值
|
|
36
54
|
ROUTER_WHETHER_UNDERLINE_TO_STRIKE: Optional[bool] = Field(default=False, description="路由是否下划线转中划线")
|
|
37
55
|
ROUTER_WHETHER_ADD_SUFFIX: Optional[bool] = Field(default=True, description="增删改查路由是否添加后缀")
|
|
@@ -43,7 +61,6 @@ class AppSettings(BaseSettings):
|
|
|
43
61
|
ROUTER_DELETE_SUFFIX_FIELD: Optional[str] = Field(default="delete", description="删除路由后缀字段")
|
|
44
62
|
ROUTER_RECURSION_DELETE_SUFFIX_FIELD: Optional[str] = Field(default="delete_tree", description="递归删除路由后缀字段")
|
|
45
63
|
ROUTER_FILTER_DELETE_SUFFIX_FIELD: Optional[str] = Field(default="delete_filter", description="递归删除路由后缀字段")
|
|
46
|
-
|
|
47
64
|
# 函数转换路由时,默认添加字段,(遵循restful规范时,get路由处理方案)
|
|
48
65
|
RESTFUL_GET_ROUTER_ADD_PREFIX: Optional[str] = Field(default="", description="函数转换路由时:前缀添加字段")
|
|
49
66
|
RESTFUL_GET_ROUTER_ADD_SUFFIX: Optional[str] = Field(default="", description="函数转换路由时:后缀pk前添加字段")
|
|
@@ -54,36 +71,23 @@ class AppSettings(BaseSettings):
|
|
|
54
71
|
RESTFUL_DELETE_ROUTER_ADD_PREFIX: Optional[str] = Field(default="", description="函数转换路由时:前缀添加字段")
|
|
55
72
|
RESTFUL_DELETE_ROUTER_ADD_SUFFIX: Optional[str] = Field(default="", description="函数转换路由时:后缀pk前添加字段")
|
|
56
73
|
|
|
74
|
+
# ####################################### 数据库相关 ###############################################
|
|
57
75
|
# 分布式id
|
|
58
76
|
WORKER_ID: Optional[int] = Field(default=1, description="数据中心(机器区域)ID")
|
|
59
77
|
DATACENTER_ID: Optional[int] = Field(default=1, description="机器ID")
|
|
60
|
-
|
|
61
78
|
# 数据库字段默认值
|
|
62
79
|
WHETHER_DELETE_FIELD: Optional[str] = Field(default="deleted_at", description="是否删除字段;推荐命名 >> deleted_at;is_active")
|
|
63
80
|
DELETE_FIELD_TYPE: Optional[str] = Field(default="time", description="删除字段类型;推荐命名 >> time;bool")
|
|
64
|
-
# ACTIVE_DEFAULT_VALUE: Optional[bool] = Field(default=True, description="有效的默认值")
|
|
65
81
|
GET_EXCLUDE_ACTIVE_VALUE: Optional[bool] = Field(default=True, description="查询结果是否排除有效字段")
|
|
66
82
|
CREATE_EXCLUDE_ACTIVE_VALUE: Optional[bool] = Field(default=True, description="创建是否排除有效字段")
|
|
67
83
|
UPDATE_EXCLUDE_ACTIVE_VALUE: Optional[bool] = Field(default=True, description="修改是否排除有效字段")
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
CODE_FAIL_DEFAULT_VALUE: Optional[int] = Field(default=-1, description="code失败返回值")
|
|
76
|
-
SUCCESS_RESPONSE_FIELD: Optional[bool] = Field(default=True, description="success返回字段")
|
|
77
|
-
MESSAGE_RESPONSE_FIELD: Optional[str] = Field(default="msg", description="消息返回字段")
|
|
78
|
-
DATA_RESPONSE_FIELD: Optional[str] = Field(default="data", description="数据返回字段")
|
|
79
|
-
LIST_RESPONSE_FIELD: Optional[str] = Field(default="list", description="列表页返回字段")
|
|
80
|
-
# 创建和修改是否返回详情
|
|
81
|
-
WHETHER_CREATE_RESPONSE_DATA: Optional[bool] = Field(default=False, description="创建是否返回详情")
|
|
82
|
-
WHETHER_UPDATE_RESPONSE_DATA: Optional[bool] = Field(default=False, description="修改是否返回详情")
|
|
83
|
-
|
|
84
|
-
# GetAll 筛选是否双下划线转单下划线
|
|
85
|
-
FILTER_UNDERLINE_WHETHER_DOUBLE_TO_SINGLE: Optional[bool] = Field(default=True, description="筛选是否双下划线转单下划线")
|
|
86
|
-
SCHEMAS_UNDERLINE_WHETHER_DOUBLE_TO_SINGLE: Optional[bool] = Field(default=True, description="序列化字段是否双下划线转单下划线")
|
|
84
|
+
# 缓存配置参数
|
|
85
|
+
CACHE_GET_ONE_WHETHER_OPEN: Optional[bool] = Field(default=False, description="查询详情是否打开缓存")
|
|
86
|
+
CACHE_GET_ONE_SECONDS: int = Field(default=300, description="查询详情缓存时间,单位秒")
|
|
87
|
+
CACHE_GET_ALL_WHETHER_OPEN: Optional[bool] = Field(default=False, description="查询列表是否打开缓存")
|
|
88
|
+
CACHE_GET_ALL_SECONDS: int = Field(default=300, description="查询列表缓存时间,单位秒")
|
|
89
|
+
CACHE_TREE_WHETHER_OPEN: Optional[bool] = Field(default=False, description="树状查询是否打开缓存")
|
|
90
|
+
CACHE_TREE_SECONDS: int = Field(default=3600, description="树状查询缓存时间,单位秒")
|
|
87
91
|
|
|
88
92
|
model_config = SettingsConfigDict(
|
|
89
93
|
env_prefix="APP_",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/delete_filter_view.py
RENAMED
|
File without changes
|
{fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/delete_tree_view.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/get_relation_view.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/mixin/base_mixin.py
RENAMED
|
File without changes
|
{fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/mixin/dbmodel_mixin.py
RENAMED
|
File without changes
|
|
File without changes
|
{fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/mixin/response_mixin.py
RENAMED
|
File without changes
|
{fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/mixin/save_mixin.py
RENAMED
|
File without changes
|
{fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/mixin/tool_mixin.py
RENAMED
|
File without changes
|
{fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/mixin/utils/__init__.py
RENAMED
|
File without changes
|
{fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/mixin/utils/docx_util.py
RENAMED
|
File without changes
|
{fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/mixin/utils/file_util.py
RENAMED
|
File without changes
|
{fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/mixin/utils/pdf_util.py
RENAMED
|
File without changes
|
{fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/mixin/utils/xlsx_util.py
RENAMED
|
File without changes
|
{fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/mixin/utils/zip_util.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/api_view/update_relation_view.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/channel/connection_manager.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/controller/router_controller.py
RENAMED
|
File without changes
|
{fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/controller/rpc_controller.py
RENAMED
|
File without changes
|
{fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/controller/search_controller.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/data_type/mysql_data_type.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/fastapi_utils/param_utils.py
RENAMED
|
File without changes
|
{fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/fastapi_utils/response_utils.py
RENAMED
|
File without changes
|
{fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/fastapi_utils/tortoise_utils.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/my_fields/soft_delete_field.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/pydantic_utils/base_model.py
RENAMED
|
File without changes
|
{fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/pydantic_utils/base_settings.py
RENAMED
|
File without changes
|
{fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/pydantic_utils/json_encoders.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi/schemas_factory/response_factory.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fastgenerateapi-1.2.7 → fastgenerateapi-1.2.9}/fastgenerateapi.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|