fastapi-sqlalchemy-toolkit 0.7.5.1__tar.gz → 0.7.7__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.
Files changed (59) hide show
  1. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/.gitignore +2 -1
  2. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/PKG-INFO +1 -1
  3. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/docs/ru/sorting.md +6 -5
  4. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/docs/ru/utils.md +6 -1
  5. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/fastapi_sqlalchemy_toolkit/model_manager.py +14 -9
  6. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/pyproject.toml +1 -1
  7. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/.flake8 +0 -0
  8. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/.github/workflows/docker-test.yml +0 -0
  9. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/.github/workflows/python-publish.yml +0 -0
  10. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/.pylintrc +0 -0
  11. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/AUTHORS +0 -0
  12. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/LICENSE +0 -0
  13. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/Makefile +0 -0
  14. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/README.md +0 -0
  15. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/docs/benefits.md +0 -0
  16. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/docs/db_validation.md +0 -0
  17. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/docs/extension.md +0 -0
  18. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/docs/filtering.md +0 -0
  19. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/docs/index.md +0 -0
  20. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/docs/ru/benefits.md +0 -0
  21. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/docs/ru/db_validation.md +0 -0
  22. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/docs/ru/extension.md +0 -0
  23. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/docs/ru/filtering.md +0 -0
  24. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/docs/ru/index.md +0 -0
  25. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/docs/ru/transactions.md +0 -0
  26. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/docs/ru/usage.md +0 -0
  27. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/docs/sorting.md +0 -0
  28. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/docs/transactions.md +0 -0
  29. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/docs/usage.md +0 -0
  30. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/docs/utils.md +0 -0
  31. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/examples/app/.env +0 -0
  32. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/examples/app/__init__.py +0 -0
  33. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/examples/app/api/__init__.py +0 -0
  34. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/examples/app/api/api.py +0 -0
  35. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/examples/app/api/deps.py +0 -0
  36. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/examples/app/api/endpoints/__init__.py +0 -0
  37. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/examples/app/api/endpoints/child.py +0 -0
  38. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/examples/app/config.py +0 -0
  39. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/examples/app/db.py +0 -0
  40. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/examples/app/main.py +0 -0
  41. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/examples/app/managers.py +0 -0
  42. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/examples/app/models.py +0 -0
  43. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/examples/app/schemas.py +0 -0
  44. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/fastapi_sqlalchemy_toolkit/__init__.py +0 -0
  45. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/fastapi_sqlalchemy_toolkit/filters.py +0 -0
  46. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/fastapi_sqlalchemy_toolkit/ordering.py +0 -0
  47. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/fastapi_sqlalchemy_toolkit/utils.py +0 -0
  48. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/mkdocs.yml +0 -0
  49. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/requirements/base.txt +0 -0
  50. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/requirements/docs.txt +0 -0
  51. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/requirements/lint.txt +0 -0
  52. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/requirements/test.txt +0 -0
  53. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/tests/Dockerfile +0 -0
  54. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/tests/__init__.py +0 -0
  55. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/tests/conftest.py +0 -0
  56. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/tests/db.py +0 -0
  57. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/tests/docker-compose.yml +0 -0
  58. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/tests/models.py +0 -0
  59. {fastapi_sqlalchemy_toolkit-0.7.5.1 → fastapi_sqlalchemy_toolkit-0.7.7}/tests/test_public_methods.py +0 -0
@@ -1,6 +1,7 @@
1
+ .mypy_cache/
1
2
  .venv/
2
3
  .vscode/
3
4
  dist/
4
5
  fastapi_sqlalchemy_toolkit.egg-info/
5
6
  .pypirc
6
- site/
7
+ site/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: fastapi_sqlalchemy_toolkit
3
- Version: 0.7.5.1
3
+ Version: 0.7.7
4
4
  Summary: FastAPI SQLAlchemy Toolkit
5
5
  Project-URL: Homepage, https://github.com/e-kondr01/fastapi-sqlalchemy-toolkit
6
6
  Author-email: Egor Kondrashov <e.kondr01@gmail.com>
@@ -9,7 +9,9 @@
9
9
 
10
10
  - Определить поля, по которым доступна фильтрация.
11
11
 
12
- Это может быть либо списком/кортежем полей основной модели:
12
+ Это может быть:
13
+
14
+ 1. Cпискок или кортеж полей основной модели:
13
15
 
14
16
  ```python
15
17
  from app.models import Child
@@ -25,16 +27,15 @@ child_ordering_fields = (
25
27
 
26
28
  Дефис первым символом означает направление сортировки по убыванию.
27
29
 
28
- Либо можно определить маппинг строковых полей для сортировки
29
- на соответствующие поля моделей:
30
+ 2. Маппинг строковых полей для сортировки на соответствующие поля моделей:
30
31
 
31
32
  ```python
32
33
  from app.models import Child, Parent
33
34
 
34
- child_ordering_fields = (
35
+ child_ordering_fields = {
35
36
  "title": MyModel.title,
36
37
  "parent_title": ParentModel.title
37
- )
38
+ }
38
39
  ```
39
40
 
40
41
  В таком случае, будут доступны следующий параметря для сортировки:
@@ -46,5 +46,10 @@ async def get_child_objects(
46
46
  ids: comma_list_query = None,
47
47
  ) -> list[ChildListSchema]
48
48
  ids = get_comma_list_values(ids, UUID)
49
- return await child_manager.list(session, id=FieldFilter(ids, operator="in_"))
49
+ return await child_manager.list(
50
+ session,
51
+ filter_expressions={
52
+ Child.id.in_: ids
53
+ }
54
+ )
50
55
  ```
@@ -1,6 +1,6 @@
1
1
  # ruff: noqa: UP006
2
2
  from collections.abc import Callable, Iterable
3
- from typing import Any, Generic, List, TypeVar # noqa: UP035
3
+ from typing import Any, List # noqa: UP035
4
4
 
5
5
  from fastapi import HTTPException, status
6
6
  from fastapi_pagination.bases import BasePage
@@ -30,19 +30,20 @@ from sqlalchemy.sql.selectable import Exists
30
30
 
31
31
  from .filters import null_query_values
32
32
 
33
- ModelT = TypeVar("ModelT", bound=DeclarativeBase)
34
- CreateSchemaT = TypeVar("CreateSchemaT", bound=BaseModel)
35
- UpdateSchemaT = TypeVar("UpdateSchemaT", bound=BaseModel)
36
33
  ModelDict = dict[str, Any]
37
34
 
38
35
 
39
- def sqlalchemy_model_to_dict(model: ModelT) -> dict:
36
+ def sqlalchemy_model_to_dict(model: DeclarativeBase) -> dict:
40
37
  db_obj_dict = model.__dict__.copy()
41
38
  del db_obj_dict["_sa_instance_state"]
42
39
  return db_obj_dict
43
40
 
44
41
 
45
- class ModelManager(Generic[ModelT, CreateSchemaT, UpdateSchemaT]):
42
+ class ModelManager[
43
+ ModelT: DeclarativeBase,
44
+ CreateSchemaT: BaseModel,
45
+ UpdateSchemaT: BaseModel,
46
+ ]:
46
47
  def __init__(
47
48
  self,
48
49
  model: type[ModelT],
@@ -85,7 +86,8 @@ class ModelManager(Generic[ModelT, CreateSchemaT, UpdateSchemaT]):
85
86
  self.defaults: dict[str, Any] = {}
86
87
 
87
88
  attr: InstrumentedAttribute
88
- for attr_name, attr in self.model.__dict__.items():
89
+ model_attrs = self.model.__dict__.copy()
90
+ for attr_name, attr in model_attrs.items():
89
91
  # Перебираем только атрибуты модели
90
92
  if not attr_name.startswith("_"):
91
93
  # Обрабатываем связи
@@ -107,7 +109,11 @@ class ModelManager(Generic[ModelT, CreateSchemaT, UpdateSchemaT]):
107
109
  if hasattr(attr, "default") and attr.default is not None:
108
110
  if isinstance(attr.default, ScalarElementColumnDefault):
109
111
  self.defaults[attr_name] = attr.default.arg
110
- elif hasattr(attr, "server_default") and attr.server_default is not None:
112
+ elif (
113
+ hasattr(attr, "server_default")
114
+ and attr.server_default is not None
115
+ and hasattr(attr.server_default, "arg")
116
+ ):
111
117
  if isinstance(attr.type, BOOLEAN):
112
118
  self.defaults[attr_name] = attr.server_default.arg != "False"
113
119
  elif isinstance(attr.type, Integer):
@@ -665,7 +671,6 @@ class ModelManager(Generic[ModelT, CreateSchemaT, UpdateSchemaT]):
665
671
  await self.run_db_validation(session, db_obj=db_obj, in_obj=update_data)
666
672
  for field in update_data:
667
673
  setattr(db_obj, field, update_data[field])
668
- session.add(db_obj)
669
674
  await self.save(session, commit=commit)
670
675
  await session.refresh(db_obj, attribute_names=refresh_attribute_names)
671
676
  return db_obj
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "fastapi_sqlalchemy_toolkit"
7
- version = "0.7.5.1"
7
+ version = "0.7.7"
8
8
  authors = [
9
9
  { name="Egor Kondrashov", email="e.kondr01@gmail.com" },
10
10
  ]