fastgenerateapi 0.0.23__tar.gz → 0.0.26__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.
Potentially problematic release.
This version of fastgenerateapi might be problematic. Click here for more details.
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/PKG-INFO +1 -1
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/__init__.py +1 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/__version__.py +1 -1
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/api_view/base_view.py +29 -14
- fastgenerateapi-0.0.26/fastgenerateapi/api_view/delete_filter_view.py +67 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/api_view/delete_tree_view.py +13 -11
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/api_view/delete_view.py +12 -11
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/api_view/get_tree_view.py +2 -1
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/api_view/mixin/base_mixin.py +1 -1
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/api_view/mixin/dbmodel_mixin.py +5 -3
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/channel/consumer.py +5 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/channel/websocket_view.py +3 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/controller/ws_controller.py +8 -6
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/example/models.py +19 -11
- fastgenerateapi-0.0.26/fastgenerateapi/example/routers.py +15 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/example/schemas.py +1 -1
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/example/views.py +46 -10
- fastgenerateapi-0.0.26/fastgenerateapi/my_fields/__init__.py +4 -0
- fastgenerateapi-0.0.26/fastgenerateapi/my_fields/aes_field.py +166 -0
- fastgenerateapi-0.0.26/fastgenerateapi/my_fields/enum_field.py +215 -0
- fastgenerateapi-0.0.26/fastgenerateapi/my_fields/pk_field.py +68 -0
- fastgenerateapi-0.0.26/fastgenerateapi/my_fields/pwd_field.py +81 -0
- fastgenerateapi-0.0.26/fastgenerateapi/my_fields/soft_delete_field.py +54 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/pydantic_utils/base_model.py +3 -1
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/schemas_factory/common_function.py +2 -1
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/schemas_factory/common_schema_factory.py +1 -1
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/schemas_factory/create_schema_factory.py +9 -3
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/schemas_factory/get_all_schema_factory.py +7 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/schemas_factory/get_one_schema_factory.py +8 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/schemas_factory/get_tree_schema_factory.py +8 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/schemas_factory/update_schema_factory.py +9 -3
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/settings/settings.py +13 -7
- fastgenerateapi-0.0.26/fastgenerateapi/utils/aes.py +93 -0
- fastgenerateapi-0.0.26/fastgenerateapi/utils/snowflake.py +148 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi.egg-info/PKG-INFO +1 -1
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi.egg-info/SOURCES.txt +10 -1
- fastgenerateapi-0.0.23/fastgenerateapi/example/routers.py +0 -15
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/LICENSE +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/README.md +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/api_view/__init__.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/api_view/api_view.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/api_view/create_view.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/api_view/get_all_view.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/api_view/get_one_view.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/api_view/get_relation_view.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/api_view/mixin/__init__.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/api_view/mixin/get_mixin.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/api_view/mixin/response_mixin.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/api_view/mixin/save_mixin.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/api_view/mixin/tool_mixin.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/api_view/sql_get_view.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/api_view/switch_view.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/api_view/update_relation_view.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/api_view/update_view.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/cache/__init__.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/cache/cache_decorator.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/cache/key_builder.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/channel/__init__.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/controller/__init__.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/controller/filter_controller.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/controller/router_controller.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/controller/rpc_controller.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/controller/search_controller.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/data_type/__init__.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/data_type/data_type.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/data_type/mysql_data_type.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/deps/__init__.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/deps/filter_params_deps.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/deps/paginator_deps.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/deps/tree_params_deps.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/example/__init__.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/pydantic_utils/__init__.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/pydantic_utils/json_encoders.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/schemas_factory/__init__.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/schemas_factory/filter_schema_factory.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/schemas_factory/get_relation_schema_factory.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/schemas_factory/response_factory.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/schemas_factory/sql_get_all_schema_factory.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/settings/__init__.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/settings/register_settings.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/utils/__init__.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/utils/exception.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/utils/parse_str.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi.egg-info/dependency_links.txt +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi.egg-info/top_level.txt +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/setup.cfg +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/setup.py +0 -0
|
@@ -12,6 +12,7 @@ from fastgenerateapi.api_view.api_view import APIView, CreateView, GetOneView, G
|
|
|
12
12
|
SwitchView
|
|
13
13
|
from fastgenerateapi.api_view.get_tree_view import GetTreeView
|
|
14
14
|
from fastgenerateapi.api_view.delete_tree_view import DeleteTreeView
|
|
15
|
+
from fastgenerateapi.api_view.delete_filter_view import DeleteFilterView
|
|
15
16
|
from fastgenerateapi.api_view.base_view import BaseView
|
|
16
17
|
|
|
17
18
|
# 多对多关联 >> 查和改
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import time
|
|
1
2
|
import uuid
|
|
2
3
|
from copy import copy
|
|
3
4
|
from typing import Optional, Type, List, Union, Sequence, Dict
|
|
@@ -9,7 +10,6 @@ from tortoise.queryset import QuerySet
|
|
|
9
10
|
from pydantic import create_model, BaseModel
|
|
10
11
|
from starlette.requests import Request
|
|
11
12
|
from tortoise import Model
|
|
12
|
-
from tortoise.expressions import Q
|
|
13
13
|
|
|
14
14
|
from fastgenerateapi.api_view.mixin.base_mixin import BaseMixin
|
|
15
15
|
from fastgenerateapi.api_view.mixin.dbmodel_mixin import DBModelMixin
|
|
@@ -55,25 +55,28 @@ class BaseView(BaseMixin, ResponseMixin, ToolMixin, DBModelMixin):
|
|
|
55
55
|
def queryset(self) -> QuerySet:
|
|
56
56
|
if not self.model_class:
|
|
57
57
|
return self.error(msg="model_class not allow None")
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
58
|
+
|
|
59
|
+
return self.get_active_queryset(self.model_class)
|
|
60
|
+
|
|
61
|
+
def get_active_queryset(self, model_class: Union[Type[Model], QuerySet, None] = None) -> QuerySet:
|
|
62
|
+
if not model_class:
|
|
63
|
+
if not self.model_class:
|
|
64
|
+
return self.error(msg="model_class not allow None")
|
|
65
|
+
model_class = self.model_class
|
|
66
|
+
delete_filter_field = settings.app_settings.WHETHER_DELETE_FIELD
|
|
67
|
+
if settings.app_settings.DELETE_FIELD_TYPE == "time":
|
|
68
|
+
delete_filter_field = f"{settings.app_settings.WHETHER_DELETE_FIELD}__isnull"
|
|
69
|
+
queryset = model_class.filter(**{
|
|
70
|
+
delete_filter_field: True
|
|
71
|
+
})
|
|
72
|
+
|
|
64
73
|
return queryset
|
|
65
74
|
|
|
66
75
|
@property
|
|
67
76
|
def relation_queryset(self) -> QuerySet:
|
|
68
77
|
if not self.relation_model_class:
|
|
69
78
|
return self.error(msg="relation_model_class not allow None")
|
|
70
|
-
|
|
71
|
-
queryset = self.relation_model_class.filter(
|
|
72
|
-
eval(f"Q({settings.app_settings.WHETHER_DELETE_FIELD}='{settings.app_settings.ACTIVE_DEFAULT_VALUE}')"))
|
|
73
|
-
else:
|
|
74
|
-
queryset = self.relation_model_class.filter(
|
|
75
|
-
eval(f"Q({settings.app_settings.WHETHER_DELETE_FIELD}={settings.app_settings.ACTIVE_DEFAULT_VALUE})"))
|
|
76
|
-
return queryset
|
|
79
|
+
return self.get_active_queryset(self.relation_model_class)
|
|
77
80
|
|
|
78
81
|
async def get_object(self, pk):
|
|
79
82
|
model = await self.queryset.filter(pk=pk).prefetch_related(
|
|
@@ -83,6 +86,18 @@ class BaseView(BaseMixin, ResponseMixin, ToolMixin, DBModelMixin):
|
|
|
83
86
|
else:
|
|
84
87
|
raise NOT_FOUND
|
|
85
88
|
|
|
89
|
+
def _delete_value(self):
|
|
90
|
+
result = False
|
|
91
|
+
if settings.app_settings.DELETE_FIELD_TYPE == "time":
|
|
92
|
+
result = int(time.time() * 1000)
|
|
93
|
+
return result
|
|
94
|
+
|
|
95
|
+
async def delete_queryset(self, queryset: QuerySet):
|
|
96
|
+
|
|
97
|
+
await queryset.update(**{
|
|
98
|
+
settings.app_settings.WHETHER_DELETE_FIELD: self._delete_value()
|
|
99
|
+
})
|
|
100
|
+
|
|
86
101
|
@staticmethod
|
|
87
102
|
async def setattr_model(model: Model, prefetch_related_fields, *args, **kwargs) -> Model:
|
|
88
103
|
for key, value_list in prefetch_related_fields.items():
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
from typing import Optional, Type, Any, Union
|
|
2
|
+
|
|
3
|
+
from fastapi import Query, Depends
|
|
4
|
+
from fastapi.types import DecoratedCallable
|
|
5
|
+
from starlette.requests import Request
|
|
6
|
+
from starlette.responses import JSONResponse
|
|
7
|
+
from tortoise.transactions import atomic
|
|
8
|
+
|
|
9
|
+
from fastgenerateapi.api_view.base_view import BaseView
|
|
10
|
+
from fastgenerateapi.data_type.data_type import CALLABLE, DEPENDENCIES
|
|
11
|
+
from fastgenerateapi.deps import filter_params_deps
|
|
12
|
+
from fastgenerateapi.schemas_factory import response_factory
|
|
13
|
+
from fastgenerateapi.settings.register_settings import settings
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class DeleteFilterView(BaseView):
|
|
17
|
+
|
|
18
|
+
delete_filter_route: Union[bool, DEPENDENCIES] = True
|
|
19
|
+
"""
|
|
20
|
+
必须继承 GetAllView 才能使用
|
|
21
|
+
与 GetAllView 同步的筛选条件
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
@atomic()
|
|
25
|
+
async def destroy_filter(self, search: str, filters: dict, *args, **kwargs):
|
|
26
|
+
queryset = await self.get_queryset(search=search, filters=filters, *args, **kwargs)
|
|
27
|
+
|
|
28
|
+
await self.delete_queryset(queryset)
|
|
29
|
+
|
|
30
|
+
return
|
|
31
|
+
|
|
32
|
+
def _delete_filter_decorator(self, *args: Any, **kwargs: Any) -> DecoratedCallable:
|
|
33
|
+
async def route(
|
|
34
|
+
request: Request,
|
|
35
|
+
search: str = Query(default="", description="搜索"),
|
|
36
|
+
filters: dict = Depends(filter_params_deps(model_class=self.model_class, fields=self.filter_fields)),
|
|
37
|
+
) -> JSONResponse:
|
|
38
|
+
await self.destroy_filter(
|
|
39
|
+
search=search,
|
|
40
|
+
filters=filters,
|
|
41
|
+
request=request,
|
|
42
|
+
*args, **kwargs
|
|
43
|
+
)
|
|
44
|
+
return self.success(msg="删除成功")
|
|
45
|
+
return route
|
|
46
|
+
|
|
47
|
+
def _handler_destroy_filter_settings(self):
|
|
48
|
+
if self.delete_filter_route:
|
|
49
|
+
return
|
|
50
|
+
if not hasattr(self, "get_one_response_schema"):
|
|
51
|
+
self.get_one_response_schema = response_factory(None, name="GetOne")
|
|
52
|
+
doc = self.destroy_filter.__doc__
|
|
53
|
+
summary = doc.strip().split("\n")[0] if doc else "Delete Filter"
|
|
54
|
+
path = f"/{settings.app_settings.ROUTER_FILTER_DELETE_SUFFIX_FIELD}" if settings.app_settings.ROUTER_WHETHER_ADD_SUFFIX else ""
|
|
55
|
+
self._add_api_route(
|
|
56
|
+
path=path,
|
|
57
|
+
endpoint=self._delete_filter_decorator(),
|
|
58
|
+
methods=["DELETE"],
|
|
59
|
+
response_model=Optional[self.get_one_response_schema],
|
|
60
|
+
summary=summary,
|
|
61
|
+
dependencies=self.delete_filter_route,
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
|
{fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/api_view/delete_tree_view.py
RENAMED
|
@@ -38,17 +38,19 @@ class DeleteTreeView(BaseView):
|
|
|
38
38
|
|
|
39
39
|
request_data.id_list = delete_id_list
|
|
40
40
|
queryset = await self.get_del_tree_queryset(request_data=request_data, *args, **kwargs)
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
41
|
+
await self.delete_queryset(queryset)
|
|
42
|
+
|
|
43
|
+
# if unique_fields := self._get_unique_fields(self.model_class):
|
|
44
|
+
# for model in await queryset:
|
|
45
|
+
# model.is_active = False
|
|
46
|
+
# for field in unique_fields:
|
|
47
|
+
# try:
|
|
48
|
+
# setattr(model, field, getattr(model, field) + f"__{int(time.time() * 1000)}")
|
|
49
|
+
# except Exception as e:
|
|
50
|
+
# setattr(model, field, getattr(model, field) + f"__{int(time.time() * 1000)}")
|
|
51
|
+
# await model.save()
|
|
52
|
+
# else:
|
|
53
|
+
# await queryset.update(is_active=False)
|
|
52
54
|
return
|
|
53
55
|
|
|
54
56
|
async def get_del_tree_queryset(self, request_data, *args, **kwargs):
|
|
@@ -26,18 +26,19 @@ class DeleteView(BaseView):
|
|
|
26
26
|
@atomic()
|
|
27
27
|
async def destroy(self, request_data, *args, **kwargs):
|
|
28
28
|
queryset = await self.get_del_queryset(request_data=request_data, *args, **kwargs)
|
|
29
|
+
await self.delete_queryset(queryset)
|
|
29
30
|
|
|
30
|
-
if unique_fields := self._get_unique_fields(self.model_class):
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
else:
|
|
40
|
-
|
|
31
|
+
# if unique_fields := self._get_unique_fields(self.model_class):
|
|
32
|
+
# for model in await queryset:
|
|
33
|
+
# model.is_active = False
|
|
34
|
+
# for field in unique_fields:
|
|
35
|
+
# try:
|
|
36
|
+
# setattr(model, field, getattr(model, field) + f"__{int(time.time() * 1000)}")
|
|
37
|
+
# except Exception as e:
|
|
38
|
+
# setattr(model, field, getattr(model, field) + f"__{int(time.time() * 1000)}")
|
|
39
|
+
# await model.save()
|
|
40
|
+
# else:
|
|
41
|
+
# await queryset.update(is_active=False)
|
|
41
42
|
return
|
|
42
43
|
|
|
43
44
|
async def get_del_queryset(self, request_data, *args, **kwargs):
|
|
@@ -101,7 +101,8 @@ class GetTreeView(BaseView):
|
|
|
101
101
|
if node_id:
|
|
102
102
|
queryset = self.queryset.filter(pk=node_id).prefetch_related(settings.app_settings.DEFAULT_TREE_PARENT_FIELD)
|
|
103
103
|
queryset = await self.get_tree_queryset(queryset, search, filters)
|
|
104
|
-
|
|
104
|
+
top_node = await queryset.first()
|
|
105
|
+
if not top_node:
|
|
105
106
|
raise NOT_FOUND
|
|
106
107
|
top_nodes = [top_node]
|
|
107
108
|
else:
|
{fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/api_view/mixin/base_mixin.py
RENAMED
|
@@ -64,7 +64,7 @@ class BaseMixin(Generic[T], APIRouter, ABC):
|
|
|
64
64
|
"update_route", "update_relation_route", "delete_route", "delete_tree_route", "switch_route_fields",
|
|
65
65
|
"websocket_route"]
|
|
66
66
|
return ["get_one", "get_all", "get_tree", "create", "update", "update_relation", "destroy", "destroy_tree",
|
|
67
|
-
"switch"]
|
|
67
|
+
"destroy_filter", "switch"]
|
|
68
68
|
|
|
69
69
|
@classmethod
|
|
70
70
|
def _get_cls_api_func(cls):
|
{fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/api_view/mixin/dbmodel_mixin.py
RENAMED
|
@@ -19,10 +19,12 @@ class DBModelMixin:
|
|
|
19
19
|
|
|
20
20
|
if type(fields) == str:
|
|
21
21
|
try:
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
field_info = model_class._meta.fields_map.get(fields)
|
|
23
|
+
field_info_fk = model_class._meta.fields_map.get(fields.rstrip("_id"))
|
|
24
|
+
if field_info:
|
|
25
25
|
return field_info.description
|
|
26
|
+
elif fields.endswith("_id") and field_info_fk:
|
|
27
|
+
return field_info_fk.description
|
|
26
28
|
elif "__" in fields:
|
|
27
29
|
field_list = fields.split("__", maxsplit=1)
|
|
28
30
|
description = ""
|
{fastgenerateapi-0.0.23 → fastgenerateapi-0.0.26}/fastgenerateapi/controller/ws_controller.py
RENAMED
|
@@ -27,16 +27,18 @@ class WsController:
|
|
|
27
27
|
def __init__(self, router_class, func_name_list):
|
|
28
28
|
self.ws_router_data = []
|
|
29
29
|
for func_name in func_name_list:
|
|
30
|
-
route_info_list = func_name.
|
|
30
|
+
route_info_list = func_name.split("__")
|
|
31
|
+
if route_info_list[-1] in ["pk", "id"]:
|
|
32
|
+
route_info_list[-1] = "{" + route_info_list[-1] + "}"
|
|
33
|
+
route_name = "/".join(route_info_list)
|
|
34
|
+
route_info_list = route_name.split("_")
|
|
35
|
+
# method = route_info_list[0] # ws
|
|
31
36
|
middle_list = route_info_list[1:]
|
|
32
|
-
pk_field = ""
|
|
33
|
-
if route_info_list[-1] == "pk":
|
|
34
|
-
pk_field = "/{pk}"
|
|
35
|
-
middle_list = middle_list[:-1]
|
|
36
37
|
if settings.app_settings.ROUTER_WHETHER_UNDERLINE_TO_STRIKE:
|
|
37
38
|
path = "-".join(middle_list)
|
|
38
39
|
else:
|
|
39
40
|
path = "_".join(middle_list)
|
|
40
|
-
path += pk_field
|
|
41
41
|
|
|
42
42
|
self.ws_router_data.append(WsRouter(router_class, path, func_name))
|
|
43
|
+
|
|
44
|
+
|
|
@@ -4,15 +4,20 @@ from typing import Optional
|
|
|
4
4
|
from pydantic.fields import FieldInfo
|
|
5
5
|
from tortoise import Model, fields
|
|
6
6
|
|
|
7
|
+
from common.model.base_model import TortoiseOrmAbstractModel
|
|
8
|
+
from fastgenerateapi import my_fields
|
|
9
|
+
from fastgenerateapi.my_fields.enum_field import IntEnumClass
|
|
10
|
+
|
|
7
11
|
|
|
8
12
|
class StaffInfo(Model):
|
|
9
13
|
"""
|
|
10
14
|
员工信息
|
|
11
15
|
"""
|
|
12
|
-
|
|
16
|
+
delete_at: Optional[datetime.datetime] = my_fields.SoftDeleteField()
|
|
17
|
+
created_at: Optional[datetime.datetime] = fields.DatetimeField(null=True, auto_now_add=True, description="创建时间")
|
|
18
|
+
category: Optional[IntEnumClass] = my_fields.IntEnumField(enum_list=["总经理", '主管', '员工'], description="职位分类")
|
|
13
19
|
name: Optional[str] = fields.CharField(description="名字", max_length=255)
|
|
14
20
|
age: Optional[int] = fields.IntField(description="年龄", default=None, null=True)
|
|
15
|
-
created_at: Optional[datetime.datetime] = fields.DatetimeField(null=True, auto_now_add=True, description="创建时间")
|
|
16
21
|
company: fields.ForeignKeyNullableRelation["CompanyInfo"] = fields.ForeignKeyField(
|
|
17
22
|
'models.CompanyInfo', related_name="staff", on_delete=fields.SET_NULL, default=None, null=True)
|
|
18
23
|
|
|
@@ -20,23 +25,24 @@ class StaffInfo(Model):
|
|
|
20
25
|
def test(self):
|
|
21
26
|
return "test"
|
|
22
27
|
|
|
28
|
+
@property
|
|
29
|
+
def category_name(self):
|
|
30
|
+
return self.category.name
|
|
31
|
+
|
|
23
32
|
class PydanticMeta:
|
|
33
|
+
# 以下内容仅用于演示,存在重复和多余写法
|
|
24
34
|
exclude = ["created_at"]
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
]
|
|
30
|
-
# get_all_include = []
|
|
31
|
-
# create_include = []
|
|
32
|
-
# update_include = []
|
|
35
|
+
get_include = ["category_name", "name"]
|
|
36
|
+
get_all_include = ["company__name"]
|
|
37
|
+
get_one_include = [("test", Optional[str], FieldInfo(default="", description="测试字段")), ]
|
|
38
|
+
save_exclude = ["category_name", "test"]
|
|
33
39
|
|
|
34
40
|
|
|
35
41
|
class CompanyInfo(Model):
|
|
36
42
|
"""
|
|
37
43
|
公司信息
|
|
38
44
|
"""
|
|
39
|
-
|
|
45
|
+
delete_at: Optional[datetime.datetime] = my_fields.SoftDeleteField()
|
|
40
46
|
name: str = fields.CharField(description="岗位名称", max_length=255)
|
|
41
47
|
boss_name: str = fields.CharField(description="老板名字", max_length=255)
|
|
42
48
|
parent: fields.ForeignKeyNullableRelation["CompanyInfo"] = fields.ForeignKeyField(
|
|
@@ -48,3 +54,5 @@ class CompanyInfo(Model):
|
|
|
48
54
|
|
|
49
55
|
|
|
50
56
|
|
|
57
|
+
|
|
58
|
+
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from fastapi import APIRouter
|
|
2
|
+
from starlette.routing import WebSocketRoute
|
|
3
|
+
|
|
4
|
+
from fastgenerateapi.example.views import ChatView, ChatGroupView
|
|
5
|
+
from fastgenerateapi.example.views import StaffView, CompanyView
|
|
6
|
+
|
|
7
|
+
router = APIRouter()
|
|
8
|
+
|
|
9
|
+
router.include_router(StaffView())
|
|
10
|
+
router.include_router(CompanyView())
|
|
11
|
+
|
|
12
|
+
router.include_router(ChatView())
|
|
13
|
+
router.routes.append(WebSocketRoute("/group", ChatGroupView, name="群聊测试"))
|
|
14
|
+
|
|
15
|
+
|
|
@@ -6,7 +6,7 @@ from tortoise.contrib.pydantic import pydantic_model_creator
|
|
|
6
6
|
from fastgenerateapi.pydantic_utils.base_model import BaseModel
|
|
7
7
|
from fastgenerateapi.schemas_factory import get_all_schema_factory
|
|
8
8
|
from fastgenerateapi.schemas_factory.common_schema_factory import common_schema_factory
|
|
9
|
-
from
|
|
9
|
+
from fastgenerateapi.example.models import CompanyInfo, StaffInfo
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
# 方式一:解决了方式二存在的问题
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
from fastapi import Depends
|
|
2
|
+
from fastapi_cache.decorator import cache
|
|
2
3
|
from starlette.websockets import WebSocket
|
|
3
|
-
from tortoise import Tortoise
|
|
4
4
|
|
|
5
|
-
from fastgenerateapi import APIView, DeleteTreeView, GetTreeView,
|
|
5
|
+
from fastgenerateapi import APIView, DeleteTreeView, GetTreeView, WebsocketView, Consumer
|
|
6
6
|
from fastgenerateapi.deps import paginator_deps
|
|
7
|
-
from
|
|
8
|
-
from
|
|
7
|
+
# from middlewares.jwt_middleware.schemas import UserObject
|
|
8
|
+
from fastgenerateapi.example.models import StaffInfo, CompanyInfo
|
|
9
|
+
from fastgenerateapi.example.schemas import CompanyInfoRead, CompanyInfoCreate, ListTestSchema, StaffReadSchema
|
|
9
10
|
|
|
10
11
|
|
|
11
12
|
class CompanyView(APIView, DeleteTreeView, GetTreeView):
|
|
@@ -13,7 +14,8 @@ class CompanyView(APIView, DeleteTreeView, GetTreeView):
|
|
|
13
14
|
# schema = CompanyInfoRead
|
|
14
15
|
# create_schema = CompanyInfoCreate
|
|
15
16
|
|
|
16
|
-
|
|
17
|
+
@cache()
|
|
18
|
+
async def view_get_list(self, paginator=Depends(paginator_deps())) -> ListTestSchema:
|
|
17
19
|
|
|
18
20
|
return await self.pagination_data(queryset=self.queryset, fields=["id", "name"], paginator=paginator)
|
|
19
21
|
|
|
@@ -24,13 +26,22 @@ class StaffView(APIView):
|
|
|
24
26
|
self.model_class = StaffInfo
|
|
25
27
|
self.order_by_fields = ["-created_at"]
|
|
26
28
|
self.prefetch_related_fields = {"company": ["name"]}
|
|
27
|
-
self.router_args = {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}
|
|
29
|
+
# self.router_args = {
|
|
30
|
+
# # "view_get_staff_list": ListTestSchema
|
|
31
|
+
# "view_get_staff_list": TestSchema
|
|
32
|
+
# }
|
|
31
33
|
self.get_all_schema = StaffReadSchema
|
|
34
|
+
# self.dependencies = [Depends(ADG.authenticate_user_deps), ]
|
|
32
35
|
super().__init__()
|
|
33
36
|
|
|
37
|
+
# async def get_one(self, pk: str, *args, **kwargs) -> Union[BaseModel, dict, None]:
|
|
38
|
+
# print(datetime.datetime.now())
|
|
39
|
+
# data = await super().get_one(pk=pk, *args, **kwargs)
|
|
40
|
+
# result = create_staff.delay()
|
|
41
|
+
# print(result.id)
|
|
42
|
+
# print(datetime.datetime.now())
|
|
43
|
+
# return data
|
|
44
|
+
|
|
34
45
|
# async def view_get_staff_list(self, name: Optional[str] = None):
|
|
35
46
|
# conn = Tortoise.get_connection("default")
|
|
36
47
|
# # conn = Tortoise.get_connection("local")
|
|
@@ -39,8 +50,24 @@ class StaffView(APIView):
|
|
|
39
50
|
# print(val)
|
|
40
51
|
# return self.success(data={"data_list": val})
|
|
41
52
|
|
|
53
|
+
@cache()
|
|
54
|
+
async def view_get_staff_list(
|
|
55
|
+
self,
|
|
56
|
+
paginator=Depends(paginator_deps()),
|
|
57
|
+
# current_user: UserObject = Depends(ADG.authenticate_user_deps),
|
|
58
|
+
) -> ListTestSchema:
|
|
59
|
+
data = await self.pagination_data(queryset=self.queryset, fields=["id", "name"], paginator=paginator)
|
|
60
|
+
return self.success(data=data)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
# class StaffView(SQLGetAllView):
|
|
64
|
+
# table_name = "staffinfo"
|
|
65
|
+
|
|
42
66
|
|
|
43
67
|
class ChatView(WebsocketView):
|
|
68
|
+
"""
|
|
69
|
+
客户端与服务端场链接测试
|
|
70
|
+
"""
|
|
44
71
|
# redis_conn = default_redis
|
|
45
72
|
tags = ["ws测试"]
|
|
46
73
|
|
|
@@ -57,6 +84,15 @@ class ChatView(WebsocketView):
|
|
|
57
84
|
print(1)
|
|
58
85
|
|
|
59
86
|
|
|
60
|
-
class Consumer
|
|
87
|
+
class ChatGroupView(Consumer):
|
|
88
|
+
"""
|
|
89
|
+
群聊测试
|
|
90
|
+
"""
|
|
61
91
|
# redis_conn = default_redis
|
|
62
92
|
...
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
|