xn-model 0.11.1__tar.gz → 0.11.3__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: xn-model
3
- Version: 0.11.1
3
+ Version: 0.11.3
4
4
  Summary: Base model for xn-api
5
5
  Author-email: Mike Artemiev <mixartemev@gmail.com>
6
6
  License: MIT
@@ -10,12 +10,11 @@ Keywords: tortoise,model,crud,generator,api,admin
10
10
  Requires-Python: >=3.12
11
11
  Description-Content-Type: text/markdown
12
12
  Requires-Dist: tortoise-orm[accel,asyncpg]
13
- Requires-Dist: python-dotenv
14
13
  Provides-Extra: dev
15
14
  Requires-Dist: pytest; extra == "dev"
15
+ Requires-Dist: python-dotenv; extra == "dev"
16
16
  Requires-Dist: build; extra == "dev"
17
17
  Requires-Dist: twine; extra == "dev"
18
- Requires-Dist: setuptools_scm; extra == "dev"
19
18
 
20
19
  ## INSTALL
21
20
  ```bash
@@ -5,8 +5,7 @@ authors = [
5
5
  {name = "Mike Artemiev", email = "mixartemev@gmail.com"},
6
6
  ]
7
7
  dependencies = [
8
- 'tortoise-orm[accel,asyncpg]',
9
- "python-dotenv"
8
+ 'tortoise-orm[accel,asyncpg]'
10
9
  ]
11
10
  keywords = ["tortoise", "model", "crud", "generator", "api", "admin"]
12
11
  description = 'Base model for xn-api'
@@ -32,9 +31,9 @@ local_scheme = "no-local-version"
32
31
  [project.optional-dependencies]
33
32
  dev = [
34
33
  "pytest",
34
+ "python-dotenv",
35
35
  "build",
36
- "twine",
37
- "setuptools_scm",
36
+ "twine"
38
37
  ]
39
38
 
40
39
  [tool.ruff]
@@ -3,7 +3,7 @@ from os import getenv as env
3
3
  from dotenv import load_dotenv
4
4
  from tortoise.backends.asyncpg import AsyncpgDBClient
5
5
 
6
- from x_model import init_db, model
6
+ from x_model import init_db, models
7
7
 
8
8
  load_dotenv()
9
9
 
@@ -11,4 +11,4 @@ PG_DSN = f"postgres://{env('POSTGRES_USER')}:{env('POSTGRES_PASSWORD')}@{env('PO
11
11
 
12
12
 
13
13
  def test_init_db():
14
- assert isinstance(run(init_db(PG_DSN, model)), AsyncpgDBClient), "DB corrupt"
14
+ assert isinstance(run(init_db(PG_DSN, models)), AsyncpgDBClient), "DB corrupt"
@@ -0,0 +1,42 @@
1
+ import logging
2
+ from enum import IntEnum
3
+ from types import ModuleType
4
+
5
+ from starlette import status
6
+ from tortoise import Tortoise, connections, ConfigurationError
7
+ from tortoise.backends.asyncpg import AsyncpgDBClient
8
+ from tortoise.exceptions import DBConnectionError
9
+ from fastapi import HTTPException as BaseHTTPException
10
+
11
+
12
+ async def init_db(dsn: str, models: ModuleType, create_tables: bool = False) -> AsyncpgDBClient | str:
13
+ try:
14
+ await Tortoise.init(db_url=dsn, modules={"models": [models]})
15
+ if create_tables:
16
+ await Tortoise.generate_schemas()
17
+ cn: AsyncpgDBClient = connections.get("default")
18
+ except (ConfigurationError, DBConnectionError) as ce:
19
+ return ce.args[0]
20
+ return cn
21
+
22
+
23
+ class FailReason(IntEnum):
24
+ body = 8
25
+ query = 9
26
+ path = 10
27
+ host = 11
28
+ protocol = 12
29
+ method = 13
30
+
31
+
32
+ class HTTPException(BaseHTTPException):
33
+ def __init__(
34
+ self,
35
+ reason: IntEnum,
36
+ parent: Exception | str = None,
37
+ status_: status = status.HTTP_400_BAD_REQUEST,
38
+ hdrs: dict = None,
39
+ ) -> None:
40
+ detail = f"{reason.name}{f': {parent}' if parent else ''}"
41
+ logging.error(detail)
42
+ super().__init__(status_, detail, hdrs)
@@ -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
@@ -33,7 +35,7 @@ class BaseModel(TortoiseModel):
33
35
  def _page_query(cls, sorts: tuple[str], limit: int = 1000, offset: int = 0, q: str = None, **filters) -> QuerySet:
34
36
  query = cls.filter(**filters).order_by(*sorts).limit(limit).offset(offset)
35
37
  if q:
36
- query = query.filter(**{f"{cls._name}__icontains": q})
38
+ query = query.filter(**{f"{cls._name[0]}__icontains": q})
37
39
  return query
38
40
 
39
41
  @classmethod
@@ -152,7 +154,10 @@ class Model(BaseModel):
152
154
  filters = {k: v for k, v in filters.items() if v is not None}
153
155
  pyd_item = cls.pyd_list_item()
154
156
  query = cls._page_query(sorts, limit, offset, q, **filters)
155
- data = await pyd_item.from_queryset(query)
157
+ try:
158
+ data = await pyd_item.from_queryset(query)
159
+ except FieldError as e:
160
+ raise HTTPException(FailReason.body, e)
156
161
  if limit - (li := len(data)):
157
162
  filtered = total = li + offset
158
163
  else:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: xn-model
3
- Version: 0.11.1
3
+ Version: 0.11.3
4
4
  Summary: Base model for xn-api
5
5
  Author-email: Mike Artemiev <mixartemev@gmail.com>
6
6
  License: MIT
@@ -10,12 +10,11 @@ Keywords: tortoise,model,crud,generator,api,admin
10
10
  Requires-Python: >=3.12
11
11
  Description-Content-Type: text/markdown
12
12
  Requires-Dist: tortoise-orm[accel,asyncpg]
13
- Requires-Dist: python-dotenv
14
13
  Provides-Extra: dev
15
14
  Requires-Dist: pytest; extra == "dev"
15
+ Requires-Dist: python-dotenv; extra == "dev"
16
16
  Requires-Dist: build; extra == "dev"
17
17
  Requires-Dist: twine; extra == "dev"
18
- Requires-Dist: setuptools_scm; extra == "dev"
19
18
 
20
19
  ## INSTALL
21
20
  ```bash
@@ -9,7 +9,7 @@ tests/test_db.py
9
9
  x_model/__init__.py
10
10
  x_model/field.py
11
11
  x_model/func.py
12
- x_model/model.py
12
+ x_model/models.py
13
13
  x_model/pydantic.py
14
14
  xn_model.egg-info/PKG-INFO
15
15
  xn_model.egg-info/SOURCES.txt
@@ -1,8 +1,7 @@
1
1
  tortoise-orm[accel,asyncpg]
2
- python-dotenv
3
2
 
4
3
  [dev]
5
4
  pytest
5
+ python-dotenv
6
6
  build
7
7
  twine
8
- setuptools_scm
@@ -1,15 +0,0 @@
1
- from types import ModuleType
2
- from tortoise import Tortoise, connections, ConfigurationError
3
- from tortoise.backends.asyncpg import AsyncpgDBClient
4
- from tortoise.exceptions import DBConnectionError
5
-
6
-
7
- async def init_db(dsn: str, models: ModuleType, create_tables: bool = False) -> AsyncpgDBClient | str:
8
- try:
9
- await Tortoise.init(db_url=dsn, modules={"models": [models]})
10
- if create_tables:
11
- await Tortoise.generate_schemas()
12
- cn: AsyncpgDBClient = connections.get("default")
13
- except (ConfigurationError, DBConnectionError) as ce:
14
- return ce.args[0]
15
- return cn
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes