xn-model 0.11.0__py3-none-any.whl → 0.11.2__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.
- x_model/__init__.py +26 -0
- x_model/model.py +10 -7
- {xn_model-0.11.0.dist-info → xn_model-0.11.2.dist-info}/METADATA +1 -1
- xn_model-0.11.2.dist-info/RECORD +9 -0
- {xn_model-0.11.0.dist-info → xn_model-0.11.2.dist-info}/WHEEL +1 -1
- xn_model-0.11.0.dist-info/RECORD +0 -9
- {xn_model-0.11.0.dist-info → xn_model-0.11.2.dist-info}/top_level.txt +0 -0
x_model/__init__.py
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from enum import IntEnum
|
|
1
3
|
from types import ModuleType
|
|
4
|
+
|
|
5
|
+
from starlette import status
|
|
2
6
|
from tortoise import Tortoise, connections, ConfigurationError
|
|
3
7
|
from tortoise.backends.asyncpg import AsyncpgDBClient
|
|
4
8
|
from tortoise.exceptions import DBConnectionError
|
|
9
|
+
from fastapi import HTTPException as BaseHTTPException
|
|
5
10
|
|
|
6
11
|
|
|
7
12
|
async def init_db(dsn: str, models: ModuleType, create_tables: bool = False) -> AsyncpgDBClient | str:
|
|
@@ -13,3 +18,24 @@ async def init_db(dsn: str, models: ModuleType, create_tables: bool = False) ->
|
|
|
13
18
|
except (ConfigurationError, DBConnectionError) as ce:
|
|
14
19
|
return ce.args[0]
|
|
15
20
|
return cn
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class FailReason(IntEnum):
|
|
24
|
+
path = 8
|
|
25
|
+
query = 9
|
|
26
|
+
body = 10
|
|
27
|
+
method = 11
|
|
28
|
+
protocol = 12
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class HTTPException(BaseHTTPException):
|
|
32
|
+
def __init__(
|
|
33
|
+
self,
|
|
34
|
+
reason: IntEnum,
|
|
35
|
+
parent: Exception | str = None,
|
|
36
|
+
status_: status = status.HTTP_400_BAD_REQUEST,
|
|
37
|
+
hdrs: dict = None,
|
|
38
|
+
) -> None:
|
|
39
|
+
detail = f"{reason.name}{f': {parent}' if parent else ''}"
|
|
40
|
+
logging.error(detail)
|
|
41
|
+
super().__init__(status_, detail, hdrs)
|
x_model/model.py
CHANGED
|
@@ -3,8 +3,10 @@ from pydantic import create_model
|
|
|
3
3
|
from tortoise import Model as TortoiseModel
|
|
4
4
|
from tortoise.contrib.pydantic import pydantic_model_creator, PydanticModel
|
|
5
5
|
from tortoise import fields
|
|
6
|
+
from tortoise.exceptions import FieldError
|
|
6
7
|
from tortoise.models import MetaInfo
|
|
7
8
|
from tortoise.queryset import QuerySet
|
|
9
|
+
from x_model import HTTPException, FailReason
|
|
8
10
|
|
|
9
11
|
from x_model.field import DatetimeSecField
|
|
10
12
|
from x_model.pydantic import PydList
|
|
@@ -15,13 +17,11 @@ class BaseModel(TortoiseModel):
|
|
|
15
17
|
# todo: refact: clean old garbage
|
|
16
18
|
id: int = fields.IntField(True)
|
|
17
19
|
|
|
18
|
-
_name: tuple[str] =
|
|
19
|
-
_sorts: tuple[str] =
|
|
20
|
+
_name: tuple[str] = ("name",)
|
|
21
|
+
_sorts: tuple[str] = ("-id",)
|
|
20
22
|
|
|
21
23
|
def repr(self, sep: str = " ") -> str:
|
|
22
|
-
|
|
23
|
-
return sep.join(getattr(self, name_fragment) for name_fragment in self._name)
|
|
24
|
-
return self.__repr__()
|
|
24
|
+
return sep.join(getattr(self, name_fragment) for name_fragment in self._name)
|
|
25
25
|
|
|
26
26
|
@classmethod
|
|
27
27
|
async def get_or_create_by_name(cls, name: str, attr_name: str = None, def_dict: dict = None) -> TortoiseModel:
|
|
@@ -35,7 +35,7 @@ class BaseModel(TortoiseModel):
|
|
|
35
35
|
def _page_query(cls, sorts: tuple[str], limit: int = 1000, offset: int = 0, q: str = None, **filters) -> QuerySet:
|
|
36
36
|
query = cls.filter(**filters).order_by(*sorts).limit(limit).offset(offset)
|
|
37
37
|
if q:
|
|
38
|
-
query = query.filter(**{f"{cls._name}__icontains": q})
|
|
38
|
+
query = query.filter(**{f"{cls._name[0]}__icontains": q})
|
|
39
39
|
return query
|
|
40
40
|
|
|
41
41
|
@classmethod
|
|
@@ -154,7 +154,10 @@ class Model(BaseModel):
|
|
|
154
154
|
filters = {k: v for k, v in filters.items() if v is not None}
|
|
155
155
|
pyd_item = cls.pyd_list_item()
|
|
156
156
|
query = cls._page_query(sorts, limit, offset, q, **filters)
|
|
157
|
-
|
|
157
|
+
try:
|
|
158
|
+
data = await pyd_item.from_queryset(query)
|
|
159
|
+
except FieldError as e:
|
|
160
|
+
raise HTTPException(FailReason.body, e)
|
|
158
161
|
if limit - (li := len(data)):
|
|
159
162
|
filtered = total = li + offset
|
|
160
163
|
else:
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
x_model/__init__.py,sha256=o2sQtkN15QxBtAIfmR0Pxf8UrdkKVRXL6nDecjgwEyU,1217
|
|
2
|
+
x_model/field.py,sha256=S461M94ryQG7yu8lreXtWnZo3YdCP97xhbcCJ3BzXsY,2751
|
|
3
|
+
x_model/func.py,sha256=E7jDoHJGaFpKvxbHnT_lyBxUZeMo-GRd5gv9dLw7B9s,289
|
|
4
|
+
x_model/model.py,sha256=VL6JE-oGU0xzolhEGD8Lp7xDV7LVNGS0klMsUOXPJi0,7029
|
|
5
|
+
x_model/pydantic.py,sha256=OjNCp4ZFGvUIxZSbDCmXISl9mOjI_UnWi5JMVntSqjM,590
|
|
6
|
+
xn_model-0.11.2.dist-info/METADATA,sha256=cePVGXEv8i744IcjtkecY1y4f05RnN5-dbzus8lkopo,1002
|
|
7
|
+
xn_model-0.11.2.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
|
|
8
|
+
xn_model-0.11.2.dist-info/top_level.txt,sha256=QCYyfv5AA_8jPPtCpShkBXzQRUCGuuW7Ro0mqysDE8E,8
|
|
9
|
+
xn_model-0.11.2.dist-info/RECORD,,
|
xn_model-0.11.0.dist-info/RECORD
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
x_model/__init__.py,sha256=HBOZMb1HheFkak6Ih7YkSGiNtGkQq7L_fiWgL_zpEC0,607
|
|
2
|
-
x_model/field.py,sha256=S461M94ryQG7yu8lreXtWnZo3YdCP97xhbcCJ3BzXsY,2751
|
|
3
|
-
x_model/func.py,sha256=E7jDoHJGaFpKvxbHnT_lyBxUZeMo-GRd5gv9dLw7B9s,289
|
|
4
|
-
x_model/model.py,sha256=LcDhLlLpOUh6ncLlDT6FODxTy3i0hl6VFG2YXdmHQkw,6916
|
|
5
|
-
x_model/pydantic.py,sha256=OjNCp4ZFGvUIxZSbDCmXISl9mOjI_UnWi5JMVntSqjM,590
|
|
6
|
-
xn_model-0.11.0.dist-info/METADATA,sha256=wQf-LgQxs5Mc9UrV3XKGSdmHe46I_flavMOC89ryFZQ,1002
|
|
7
|
-
xn_model-0.11.0.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
|
|
8
|
-
xn_model-0.11.0.dist-info/top_level.txt,sha256=QCYyfv5AA_8jPPtCpShkBXzQRUCGuuW7Ro0mqysDE8E,8
|
|
9
|
-
xn_model-0.11.0.dist-info/RECORD,,
|
|
File without changes
|