fastapi-rtk 1.0.6__tar.gz → 1.0.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 (134) hide show
  1. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/PKG-INFO +1 -1
  2. fastapi_rtk-1.0.7/fastapi_rtk/_version.py +1 -0
  3. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/api/model_rest_api.py +12 -9
  4. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/backends/sqla/db.py +24 -7
  5. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/backends/sqla/model.py +7 -5
  6. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/bases/filter.py +1 -1
  7. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/const.py +1 -1
  8. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/utils/self_dependencies.py +1 -1
  9. fastapi_rtk-1.0.6/fastapi_rtk/_version.py +0 -1
  10. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/.gitignore +0 -0
  11. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/LICENSE +0 -0
  12. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/README.md +0 -0
  13. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/__init__.py +0 -0
  14. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/api/__init__.py +0 -0
  15. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/api/base_api.py +0 -0
  16. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/apis.py +0 -0
  17. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/auth/__init__.py +0 -0
  18. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/auth/auth.py +0 -0
  19. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/auth/hashers/__init__.py +0 -0
  20. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/auth/hashers/pbkdf2.py +0 -0
  21. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/auth/hashers/scrypt.py +0 -0
  22. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/auth/hashers/utils.py +0 -0
  23. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/auth/password_helpers/__init__.py +0 -0
  24. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/auth/password_helpers/fab.py +0 -0
  25. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/auth/strategies/__init__.py +0 -0
  26. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/auth/strategies/config.py +0 -0
  27. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/auth/strategies/db.py +0 -0
  28. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/auth/strategies/jwt.py +0 -0
  29. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/backends/__init__.py +0 -0
  30. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/backends/generic/__init__.py +0 -0
  31. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/backends/generic/column.py +0 -0
  32. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/backends/generic/db.py +0 -0
  33. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/backends/generic/exceptions.py +0 -0
  34. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/backends/generic/filters.py +0 -0
  35. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/backends/generic/interface.py +0 -0
  36. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/backends/generic/model.py +0 -0
  37. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/backends/generic/session.py +0 -0
  38. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/backends/sqla/__init__.py +0 -0
  39. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/backends/sqla/column.py +0 -0
  40. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/backends/sqla/exceptions.py +0 -0
  41. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/backends/sqla/extensions/__init__.py +0 -0
  42. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/backends/sqla/extensions/audit/__init__.py +0 -0
  43. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/backends/sqla/extensions/audit/audit.py +0 -0
  44. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/backends/sqla/extensions/audit/types.py +0 -0
  45. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/backends/sqla/extensions/geoalchemy2/__init__.py +0 -0
  46. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/backends/sqla/extensions/geoalchemy2/filters.py +0 -0
  47. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/backends/sqla/extensions/geoalchemy2/geometry_converter.py +0 -0
  48. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/backends/sqla/filters.py +0 -0
  49. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/backends/sqla/interface.py +0 -0
  50. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/backends/sqla/session.py +0 -0
  51. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/bases/__init__.py +0 -0
  52. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/bases/db.py +0 -0
  53. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/bases/file_manager.py +0 -0
  54. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/bases/interface.py +0 -0
  55. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/bases/model.py +0 -0
  56. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/bases/session.py +0 -0
  57. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/cli/__init__.py +0 -0
  58. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/cli/cli.py +0 -0
  59. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/cli/commands/__init__.py +0 -0
  60. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/cli/commands/db/__init__.py +0 -0
  61. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/cli/commands/db/templates/fastapi/README +0 -0
  62. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/cli/commands/db/templates/fastapi/alembic.ini.mako +0 -0
  63. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/cli/commands/db/templates/fastapi/env.py +0 -0
  64. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/cli/commands/db/templates/fastapi/script.py.mako +0 -0
  65. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/cli/commands/db/templates/fastapi-multidb/README +0 -0
  66. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/cli/commands/db/templates/fastapi-multidb/alembic.ini.mako +0 -0
  67. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/cli/commands/db/templates/fastapi-multidb/env.py +0 -0
  68. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/cli/commands/db/templates/fastapi-multidb/script.py.mako +0 -0
  69. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/cli/commands/export.py +0 -0
  70. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/cli/commands/security.py +0 -0
  71. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/cli/commands/translate.py +0 -0
  72. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/cli/const.py +0 -0
  73. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/cli/decorators.py +0 -0
  74. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/cli/types.py +0 -0
  75. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/cli/utils.py +0 -0
  76. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/config.py +0 -0
  77. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/db.py +0 -0
  78. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/decorators.py +0 -0
  79. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/dependencies.py +0 -0
  80. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/exceptions.py +0 -0
  81. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/fastapi_react_toolkit.py +0 -0
  82. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/file_managers/__init__.py +0 -0
  83. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/file_managers/file_manager.py +0 -0
  84. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/file_managers/image_manager.py +0 -0
  85. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/file_managers/s3_file_manager.py +0 -0
  86. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/file_managers/s3_image_manager.py +0 -0
  87. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/filters.py +0 -0
  88. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/globals.py +0 -0
  89. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/lang/__init__.py +0 -0
  90. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/lang/babel/__init__.py +0 -0
  91. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/lang/babel/cli.py +0 -0
  92. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/lang/babel/config.py +0 -0
  93. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/lang/babel.cfg +0 -0
  94. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/lang/lazy_text.py +0 -0
  95. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/lang/messages.pot +0 -0
  96. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/lang/translations/de/LC_MESSAGES/messages.mo +0 -0
  97. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/lang/translations/de/LC_MESSAGES/messages.po +0 -0
  98. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/lang/translations/en/LC_MESSAGES/messages.mo +0 -0
  99. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/lang/translations/en/LC_MESSAGES/messages.po +0 -0
  100. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/manager.py +0 -0
  101. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/middlewares.py +0 -0
  102. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/mixins.py +0 -0
  103. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/models.py +0 -0
  104. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/routers.py +0 -0
  105. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/schemas.py +0 -0
  106. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/security/__init__.py +0 -0
  107. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/security/sqla/__init__.py +0 -0
  108. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/security/sqla/apis.py +0 -0
  109. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/security/sqla/models.py +0 -0
  110. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/security/sqla/security_manager.py +0 -0
  111. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/setting.py +0 -0
  112. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/types.py +0 -0
  113. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/utils/__init__.py +0 -0
  114. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/utils/async_task_runner.py +0 -0
  115. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/utils/class_factory.py +0 -0
  116. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/utils/csv_json_converter.py +0 -0
  117. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/utils/deep_merge.py +0 -0
  118. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/utils/extender_mixin.py +0 -0
  119. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/utils/flask_appbuilder_utils.py +0 -0
  120. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/utils/hooks.py +0 -0
  121. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/utils/lazy.py +0 -0
  122. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/utils/merge_schema.py +0 -0
  123. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/utils/multiple_async_contexts.py +0 -0
  124. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/utils/prettify_dict.py +0 -0
  125. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/utils/pydantic.py +0 -0
  126. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/utils/run_utils.py +0 -0
  127. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/utils/smartdefaultdict.py +0 -0
  128. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/utils/sqla.py +0 -0
  129. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/utils/timezone.py +0 -0
  130. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/utils/update_signature.py +0 -0
  131. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/utils/use_default_when_none.py +0 -0
  132. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/utils/werkzeug.py +0 -0
  133. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/fastapi_rtk/version.py +0 -0
  134. {fastapi_rtk-1.0.6 → fastapi_rtk-1.0.7}/pyproject.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fastapi-rtk
3
- Version: 1.0.6
3
+ Version: 1.0.7
4
4
  Summary: A package that provides a set of tools to build a FastAPI application with a Class-Based CRUD API.
5
5
  Project-URL: Homepage, https://codeberg.org/datatactics/fastapi-rtk
6
6
  Project-URL: Issues, https://codeberg.org/datatactics/fastapi-rtk/issues
@@ -0,0 +1 @@
1
+ __version__ = "1.0.7"
@@ -1,5 +1,4 @@
1
1
  import asyncio
2
- import copy
3
2
  import csv
4
3
  import enum
5
4
  import re
@@ -256,9 +255,7 @@ class ModelRestApi(BaseApi):
256
255
 
257
256
  Example:
258
257
  ```python
259
- opr_filters = [
260
- [FilterEqualOnNameAndAge],
261
- ]
258
+ opr_filters = [FilterEqualOnNameAndAge]
262
259
  ```
263
260
  """
264
261
  label_columns = lazy(lambda: dict[str, str]())
@@ -2591,12 +2588,18 @@ class ModelRestApi(BaseApi):
2591
2588
  Returns:
2592
2589
  dict: The generated JSONForms schema.
2593
2590
  """
2594
- jsonforms_schema = schema.model_json_schema()
2591
+ cache_key = f"jsonforms_schema_{schema.__name__}"
2592
+ jsonforms_schema = self.cache.get(cache_key)
2593
+ if not jsonforms_schema:
2594
+ self.cache[cache_key] = jsonforms_schema = schema.model_json_schema()
2595
2595
 
2596
2596
  # Remove unused vars
2597
2597
  jsonforms_schema.pop("$defs", None)
2598
2598
 
2599
- for key, value in jsonforms_schema["properties"].items():
2599
+ result = jsonforms_schema.copy()
2600
+ result["properties"] = jsonforms_schema["properties"].copy()
2601
+ for key, value in result["properties"].items():
2602
+ value = value.copy()
2600
2603
  label = self.label_columns.get(key)
2601
2604
  if label:
2602
2605
  value["title"] = label
@@ -2621,7 +2624,7 @@ class ModelRestApi(BaseApi):
2621
2624
  ]
2622
2625
  value["contentMediaType"] = ", ".join(allowed_extensions)
2623
2626
  if self.datamodel.is_files(key) or self.datamodel.is_images(key):
2624
- current_value = copy.deepcopy(value)
2627
+ current_value = value.copy()
2625
2628
  value["type"] = "array"
2626
2629
  value["items"] = current_value
2627
2630
  elif self.datamodel.is_boolean(key):
@@ -2688,9 +2691,9 @@ class ModelRestApi(BaseApi):
2688
2691
  if key in g.sensitive_data.get(self.datamodel.obj.__name__, []):
2689
2692
  value["format"] = "password"
2690
2693
 
2691
- jsonforms_schema["properties"][key] = value
2694
+ result["properties"][key] = value
2692
2695
 
2693
- return jsonforms_schema
2696
+ return result
2694
2697
 
2695
2698
  async def _export_data(
2696
2699
  self,
@@ -34,6 +34,7 @@ LOAD_TYPE_MAPPING = {
34
34
 
35
35
  class LoadColumn(typing.TypedDict):
36
36
  statement: Select[tuple[T]] | _AbstractLoad
37
+ statement_type: typing.Literal["select", "joinedload", "selectinload"] | None
37
38
  type: typing.Literal["defer", "some", "all"]
38
39
  columns: list[str]
39
40
  related_columns: collections.defaultdict[str, "LoadColumn"]
@@ -42,6 +43,7 @@ class LoadColumn(typing.TypedDict):
42
43
  def create_load_column(statement: Select[tuple[T]] | _AbstractLoad | None = None):
43
44
  return LoadColumn(
44
45
  statement=statement,
46
+ statement_type=None,
45
47
  type="defer",
46
48
  columns=[],
47
49
  related_columns=collections.defaultdict(create_load_column),
@@ -104,7 +106,7 @@ class SQLAQueryBuilder(AbstractQueryBuilder[Select[tuple[T]]]):
104
106
  statement = statement.options(cache_option)
105
107
  return statement
106
108
 
107
- load_column = self._load_columns_recursively(statement, list_columns)
109
+ load_column = self._load_columns_recursively(statement, "select", list_columns)
108
110
  logger.debug(f"Load Column:\n{prettify_dict(load_column)}")
109
111
  return self._load_columns_from_dictionary(statement, load_column, list_columns)
110
112
 
@@ -365,27 +367,32 @@ class SQLAQueryBuilder(AbstractQueryBuilder[Select[tuple[T]]]):
365
367
  return statement
366
368
 
367
369
  def _load_columns_recursively(
368
- self, statement: Select[tuple[T]] | _AbstractLoad, columns: list[str]
370
+ self,
371
+ statement: Select[tuple[T]] | _AbstractLoad,
372
+ statement_type: typing.Literal["select", "joinedload", "selectinload"],
373
+ columns: list[str],
369
374
  ):
370
375
  """
371
376
  Load specified columns into the given SQLAlchemy statement. This returns a dictionary that can be used with the `load_columns_from_dictionary` method.
372
377
 
373
378
  Args:
374
379
  statement (Select[tuple[T]] | _AbstractLoad): The SQLAlchemy statement to which the columns will be loaded.
380
+ statement_type (typing.Literal["select", "joinedload", "selectinload"]): The type of statement to use for loading.
375
381
  columns (list[str]): A list of column names to be loaded.
376
382
 
377
383
  Returns:
378
384
  dict: A dictionary that can be used with the `load_columns_from_dictionary` method.
379
385
  """
380
386
  load_column = create_load_column(statement)
387
+ load_column["statement_type"] = statement_type
381
388
  for col in columns:
382
389
  sub_col = ""
383
390
  if "." in col:
384
391
  col, sub_col = col.split(".", 1)
385
392
 
386
- # If it is not a relation, load only the column if it is in the user column list, else skip
393
+ # If it is not a relation, load only the column if it is in the column list, else skip
387
394
  if not self.datamodel.is_relation(col):
388
- if col in self.datamodel.get_user_column_list():
395
+ if col in self.datamodel.get_column_list():
389
396
  load_column["columns"].append(col)
390
397
  load_column["type"] = "some"
391
398
  continue
@@ -393,10 +400,18 @@ class SQLAQueryBuilder(AbstractQueryBuilder[Select[tuple[T]]]):
393
400
  if self.datamodel.is_relation_one_to_one(
394
401
  col
395
402
  ) or self.datamodel.is_relation_many_to_one(col):
403
+ load_column["related_columns"][col]["statement_type"] = (
404
+ load_column["related_columns"][col]["statement_type"]
405
+ or "joinedload"
406
+ )
396
407
  load_column["related_columns"][col]["statement"] = load_column[
397
408
  "related_columns"
398
409
  ][col]["statement"] or joinedload(self.datamodel.obj.load_options(col))
399
410
  else:
411
+ load_column["related_columns"][col]["statement_type"] = (
412
+ load_column["related_columns"][col]["statement_type"]
413
+ or "selectinload"
414
+ )
400
415
  load_column["related_columns"][col]["statement"] = load_column[
401
416
  "related_columns"
402
417
  ][col]["statement"] or selectinload(
@@ -410,7 +425,9 @@ class SQLAQueryBuilder(AbstractQueryBuilder[Select[tuple[T]]]):
410
425
  load_column["related_columns"][col] = deep_merge(
411
426
  load_column["related_columns"][col],
412
427
  interface.query._load_columns_recursively(
413
- load_column["related_columns"][col]["statement"], [sub_col]
428
+ load_column["related_columns"][col]["statement"],
429
+ load_column["related_columns"][col]["statement_type"],
430
+ [sub_col],
414
431
  ),
415
432
  rules={
416
433
  "type": lambda x1, x2: LOAD_TYPE_MAPPING[x2]
@@ -427,8 +444,8 @@ class SQLAQueryBuilder(AbstractQueryBuilder[Select[tuple[T]]]):
427
444
  load_column["related_columns"][col]["type"] = "all"
428
445
  continue
429
446
 
430
- # Skip if the sub column is not in the user column list or if it is a relation
431
- if sub_col not in interface.get_user_column_list() or interface.is_relation(
447
+ # Skip if the sub column is not in the column list or if it is a relation
448
+ if sub_col not in interface.get_column_list() or interface.is_relation(
432
449
  sub_col
433
450
  ):
434
451
  continue
@@ -125,16 +125,18 @@ class Model(sqlalchemy.ext.asyncio.AsyncAttrs, BasicModel, DeclarativeBase):
125
125
  def get_pk_attrs(cls):
126
126
  return [col.name for col in cls.__mapper__.primary_key]
127
127
 
128
- async def load(self, cols: list[str] | str):
128
+ async def load(self, *cols: list[str] | str):
129
129
  """
130
- Asynchronously load the specified columns for the current instance.
130
+ Asynchronously loads the specified columns of the model instance.
131
131
 
132
132
  Args:
133
- cols (list[str] | str): A list of column names to load or a single column name.
133
+ *cols (list[str] | str): The columns to load. Can be a list of strings or individual string arguments.
134
134
  """
135
+ cols = [
136
+ item for col in cols for item in (col if isinstance(col, list) else [col])
137
+ ]
138
+
135
139
  async with AsyncTaskRunner() as runner:
136
- if isinstance(cols, str):
137
- cols = [cols]
138
140
  for col in cols:
139
141
  runner.add_task(getattr(self.awaitable_attrs, col))
140
142
 
@@ -51,7 +51,7 @@ class AbstractBaseOprFilter(AbstractBaseFilter[T]):
51
51
  """
52
52
 
53
53
  @abc.abstractmethod
54
- def apply(self, statement, value) -> T:
54
+ def apply(self, statement: T, value) -> T:
55
55
  """
56
56
  Apply the filter to the given SQLAlchemy Select statement.
57
57
 
@@ -76,7 +76,7 @@ DEFAULT_COOKIE_NAME = "dataTactics"
76
76
  DEFAULT_BASEDIR = "app"
77
77
  DEFAULT_STATIC_FOLDER = DEFAULT_BASEDIR + "/static"
78
78
  DEFAULT_TEMPLATE_FOLDER = DEFAULT_BASEDIR + "/templates"
79
- DEFAULT_PROFILER_FOLDER = DEFAULT_STATIC_FOLDER + "/profiles"
79
+ DEFAULT_PROFILER_FOLDER = DEFAULT_STATIC_FOLDER + "/profiler"
80
80
  DEFAULT_LANG_FOLDER = DEFAULT_BASEDIR + "/lang"
81
81
  DEFAULT_LANGUAGES = "en,de"
82
82
  DEFAULT_TRANSLATIONS_KEY = "translations"
@@ -1,6 +1,6 @@
1
1
  import fastapi
2
2
 
3
- __al__ = ["SelfDepends", "SelfType"]
3
+ __all__ = ["SelfDepends", "SelfType"]
4
4
 
5
5
 
6
6
  class BaseSelf:
@@ -1 +0,0 @@
1
- __version__ = "1.0.6"
File without changes
File without changes
File without changes
File without changes