fastgenerateapi 0.0.23__tar.gz → 0.0.25__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/PKG-INFO +1 -1
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/__version__.py +1 -1
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/api_view/base_view.py +29 -14
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/api_view/delete_tree_view.py +13 -11
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/api_view/delete_view.py +12 -11
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/api_view/get_tree_view.py +2 -1
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/api_view/mixin/dbmodel_mixin.py +5 -3
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/example/models.py +19 -11
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/example/views.py +38 -26
- fastgenerateapi-0.0.25/fastgenerateapi/my_fields/__init__.py +4 -0
- fastgenerateapi-0.0.25/fastgenerateapi/my_fields/aes_field.py +166 -0
- fastgenerateapi-0.0.25/fastgenerateapi/my_fields/enum_field.py +215 -0
- fastgenerateapi-0.0.25/fastgenerateapi/my_fields/pk_field.py +68 -0
- fastgenerateapi-0.0.25/fastgenerateapi/my_fields/pwd_field.py +81 -0
- fastgenerateapi-0.0.25/fastgenerateapi/my_fields/soft_delete_field.py +54 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/schemas_factory/common_function.py +2 -1
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/schemas_factory/common_schema_factory.py +1 -1
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/schemas_factory/create_schema_factory.py +9 -3
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/schemas_factory/get_all_schema_factory.py +7 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/schemas_factory/get_one_schema_factory.py +8 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/schemas_factory/get_tree_schema_factory.py +8 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/schemas_factory/update_schema_factory.py +9 -3
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/settings/settings.py +12 -7
- fastgenerateapi-0.0.25/fastgenerateapi/utils/aes.py +93 -0
- fastgenerateapi-0.0.25/fastgenerateapi/utils/snowflake.py +148 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi.egg-info/PKG-INFO +1 -1
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi.egg-info/SOURCES.txt +9 -1
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/LICENSE +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/README.md +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/__init__.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/api_view/__init__.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/api_view/api_view.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/api_view/create_view.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/api_view/get_all_view.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/api_view/get_one_view.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/api_view/get_relation_view.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/api_view/mixin/__init__.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/api_view/mixin/base_mixin.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/api_view/mixin/get_mixin.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/api_view/mixin/response_mixin.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/api_view/mixin/save_mixin.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/api_view/mixin/tool_mixin.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/api_view/sql_get_view.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/api_view/switch_view.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/api_view/update_relation_view.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/api_view/update_view.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/cache/__init__.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/cache/cache_decorator.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/cache/key_builder.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/channel/__init__.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/channel/consumer.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/channel/websocket_view.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/controller/__init__.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/controller/filter_controller.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/controller/router_controller.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/controller/rpc_controller.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/controller/search_controller.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/controller/ws_controller.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/data_type/__init__.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/data_type/data_type.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/data_type/mysql_data_type.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/deps/__init__.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/deps/filter_params_deps.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/deps/paginator_deps.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/deps/tree_params_deps.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/example/__init__.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/example/routers.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/example/schemas.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/pydantic_utils/__init__.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/pydantic_utils/base_model.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/pydantic_utils/json_encoders.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/schemas_factory/__init__.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/schemas_factory/filter_schema_factory.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/schemas_factory/get_relation_schema_factory.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/schemas_factory/response_factory.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/schemas_factory/sql_get_all_schema_factory.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/settings/__init__.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/settings/register_settings.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/utils/__init__.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/utils/exception.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi/utils/parse_str.py +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi.egg-info/dependency_links.txt +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/fastgenerateapi.egg-info/top_level.txt +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/setup.cfg +0 -0
- {fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/setup.py +0 -0
|
@@ -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():
|
{fastgenerateapi-0.0.23 → fastgenerateapi-0.0.25}/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.25}/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 = ""
|
|
@@ -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
|
+
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
from fastapi import Depends
|
|
2
|
-
from
|
|
3
|
-
from tortoise import Tortoise
|
|
2
|
+
from fastapi_cache.decorator import cache
|
|
4
3
|
|
|
5
|
-
from fastgenerateapi import APIView, DeleteTreeView, GetTreeView
|
|
4
|
+
from fastgenerateapi import APIView, DeleteTreeView, GetTreeView
|
|
6
5
|
from fastgenerateapi.deps import paginator_deps
|
|
6
|
+
from middlewares.jwt_middleware.schemas import UserObject
|
|
7
7
|
from modules.example.models import StaffInfo, CompanyInfo
|
|
8
|
-
from modules.example.schemas import CompanyInfoRead, CompanyInfoCreate,
|
|
8
|
+
from modules.example.schemas import CompanyInfoRead, CompanyInfoCreate, ListTestSchema, StaffReadSchema
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
class CompanyView(APIView, DeleteTreeView, GetTreeView):
|
|
@@ -13,7 +13,8 @@ class CompanyView(APIView, DeleteTreeView, GetTreeView):
|
|
|
13
13
|
# schema = CompanyInfoRead
|
|
14
14
|
# create_schema = CompanyInfoCreate
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
@cache()
|
|
17
|
+
async def view_get_list(self, paginator=Depends(paginator_deps())) -> ListTestSchema:
|
|
17
18
|
|
|
18
19
|
return await self.pagination_data(queryset=self.queryset, fields=["id", "name"], paginator=paginator)
|
|
19
20
|
|
|
@@ -24,13 +25,22 @@ class StaffView(APIView):
|
|
|
24
25
|
self.model_class = StaffInfo
|
|
25
26
|
self.order_by_fields = ["-created_at"]
|
|
26
27
|
self.prefetch_related_fields = {"company": ["name"]}
|
|
27
|
-
self.router_args = {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}
|
|
28
|
+
# self.router_args = {
|
|
29
|
+
# # "view_get_staff_list": ListTestSchema
|
|
30
|
+
# "view_get_staff_list": TestSchema
|
|
31
|
+
# }
|
|
31
32
|
self.get_all_schema = StaffReadSchema
|
|
33
|
+
# self.dependencies = [Depends(ADG.authenticate_user_deps), ]
|
|
32
34
|
super().__init__()
|
|
33
35
|
|
|
36
|
+
# async def get_one(self, pk: str, *args, **kwargs) -> Union[BaseModel, dict, None]:
|
|
37
|
+
# print(datetime.datetime.now())
|
|
38
|
+
# data = await super().get_one(pk=pk, *args, **kwargs)
|
|
39
|
+
# result = create_staff.delay()
|
|
40
|
+
# print(result.id)
|
|
41
|
+
# print(datetime.datetime.now())
|
|
42
|
+
# return data
|
|
43
|
+
|
|
34
44
|
# async def view_get_staff_list(self, name: Optional[str] = None):
|
|
35
45
|
# conn = Tortoise.get_connection("default")
|
|
36
46
|
# # conn = Tortoise.get_connection("local")
|
|
@@ -39,24 +49,26 @@ class StaffView(APIView):
|
|
|
39
49
|
# print(val)
|
|
40
50
|
# return self.success(data={"data_list": val})
|
|
41
51
|
|
|
52
|
+
@cache()
|
|
53
|
+
async def view_get_staff_list(
|
|
54
|
+
self,
|
|
55
|
+
paginator=Depends(paginator_deps()),
|
|
56
|
+
# current_user: UserObject = Depends(ADG.authenticate_user_deps),
|
|
57
|
+
) -> ListTestSchema:
|
|
58
|
+
data = await self.pagination_data(queryset=self.queryset, fields=["id", "name"], paginator=paginator)
|
|
59
|
+
return self.success(data=data)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
# class StaffView(SQLGetAllView):
|
|
63
|
+
# table_name = "staffinfo"
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
|
|
42
71
|
|
|
43
|
-
class ChatView(WebsocketView):
|
|
44
|
-
# redis_conn = default_redis
|
|
45
|
-
tags = ["ws测试"]
|
|
46
72
|
|
|
47
|
-
async def ws_wschat_pk(self, websocket: WebSocket, pk: str):
|
|
48
|
-
"""
|
|
49
|
-
测试
|
|
50
|
-
"""
|
|
51
|
-
await websocket.accept()
|
|
52
|
-
while True:
|
|
53
|
-
try:
|
|
54
|
-
data = await websocket.receive_json()
|
|
55
|
-
await websocket.send_text(f"接受到的消息是: {data}")
|
|
56
|
-
except Exception:
|
|
57
|
-
print(1)
|
|
58
73
|
|
|
59
74
|
|
|
60
|
-
class Consumer(AsyncWebsocketConsumer):
|
|
61
|
-
# redis_conn = default_redis
|
|
62
|
-
...
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
from typing import (
|
|
2
|
+
TYPE_CHECKING,
|
|
3
|
+
Any,
|
|
4
|
+
Callable,
|
|
5
|
+
Dict,
|
|
6
|
+
Generic,
|
|
7
|
+
List,
|
|
8
|
+
Optional,
|
|
9
|
+
Tuple,
|
|
10
|
+
Type,
|
|
11
|
+
TypeVar,
|
|
12
|
+
Union,
|
|
13
|
+
overload,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
from passlib.handlers.pbkdf2 import pbkdf2_sha256
|
|
17
|
+
from tortoise.fields import CharField
|
|
18
|
+
|
|
19
|
+
from fastgenerateapi.utils.aes import AESCipher
|
|
20
|
+
|
|
21
|
+
if TYPE_CHECKING: # pragma: nocoverage
|
|
22
|
+
from tortoise.models import Model
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class AESField(CharField):
|
|
26
|
+
"""
|
|
27
|
+
Character field.
|
|
28
|
+
|
|
29
|
+
You need provide the following:
|
|
30
|
+
|
|
31
|
+
``salt`` (str): must
|
|
32
|
+
CBC加密需要一个十六位的key(密钥)和一个十六位iv(偏移量)
|
|
33
|
+
``is_decrypt`` (str): default True 明文
|
|
34
|
+
返回结果是否明文
|
|
35
|
+
``prefix`` (str): default $aes_
|
|
36
|
+
判断是否加密
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
def __init__(self, salt: str, is_decrypt: bool = True, prefix="$aes_", **kwargs: Any) -> None:
|
|
40
|
+
kwargs.setdefault("max_length", 255)
|
|
41
|
+
kwargs.setdefault("description", "加密字段")
|
|
42
|
+
self.salt = salt
|
|
43
|
+
self.prefix = prefix
|
|
44
|
+
self.is_decrypt = is_decrypt
|
|
45
|
+
super().__init__(**kwargs)
|
|
46
|
+
|
|
47
|
+
def to_db_value(self, value: Any, instance: "Union[Type[Model], Model]") -> Any:
|
|
48
|
+
"""
|
|
49
|
+
Converts from the Python type to the DB type.
|
|
50
|
+
"""
|
|
51
|
+
if value is not None:
|
|
52
|
+
if not isinstance(value, self.field_type):
|
|
53
|
+
value = self.field_type(value) # pylint: disable=E1102
|
|
54
|
+
if not value.startswith(self.prefix):
|
|
55
|
+
value = self.prefix + AESCipher(self.salt).encrypt(value).decode("utf-8")
|
|
56
|
+
|
|
57
|
+
self.validate(value)
|
|
58
|
+
return value
|
|
59
|
+
|
|
60
|
+
def to_python_value(self, value: Any) -> Any:
|
|
61
|
+
"""
|
|
62
|
+
Converts from the DB type to the Python type.
|
|
63
|
+
"""
|
|
64
|
+
if value is not None:
|
|
65
|
+
if not isinstance(value, self.field_type):
|
|
66
|
+
value = self.field_type(value) # pylint: disable=E1102
|
|
67
|
+
if value.startswith(self.prefix):
|
|
68
|
+
value = AESString(value[len(self.prefix):], self.salt, self.is_decrypt)
|
|
69
|
+
|
|
70
|
+
self.validate(value)
|
|
71
|
+
return value
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class AESString(object):
|
|
75
|
+
def __init__(self, value: str, salt: str, is_decrypt: bool = True):
|
|
76
|
+
self.value = value
|
|
77
|
+
self.salt = salt
|
|
78
|
+
self.is_decrypt = is_decrypt
|
|
79
|
+
|
|
80
|
+
def __str__(self):
|
|
81
|
+
if self.is_decrypt:
|
|
82
|
+
return self.decrypt_value
|
|
83
|
+
return self.value
|
|
84
|
+
|
|
85
|
+
@property
|
|
86
|
+
def decrypt_value(self):
|
|
87
|
+
return AESCipher(self.salt).decrypt(self.value).decode("utf-8")
|
|
88
|
+
|
|
89
|
+
def __len__(self):
|
|
90
|
+
return len(str(self))
|
|
91
|
+
|
|
92
|
+
def __getitem__(self, index):
|
|
93
|
+
return str(self)[index]
|
|
94
|
+
|
|
95
|
+
def __add__(self, other: Union["AESString", str]):
|
|
96
|
+
if isinstance(other, AESString):
|
|
97
|
+
other = str(other)
|
|
98
|
+
return str(self) + other
|
|
99
|
+
|
|
100
|
+
def __contains__(self, substring):
|
|
101
|
+
return substring in str(self)
|
|
102
|
+
|
|
103
|
+
def find(self, substring, start=0, end=None):
|
|
104
|
+
return str(self).find(substring, start, end)
|
|
105
|
+
|
|
106
|
+
def index(self, substring, start=0, end=None):
|
|
107
|
+
return str(self).index(substring, start, end)
|
|
108
|
+
|
|
109
|
+
def split(self, sep=None, maxsplit=-1):
|
|
110
|
+
return str(self).split(sep, maxsplit)
|
|
111
|
+
|
|
112
|
+
def replace(self, old, new, count=-1):
|
|
113
|
+
return str(self).replace(old, new, count)
|
|
114
|
+
|
|
115
|
+
def startswith(self, prefix, start=0, end=None):
|
|
116
|
+
return str(self).startswith(prefix, start, end)
|
|
117
|
+
|
|
118
|
+
def endswith(self, suffix, start=0, end=None):
|
|
119
|
+
return str(self).endswith(suffix, start, end)
|
|
120
|
+
|
|
121
|
+
def __mul__(self, n):
|
|
122
|
+
return str(self) * n
|
|
123
|
+
|
|
124
|
+
def __rmul__(self, n):
|
|
125
|
+
return self.__mul__(n)
|
|
126
|
+
|
|
127
|
+
def capitalize(self):
|
|
128
|
+
return str(self).capitalize()
|
|
129
|
+
|
|
130
|
+
def title(self):
|
|
131
|
+
return str(self).title()
|
|
132
|
+
|
|
133
|
+
def upper(self):
|
|
134
|
+
return str(self).upper()
|
|
135
|
+
|
|
136
|
+
def lower(self):
|
|
137
|
+
return str(self).lower()
|
|
138
|
+
|
|
139
|
+
def swapcase(self):
|
|
140
|
+
return str(self).swapcase()
|
|
141
|
+
|
|
142
|
+
def strip(self, chars=None):
|
|
143
|
+
return str(self).strip(chars)
|
|
144
|
+
|
|
145
|
+
def lstrip(self, chars=None):
|
|
146
|
+
return str(self).lstrip(chars)
|
|
147
|
+
|
|
148
|
+
def rstrip(self, chars=None):
|
|
149
|
+
return str(self).rstrip(chars)
|
|
150
|
+
|
|
151
|
+
def count(self, sub, start=0, end=None):
|
|
152
|
+
return str(self).count(sub, start, end)
|
|
153
|
+
|
|
154
|
+
def join(self, iterable):
|
|
155
|
+
return str(self).join(iterable)
|
|
156
|
+
|
|
157
|
+
def encode(self, encoding='utf-8', errors='strict'):
|
|
158
|
+
return str(self).encode(encoding, errors)
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
|