fastgenerateapi 0.0.23__py2.py3-none-any.whl → 0.0.26__py2.py3-none-any.whl
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/__init__.py +1 -0
- fastgenerateapi/__version__.py +1 -1
- fastgenerateapi/api_view/base_view.py +29 -14
- fastgenerateapi/api_view/delete_filter_view.py +67 -0
- fastgenerateapi/api_view/delete_tree_view.py +13 -11
- fastgenerateapi/api_view/delete_view.py +12 -11
- fastgenerateapi/api_view/get_tree_view.py +2 -1
- fastgenerateapi/api_view/mixin/base_mixin.py +1 -1
- fastgenerateapi/api_view/mixin/dbmodel_mixin.py +5 -3
- fastgenerateapi/channel/consumer.py +5 -0
- fastgenerateapi/channel/websocket_view.py +3 -0
- fastgenerateapi/controller/ws_controller.py +8 -6
- fastgenerateapi/example/models.py +19 -11
- fastgenerateapi/example/routers.py +3 -3
- fastgenerateapi/example/schemas.py +1 -1
- fastgenerateapi/example/views.py +46 -10
- fastgenerateapi/my_fields/__init__.py +4 -0
- fastgenerateapi/my_fields/aes_field.py +166 -0
- fastgenerateapi/my_fields/enum_field.py +215 -0
- fastgenerateapi/my_fields/pk_field.py +68 -0
- fastgenerateapi/my_fields/pwd_field.py +81 -0
- fastgenerateapi/my_fields/soft_delete_field.py +54 -0
- fastgenerateapi/pydantic_utils/base_model.py +3 -1
- fastgenerateapi/schemas_factory/common_function.py +2 -1
- fastgenerateapi/schemas_factory/common_schema_factory.py +1 -1
- fastgenerateapi/schemas_factory/create_schema_factory.py +9 -3
- fastgenerateapi/schemas_factory/get_all_schema_factory.py +7 -0
- fastgenerateapi/schemas_factory/get_one_schema_factory.py +8 -0
- fastgenerateapi/schemas_factory/get_tree_schema_factory.py +8 -0
- fastgenerateapi/schemas_factory/update_schema_factory.py +9 -3
- fastgenerateapi/settings/settings.py +13 -7
- fastgenerateapi/utils/aes.py +93 -0
- fastgenerateapi/utils/snowflake.py +148 -0
- {fastgenerateapi-0.0.23.dist-info → fastgenerateapi-0.0.26.dist-info}/METADATA +1 -1
- {fastgenerateapi-0.0.23.dist-info → fastgenerateapi-0.0.26.dist-info}/RECORD +38 -29
- {fastgenerateapi-0.0.23.dist-info → fastgenerateapi-0.0.26.dist-info}/WHEEL +1 -1
- {fastgenerateapi-0.0.23.dist-info → fastgenerateapi-0.0.26.dist-info}/LICENSE +0 -0
- {fastgenerateapi-0.0.23.dist-info → fastgenerateapi-0.0.26.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
from typing import Union
|
|
2
|
+
|
|
3
|
+
from Crypto import Random
|
|
4
|
+
from Crypto.Cipher import AES
|
|
5
|
+
import base64
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class AESCipher(object):
|
|
9
|
+
"""
|
|
10
|
+
可用于二进制(文件)和字符串加密
|
|
11
|
+
"""
|
|
12
|
+
def __init__(self, salt):
|
|
13
|
+
'''
|
|
14
|
+
CBC加密需要一个十六位的key(密钥)和一个十六位iv(偏移量)
|
|
15
|
+
'''
|
|
16
|
+
self.salt = self.check_key(salt)
|
|
17
|
+
# 这里使用随机偏移量
|
|
18
|
+
# self.iv = self.check_key(iv) if iv else self.salt
|
|
19
|
+
# 数据块的大小 16位
|
|
20
|
+
self.BS = AES.block_size
|
|
21
|
+
# CBC模式 相对安全 因为有偏移向量 iv 也是16位字节的
|
|
22
|
+
self.mode = AES.MODE_CBC
|
|
23
|
+
# 填充函数 因为AES加密是一段一段加密的 每段都是BS位字节,不够的话是需要自己填充的
|
|
24
|
+
self.pad = lambda s: s + (self.BS - len(s) % self.BS) * chr(self.BS - len(s) % self.BS).encode('utf-8')
|
|
25
|
+
# 将填充的数据剔除
|
|
26
|
+
self.unpad = lambda s: s[:-ord(s[len(s) - 1:])]
|
|
27
|
+
|
|
28
|
+
def encrypt(self, text: Union[bytes, str]) -> bytes:
|
|
29
|
+
text = self.check_data(text)
|
|
30
|
+
text = self.pad(text)
|
|
31
|
+
# 随机获取iv
|
|
32
|
+
iv = Random.new().read(AES.block_size)
|
|
33
|
+
# 初始化自定义
|
|
34
|
+
cipher = AES.new(self.salt, self.mode, iv)
|
|
35
|
+
# 此处是将密文和iv一起 base64 解密的时候就可以根据这个iv来解密
|
|
36
|
+
return base64.b64encode(iv + cipher.encrypt(text))
|
|
37
|
+
# return base64.b64encode(iv + cipher.encrypt(text)).decode("utf-8")
|
|
38
|
+
|
|
39
|
+
def decrypt(self, text: Union[bytes, str, int]) -> bytes:
|
|
40
|
+
text = self.check_data(text)
|
|
41
|
+
# 先将密文进行base64解码
|
|
42
|
+
text = base64.b64decode(text)
|
|
43
|
+
# 取出iv值
|
|
44
|
+
iv = text[:self.BS]
|
|
45
|
+
# 初始化自定义
|
|
46
|
+
cipher = AES.new(self.salt, self.mode, iv)
|
|
47
|
+
return self.unpad(cipher.decrypt(text[self.BS:]))
|
|
48
|
+
# return self.unpad(cipher.decrypt(text[self.BS:])).decode("utf-8")
|
|
49
|
+
|
|
50
|
+
def check_key(self, key: Union[bytes, str]) -> bytes:
|
|
51
|
+
'''
|
|
52
|
+
检测key的长度是否为16,24或者32bytes的长度
|
|
53
|
+
'''
|
|
54
|
+
if isinstance(key, bytes):
|
|
55
|
+
assert len(key) in [16, 24, 32]
|
|
56
|
+
return key
|
|
57
|
+
elif isinstance(key, str):
|
|
58
|
+
assert len(key.encode("utf-8")) in [16, 24, 32]
|
|
59
|
+
return key.encode("utf-8")
|
|
60
|
+
else:
|
|
61
|
+
raise Exception(f'密钥必须为str或bytes,不能为{type(key)}')
|
|
62
|
+
|
|
63
|
+
def check_data(self, data: Union[bytes, str, int]) -> bytes:
|
|
64
|
+
'''
|
|
65
|
+
检测加密的数据类型
|
|
66
|
+
'''
|
|
67
|
+
if isinstance(data, int):
|
|
68
|
+
data = str(data).encode('utf-8')
|
|
69
|
+
elif isinstance(data, str):
|
|
70
|
+
data = data.encode('utf-8')
|
|
71
|
+
elif isinstance(data, bytes):
|
|
72
|
+
pass
|
|
73
|
+
else:
|
|
74
|
+
raise Exception(f'加密的数据必须为str或bytes,不能为{type(data)}')
|
|
75
|
+
return data
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
# if __name__ == '__main__':
|
|
79
|
+
# # 加密字符串
|
|
80
|
+
# import json
|
|
81
|
+
# # aes_encrypt = AESCipher('ningbozhihuirend') # 自己设定的密钥
|
|
82
|
+
# aes_encrypt = AESCipher('ningbozhihuirend') # 自己设定的密钥
|
|
83
|
+
# data = json.dumps({"mobile": "1312345646", "content": "xczczczc"})
|
|
84
|
+
# print(type(data))
|
|
85
|
+
# print(data)
|
|
86
|
+
# e = aes_encrypt.encrypt(data).decode("utf-8") # 加密内容
|
|
87
|
+
# print(type(e))
|
|
88
|
+
# print(e)
|
|
89
|
+
# d = aes_encrypt.decrypt(e).decode("utf-8")
|
|
90
|
+
# print(type(d))
|
|
91
|
+
# print(json.loads(d))
|
|
92
|
+
# print(len(e))
|
|
93
|
+
# print("加密后%s,解密后%s" % (e, d))
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import time
|
|
2
|
+
from typing import Any
|
|
3
|
+
|
|
4
|
+
from fastapi.exceptions import RequestValidationError
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
# 64位ID的划分
|
|
8
|
+
from fastgenerateapi.settings.register_settings import settings
|
|
9
|
+
|
|
10
|
+
WORKER_ID_BITS = 5 # 机器位
|
|
11
|
+
DATACENTER_ID_BITS = 5 # 数据位
|
|
12
|
+
SEQUENCE_BITS = 12 # 循环位
|
|
13
|
+
|
|
14
|
+
# 最大取值计算
|
|
15
|
+
MAX_WORKER_ID = -1 ^ (-1 << WORKER_ID_BITS)
|
|
16
|
+
MAX_DATACENTER_ID = -1 ^ (-1 << DATACENTER_ID_BITS)
|
|
17
|
+
|
|
18
|
+
# 移位偏移计算
|
|
19
|
+
WOKER_ID_SHIFT = SEQUENCE_BITS
|
|
20
|
+
DATACENTER_ID_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS
|
|
21
|
+
TIMESTAMP_LEFT_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS + DATACENTER_ID_BITS
|
|
22
|
+
|
|
23
|
+
# 序号循环掩码
|
|
24
|
+
SEQUENCE_MASK = -1 ^ (-1 << SEQUENCE_BITS)
|
|
25
|
+
|
|
26
|
+
# Twitter元年时间戳
|
|
27
|
+
# TWEPOCH = 1288834974657
|
|
28
|
+
# 2022年10月24号00:00
|
|
29
|
+
TWEPOCH = 1666540800000
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class InvalidSystemClock(Exception):
|
|
33
|
+
def __init__(
|
|
34
|
+
self,
|
|
35
|
+
status_code: int = 400,
|
|
36
|
+
message: str = "请求失败",
|
|
37
|
+
detail: Any = None,
|
|
38
|
+
) -> None:
|
|
39
|
+
self.status_code = status_code
|
|
40
|
+
self.message = message
|
|
41
|
+
self.detail = detail
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class IdWorker(object):
|
|
45
|
+
"""
|
|
46
|
+
用于生成IDs
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
def __init__(self, datacenter_id=1, worker_id=1, sequence=0):
|
|
50
|
+
"""
|
|
51
|
+
初始化
|
|
52
|
+
:param datacenter_id: 数据中心(机器区域)ID
|
|
53
|
+
:param worker_id: 机器ID
|
|
54
|
+
:param sequence: 其实序号
|
|
55
|
+
"""
|
|
56
|
+
# sanity check
|
|
57
|
+
if worker_id > MAX_WORKER_ID or worker_id < 0:
|
|
58
|
+
raise ValueError('worker_id值越界')
|
|
59
|
+
|
|
60
|
+
if datacenter_id > MAX_DATACENTER_ID or datacenter_id < 0:
|
|
61
|
+
raise ValueError('datacenter_id值越界')
|
|
62
|
+
|
|
63
|
+
self.worker_id = worker_id
|
|
64
|
+
self.datacenter_id = datacenter_id
|
|
65
|
+
self.sequence = sequence
|
|
66
|
+
|
|
67
|
+
self.last_timestamp = -1 # 上次计算的时间戳
|
|
68
|
+
|
|
69
|
+
def _gen_timestamp(self):
|
|
70
|
+
"""
|
|
71
|
+
生成整数时间戳
|
|
72
|
+
:return:int timestamp
|
|
73
|
+
"""
|
|
74
|
+
return int(time.time() * 1000)
|
|
75
|
+
|
|
76
|
+
def get_post_id(self):
|
|
77
|
+
"""
|
|
78
|
+
获取新ID
|
|
79
|
+
:return:
|
|
80
|
+
"""
|
|
81
|
+
timestamp = self._gen_timestamp()
|
|
82
|
+
|
|
83
|
+
# 时钟回拨
|
|
84
|
+
if timestamp < self.last_timestamp:
|
|
85
|
+
raise RequestValidationError
|
|
86
|
+
|
|
87
|
+
if timestamp == self.last_timestamp:
|
|
88
|
+
self.sequence = (self.sequence + 1) & SEQUENCE_MASK
|
|
89
|
+
if self.sequence == 0:
|
|
90
|
+
timestamp = self._til_next_millis(self.last_timestamp)
|
|
91
|
+
else:
|
|
92
|
+
self.sequence = 0
|
|
93
|
+
|
|
94
|
+
self.last_timestamp = timestamp
|
|
95
|
+
|
|
96
|
+
# new_id = ((timestamp - TWEPOCH) << TIMESTAMP_LEFT_SHIFT) | (self.datacenter_id << DATACENTER_ID_SHIFT) | \
|
|
97
|
+
# (self.worker_id << WOKER_ID_SHIFT) | self.sequence
|
|
98
|
+
new_id = ((timestamp - TWEPOCH) << TIMESTAMP_LEFT_SHIFT) | self.sequence
|
|
99
|
+
return 'PT' + str(new_id)
|
|
100
|
+
|
|
101
|
+
def get_id(self):
|
|
102
|
+
"""
|
|
103
|
+
获取新ID
|
|
104
|
+
:return:
|
|
105
|
+
"""
|
|
106
|
+
timestamp = self._gen_timestamp()
|
|
107
|
+
|
|
108
|
+
# 时钟回拨
|
|
109
|
+
if timestamp < self.last_timestamp:
|
|
110
|
+
# logging.error('clock is moving backwards. Rejecting requests until {}'.format(self.last_timestamp))
|
|
111
|
+
raise InvalidSystemClock(
|
|
112
|
+
status_code=500,
|
|
113
|
+
message='时钟回拨异常',
|
|
114
|
+
detail='clock is moving backwards. Rejecting requests until {}'.format(self.last_timestamp))
|
|
115
|
+
|
|
116
|
+
if timestamp == self.last_timestamp:
|
|
117
|
+
self.sequence = (self.sequence + 1) & SEQUENCE_MASK
|
|
118
|
+
if self.sequence == 0:
|
|
119
|
+
timestamp = self._til_next_millis(self.last_timestamp)
|
|
120
|
+
else:
|
|
121
|
+
self.sequence = 0
|
|
122
|
+
|
|
123
|
+
self.last_timestamp = timestamp
|
|
124
|
+
|
|
125
|
+
new_id = ((timestamp - TWEPOCH) << TIMESTAMP_LEFT_SHIFT) | (self.datacenter_id << DATACENTER_ID_SHIFT) | \
|
|
126
|
+
(self.worker_id << WOKER_ID_SHIFT) | self.sequence
|
|
127
|
+
return new_id
|
|
128
|
+
|
|
129
|
+
def _til_next_millis(self, last_timestamp):
|
|
130
|
+
"""
|
|
131
|
+
等到下一毫秒
|
|
132
|
+
"""
|
|
133
|
+
timestamp = self._gen_timestamp()
|
|
134
|
+
while timestamp <= last_timestamp:
|
|
135
|
+
timestamp = self._gen_timestamp()
|
|
136
|
+
return timestamp
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
worker = IdWorker(datacenter_id=settings.app_settings.DATACENTER_ID, worker_id=settings.app_settings.WORKER_ID)
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
# if __name__ == '__main__':
|
|
143
|
+
# # worker = IdWorker()
|
|
144
|
+
# pk = worker.get_id()
|
|
145
|
+
# print(pk)
|
|
146
|
+
# print(len(str(pk)), len("9223372036854775807"))
|
|
147
|
+
# print(bin(pk))
|
|
148
|
+
# print(len(bin(pk)))
|
|
@@ -1,22 +1,23 @@
|
|
|
1
|
-
fastgenerateapi/__init__.py,sha256=
|
|
2
|
-
fastgenerateapi/__version__.py,sha256=
|
|
1
|
+
fastgenerateapi/__init__.py,sha256=70KtJJxhQcntZJTt2ilIR2pvokI4X6Xp200nHGZ5dkU,1264
|
|
2
|
+
fastgenerateapi/__version__.py,sha256=8Y5ui80id1BS57BcGr_KGOGJN0kvqVqW_BRkGxzU_es,497
|
|
3
3
|
fastgenerateapi/api_view/__init__.py,sha256=zkaTX5JxsNfjF-dFeEbHfUB58vhPMjm6Iiqx9HgJOrY,14
|
|
4
4
|
fastgenerateapi/api_view/api_view.py,sha256=mfD8GB-hnyI2XO3tkSOlEa2FfBLdq0_Wqvp8gFrXFKU,1160
|
|
5
|
-
fastgenerateapi/api_view/base_view.py,sha256=
|
|
5
|
+
fastgenerateapi/api_view/base_view.py,sha256=EvEVPJIkJNQct-s_DtN1YdRA3r97RDRYmLsPGbZOPzU,9245
|
|
6
6
|
fastgenerateapi/api_view/create_view.py,sha256=q8vlTvJfjmhqLKA4WAiIzpSSgKEvo96Ftkaa2cGwUSo,4409
|
|
7
|
-
fastgenerateapi/api_view/
|
|
8
|
-
fastgenerateapi/api_view/
|
|
7
|
+
fastgenerateapi/api_view/delete_filter_view.py,sha256=QSrFEjYmhCkSJIZw6XYl7elJr4PycxqkhMmT1D8JjJk,2479
|
|
8
|
+
fastgenerateapi/api_view/delete_tree_view.py,sha256=11kdktfLuUAnI381_uVoBw_PwCTquigQjADG7JPJEuo,3695
|
|
9
|
+
fastgenerateapi/api_view/delete_view.py,sha256=BuZ4hZ1wSGHBlWTS4wKFA1w5IfEaFDdgzUFvHKv3WBo,3104
|
|
9
10
|
fastgenerateapi/api_view/get_all_view.py,sha256=bokoPbB1yPZqxVuH8gQSz_2CrMyS3aQBNCMFgZTAccw,8313
|
|
10
11
|
fastgenerateapi/api_view/get_one_view.py,sha256=BhhQMdcD85W2FgGiJBCdQfI1TYldVAGREK1ZQFPXjnc,3359
|
|
11
12
|
fastgenerateapi/api_view/get_relation_view.py,sha256=h8D6N71L51Ifu2SkM3DcmYIICQTprrNmdW1Wbl_qeoM,9583
|
|
12
|
-
fastgenerateapi/api_view/get_tree_view.py,sha256=
|
|
13
|
+
fastgenerateapi/api_view/get_tree_view.py,sha256=VRg9xqBcxXfrHrDeOUshsbEuOX8UExvB-WMWaa9-Ad8,9129
|
|
13
14
|
fastgenerateapi/api_view/sql_get_view.py,sha256=wxYI0JuH8Gw99LfMMwA4rQ_a_tBrKYxYhA7MNGQOx3A,6691
|
|
14
15
|
fastgenerateapi/api_view/switch_view.py,sha256=TSkvNDzYXZJbdUmh505-YInFdniCgAYUuElBWh4BsIw,3023
|
|
15
16
|
fastgenerateapi/api_view/update_relation_view.py,sha256=UvCdnhazEein2jSRx-KFbMe7LK4ojoFXAwRwxCumOZQ,3550
|
|
16
17
|
fastgenerateapi/api_view/update_view.py,sha256=9b5-RxfSAGJIiQheM_qgin8Tkd9-Nz8LOCHw6IPatJk,3894
|
|
17
18
|
fastgenerateapi/api_view/mixin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
18
|
-
fastgenerateapi/api_view/mixin/base_mixin.py,sha256=
|
|
19
|
-
fastgenerateapi/api_view/mixin/dbmodel_mixin.py,sha256=
|
|
19
|
+
fastgenerateapi/api_view/mixin/base_mixin.py,sha256=JI9xFkWCTLVKI7aP92v2cXCIY8GPAIE46JxJgNKSbEw,6595
|
|
20
|
+
fastgenerateapi/api_view/mixin/dbmodel_mixin.py,sha256=2JY04R3_d_mxK_yp4iS746L8Gd4iONqOWHLpGerwyRk,4258
|
|
20
21
|
fastgenerateapi/api_view/mixin/get_mixin.py,sha256=cpyTHaKFNsAhbtnLkz057rGcaKJXipNS-m9ftITsz1I,266
|
|
21
22
|
fastgenerateapi/api_view/mixin/response_mixin.py,sha256=zhWK6aqJtSvsjm6vkaDRXpYPGzh7FgLPyQS_SIoZWNc,2888
|
|
22
23
|
fastgenerateapi/api_view/mixin/save_mixin.py,sha256=inRppAov9ruKqTgGhxPto84ETp1T1WP62n6OgEBIgyU,317
|
|
@@ -25,14 +26,14 @@ fastgenerateapi/cache/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
|
|
|
25
26
|
fastgenerateapi/cache/cache_decorator.py,sha256=Mbxev-3BuTb61AsQ1x9iu29zOSN5SsdVhPgn7RonxUU,584
|
|
26
27
|
fastgenerateapi/cache/key_builder.py,sha256=6Vudd19EGg1IUGT5ftPDqLUNCCqXzmQNV69zBfjGf9A,503
|
|
27
28
|
fastgenerateapi/channel/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
28
|
-
fastgenerateapi/channel/consumer.py,sha256=
|
|
29
|
-
fastgenerateapi/channel/websocket_view.py,sha256=
|
|
29
|
+
fastgenerateapi/channel/consumer.py,sha256=qaxv2M750EFxuWSnu-T74D-mBBL_pIn7zbA-3GUoOso,3069
|
|
30
|
+
fastgenerateapi/channel/websocket_view.py,sha256=3oGppnu1HTQbK-HquGFT04AKj1T7lDkW0lmMQYeh5yI,795
|
|
30
31
|
fastgenerateapi/controller/__init__.py,sha256=eM5a3k_G0bf-k_WcwfcBbI-M3kLFJIITBWX85lVyClE,316
|
|
31
32
|
fastgenerateapi/controller/filter_controller.py,sha256=yqeOJpXeNYUQc_ueWM1cZgP4rIOyvO-LnQqX-eNavJs,3391
|
|
32
33
|
fastgenerateapi/controller/router_controller.py,sha256=yq7oz8oiHKGbxWT5RvFXNQXYewzGaH0ODJFBrZewJEA,5321
|
|
33
34
|
fastgenerateapi/controller/rpc_controller.py,sha256=keH9U5zWOaO3QArTl6uR6PxTNEh0Vb0uZ6gbE5_ugu4,2298
|
|
34
35
|
fastgenerateapi/controller/search_controller.py,sha256=7L4aOF6s6XAVk7swP7KYS57fXiSu8VCBOibzgPlczrc,873
|
|
35
|
-
fastgenerateapi/controller/ws_controller.py,sha256=
|
|
36
|
+
fastgenerateapi/controller/ws_controller.py,sha256=QUJVsPo-M8s9bbewmIN_9oIOZGUXYh0YEqUZvAWfIqA,1667
|
|
36
37
|
fastgenerateapi/data_type/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
37
38
|
fastgenerateapi/data_type/data_type.py,sha256=mWxnXck-QkjmdkhFxjvr7GOQtyzuMIlSJfb4QsVuYBM,727
|
|
38
39
|
fastgenerateapi/data_type/mysql_data_type.py,sha256=DOa-9DdyzG_Pvg1ESmSFa-e_fP_SP5KzDu9JLr1b2vw,233
|
|
@@ -41,33 +42,41 @@ fastgenerateapi/deps/filter_params_deps.py,sha256=v1DRbufhwza6qnk-5LWdx84OXdAy_c
|
|
|
41
42
|
fastgenerateapi/deps/paginator_deps.py,sha256=SWXXNK9f9PXDzccHieNICSgPAG-5qMOKX2WRS4ZxHeY,3171
|
|
42
43
|
fastgenerateapi/deps/tree_params_deps.py,sha256=qpDc_HEg9FJqxJkmiGMGm04qvRs4cwII63t-aGHWTA4,1264
|
|
43
44
|
fastgenerateapi/example/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
44
|
-
fastgenerateapi/example/models.py,sha256=
|
|
45
|
-
fastgenerateapi/example/routers.py,sha256=
|
|
46
|
-
fastgenerateapi/example/schemas.py,sha256=
|
|
47
|
-
fastgenerateapi/example/views.py,sha256=
|
|
45
|
+
fastgenerateapi/example/models.py,sha256=ewtkl_JcBaPXPvVxhKW98jYaED3PS7GYarfdrjrch1o,2134
|
|
46
|
+
fastgenerateapi/example/routers.py,sha256=gsmViGNqO1JbVc0M8tZPvD46kReOYJ5I457WwBHt4l4,437
|
|
47
|
+
fastgenerateapi/example/schemas.py,sha256=MRtyfWUjRSNPJKWPUHGXyMFUugGY8kylPAdq9gJE2CU,1682
|
|
48
|
+
fastgenerateapi/example/views.py,sha256=vj-Nk3z8tA0q8_blyAKzg_s7OEByPBos-2T-9ksl3Gc,3276
|
|
49
|
+
fastgenerateapi/my_fields/__init__.py,sha256=StbTm3_2IBZ8U5kEWxtNyZ3I-Qs-pCFd5vtAZTq52wA,202
|
|
50
|
+
fastgenerateapi/my_fields/aes_field.py,sha256=r4_Jhuq5lgwmITWjUYcFrv5uBR57GPGCVMgy3yNDvp4,4518
|
|
51
|
+
fastgenerateapi/my_fields/enum_field.py,sha256=uTzYFexX1uCPxVzvrCXSSqvpw134vlZDKBrzElmvDuw,7672
|
|
52
|
+
fastgenerateapi/my_fields/pk_field.py,sha256=JUjIpLb2qoNhAMELSOIahlNEk2gTe7KL3DaEZJBWrQk,1376
|
|
53
|
+
fastgenerateapi/my_fields/pwd_field.py,sha256=eUnarxEyHgpOzTBmsl0KxsI8lR7FzUDjxyFCKTqJDBU,2191
|
|
54
|
+
fastgenerateapi/my_fields/soft_delete_field.py,sha256=aZ1ThTzRmB3OF0ffVCzT5pQ8nFVEOPvOHHz3lyf5ZBE,1450
|
|
48
55
|
fastgenerateapi/pydantic_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
49
|
-
fastgenerateapi/pydantic_utils/base_model.py,sha256=
|
|
56
|
+
fastgenerateapi/pydantic_utils/base_model.py,sha256=Yg7929Q4Zsquijc2sKt6T81aU-djqMWJ4HMYgpUHhjY,781
|
|
50
57
|
fastgenerateapi/pydantic_utils/json_encoders.py,sha256=yzmezJk1FsLtuZ7gEM-xW1YWAO0aBf4615V6AgMrK4M,2814
|
|
51
58
|
fastgenerateapi/schemas_factory/__init__.py,sha256=X9U96fiyRfCY0u6SzaCYG62RdpEGFX7yOZh_cJl6R2E,472
|
|
52
|
-
fastgenerateapi/schemas_factory/common_function.py,sha256=
|
|
53
|
-
fastgenerateapi/schemas_factory/common_schema_factory.py,sha256=
|
|
54
|
-
fastgenerateapi/schemas_factory/create_schema_factory.py,sha256=
|
|
59
|
+
fastgenerateapi/schemas_factory/common_function.py,sha256=zU46EbMm0NQndMpUuDSuxe2WcEr4puibehZMudbrifo,5229
|
|
60
|
+
fastgenerateapi/schemas_factory/common_schema_factory.py,sha256=3m8FgnjzTNacetspLG4m6mM25XO7rHmwUC2aExXkVlU,2910
|
|
61
|
+
fastgenerateapi/schemas_factory/create_schema_factory.py,sha256=4yQUerLMcIIs9dqVTvKSvEMpWlL_xkOh4Ufdui3l60Y,3739
|
|
55
62
|
fastgenerateapi/schemas_factory/filter_schema_factory.py,sha256=d_fiiY5Oo8iiPgQaxlt9BrME3cObHsZgVNrv8qs1OoA,1284
|
|
56
|
-
fastgenerateapi/schemas_factory/get_all_schema_factory.py,sha256=
|
|
57
|
-
fastgenerateapi/schemas_factory/get_one_schema_factory.py,sha256=
|
|
63
|
+
fastgenerateapi/schemas_factory/get_all_schema_factory.py,sha256=H2V0u04YfvhwyT0jhv4X4vFXa67niDaNbjV7E-1Z4RU,5175
|
|
64
|
+
fastgenerateapi/schemas_factory/get_one_schema_factory.py,sha256=8rrIzAnp5ZxWdVjGxCmcUxUPWmv7hFgHLhkEmvQCMIs,3373
|
|
58
65
|
fastgenerateapi/schemas_factory/get_relation_schema_factory.py,sha256=00Mpz6kO4pH-fPoTv3HGT7P9XS0Q0Zi48WfAGy5YrNE,3117
|
|
59
|
-
fastgenerateapi/schemas_factory/get_tree_schema_factory.py,sha256=
|
|
66
|
+
fastgenerateapi/schemas_factory/get_tree_schema_factory.py,sha256=6HSXOKu73p4o2ugf4LnY8SJ18npdIGMqZ0itZVOATHU,7265
|
|
60
67
|
fastgenerateapi/schemas_factory/response_factory.py,sha256=E5NAUcI9IWkH9xT517udWzOexF7U6sgVomcnHh2PxVc,1647
|
|
61
68
|
fastgenerateapi/schemas_factory/sql_get_all_schema_factory.py,sha256=fr-_J2FdLfhAQTXZHMwhF56KIf_y7suI9TCOmAV4zI8,1816
|
|
62
|
-
fastgenerateapi/schemas_factory/update_schema_factory.py,sha256=
|
|
69
|
+
fastgenerateapi/schemas_factory/update_schema_factory.py,sha256=_PRSNn8gy_DYoEFEQKWMYBMzyksJeKM2AyFUrVcYmFU,3737
|
|
63
70
|
fastgenerateapi/settings/__init__.py,sha256=rqUtJyMLicobcyhmr74TepjmUQAEmlazKT3vjV_n3aA,6
|
|
64
71
|
fastgenerateapi/settings/register_settings.py,sha256=yeVkXuarA_OdxPQ6F4y1eW-_OuFAm9eJcFaz-YZwodg,97
|
|
65
|
-
fastgenerateapi/settings/settings.py,sha256=
|
|
72
|
+
fastgenerateapi/settings/settings.py,sha256=A0smBQ8YpDfvo6jjD4ztRhS2A_9stqS5hwsODwdu4Xw,6881
|
|
66
73
|
fastgenerateapi/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
74
|
+
fastgenerateapi/utils/aes.py,sha256=2ewx-qc7wAN68iExyNM97F8dB1sXhfGYVpNWFYR_a1k,3569
|
|
67
75
|
fastgenerateapi/utils/exception.py,sha256=dnBmVpHLUS_PZ2cwIvpAJ3ncswZnn31L98gNmCoe8_k,121
|
|
68
76
|
fastgenerateapi/utils/parse_str.py,sha256=vDUjx_Fx0nOHwtkWnOauN21NB_ecNglr5bVBKrLL33g,850
|
|
69
|
-
fastgenerateapi
|
|
70
|
-
fastgenerateapi-0.0.
|
|
71
|
-
fastgenerateapi-0.0.
|
|
72
|
-
fastgenerateapi-0.0.
|
|
73
|
-
fastgenerateapi-0.0.
|
|
77
|
+
fastgenerateapi/utils/snowflake.py,sha256=ufr6aayY0McRp6epw2AGMqSA-CEzvXwSF5VmnIzPhLo,4539
|
|
78
|
+
fastgenerateapi-0.0.26.dist-info/LICENSE,sha256=gcuuhKKc5-dwvyvHsXjlC9oM6N5gZ6umYbC8ewW1Yvg,35821
|
|
79
|
+
fastgenerateapi-0.0.26.dist-info/METADATA,sha256=MIHAsAPOCdXlqZ87-uhoqpgrgUWI6b02dpvIQg1oh7U,4887
|
|
80
|
+
fastgenerateapi-0.0.26.dist-info/WHEEL,sha256=iYlv5fX357PQyRT2o6tw1bN-YcKFFHKqB_LwHO5wP-g,110
|
|
81
|
+
fastgenerateapi-0.0.26.dist-info/top_level.txt,sha256=7RBBRe1lBEnxZtP89_Wj1QwI2KE8r3Pi9IwywUHTdVg,16
|
|
82
|
+
fastgenerateapi-0.0.26.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|