fastgenerateapi 1.2.9__tar.gz → 1.2.11__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.
Files changed (118) hide show
  1. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/PKG-INFO +1 -1
  2. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/__version__.py +1 -1
  3. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/api_view/base_view.py +15 -11
  4. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/api_view/create_view.py +2 -2
  5. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/api_view/get_all_view.py +7 -4
  6. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/api_view/get_one_view.py +2 -1
  7. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/api_view/switch_view.py +1 -1
  8. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/api_view/update_view.py +2 -2
  9. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/schemas_factory/common_function.py +22 -3
  10. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/schemas_factory/common_schema_factory.py +22 -14
  11. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/schemas_factory/get_all_schema_factory.py +24 -24
  12. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/schemas_factory/get_one_schema_factory.py +32 -26
  13. fastgenerateapi-1.2.11/fastgenerateapi/schemas_factory/get_relation_schema_factory.py +102 -0
  14. fastgenerateapi-1.2.11/fastgenerateapi/schemas_factory/get_tree_schema_factory.py +111 -0
  15. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/settings/app_settings.py +3 -0
  16. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi.egg-info/PKG-INFO +1 -1
  17. fastgenerateapi-1.2.9/fastgenerateapi/schemas_factory/get_relation_schema_factory.py +0 -79
  18. fastgenerateapi-1.2.9/fastgenerateapi/schemas_factory/get_tree_schema_factory.py +0 -164
  19. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/LICENSE +0 -0
  20. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/README.md +0 -0
  21. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/__init__.py +0 -0
  22. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/api_view/__init__.py +0 -0
  23. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/api_view/api_view.py +0 -0
  24. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/api_view/delete_filter_view.py +0 -0
  25. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/api_view/delete_tree_view.py +0 -0
  26. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/api_view/delete_view.py +0 -0
  27. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/api_view/get_relation_view.py +0 -0
  28. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/api_view/get_tree_view.py +0 -0
  29. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/api_view/mixin/__init__.py +0 -0
  30. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/api_view/mixin/base_mixin.py +0 -0
  31. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/api_view/mixin/dbmodel_mixin.py +0 -0
  32. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/api_view/mixin/get_mixin.py +0 -0
  33. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/api_view/mixin/response_mixin.py +0 -0
  34. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/api_view/mixin/save_mixin.py +0 -0
  35. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/api_view/mixin/tool_mixin.py +0 -0
  36. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/api_view/mixin/utils/__init__.py +0 -0
  37. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/api_view/mixin/utils/docx_util.py +0 -0
  38. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/api_view/mixin/utils/file_util.py +0 -0
  39. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/api_view/mixin/utils/pdf_util.py +0 -0
  40. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/api_view/mixin/utils/xlsx_util.py +0 -0
  41. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/api_view/mixin/utils/zip_util.py +0 -0
  42. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/api_view/sql_get_view.py +0 -0
  43. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/api_view/update_relation_view.py +0 -0
  44. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/cache/__init__.py +0 -0
  45. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/cache/cache_decorator.py +0 -0
  46. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/cache/key_builder.py +0 -0
  47. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/channel/__init__.py +0 -0
  48. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/channel/connection_manager.py +0 -0
  49. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/channel/consumer.py +0 -0
  50. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/channel/websocket_view.py +0 -0
  51. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/controller/__init__.py +0 -0
  52. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/controller/filter_controller.py +0 -0
  53. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/controller/router_controller.py +0 -0
  54. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/controller/rpc_controller.py +0 -0
  55. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/controller/search_controller.py +0 -0
  56. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/controller/ws_controller.py +0 -0
  57. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/data_type/__init__.py +0 -0
  58. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/data_type/data_type.py +0 -0
  59. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/data_type/mysql_data_type.py +0 -0
  60. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/deps/__init__.py +0 -0
  61. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/deps/filter_params_deps.py +0 -0
  62. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/deps/paginator_deps.py +0 -0
  63. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/deps/tree_params_deps.py +0 -0
  64. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/example/__init__.py +0 -0
  65. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/example/models.py +0 -0
  66. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/example/routers.py +0 -0
  67. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/example/schemas.py +0 -0
  68. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/example/views.py +0 -0
  69. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/fastapi_utils/__init__.py +0 -0
  70. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/fastapi_utils/all.py +0 -0
  71. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/fastapi_utils/param_utils.py +0 -0
  72. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/fastapi_utils/response_utils.py +0 -0
  73. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/fastapi_utils/tortoise_utils.py +0 -0
  74. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/model/__init__.py +0 -0
  75. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/model/base_model.py +0 -0
  76. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/my_fields/__init__.py +0 -0
  77. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/my_fields/aes_field.py +0 -0
  78. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/my_fields/enum_field.py +0 -0
  79. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/my_fields/pk_field.py +0 -0
  80. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/my_fields/pwd_field.py +0 -0
  81. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/my_fields/soft_delete_field.py +0 -0
  82. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/my_fields/validator.py +0 -0
  83. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/pydantic_utils/__init__.py +0 -0
  84. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/pydantic_utils/base_model.py +0 -0
  85. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/pydantic_utils/base_settings.py +0 -0
  86. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/pydantic_utils/json_encoders.py +0 -0
  87. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/schemas_factory/__init__.py +0 -0
  88. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/schemas_factory/create_schema_factory.py +0 -0
  89. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/schemas_factory/filter_schema_factory.py +0 -0
  90. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/schemas_factory/response_factory.py +0 -0
  91. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/schemas_factory/sql_get_all_schema_factory.py +0 -0
  92. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/schemas_factory/update_schema_factory.py +0 -0
  93. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/settings/__init__.py +0 -0
  94. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/settings/all_settings.py +0 -0
  95. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/settings/db_settings.py +0 -0
  96. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/settings/etcd_settings.py +0 -0
  97. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/settings/file_settings.py +0 -0
  98. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/settings/jwt_settings.py +0 -0
  99. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/settings/otlp_settings.py +0 -0
  100. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/settings/redis_settings.py +0 -0
  101. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/settings/sms_settings.py +0 -0
  102. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/settings/system_settings.py +0 -0
  103. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/utils/__init__.py +0 -0
  104. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/utils/aes.py +0 -0
  105. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/utils/auto_discover.py +0 -0
  106. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/utils/exception.py +0 -0
  107. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/utils/file_utils.py +0 -0
  108. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/utils/pwd_utils.py +0 -0
  109. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/utils/ramdom_utils.py +0 -0
  110. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/utils/snowflake.py +0 -0
  111. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/utils/str_util.py +0 -0
  112. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi/utils/swagger_to_js.py +0 -0
  113. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi.egg-info/SOURCES.txt +0 -0
  114. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi.egg-info/dependency_links.txt +0 -0
  115. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/fastgenerateapi.egg-info/top_level.txt +0 -0
  116. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/script/__init__.py +0 -0
  117. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/setup.cfg +0 -0
  118. {fastgenerateapi-1.2.9 → fastgenerateapi-1.2.11}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fastgenerateapi
3
- Version: 1.2.9
3
+ Version: 1.2.11
4
4
  Summary: FastAPIView Class View
5
5
  Author: ShiLiang
6
6
  Author-email: 2509144896@qq.com
@@ -8,7 +8,7 @@
8
8
  # d8888P
9
9
 
10
10
 
11
- VERSION = (1, 2, 9)
11
+ VERSION = (1, 2, 11)
12
12
 
13
13
  __version__ = '.'.join(map(str, VERSION))
14
14
 
@@ -26,7 +26,7 @@ class BaseView(BaseMixin, ResponseMixin, ToolMixin, DBModelMixin):
26
26
  model_class: Optional[Type[Model]] = None # 数据库模型
27
27
  prefetch_related_fields: Union[None, dict] = None
28
28
  is_with_prefetch: Optional[bool] = False
29
- schema: Optional[Type[BaseModel]] = None # 返回序列化[未使用]
29
+ response_schema: Optional[Type[BaseModel]] = None # 通用返回序列化
30
30
  dependencies: Optional[Sequence[params.Depends]] = None
31
31
  tags: Optional[List[str]] = None # swagger标签
32
32
  check_ignore_error_fields: Optional[List[str]] = None # 检查唯一字段报错时,不展示这个字段
@@ -214,10 +214,14 @@ class BaseView(BaseMixin, ResponseMixin, ToolMixin, DBModelMixin):
214
214
  result[key] = val[0]
215
215
  return result
216
216
 
217
- def gen_get_one_response_schema(self):
218
- if not hasattr(self, "get_one_schema") or not self.get_one_schema:
217
+ def get_response_schema(self):
218
+ """
219
+ 如果response_schema不存在,则生成
220
+ :return:
221
+ """
222
+ if not self.response_schema:
219
223
  get_one_schema_include = []
220
- if hasattr(self, "is_with_prefetch") and self.is_with_prefetch and self.prefetch_related_fields:
224
+ if self.is_with_prefetch and self.prefetch_related_fields:
221
225
  for key, value in self.prefetch_related_fields.items():
222
226
  if value and type(value) in [list, tuple, set]:
223
227
  for val in value:
@@ -225,19 +229,19 @@ class BaseView(BaseMixin, ResponseMixin, ToolMixin, DBModelMixin):
225
229
  if type(val) in [list, tuple, set]:
226
230
  val_str = val[0]
227
231
  get_one_schema_include.append(key + "__" + val_str)
228
- self.get_one_schema = get_one_schema_factory(model_class=self.model_class, include=get_one_schema_include)
232
+ self.response_schema = get_one_schema_factory(self.model_class, extra_include=get_one_schema_include)
229
233
 
230
- return self.get_one_schema
234
+ return self.response_schema
231
235
 
232
- def gen_get_one_response_schema_factory(self):
236
+ def get_response_schema_factory(self):
233
237
  """
234
- 如果get_one_response_schema不存在,则生成
238
+ 如果response_schema不存在,则生成
235
239
  :return:
236
240
  """
237
- self.gen_get_one_response_schema()
238
- self.get_one_response_schema_factory = response_factory(self.get_one_schema, name="GetOne")
241
+ self.get_response_schema()
242
+ self.response_schema_factory = response_factory(self.response_schema, name="Common")
239
243
 
240
- return self.get_one_response_schema_factory
244
+ return self.response_schema_factory
241
245
 
242
246
 
243
247
 
@@ -114,8 +114,8 @@ class CreateView(BaseView, SaveMixin):
114
114
  if self.create_response_schema:
115
115
  self.create_response_schema_factory = response_factory(self.create_response_schema, name="Create")
116
116
  else:
117
- self.create_response_schema_factory = self.gen_get_one_response_schema_factory()
118
- self.create_response_schema = self.get_one_schema
117
+ self.create_response_schema_factory = self.get_response_schema_factory()
118
+ self.create_response_schema = self.response_schema
119
119
  if not self.create_summary:
120
120
  doc = self.create.__doc__
121
121
  self.create_summary = doc.strip().split("\n")[0] if doc else f"Create"
@@ -152,9 +152,10 @@ class GetAllView(BaseView, GetMixin):
152
152
  key_builder=generate_key_builder))
153
153
  async def route(
154
154
  request: Request,
155
- paginator = Depends(paginator_deps()),
155
+ paginator=Depends(paginator_deps()),
156
156
  search: Optional[str] = Depends(search_params_deps(self.search_fields)),
157
- filters: dict = Depends(filter_params_deps(model_class=self.model_class, fields=self.filter_fields, schema=self.filter_schema)),
157
+ filters: dict = Depends(filter_params_deps(model_class=self.model_class, fields=self.filter_fields,
158
+ schema=self.filter_schema)),
158
159
  extra_filters: dict = Depends(extra_filter_params_deps(schema=self.extra_filter_schema)),
159
160
  token: Optional[str] = Depends(OAuth2PasswordBearer(tokenUrl="token", auto_error=False)),
160
161
  ) -> JSONResponse:
@@ -193,8 +194,10 @@ class GetAllView(BaseView, GetMixin):
193
194
  if type(val) in [list, tuple, set]:
194
195
  val_str = val[0]
195
196
  get_all_schema_include.append(key + "__" + val_str)
196
- self.get_all_schema = get_all_schema_factory(self.model_class, include=get_all_schema_include) \
197
- if (get_all_schema_include or hasattr_get_all_schema(self.model_class)) else self.gen_get_one_response_schema()
197
+ if hasattr_get_all_schema(self.model_class) or get_all_schema_include:
198
+ self.get_all_schema = get_all_schema_factory(self.model_class, extra_include=get_all_schema_include)
199
+ else:
200
+ self.get_all_schema = self.get_response_schema()
198
201
  self.get_page_schema = get_page_schema_factory(self.get_all_schema)
199
202
  self.get_list_schema = get_list_schema_factory(self.get_all_schema)
200
203
  self.get_all_response_schema_factory = response_factory(self.get_page_schema, name="GetPage")
@@ -75,7 +75,8 @@ class GetOneView(BaseView, GetMixin):
75
75
  if func_type != inspect._empty and func_type is not None:
76
76
  self.get_one_schema = func_type
77
77
  if not self.get_one_schema:
78
- self.get_one_schema = self.gen_get_one_response_schema()
78
+ self.get_one_schema = self.get_response_schema()
79
+
79
80
  self.get_one_response_schema_factory = response_factory(self.get_one_schema, name="GetOne")
80
81
  if not self.get_one_summary:
81
82
  doc = self.get_one.__doc__
@@ -66,7 +66,7 @@ class SwitchView(BaseView):
66
66
  path="/%s/{pk}" % ("switch_"+switch_route_field),
67
67
  endpoint=self._switch_decorator(switch_route_field),
68
68
  methods=["PUT"],
69
- response_model=self.gen_get_one_response_schema_factory(),
69
+ response_model=self.get_response_schema_factory(),
70
70
  summary=summary,
71
71
  dependencies=True,
72
72
  error_responses=[NOT_FOUND],
@@ -107,8 +107,8 @@ class UpdateView(BaseView, SaveMixin):
107
107
  if self.update_response_schema:
108
108
  self.update_response_schema_factory = response_factory(self.update_response_schema, name="Update")
109
109
  else:
110
- self.update_response_schema_factory = self.gen_get_one_response_schema_factory()
111
- self.update_response_schema = self.get_one_schema
110
+ self.update_response_schema_factory = self.get_response_schema_factory()
111
+ self.update_response_schema = self.response_schema
112
112
  if not self.update_summary:
113
113
  doc = self.update.__doc__
114
114
  self.update_summary = doc.strip().split("\n")[0] if doc else f"Update"
@@ -1,3 +1,5 @@
1
+ import time
2
+ from datetime import datetime
1
3
  from typing import Type, Optional, Union, List
2
4
 
3
5
  from pydantic import field_validator, model_validator
@@ -42,6 +44,18 @@ def get_field_info(value, description="", default_field_type=None) -> (Type, Fie
42
44
  if constraints:
43
45
  for key, val in constraints.items():
44
46
  field_info_dict.setdefault(key, val)
47
+ if settings.app_settings.SWAGGER_OPEN_DEFAULT_EXAMPLES:
48
+ examples = []
49
+ if value.field_type == str:
50
+ examples.append(value.description)
51
+ elif value.field_type == int:
52
+ if hasattr(value, "start_num"):
53
+ examples.append(value.start_num)
54
+ else:
55
+ examples.append(0)
56
+ elif value.field_type == datetime:
57
+ examples.append(int(time.time() * 1000))
58
+ field_info_dict.setdefault("examples", examples)
45
59
  return field_type, FieldInfo(**field_info_dict)
46
60
 
47
61
 
@@ -63,11 +77,16 @@ def get_field_info_from_model_class(model_class: Type[Model], field: str, descri
63
77
  return Optional[str], FieldInfo(default=None, description=f"{field}")
64
78
  return get_field_info(value, description=description)
65
79
 
66
- field_info = model_class._meta.fields_map.get(field.split("__", maxsplit=1)[0])
80
+ split_left_field = field.split("__", maxsplit=1)[0]
81
+ field_info = model_class._meta.fields_map.get(split_left_field)
67
82
  if field_info:
68
83
  description += field_info.description or ""
84
+ elif split_left_field.endswith("_id"):
85
+ field_info = model_class._meta.fields_map.get(split_left_field.removesuffix("_id"))
86
+ if field_info:
87
+ description += field_info.description or ""
69
88
 
70
- model_class = DBModelMixin._get_foreign_key_relation_class(model_class, field.split("__", maxsplit=1)[0])
89
+ model_class = DBModelMixin._get_foreign_key_relation_class(model_class, split_left_field)
71
90
 
72
91
  return get_field_info_from_model_class(model_class, field.split("__", maxsplit=1)[1], description)
73
92
 
@@ -89,7 +108,7 @@ def get_dict_from_pydanticmeta(model_class: Type[Model], data: Union[list, tuple
89
108
  if len(field) == 2:
90
109
  if isinstance(field[1], str):
91
110
  key_field = field[1]
92
- if isinstance(field[2], FieldInfo):
111
+ elif isinstance(field[1], FieldInfo):
93
112
  field_info = field[1]
94
113
  else:
95
114
  field_type = field[1]
@@ -17,6 +17,8 @@ def common_schema_factory(
17
17
  extra_include: Union[list, tuple, set] = None,
18
18
  exclude: Union[list, tuple, set] = None,
19
19
  exclude_readonly: Optional[bool] = False,
20
+ pydantic_meta_include: Union[list, tuple, set] = None,
21
+ pydantic_meta_exclude: Optional[bool] = True,
20
22
  ) -> Type[T]:
21
23
  """
22
24
  Is used to create a CommonSchema
@@ -27,25 +29,31 @@ def common_schema_factory(
27
29
  exclude_fields = set()
28
30
  if exclude_readonly:
29
31
  exclude_fields.update(["id", "created_at", "modified_at", "updated_at"])
30
- if hasattr(model_class, "PydanticMeta"):
31
- if hasattr(model_class.PydanticMeta, "include"):
32
- include_fields_dict = get_dict_from_pydanticmeta(model_class, model_class.PydanticMeta.include)
33
- all_fields_info.update(include_fields_dict)
34
- include_fields.update(include_fields_dict.keys())
35
- else:
36
- include_fields.update(all_fields_info.keys())
37
- if hasattr(model_class.PydanticMeta, "exclude"):
38
- exclude_fields.update(model_class.PydanticMeta.exclude)
39
- else:
40
- include_fields.update(all_fields_info.keys())
41
-
42
32
  if include:
43
33
  include_fields_dict = get_dict_from_pydanticmeta(model_class, include)
44
- all_fields_info.update(include_fields_dict)
34
+ all_fields_info = {**include_fields_dict, **all_fields_info}
45
35
  include_fields.update(include_fields_dict.keys())
36
+ else:
37
+ if hasattr(model_class, "PydanticMeta"):
38
+ if pydantic_meta_include:
39
+ include_fields_dict = get_dict_from_pydanticmeta(model_class, pydantic_meta_include)
40
+ all_fields_info = {**include_fields_dict, **all_fields_info}
41
+ include_fields.update(include_fields_dict.keys())
42
+ else:
43
+ if hasattr(model_class.PydanticMeta, "include"):
44
+ include_fields_dict = get_dict_from_pydanticmeta(model_class, model_class.PydanticMeta.include)
45
+ all_fields_info = {**include_fields_dict, **all_fields_info}
46
+ include_fields.update(include_fields_dict.keys())
47
+ else:
48
+ include_fields.update(all_fields_info.keys())
49
+ if pydantic_meta_exclude and hasattr(model_class.PydanticMeta, "exclude"):
50
+ exclude_fields.update(model_class.PydanticMeta.exclude)
51
+ else:
52
+ include_fields.update(all_fields_info.keys())
53
+
46
54
  if extra_include:
47
55
  include_fields_dict = get_dict_from_pydanticmeta(model_class, extra_include)
48
- all_fields_info.update(include_fields_dict)
56
+ all_fields_info = {**include_fields_dict, **all_fields_info}
49
57
  include_fields.update(include_fields_dict.keys())
50
58
  if exclude:
51
59
  exclude_fields.update(exclude)
@@ -91,7 +91,7 @@ def get_all_schema_factory(
91
91
  text_to_list_fields = set()
92
92
  if include:
93
93
  include_fields_dict = get_dict_from_pydanticmeta(model_class, include)
94
- all_fields_info.update(include_fields_dict)
94
+ all_fields_info = {**include_fields_dict, **all_fields_info}
95
95
  include_fields.update(include_fields_dict.keys())
96
96
  else:
97
97
  if hasattr(model_class, "PydanticMeta"):
@@ -131,29 +131,29 @@ def get_all_schema_factory(
131
131
  else:
132
132
  include_fields.update(all_fields_info.keys())
133
133
 
134
- if extra_include:
135
- include_fields_dict = get_dict_from_pydanticmeta(model_class, extra_include)
136
- all_fields_info.update(include_fields_dict)
137
- include_fields.update(include_fields_dict.keys())
138
- if exclude:
139
- exclude_fields.update(exclude)
140
-
141
- all_fields = include_fields.difference(exclude_fields)
142
- if settings.app_settings.GET_EXCLUDE_ACTIVE_VALUE:
143
- try:
144
- all_fields.remove(settings.app_settings.WHETHER_DELETE_FIELD)
145
- except Exception:
146
- ...
147
-
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)
150
- schema: Type[T] = create_model(
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
- )
156
- return schema
134
+ if extra_include:
135
+ include_fields_dict = get_dict_from_pydanticmeta(model_class, extra_include)
136
+ all_fields_info.update(include_fields_dict)
137
+ include_fields.update(include_fields_dict.keys())
138
+ if exclude:
139
+ exclude_fields.update(exclude)
140
+
141
+ all_fields = include_fields.difference(exclude_fields)
142
+ if settings.app_settings.GET_EXCLUDE_ACTIVE_VALUE:
143
+ try:
144
+ all_fields.remove(settings.app_settings.WHETHER_DELETE_FIELD)
145
+ except Exception:
146
+ ...
147
+
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)
150
+ schema: Type[T] = create_model(
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
+ )
156
+ return schema
157
157
 
158
158
 
159
159
  def get_list_schema_factory(schema_cls: Type[T] = None, response_field: Optional[str] = None, name: str = "") -> Type[T]:
@@ -4,7 +4,6 @@ from pydantic_core import PydanticUndefined
4
4
 
5
5
  from fastgenerateapi.settings.all_settings import settings
6
6
 
7
- # from fastgenerateapi.pydantic_utils.base_model import Config
8
7
  from pydantic import create_model
9
8
  from tortoise import Model
10
9
 
@@ -13,6 +12,13 @@ from fastgenerateapi.pydantic_utils.base_model import model_config
13
12
  from fastgenerateapi.schemas_factory.common_function import get_dict_from_model_fields, get_dict_from_pydanticmeta, \
14
13
  get_model_validate_text_to_list
15
14
 
15
+ def hasattr_get_one_schema(model_class: Type[Model],):
16
+ if not hasattr(model_class, "PydanticMeta"):
17
+ return False
18
+ if hasattr(model_class.PydanticMeta, "get_one_include") or hasattr(model_class.PydanticMeta, "get_one_exclude"):
19
+ return True
20
+ return False
21
+
16
22
 
17
23
  def get_one_schema_factory(
18
24
  model_class: Type[Model],
@@ -83,7 +89,7 @@ def get_one_schema_factory(
83
89
  text_to_list_fields = set()
84
90
  if include:
85
91
  include_fields_dict = get_dict_from_pydanticmeta(model_class, include)
86
- all_fields_info.update(include_fields_dict)
92
+ all_fields_info = {**include_fields_dict, **all_fields_info}
87
93
  include_fields.update(include_fields_dict.keys())
88
94
  else:
89
95
  if hasattr(model_class, "PydanticMeta"):
@@ -123,30 +129,30 @@ def get_one_schema_factory(
123
129
  else:
124
130
  include_fields.update(all_fields_info.keys())
125
131
 
126
- if extra_include:
127
- include_fields_dict = get_dict_from_pydanticmeta(model_class, extra_include)
128
- all_fields_info.update(include_fields_dict)
129
- include_fields.update(include_fields_dict.keys())
130
- if exclude:
131
- exclude_fields.update(exclude)
132
-
133
- all_fields = include_fields.difference(exclude_fields)
134
-
135
- if settings.app_settings.GET_EXCLUDE_ACTIVE_VALUE:
136
- try:
137
- all_fields.remove(settings.app_settings.WHETHER_DELETE_FIELD)
138
- except Exception:
139
- ...
140
-
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)
143
- schema: Type[T] = create_model(
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
- )
149
- return schema
132
+ if extra_include:
133
+ include_fields_dict = get_dict_from_pydanticmeta(model_class, extra_include)
134
+ all_fields_info.update(include_fields_dict)
135
+ include_fields.update(include_fields_dict.keys())
136
+ if exclude:
137
+ exclude_fields.update(exclude)
138
+
139
+ all_fields = include_fields.difference(exclude_fields)
140
+
141
+ if settings.app_settings.GET_EXCLUDE_ACTIVE_VALUE:
142
+ try:
143
+ all_fields.remove(settings.app_settings.WHETHER_DELETE_FIELD)
144
+ except Exception:
145
+ ...
146
+
147
+ schema_name = name if name else model_class.__name__ + "GetOneSchema"
148
+ text_to_list_validators_dict = get_model_validate_text_to_list(text_to_list_fields)
149
+ schema: Type[T] = create_model(
150
+ schema_name,
151
+ **{field: all_fields_info[field] for field in all_fields},
152
+ __config__=model_config,
153
+ __validators__={**text_to_list_validators_dict},
154
+ )
155
+ return schema
150
156
 
151
157
 
152
158
 
@@ -0,0 +1,102 @@
1
+ from typing import Type, Optional, Union, List
2
+
3
+ from tortoise import Model
4
+ from pydantic import create_model
5
+
6
+ from fastgenerateapi.data_type.data_type import T
7
+ from fastgenerateapi.pydantic_utils.base_model import model_config
8
+ from fastgenerateapi.schemas_factory.common_function import get_dict_from_model_fields, get_dict_from_pydanticmeta, \
9
+ get_model_validate_text_to_list
10
+ from fastgenerateapi.settings.all_settings import settings
11
+
12
+
13
+ def get_relation_schema_factory(
14
+ model_class: Type[Model],
15
+ include: Union[list, tuple, set] = None,
16
+ extra_include: Union[list, tuple, set] = None,
17
+ exclude: Union[list, tuple, set] = None,
18
+ pydantic_meta_include: Union[list, tuple, set] = None,
19
+ pydantic_meta_exclude: Optional[bool] = True,
20
+ pydantic_meta_get_relation_include: Optional[bool] = True,
21
+ pydantic_meta_get_relation_exclude: Optional[bool] = True,
22
+ pydantic_meta_text_to_list: Optional[bool] = True,
23
+ name: Optional[str] = None
24
+ ) -> Optional[Type[T]]:
25
+ """
26
+ Is used to create a GetRelationSchema
27
+ """
28
+ all_fields_info: dict = get_dict_from_model_fields(model_class)
29
+
30
+ include_fields = set()
31
+ exclude_fields = set()
32
+ text_to_list_fields = set()
33
+ if include:
34
+ include_fields_dict = get_dict_from_pydanticmeta(model_class, include)
35
+ all_fields_info.update(include_fields_dict)
36
+ include_fields.update(include_fields_dict.keys())
37
+ else:
38
+ if hasattr(model_class, "PydanticMeta"):
39
+ if pydantic_meta_include:
40
+ include_fields_dict = get_dict_from_pydanticmeta(model_class, pydantic_meta_include)
41
+ all_fields_info.update(include_fields_dict)
42
+ include_fields.update(include_fields_dict.keys())
43
+ else:
44
+ if hasattr(model_class.PydanticMeta, "include"):
45
+ include_fields_dict = get_dict_from_pydanticmeta(model_class, model_class.PydanticMeta.include)
46
+ all_fields_info.update(include_fields_dict)
47
+ include_fields.update(include_fields_dict.keys())
48
+ else:
49
+ include_fields.update(all_fields_info.keys())
50
+ if pydantic_meta_exclude and hasattr(model_class.PydanticMeta, "exclude"):
51
+ exclude_fields.update(model_class.PydanticMeta.exclude)
52
+
53
+ if pydantic_meta_get_relation_include and hasattr(model_class.PydanticMeta, "get_relation_include"):
54
+ get_tree_include_fields_dict = get_dict_from_pydanticmeta(model_class, model_class.PydanticMeta.get_tree_include)
55
+ all_fields_info.update(get_tree_include_fields_dict)
56
+ include_fields.update(get_tree_include_fields_dict.keys())
57
+ if pydantic_meta_get_relation_exclude and hasattr(model_class.PydanticMeta, "get_relation_exclude"):
58
+ exclude_fields.update(model_class.PydanticMeta.get_tree_exclude)
59
+ if pydantic_meta_text_to_list and hasattr(model_class.PydanticMeta, "text_to_list"):
60
+ text_to_list_fields = getattr(model_class.PydanticMeta, "text_to_list")
61
+ for field in text_to_list_fields:
62
+ field_info = all_fields_info.get(field)[1]
63
+ field_type = List[str] if field_info.is_required() else Optional[List[str]]
64
+ all_fields_info.update({field: (field_type, field_info)})
65
+ else:
66
+ include_fields.update(all_fields_info.keys())
67
+
68
+ if extra_include:
69
+ include_fields_dict = get_dict_from_pydanticmeta(model_class, extra_include)
70
+ all_fields_info.update(include_fields_dict)
71
+ include_fields.update(include_fields_dict.keys())
72
+ if exclude:
73
+ exclude_fields.update(exclude)
74
+
75
+ all_fields = include_fields.difference(exclude_fields)
76
+
77
+ if settings.app_settings.GET_EXCLUDE_ACTIVE_VALUE:
78
+ try:
79
+ all_fields.remove(settings.app_settings.WHETHER_DELETE_FIELD)
80
+ except Exception:
81
+ ...
82
+
83
+ schema_name = name if name else model_class.__name__ + "GetRelationSchema"
84
+ text_to_list_validators_dict = get_model_validate_text_to_list(text_to_list_fields)
85
+ schema: Type[T] = create_model(
86
+ schema_name,
87
+ **{field: all_fields_info[field] for field in all_fields},
88
+ __config__=model_config,
89
+ __validators__={**text_to_list_validators_dict},
90
+ )
91
+
92
+ return schema
93
+
94
+
95
+
96
+
97
+
98
+
99
+
100
+
101
+
102
+
@@ -0,0 +1,111 @@
1
+ from typing import Type, Optional, Union, List
2
+
3
+ from pydantic.fields import FieldInfo
4
+ from tortoise import Model
5
+ from pydantic import create_model
6
+
7
+ from fastgenerateapi.data_type.data_type import T
8
+ from fastgenerateapi.pydantic_utils.base_model import model_config
9
+ from fastgenerateapi.schemas_factory.common_function import get_dict_from_model_fields, get_dict_from_pydanticmeta, \
10
+ get_model_validate_text_to_list
11
+ from fastgenerateapi.settings.all_settings import settings
12
+
13
+
14
+ def get_tree_schema_factory(
15
+ model_class: Type[Model],
16
+ include: Union[list, tuple, set] = None,
17
+ extra_include: Union[list, tuple, set] = None,
18
+ exclude: Union[list, tuple, set] = None,
19
+ pydantic_meta_include: Union[list, tuple, set] = None,
20
+ pydantic_meta_exclude: Optional[bool] = True,
21
+ pydantic_meta_get_include: Optional[bool] = True,
22
+ pydantic_meta_get_exclude: Optional[bool] = True,
23
+ pydantic_meta_get_tree_include: Optional[bool] = True,
24
+ pydantic_meta_get_tree_exclude: Optional[bool] = True,
25
+ pydantic_meta_text_to_list: Optional[bool] = True,
26
+ name: Optional[str] = None
27
+ ) -> Optional[Type[T]]:
28
+ """
29
+ Is used to create a GetTreeSchema
30
+ """
31
+ all_fields_info: dict = get_dict_from_model_fields(model_class)
32
+
33
+ include_fields = set()
34
+ exclude_fields = set()
35
+ text_to_list_fields = set()
36
+ if include:
37
+ include_fields_dict = get_dict_from_pydanticmeta(model_class, include)
38
+ all_fields_info.update(include_fields_dict)
39
+ include_fields.update(include_fields_dict.keys())
40
+ else:
41
+ if hasattr(model_class, "PydanticMeta"):
42
+ if pydantic_meta_include:
43
+ include_fields_dict = get_dict_from_pydanticmeta(model_class, pydantic_meta_include)
44
+ all_fields_info.update(include_fields_dict)
45
+ include_fields.update(include_fields_dict.keys())
46
+ else:
47
+ if hasattr(model_class.PydanticMeta, "include"):
48
+ include_fields_dict = get_dict_from_pydanticmeta(model_class, model_class.PydanticMeta.include)
49
+ all_fields_info.update(include_fields_dict)
50
+ include_fields.update(include_fields_dict.keys())
51
+ else:
52
+ include_fields.update(all_fields_info.keys())
53
+ if pydantic_meta_exclude and hasattr(model_class.PydanticMeta, "exclude"):
54
+ exclude_fields.update(model_class.PydanticMeta.exclude)
55
+
56
+ if pydantic_meta_get_include and hasattr(model_class.PydanticMeta, "get_include"):
57
+ get_include_fields_dict = get_dict_from_pydanticmeta(model_class, model_class.PydanticMeta.get_include)
58
+ all_fields_info.update(get_include_fields_dict)
59
+ include_fields.update(get_include_fields_dict.keys())
60
+ if pydantic_meta_get_exclude and hasattr(model_class.PydanticMeta, "get_exclude"):
61
+ exclude_fields.update(model_class.PydanticMeta.get_exclude)
62
+
63
+ if pydantic_meta_get_tree_include and hasattr(model_class.PydanticMeta, "get_tree_include"):
64
+ get_tree_include_fields_dict = get_dict_from_pydanticmeta(model_class, model_class.PydanticMeta.get_tree_include)
65
+ all_fields_info.update(get_tree_include_fields_dict)
66
+ include_fields.update(get_tree_include_fields_dict.keys())
67
+ if pydantic_meta_get_tree_exclude and hasattr(model_class.PydanticMeta, "get_tree_exclude"):
68
+ exclude_fields.update(model_class.PydanticMeta.get_tree_exclude)
69
+ if pydantic_meta_text_to_list and hasattr(model_class.PydanticMeta, "text_to_list"):
70
+ text_to_list_fields = getattr(model_class.PydanticMeta, "text_to_list")
71
+ for field in text_to_list_fields:
72
+ field_info = all_fields_info.get(field)[1]
73
+ field_type = List[str] if field_info.is_required() else Optional[List[str]]
74
+ all_fields_info.update({field: (field_type, field_info)})
75
+ else:
76
+ include_fields.update(all_fields_info.keys())
77
+
78
+ if extra_include:
79
+ include_fields_dict = get_dict_from_pydanticmeta(model_class, extra_include)
80
+ all_fields_info.update(include_fields_dict)
81
+ include_fields.update(include_fields_dict.keys())
82
+ if exclude:
83
+ exclude_fields.update(exclude)
84
+
85
+ all_fields = include_fields.difference(exclude_fields)
86
+ all_fields.add(settings.app_settings.DEFAULT_TREE_CHILDREN_FIELD)
87
+ if settings.app_settings.GET_EXCLUDE_ACTIVE_VALUE:
88
+ try:
89
+ all_fields.remove(settings.app_settings.WHETHER_DELETE_FIELD)
90
+ except Exception:
91
+ ...
92
+ schema_name = name if name else model_class.__name__ + "GetTreeSchema"
93
+
94
+ all_fields_info.setdefault(
95
+ settings.app_settings.DEFAULT_TREE_CHILDREN_FIELD,
96
+ (Optional[List[schema_name]], FieldInfo(default=[], description="子级目录"))
97
+ )
98
+
99
+ text_to_list_validators_dict = get_model_validate_text_to_list(text_to_list_fields)
100
+ schema: Type[T] = create_model(
101
+ schema_name,
102
+ **{field: all_fields_info[field] for field in all_fields},
103
+ __config__=model_config,
104
+ __validators__={**text_to_list_validators_dict},
105
+ )
106
+
107
+ return schema
108
+
109
+
110
+
111
+
@@ -89,6 +89,9 @@ class AppSettings(BaseSettings):
89
89
  CACHE_TREE_WHETHER_OPEN: Optional[bool] = Field(default=False, description="树状查询是否打开缓存")
90
90
  CACHE_TREE_SECONDS: int = Field(default=3600, description="树状查询缓存时间,单位秒")
91
91
 
92
+ # ####################################### Swagger文档相关 ###############################################
93
+ SWAGGER_OPEN_DEFAULT_EXAMPLES: Optional[bool] = Field(default=False, description="是否添加默认值")
94
+
92
95
  model_config = SettingsConfigDict(
93
96
  env_prefix="APP_",
94
97
  env_file=".env",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fastgenerateapi
3
- Version: 1.2.9
3
+ Version: 1.2.11
4
4
  Summary: FastAPIView Class View
5
5
  Author: ShiLiang
6
6
  Author-email: 2509144896@qq.com