fastgenerateapi 1.2.4__tar.gz → 1.2.6__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 (116) hide show
  1. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/PKG-INFO +1 -1
  2. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/__init__.py +1 -0
  3. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/__version__.py +1 -1
  4. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/api_view/base_view.py +5 -16
  5. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/api_view/create_view.py +15 -14
  6. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/api_view/delete_filter_view.py +9 -7
  7. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/api_view/delete_tree_view.py +9 -7
  8. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/api_view/delete_view.py +10 -20
  9. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/api_view/get_all_view.py +18 -8
  10. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/api_view/get_one_view.py +8 -5
  11. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/api_view/get_relation_view.py +7 -4
  12. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/api_view/get_tree_view.py +7 -4
  13. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/api_view/mixin/base_mixin.py +0 -5
  14. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/api_view/mixin/get_mixin.py +1 -1
  15. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/api_view/switch_view.py +2 -0
  16. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/api_view/update_relation_view.py +9 -7
  17. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/api_view/update_view.py +14 -13
  18. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/controller/router_controller.py +5 -38
  19. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/controller/ws_controller.py +3 -13
  20. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/deps/filter_params_deps.py +24 -0
  21. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/example/views.py +0 -4
  22. fastgenerateapi-1.2.6/fastgenerateapi/fastapi_utils/tortoise_utils.py +39 -0
  23. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/my_fields/enum_field.py +3 -2
  24. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/schemas_factory/common_function.py +5 -16
  25. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/settings/all_settings.py +7 -5
  26. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi.egg-info/PKG-INFO +1 -1
  27. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi.egg-info/SOURCES.txt +1 -0
  28. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/LICENSE +0 -0
  29. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/README.md +0 -0
  30. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/api_view/__init__.py +0 -0
  31. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/api_view/api_view.py +0 -0
  32. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/api_view/mixin/__init__.py +0 -0
  33. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/api_view/mixin/dbmodel_mixin.py +0 -0
  34. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/api_view/mixin/response_mixin.py +0 -0
  35. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/api_view/mixin/save_mixin.py +0 -0
  36. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/api_view/mixin/tool_mixin.py +0 -0
  37. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/api_view/mixin/utils/__init__.py +0 -0
  38. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/api_view/mixin/utils/docx_util.py +0 -0
  39. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/api_view/mixin/utils/file_util.py +0 -0
  40. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/api_view/mixin/utils/pdf_util.py +0 -0
  41. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/api_view/mixin/utils/xlsx_util.py +0 -0
  42. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/api_view/mixin/utils/zip_util.py +0 -0
  43. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/api_view/sql_get_view.py +0 -0
  44. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/cache/__init__.py +0 -0
  45. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/cache/cache_decorator.py +0 -0
  46. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/cache/key_builder.py +0 -0
  47. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/channel/__init__.py +0 -0
  48. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/channel/connection_manager.py +0 -0
  49. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/channel/consumer.py +0 -0
  50. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/channel/websocket_view.py +0 -0
  51. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/controller/__init__.py +0 -0
  52. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/controller/filter_controller.py +0 -0
  53. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/controller/rpc_controller.py +0 -0
  54. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/controller/search_controller.py +0 -0
  55. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/data_type/__init__.py +0 -0
  56. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/data_type/data_type.py +0 -0
  57. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/data_type/mysql_data_type.py +0 -0
  58. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/deps/__init__.py +0 -0
  59. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/deps/paginator_deps.py +0 -0
  60. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/deps/tree_params_deps.py +0 -0
  61. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/example/__init__.py +0 -0
  62. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/example/models.py +0 -0
  63. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/example/routers.py +0 -0
  64. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/example/schemas.py +0 -0
  65. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/fastapi_utils/__init__.py +0 -0
  66. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/fastapi_utils/all.py +0 -0
  67. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/fastapi_utils/param_utils.py +0 -0
  68. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/fastapi_utils/response_utils.py +0 -0
  69. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/model/__init__.py +0 -0
  70. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/model/base_model.py +0 -0
  71. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/my_fields/__init__.py +0 -0
  72. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/my_fields/aes_field.py +0 -0
  73. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/my_fields/pk_field.py +0 -0
  74. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/my_fields/pwd_field.py +0 -0
  75. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/my_fields/soft_delete_field.py +0 -0
  76. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/my_fields/validator.py +0 -0
  77. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/pydantic_utils/__init__.py +0 -0
  78. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/pydantic_utils/base_model.py +0 -0
  79. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/pydantic_utils/base_settings.py +0 -0
  80. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/pydantic_utils/json_encoders.py +0 -0
  81. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/schemas_factory/__init__.py +0 -0
  82. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/schemas_factory/common_schema_factory.py +0 -0
  83. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/schemas_factory/create_schema_factory.py +0 -0
  84. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/schemas_factory/filter_schema_factory.py +0 -0
  85. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/schemas_factory/get_all_schema_factory.py +0 -0
  86. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/schemas_factory/get_one_schema_factory.py +0 -0
  87. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/schemas_factory/get_relation_schema_factory.py +0 -0
  88. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/schemas_factory/get_tree_schema_factory.py +0 -0
  89. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/schemas_factory/response_factory.py +0 -0
  90. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/schemas_factory/sql_get_all_schema_factory.py +0 -0
  91. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/schemas_factory/update_schema_factory.py +0 -0
  92. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/settings/__init__.py +0 -0
  93. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/settings/app_settings.py +0 -0
  94. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/settings/db_settings.py +0 -0
  95. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/settings/etcd_settings.py +0 -0
  96. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/settings/file_settings.py +0 -0
  97. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/settings/jwt_settings.py +0 -0
  98. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/settings/otlp_settings.py +0 -0
  99. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/settings/redis_settings.py +0 -0
  100. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/settings/sms_settings.py +0 -0
  101. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/settings/system_settings.py +0 -0
  102. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/utils/__init__.py +0 -0
  103. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/utils/aes.py +0 -0
  104. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/utils/auto_discover.py +0 -0
  105. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/utils/exception.py +0 -0
  106. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/utils/file_utils.py +0 -0
  107. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/utils/pwd_utils.py +0 -0
  108. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/utils/ramdom_utils.py +0 -0
  109. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/utils/snowflake.py +0 -0
  110. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/utils/str_util.py +0 -0
  111. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi/utils/swagger_to_js.py +0 -0
  112. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi.egg-info/dependency_links.txt +0 -0
  113. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/fastgenerateapi.egg-info/top_level.txt +0 -0
  114. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/script/__init__.py +0 -0
  115. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/setup.cfg +0 -0
  116. {fastgenerateapi-1.2.4 → fastgenerateapi-1.2.6}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fastgenerateapi
3
- Version: 1.2.4
3
+ Version: 1.2.6
4
4
  Summary: FastAPIView Class View
5
5
  Author: ShiLiang
6
6
  Author-email: 2509144896@qq.com
@@ -8,6 +8,7 @@
8
8
  # d8888P
9
9
 
10
10
  author="石亮"
11
+ from fastgenerateapi.fastapi_utils.tortoise_utils import *
11
12
  from fastgenerateapi.api_view.api_view import APIView, CreateView, GetOneView, GetAllView, UpdateView, DeleteView, \
12
13
  SwitchView
13
14
  from fastgenerateapi.api_view.get_tree_view import GetTreeView
@@ -8,7 +8,7 @@
8
8
  # d8888P
9
9
 
10
10
 
11
- VERSION = (1, 2, 4)
11
+ VERSION = (1, 2, 6)
12
12
 
13
13
  __version__ = '.'.join(map(str, VERSION))
14
14
 
@@ -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
- router_args: Dict[str, any] = None
32
+ check_ignore_error_fields: List[str] = None # 检查唯一字段报错时,不展示这个字段
33
33
 
34
34
  """
35
35
  # 增加外键字段显示
@@ -38,20 +38,6 @@ class BaseView(BaseMixin, ResponseMixin, ToolMixin, DBModelMixin):
38
38
  "avatar": ["id", ("url", "avatar_url")] # 增加 avatar_id,avatar_url2个字段
39
39
  }
40
40
  is_with_prefetch: 是否带有列表的prefetch_related_fields
41
-
42
- # router_args: List[Union[str, tuple, BaseRouterSummary]] = None
43
- # 给函数设置路由以及其他参数
44
- # key为方法名,例如:"get_one", "view_get_data"
45
- router_args = {
46
- "get_one": {
47
- "response_model": CommonResponse;
48
- "summary": "备注",
49
- "dependencies": ["依赖函数"],
50
- }
51
- // 或者 "get_one": CommonResponse,
52
- // 或者 "get_one": "备注",
53
- // 或者 "get_one": ["依赖函数"],
54
- }
55
41
  """
56
42
 
57
43
  @property
@@ -162,13 +148,15 @@ class BaseView(BaseMixin, ResponseMixin, ToolMixin, DBModelMixin):
162
148
  cls,
163
149
  data_dict: dict,
164
150
  model_class: Type[Model],
165
- model: Union[Model, None] = None
151
+ model: Union[Model, None] = None,
152
+ check_ignore_error_fields: List[str] = None,
166
153
  ):
167
154
  """
168
155
  校验模型中设置了 唯一索引和联合唯一索引 的字段
169
156
  :param data_dict: 修改或创建的数据字典
170
157
  :param model_class: 数据库模型
171
158
  :param model: 修改前的数据,用于判断是否修改了字段,当唯一字段与数据data_dict一致时,不会做校验
159
+ :param check_ignore_error_fields: 错误提示忽略字段,会合并类上的字段
172
160
  :return:
173
161
  """
174
162
  check_unique_fields = cls._get_unique_fields(model_class)
@@ -204,6 +192,7 @@ class BaseView(BaseMixin, ResponseMixin, ToolMixin, DBModelMixin):
204
192
  continue
205
193
 
206
194
  if await model_class.filter(**filter_fields).first():
195
+ ignore_error_field_list = check_ignore_error_fields or []
207
196
  if settings.app_settings.WHETHER_DELETE_FIELD in description_fields:
208
197
  description_fields.remove(settings.app_settings.WHETHER_DELETE_FIELD)
209
198
  return cls.error(
@@ -20,7 +20,7 @@ from fastgenerateapi.settings.all_settings import settings
20
20
 
21
21
 
22
22
  class CreateView(BaseView, SaveMixin):
23
-
23
+ create_summary: Optional[str] = None
24
24
  create_route: Union[bool, DEPENDENCIES] = True
25
25
  create_schema: Optional[Type[BaseModel]] = None
26
26
  create_response_schema: Optional[Type[BaseModel]] = None
@@ -89,17 +89,18 @@ class CreateView(BaseView, SaveMixin):
89
89
  *args,
90
90
  **kwargs
91
91
  )
92
+ if isinstance(data, Model):
93
+ if settings.app_settings.WHETHER_CREATE_RESPONSE_DATA:
94
+ if self.is_with_prefetch:
95
+ data = await self.get_object(data.id, self.model_class, self.is_with_prefetch)
96
+ await self.setattr_model(data, prefetch_related_fields=self.prefetch_related_fields)
97
+
98
+ return self.success(data=self.create_response_schema.model_validate(data))
99
+ return self.success()
92
100
  if isinstance(data, JSONResponse):
93
101
  return data
94
- if isinstance(data, PydanticBaseModel):
95
- return self.success(data=data)
96
- if settings.app_settings.WHETHER_CREATE_RESPONSE_DATA:
97
- if self.is_with_prefetch:
98
- data = await self.get_object(data.id, self.model_class, self.is_with_prefetch)
99
- await self.setattr_model(data, prefetch_related_fields=self.prefetch_related_fields)
100
-
101
- return self.success(data=self.create_response_schema.model_validate(data))
102
- return self.success()
102
+ return self.success(data=data)
103
+
103
104
  return route
104
105
 
105
106
  def _handler_create_settings(self):
@@ -115,16 +116,16 @@ class CreateView(BaseView, SaveMixin):
115
116
  else:
116
117
  self.create_response_schema_factory = self.gen_get_one_response_schema_factory()
117
118
  self.create_response_schema = self.get_one_schema
118
-
119
- doc = self.create.__doc__
120
- summary = doc.strip().split("\n")[0] if doc else f"Create"
119
+ if not self.create_summary:
120
+ doc = self.create.__doc__
121
+ self.create_summary = doc.strip().split("\n")[0] if doc else f"Create"
121
122
  path = f"/{settings.app_settings.ROUTER_CREATE_SUFFIX_FIELD}" if settings.app_settings.ROUTER_WHETHER_ADD_SUFFIX else ""
122
123
  self._add_api_route(
123
124
  path=path,
124
125
  endpoint=self._create_decorator(),
125
126
  methods=["POST"],
126
127
  response_model=self.create_response_schema_factory, # type: ignore
127
- summary=summary,
128
+ summary=self.create_summary,
128
129
  dependencies=self.create_route,
129
130
  )
130
131
 
@@ -17,7 +17,7 @@ from fastgenerateapi.settings.all_settings import settings
17
17
 
18
18
 
19
19
  class DeleteFilterView(BaseView):
20
-
20
+ delete_filter_summary: Optional[str] = None
21
21
  delete_filter_route: Union[bool, DEPENDENCIES] = True
22
22
  delete_filter_response_schema: Optional[Type[BaseModel]] = None
23
23
  """
@@ -42,14 +42,16 @@ class DeleteFilterView(BaseView):
42
42
  filters: dict = Depends(filter_params_deps(model_class=self.model_class, fields=self.filter_fields)),
43
43
  token: Optional[str] = Depends(OAuth2PasswordBearer(tokenUrl="token", auto_error=False)),
44
44
  ) -> JSONResponse:
45
- await self.destroy_filter(
45
+ data = await self.destroy_filter(
46
46
  search=search,
47
47
  filters=filters,
48
48
  request=request,
49
49
  token=token,
50
50
  *args, **kwargs
51
51
  )
52
- return self.success(msg="删除成功")
52
+ if isinstance(data, JSONResponse):
53
+ return data
54
+ return self.success(msg="删除成功", data=data)
53
55
  return route
54
56
 
55
57
  def _handler_destroy_filter_settings(self):
@@ -62,16 +64,16 @@ class DeleteFilterView(BaseView):
62
64
  self.delete_filter_response_schema = func_type
63
65
  if self.delete_filter_response_schema:
64
66
  self.delete_filter_response_schema_factory = response_factory(self.delete_filter_response_schema, name="DeleteFilter")
65
-
66
- doc = self.destroy_filter.__doc__
67
- summary = doc.strip().split("\n")[0] if doc else "Delete Filter"
67
+ if not self.delete_filter_summary:
68
+ doc = self.destroy_filter.__doc__
69
+ self.delete_filter_summary = doc.strip().split("\n")[0] if doc else "Delete Filter"
68
70
  path = f"/{settings.app_settings.ROUTER_FILTER_DELETE_SUFFIX_FIELD}" if settings.app_settings.ROUTER_WHETHER_ADD_SUFFIX else ""
69
71
  self._add_api_route(
70
72
  path=path,
71
73
  endpoint=self._delete_filter_decorator(),
72
74
  methods=["DELETE"],
73
75
  response_model=self.delete_filter_response_schema_factory,
74
- summary=summary,
76
+ summary=self.delete_filter_summary,
75
77
  dependencies=self.delete_filter_route,
76
78
  )
77
79
 
@@ -18,7 +18,7 @@ from fastgenerateapi.settings.all_settings import settings
18
18
 
19
19
 
20
20
  class DeleteTreeView(BaseView):
21
-
21
+ delete_tree_summary: Optional[str] = None
22
22
  delete_tree_route: Union[bool, DEPENDENCIES] = True
23
23
  delete_tree_schema: Optional[Type[BaseModel]] = IdList
24
24
  delete_tree_response_schema: Optional[Type[BaseModel]] = None
@@ -68,13 +68,15 @@ class DeleteTreeView(BaseView):
68
68
  request: Request,
69
69
  token: Optional[str] = Depends(OAuth2PasswordBearer(tokenUrl="token", auto_error=False)),
70
70
  ) -> JSONResponse:
71
- await self.destroy_tree(
71
+ data = await self.destroy_tree(
72
72
  request_data=request_data,
73
73
  request=request,
74
74
  token=token,
75
75
  *args, **kwargs
76
76
  )
77
- return self.success(msg="删除成功")
77
+ if isinstance(data, JSONResponse):
78
+ return data
79
+ return self.success(msg="删除成功", data=data)
78
80
  return route
79
81
 
80
82
  def _handler_delete_tree_settings(self):
@@ -87,16 +89,16 @@ class DeleteTreeView(BaseView):
87
89
  self.delete_tree_response_schema = func_type
88
90
  if self.delete_tree_response_schema:
89
91
  self.delete_tree_response_schema_factory = response_factory(self.delete_tree_response_schema, name="DeleteTree")
90
-
91
- doc = self.destroy_tree.__doc__
92
- summary = doc.strip().split("\n")[0] if doc else "Delete Tree"
92
+ if not self.delete_tree_summary:
93
+ doc = self.destroy_tree.__doc__
94
+ self.delete_tree_summary = doc.strip().split("\n")[0] if doc else "Delete Tree"
93
95
  path = f"/{settings.app_settings.ROUTER_RECURSION_DELETE_SUFFIX_FIELD}" if settings.app_settings.ROUTER_WHETHER_ADD_SUFFIX else ""
94
96
  self._add_api_route(
95
97
  path=path,
96
98
  endpoint=self._delete_tree_decorator(),
97
99
  methods=["DELETE"],
98
100
  response_model=self.delete_tree_response_schema_factory,
99
- summary=summary,
101
+ summary=self.delete_tree_summary,
100
102
  dependencies=self.delete_tree_route,
101
103
  )
102
104
 
@@ -18,7 +18,7 @@ from fastgenerateapi.settings.all_settings import settings
18
18
 
19
19
 
20
20
  class DeleteView(BaseView):
21
-
21
+ delete_summary: Optional[str] = None
22
22
  delete_route: Union[bool, DEPENDENCIES] = True
23
23
  delete_schema: Optional[Type[BaseModel]] = IdList
24
24
  delete_response_schema: Optional[Type[BaseModel]] = IdList
@@ -35,19 +35,6 @@ class DeleteView(BaseView):
35
35
 
36
36
  return
37
37
 
38
- # 弃用思路:唯一字段加时间戳
39
- # if unique_fields := self._get_unique_fields(self.model_class):
40
- # for model in await queryset:
41
- # model.is_active = False
42
- # for field in unique_fields:
43
- # try:
44
- # setattr(model, field, getattr(model, field) + f"__{int(time.time() * 1000)}")
45
- # except Exception as e:
46
- # setattr(model, field, getattr(model, field) + f"__{int(time.time() * 1000)}")
47
- # await model.save()
48
- # else:
49
- # await queryset.update(is_active=False)
50
-
51
38
  async def get_del_queryset(self, request_data, *args, **kwargs):
52
39
  queryset = self.queryset.filter(id__in=request_data.id_list)
53
40
  return queryset
@@ -58,13 +45,16 @@ class DeleteView(BaseView):
58
45
  request: Request,
59
46
  token: Optional[str] = Depends(OAuth2PasswordBearer(tokenUrl="token", auto_error=False)),
60
47
  ) -> JSONResponse:
61
- await self.destroy(
48
+ data = await self.destroy(
62
49
  request_data=request_data,
63
50
  request=request,
64
51
  token=token,
65
52
  *args, **kwargs
66
53
  )
67
- return self.success(msg="删除成功")
54
+
55
+ if isinstance(data, JSONResponse):
56
+ return data
57
+ return self.success(msg="删除成功", data=data)
68
58
  return route
69
59
 
70
60
  def _handler_delete_settings(self):
@@ -77,16 +67,16 @@ class DeleteView(BaseView):
77
67
  self.delete_response_schema = func_type
78
68
  if self.delete_response_schema:
79
69
  self.delete_response_schema_factory = response_factory(self.delete_response_schema, name="Delete")
80
-
81
- doc = self.destroy.__doc__
82
- summary = doc.strip().split("\n")[0] if doc else "Delete All"
70
+ if not self.delete_summary:
71
+ doc = self.destroy.__doc__
72
+ summary = doc.strip().split("\n")[0] if doc else "Delete All"
83
73
  path = f"/{settings.app_settings.ROUTER_DELETE_SUFFIX_FIELD}" if settings.app_settings.ROUTER_WHETHER_ADD_SUFFIX else ""
84
74
  self._add_api_route(
85
75
  path=path,
86
76
  endpoint=self._delete_decorator(),
87
77
  methods=["DELETE"],
88
78
  response_model=self.delete_response_schema_factory,
89
- summary=summary,
79
+ summary=self.delete_summary,
90
80
  dependencies=self.delete_route,
91
81
  )
92
82
 
@@ -20,7 +20,7 @@ from fastgenerateapi.cache.key_builder import generate_key_builder
20
20
  from fastgenerateapi.controller import SearchController, BaseFilter, FilterController
21
21
  from fastgenerateapi.data_type.data_type import DEPENDENCIES, PYDANTIC_SCHEMA
22
22
  from fastgenerateapi.deps import paginator_deps, filter_params_deps
23
- from fastgenerateapi.deps.filter_params_deps import search_params_deps
23
+ from fastgenerateapi.deps.filter_params_deps import search_params_deps, extra_filter_params_deps
24
24
  from fastgenerateapi.schemas_factory import get_all_schema_factory, get_page_schema_factory, get_one_schema_factory, \
25
25
  response_factory
26
26
  from fastgenerateapi.schemas_factory.get_all_schema_factory import get_list_schema_factory, hasattr_get_all_schema
@@ -28,11 +28,13 @@ from fastgenerateapi.settings.all_settings import settings
28
28
 
29
29
 
30
30
  class GetAllView(BaseView, GetMixin):
31
+ get_all_summary: Optional[str] = None
31
32
  get_all_route: Union[bool, DEPENDENCIES] = True
32
33
  get_all_schema: Optional[Type[PYDANTIC_SCHEMA]] = None
33
34
  search_fields: Union[None, list] = None
34
- filter_schema: Optional[Type[PYDANTIC_SCHEMA]] = None
35
35
  filter_fields: Union[None, list] = None
36
+ filter_schema: Optional[Type[PYDANTIC_SCHEMA]] = None
37
+ extra_filter_schema: Optional[Type[PYDANTIC_SCHEMA]] = None
36
38
  order_by_fields: Union[None, list] = None
37
39
  auto_add_id_order: bool = True
38
40
  """
@@ -46,6 +48,9 @@ class GetAllView(BaseView, GetMixin):
46
48
  example:("name__contains", str, "name") 类型是str的时候可以省略,没有第三个值时,自动双下划线转单下划线
47
49
  filter_fields: 筛选对应字段
48
50
  example: name__contains or (create_at__gt, datetime) or (create_at__gt, datetime, create_time)
51
+ filter_schema: 筛选对应字段
52
+ 与filter_fields结果合并,存在相同值时,filter_schema覆盖filter_fields
53
+ extra_filter_schema: 不用于筛选,可用于返回值判断
49
54
  order_by_fields: 排序对应字段
50
55
  auto_add_id_order: 是否自动在 order_by_fields 后面追加id排序
51
56
  """
@@ -78,7 +83,7 @@ class GetAllView(BaseView, GetMixin):
78
83
  """
79
84
  return queryset
80
85
 
81
- async def set_get_all_model(self, model: Model) -> Model:
86
+ async def set_get_all_model(self, model: Model, *args, **kwargs) -> Model:
82
87
  """
83
88
  对于查询的model,展示数据处理
84
89
  """
@@ -110,8 +115,8 @@ class GetAllView(BaseView, GetMixin):
110
115
  await self.setattr_model(model, prefetch_related_fields=self.prefetch_related_fields, *args, **kwargs)
111
116
 
112
117
  # await self.setattr_model_rpc(self.rpc_class, model, self.rpc_param)
113
- model = await self.set_get_model(model)
114
- model = await self.set_get_all_model(model)
118
+ model = await self.set_get_model(model, *args, **kwargs)
119
+ model = await self.set_get_all_model(model, *args, **kwargs)
115
120
 
116
121
  if schema:
117
122
  data_list.append(schema.from_orm(model))
@@ -150,17 +155,21 @@ class GetAllView(BaseView, GetMixin):
150
155
  paginator = Depends(paginator_deps()),
151
156
  search: Optional[str] = Depends(search_params_deps(self.search_fields)),
152
157
  filters: dict = Depends(filter_params_deps(model_class=self.model_class, fields=self.filter_fields, schema=self.filter_schema)),
158
+ extra_filters: dict = Depends(extra_filter_params_deps(schema=self.extra_filter_schema)),
153
159
  token: Optional[str] = Depends(OAuth2PasswordBearer(tokenUrl="token", auto_error=False)),
154
160
  ) -> JSONResponse:
155
161
  data = await self.get_all(
156
162
  paginator=paginator,
157
163
  search=search,
158
164
  filters=filters,
165
+ extra_filters=extra_filters,
159
166
  request=request,
160
167
  token=token,
161
168
  *args,
162
169
  **kwargs
163
170
  )
171
+ if isinstance(data, JSONResponse):
172
+ return data
164
173
  return self.success(data=data)
165
174
 
166
175
  return route
@@ -189,14 +198,15 @@ class GetAllView(BaseView, GetMixin):
189
198
  self.get_page_schema = get_page_schema_factory(self.get_all_schema)
190
199
  self.get_list_schema = get_list_schema_factory(self.get_all_schema)
191
200
  self.get_all_response_schema_factory = response_factory(self.get_page_schema, name="GetPage")
192
- doc = self.get_all.__doc__
193
- summary = doc.strip().split("\n")[0] if doc else "Get All"
201
+ if not self.get_all_summary:
202
+ doc = self.get_all.__doc__
203
+ self.get_all_summary = doc.strip().split("\n")[0] if doc else "Get All"
194
204
  path = f"/{settings.app_settings.ROUTER_GET_ALL_SUFFIX_FIELD}" if settings.app_settings.ROUTER_WHETHER_ADD_SUFFIX else ""
195
205
  self._add_api_route(
196
206
  path=path,
197
207
  endpoint=self._get_all_decorator(),
198
208
  methods=["GET"],
199
209
  response_model=self.get_all_response_schema_factory,
200
- summary=summary,
210
+ summary=self.get_all_summary,
201
211
  dependencies=self.get_all_route,
202
212
  )
@@ -22,7 +22,7 @@ from fastgenerateapi.utils.exception import NOT_FOUND
22
22
 
23
23
 
24
24
  class GetOneView(BaseView, GetMixin):
25
-
25
+ get_one_summary: Optional[str] = None
26
26
  get_one_route: Union[bool, DEPENDENCIES] = True
27
27
  get_one_schema: Optional[Type[BaseModel]] = None
28
28
  """
@@ -45,7 +45,7 @@ class GetOneView(BaseView, GetMixin):
45
45
  await self.setattr_model(model, prefetch_related_fields=self.prefetch_related_fields, *args, **kwargs)
46
46
 
47
47
  # await self.setattr_model_rpc(self.rpc_class, model, self.rpc_param)
48
- model = await self.set_get_model(model)
48
+ model = await self.set_get_model(model, *args, **kwargs)
49
49
 
50
50
  return self.get_one_schema.from_orm(model)
51
51
 
@@ -62,6 +62,8 @@ class GetOneView(BaseView, GetMixin):
62
62
  token=token,
63
63
  *args, **kwargs
64
64
  )
65
+ if isinstance(data, JSONResponse):
66
+ return data
65
67
  return self.success(data=data)
66
68
  return route
67
69
 
@@ -75,15 +77,16 @@ class GetOneView(BaseView, GetMixin):
75
77
  if not self.get_one_schema:
76
78
  self.get_one_schema = self.gen_get_one_response_schema()
77
79
  self.get_one_response_schema_factory = response_factory(self.get_one_schema, name="GetOne")
78
- doc = self.get_one.__doc__
79
- summary = doc.strip().split("\n")[0] if self.get_one.__doc__ else "Get One"
80
+ if not self.get_one_summary:
81
+ doc = self.get_one.__doc__
82
+ self.get_one_summary = doc.strip().split("\n")[0] if self.get_one.__doc__ else "Get One"
80
83
  path = f"/{settings.app_settings.ROUTER_GET_ONE_SUFFIX_FIELD}/{'{pk}'}" if settings.app_settings.ROUTER_WHETHER_ADD_SUFFIX else "/{pk}"
81
84
  self._add_api_route(
82
85
  path=path,
83
86
  endpoint=self._get_one_decorator(),
84
87
  methods=["GET"],
85
88
  response_model=self.get_one_response_schema_factory,
86
- summary=summary,
89
+ summary=self.get_one_summary,
87
90
  dependencies=self.get_one_route,
88
91
  error_responses=[NOT_FOUND],
89
92
  )
@@ -22,10 +22,10 @@ from fastgenerateapi.settings.all_settings import settings
22
22
 
23
23
 
24
24
  class GetRelationView(BaseView):
25
-
26
25
  path_id_name: str
27
26
  relation_id_name: str
28
27
  relation_model_class: Optional[Type[Model]]
28
+ get_relation_summary: Optional[str] = None
29
29
  get_relation_route: Union[bool, DEPENDENCIES] = True
30
30
  get_relation_schema: Optional[Type[BaseModel]] = None
31
31
  search_fields: Union[None, list] = None
@@ -175,6 +175,8 @@ class GetRelationView(BaseView):
175
175
  *args,
176
176
  **kwargs
177
177
  )
178
+ if isinstance(data, JSONResponse):
179
+ return data
178
180
  return self.success(data=data)
179
181
  return route
180
182
 
@@ -192,15 +194,16 @@ class GetRelationView(BaseView):
192
194
  self.get_relation_page_schema = get_page_schema_factory(self.get_relation_schema)
193
195
  self.get_relation_list_schema = get_list_schema_factory(self.get_relation_schema)
194
196
  self.get_relation_response_schema_factory = response_factory(self.get_relation_page_schema, name="GetPage")
195
- doc = self.get_relation.__doc__
196
- summary = doc.strip().split("\n")[0] if doc else f"Get {self.model_class.__name__.title()}"
197
+ if not self.get_relation_summary:
198
+ doc = self.get_relation.__doc__
199
+ summary = doc.strip().split("\n")[0] if doc else f"Get {self.model_class.__name__.title()}"
197
200
  path = f"/get-{self.relation_id_name.removesuffix('_id')}-by-{self.path_id_name.removesuffix('_id')}/{'{pk}'}" if settings.app_settings.ROUTER_WHETHER_ADD_SUFFIX else ""
198
201
  self._add_api_route(
199
202
  path=path,
200
203
  endpoint=self._get_relation_decorator(),
201
204
  methods=["GET"],
202
205
  response_model=self.get_relation_response_schema_factory,
203
- summary=summary,
206
+ summary=self.get_relation_summary,
204
207
  dependencies=self.get_relation_route,
205
208
  )
206
209
 
@@ -31,7 +31,7 @@ from fastgenerateapi.settings.all_settings import settings
31
31
 
32
32
 
33
33
  class GetTreeView(BaseView):
34
-
34
+ get_tree_summary: Optional[str] = None
35
35
  get_tree_route: Union[bool, DEPENDENCIES] = True
36
36
  get_tree_schema: Optional[Type[BaseModel]] = None
37
37
  search_fields: Union[None, list] = None
@@ -170,6 +170,8 @@ class GetTreeView(BaseView):
170
170
  *args,
171
171
  **kwargs
172
172
  )
173
+ if isinstance(data, JSONResponse):
174
+ return data
173
175
  return self.success(data=data)
174
176
  return route
175
177
 
@@ -185,15 +187,16 @@ class GetTreeView(BaseView):
185
187
  self.get_tree_schema = self.get_tree_schema or get_tree_schema_factory(self.model_class)
186
188
  self.get_tree_data_schema = get_list_schema_factory(self.get_tree_schema)
187
189
  self.get_tree_response_schema_factory = response_factory(self.get_tree_data_schema, name="GetTree")
188
- doc = self.get_tree.__doc__
189
- summary = doc.strip().split("\n")[0] if self.get_tree.__doc__ else "Get Tree"
190
+ if not self.get_tree_summary:
191
+ doc = self.get_tree.__doc__
192
+ self.get_tree_summary = doc.strip().split("\n")[0] if self.get_tree.__doc__ else "Get Tree"
190
193
  path = f"/{settings.app_settings.ROUTER_GET_TREE_SUFFIX_FIELD}" if settings.app_settings.ROUTER_WHETHER_ADD_SUFFIX else ""
191
194
  self._add_api_route(
192
195
  path=path,
193
196
  endpoint=self._get_tree_decorator(),
194
197
  methods=["GET"],
195
198
  response_model=self.get_tree_response_schema_factory,
196
- summary=summary,
199
+ summary=self.get_tree_summary,
197
200
  dependencies=self.get_tree_route,
198
201
  )
199
202
 
@@ -8,9 +8,7 @@ from fastgenerateapi.utils.exception import NOT_FOUND
8
8
 
9
9
  from fastgenerateapi.controller.filter_controller import BaseFilter
10
10
  from fastgenerateapi.controller import RouterController
11
- from fastgenerateapi.controller.ws_controller import WsController
12
11
 
13
- from fastgenerateapi.settings.all_settings import settings
14
12
  from starlette.exceptions import HTTPException
15
13
 
16
14
  from fastgenerateapi.data_type.data_type import DEPENDENCIES, T, PYDANTIC_SCHEMA
@@ -48,9 +46,6 @@ class BaseMixin(Generic[T], APIRouter, ABC):
48
46
  route_field_func = f"_handler_{route_field.rsplit('_', 1)[0]}_settings"
49
47
  if hasattr(self, route_field) and getattr(self, route_field) and hasattr(self, route_field_func):
50
48
  getattr(self, route_field_func)()
51
- # if self.table_name:
52
- # if hasattr(self, "_handler_sql_get_all_settings"):
53
- # getattr(self, "_handler_sql_get_all_settings")()
54
49
 
55
50
  @staticmethod
56
51
  def get_base_filter(fields: list, schema: Optional[PYDANTIC_SCHEMA] = None) -> list:
@@ -5,7 +5,7 @@ from fastgenerateapi.pydantic_utils.base_model import BaseModel
5
5
 
6
6
  class GetMixin:
7
7
 
8
- async def set_get_model(self, model: Model) -> Model:
8
+ async def set_get_model(self, model: Model, *args, **kwargs) -> Model:
9
9
  """
10
10
  修改查询后的model数据
11
11
  """
@@ -48,6 +48,8 @@ class SwitchView(BaseView):
48
48
  token: Optional[str] = Depends(OAuth2PasswordBearer(tokenUrl="token", auto_error=False)),
49
49
  ) -> JSONResponse:
50
50
  data = await self.switch(pk=pk, request=request, filed=filed, token=token, *args, **kwargs)
51
+ if isinstance(data, JSONResponse):
52
+ return data
51
53
  return self.success(data=data)
52
54
  return route
53
55
 
@@ -20,11 +20,11 @@ from fastgenerateapi.utils.exception import NOT_FOUND
20
20
 
21
21
 
22
22
  class UpdateRelationView(BaseView, SaveMixin):
23
-
24
23
  path_id_name: str
25
24
  relation_id_name: str
26
25
  update_relation_schema: Optional[Type[BaseModel]] = IdList
27
26
  update_relation_response_schema: Optional[Type[BaseModel]] = None
27
+ update_relation_summary: Optional[str] = None
28
28
  update_relation_route: Union[bool, DEPENDENCIES] = True
29
29
  """
30
30
  path_id_name: 路径id在模型中对应的字段名
@@ -61,14 +61,16 @@ class UpdateRelationView(BaseView, SaveMixin):
61
61
  request: Request,
62
62
  token: Optional[str] = Depends(OAuth2PasswordBearer(tokenUrl="token", auto_error=False)),
63
63
  ) -> JSONResponse:
64
- await self.update_relation(
64
+ data = await self.update_relation(
65
65
  pk=pk,
66
66
  request_data=request_data,
67
67
  request=request,
68
68
  token=token,
69
69
  *args, **kwargs
70
70
  )
71
- return self.success()
71
+ if isinstance(data, JSONResponse):
72
+ return data
73
+ return self.success(data=data)
72
74
  return route
73
75
 
74
76
  def _handler_update_relation_settings(self):
@@ -81,16 +83,16 @@ class UpdateRelationView(BaseView, SaveMixin):
81
83
  self.update_relation_response_schema = func_type
82
84
  if self.update_relation_response_schema:
83
85
  self.update_relation_response_schema_factory = response_factory(self.update_relation_response_schema, name="UpdateRelation")
84
-
85
- doc = self.update_relation.__doc__
86
- summary = doc.strip().split("\n")[0] if doc else f"Update {self.model_class.__name__.title()}"
86
+ if not self.update_relation_summary:
87
+ doc = self.update_relation.__doc__
88
+ self.update_relation_summary = doc.strip().split("\n")[0] if doc else f"Update {self.model_class.__name__.title()}"
87
89
  path = f"/update-{self.relation_id_name.removesuffix('_id')}-by-{self.path_id_name.removesuffix('_id')}/{'{pk}'}" if settings.app_settings.ROUTER_WHETHER_ADD_SUFFIX else "/{pk}"
88
90
  self._add_api_route(
89
91
  path=path,
90
92
  endpoint=self._update_relation_decorator(),
91
93
  methods=["PUT"],
92
94
  response_model=self.update_relation_response_schema_factory,
93
- summary=summary,
95
+ summary=self.update_relation_summary,
94
96
  dependencies=self.update_relation_route,
95
97
  error_responses=[NOT_FOUND],
96
98
  )