fastapi-rtk 2.3.2__tar.gz → 2.3.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.
Files changed (303) hide show
  1. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/PKG-INFO +1 -1
  2. fastapi_rtk-2.3.3/fastapi_rtk/_version.py +1 -0
  3. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/api/base_api.py +8 -9
  4. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/api/model_rest_api/__init__.py +47 -24
  5. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/api/model_rest_api/_add_mixin.py +3 -21
  6. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/api/model_rest_api/_bulk_mixin.py +7 -13
  7. fastapi_rtk-2.3.2/fastapi_rtk/api/model_rest_api/_columns.py → fastapi_rtk-2.3.3/fastapi_rtk/api/model_rest_api/_columns_mixin.py +11 -20
  8. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/api/model_rest_api/_delete_mixin.py +4 -19
  9. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/api/model_rest_api/_download_mixin.py +6 -20
  10. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/api/model_rest_api/_edit_mixin.py +5 -30
  11. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/api/model_rest_api/_file_mixin.py +14 -17
  12. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/api/model_rest_api/_info_mixin.py +13 -72
  13. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/api/model_rest_api/_list_mixin.py +2 -15
  14. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/api/model_rest_api/_params.py +5 -5
  15. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/api/model_rest_api/_show_mixin.py +4 -24
  16. fastapi_rtk-2.3.3/fastapi_rtk/api/model_rest_api/_typed_base.py +179 -0
  17. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/auth/auth.py +82 -71
  18. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/auth/hashers/pbkdf2.py +7 -7
  19. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/auth/hashers/scrypt.py +7 -7
  20. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/auth/password_helpers/fab.py +8 -6
  21. fastapi_rtk-2.3.3/fastapi_rtk/auth/strategies/config.py +25 -0
  22. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/auth/strategies/db.py +47 -32
  23. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/auth/strategies/jwt.py +5 -5
  24. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/generic/column.py +5 -11
  25. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/generic/exceptions.py +2 -2
  26. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/generic/filters.py +17 -9
  27. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/generic/interface.py +4 -4
  28. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/generic/session.py +4 -4
  29. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/sqla/db.py +34 -20
  30. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/sqla/extensions/geoalchemy2/filters.py +51 -21
  31. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/sqla/filters.py +19 -16
  32. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/sqla/interface.py +85 -52
  33. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/sqla/model.py +32 -26
  34. fastapi_rtk-2.3.3/fastapi_rtk/backends/sqla/session.py +32 -0
  35. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/cli.py +6 -7
  36. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/commands/_security_crypto.py +11 -7
  37. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/commands/db/__init__.py +103 -85
  38. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/commands/security.py +87 -79
  39. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/commands/translate.py +9 -9
  40. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/decorators.py +7 -7
  41. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/utils.py +13 -8
  42. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/config.py +2 -2
  43. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/const.py +3 -3
  44. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/db.py +676 -671
  45. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/decorators.py +28 -27
  46. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/dependencies.py +7 -8
  47. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/fastapi_react_toolkit.py +63 -36
  48. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/file_managers/file_manager.py +2 -2
  49. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/globals.py +30 -29
  50. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/lang/babel/cli.py +2 -2
  51. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/manager.py +71 -60
  52. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/middlewares.py +24 -24
  53. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/routers.py +183 -137
  54. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/schemas.py +47 -50
  55. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/security/sqla/apis.py +17 -15
  56. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/security/sqla/models.py +108 -60
  57. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/security/sqla/security_manager/_export.py +4 -4
  58. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/security/sqla/security_manager/_user_mixin.py +5 -5
  59. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/types.py +7 -7
  60. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/run_utils.py +7 -5
  61. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/sqla.py +3 -3
  62. fastapi_rtk-2.3.3/fastapi_rtk/utils/timezone.py +19 -0
  63. fastapi_rtk-2.3.3/tests/integration/apis/test_info_callable_schema.py +102 -0
  64. fastapi_rtk-2.3.3/tests/unit/api/model_rest_api/test_typed_base_consistency.py +104 -0
  65. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/cli/commands/conftest.py +3 -1
  66. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/cli/test_decorators.py +11 -11
  67. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/lang/test_babel_cli.py +4 -4
  68. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_middlewares.py +3 -4
  69. fastapi_rtk-2.3.2/fastapi_rtk/_version.py +0 -1
  70. fastapi_rtk-2.3.2/fastapi_rtk/auth/strategies/config.py +0 -24
  71. fastapi_rtk-2.3.2/fastapi_rtk/backends/sqla/session.py +0 -29
  72. fastapi_rtk-2.3.2/fastapi_rtk/utils/timezone.py +0 -19
  73. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/.gitignore +0 -0
  74. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/LICENSE +0 -0
  75. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/README.md +0 -0
  76. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/__init__.py +0 -0
  77. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/api/__init__.py +0 -0
  78. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/api/model_rest_api/_upload_mixin.py +0 -0
  79. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/apis/__init__.py +0 -0
  80. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/apis/info.py +0 -0
  81. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/apis/license.py +0 -0
  82. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/auth/__init__.py +0 -0
  83. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/auth/hashers/__init__.py +0 -0
  84. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/auth/ldap.py +0 -0
  85. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/auth/password_helpers/__init__.py +0 -0
  86. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/auth/strategies/__init__.py +0 -0
  87. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/__init__.py +0 -0
  88. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/generic/__init__.py +0 -0
  89. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/generic/db.py +0 -0
  90. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/generic/model.py +0 -0
  91. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/sqla/__init__.py +0 -0
  92. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/sqla/column.py +0 -0
  93. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/sqla/exceptions.py +0 -0
  94. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/sqla/extensions/__init__.py +0 -0
  95. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/sqla/extensions/audit/__init__.py +0 -0
  96. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/sqla/extensions/audit/_decorators_mixin.py +0 -0
  97. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/sqla/extensions/audit/_lifecycle_mixin.py +0 -0
  98. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/sqla/extensions/audit/_logger.py +0 -0
  99. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/sqla/extensions/audit/_processing_mixin.py +0 -0
  100. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/sqla/extensions/audit/audit.py +0 -0
  101. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/sqla/extensions/audit/types.py +0 -0
  102. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/sqla/extensions/geoalchemy2/__init__.py +0 -0
  103. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/sqla/extensions/geoalchemy2/geometry_converter.py +0 -0
  104. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/bases/__init__.py +0 -0
  105. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/bases/db.py +0 -0
  106. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/bases/file_manager.py +0 -0
  107. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/bases/filter.py +0 -0
  108. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/bases/interface.py +0 -0
  109. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/bases/model.py +0 -0
  110. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/bases/session.py +0 -0
  111. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/__init__.py +0 -0
  112. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/commands/__init__.py +0 -0
  113. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/commands/db/templates/fastapi/README +0 -0
  114. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/commands/db/templates/fastapi/alembic.ini.mako +0 -0
  115. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/commands/db/templates/fastapi/env.py +0 -0
  116. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/commands/db/templates/fastapi/script.py.mako +0 -0
  117. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/commands/db/templates/fastapi-multidb/README +0 -0
  118. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/commands/db/templates/fastapi-multidb/alembic.ini.mako +0 -0
  119. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/commands/db/templates/fastapi-multidb/env.py +0 -0
  120. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/commands/db/templates/fastapi-multidb/script.py.mako +0 -0
  121. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/commands/export.py +0 -0
  122. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/const.py +0 -0
  123. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/types.py +0 -0
  124. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/exceptions.py +0 -0
  125. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/file_managers/__init__.py +0 -0
  126. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/file_managers/image_manager.py +0 -0
  127. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/file_managers/s3_file_manager.py +0 -0
  128. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/file_managers/s3_image_manager.py +0 -0
  129. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/filters.py +0 -0
  130. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/lang/__init__.py +0 -0
  131. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/lang/babel/__init__.py +0 -0
  132. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/lang/babel/config.py +0 -0
  133. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/lang/babel.cfg +0 -0
  134. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/lang/lazy_text.py +0 -0
  135. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/lang/messages.pot +0 -0
  136. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/lang/translations/de/LC_MESSAGES/messages.mo +0 -0
  137. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/lang/translations/de/LC_MESSAGES/messages.po +0 -0
  138. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/lang/translations/en/LC_MESSAGES/messages.mo +0 -0
  139. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/lang/translations/en/LC_MESSAGES/messages.po +0 -0
  140. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/mixins.py +0 -0
  141. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/models.py +0 -0
  142. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/py.typed +0 -0
  143. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/registry.py +0 -0
  144. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/security/__init__.py +0 -0
  145. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/security/sqla/__init__.py +0 -0
  146. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/security/sqla/security_manager/__init__.py +0 -0
  147. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/security/sqla/security_manager/_association_mixin.py +0 -0
  148. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/security/sqla/security_manager/_builtin_role_mixin.py +0 -0
  149. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/security/sqla/security_manager/_cleanup_mixin.py +0 -0
  150. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/security/sqla/security_manager/_exception_filters.py +0 -0
  151. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/security/sqla/security_manager/_import.py +0 -0
  152. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/security/sqla/security_manager/_role_mixin.py +0 -0
  153. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/setting.py +0 -0
  154. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/__init__.py +0 -0
  155. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/async_task_runner.py +0 -0
  156. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/class_factory.py +0 -0
  157. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/csv_json_converter.py +0 -0
  158. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/deep_merge.py +0 -0
  159. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/extender_mixin.py +0 -0
  160. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/flask_appbuilder_utils.py +0 -0
  161. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/formatter.py +0 -0
  162. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/hooks.py +0 -0
  163. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/lazy.py +0 -0
  164. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/merge_schema.py +0 -0
  165. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/multiple_async_contexts.py +0 -0
  166. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/pydantic.py +0 -0
  167. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/self_dependencies.py +0 -0
  168. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/smartdefaultdict.py +0 -0
  169. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/update_signature.py +0 -0
  170. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/use_default_when_none.py +0 -0
  171. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/version.py +0 -0
  172. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/pyproject.toml +0 -0
  173. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/conftest.py +0 -0
  174. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/docker-compose.gis.yml +0 -0
  175. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/integration/__init__.py +0 -0
  176. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/integration/api/__init__.py +0 -0
  177. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/integration/api/test_model_rest_api.py +0 -0
  178. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/integration/apis/__init__.py +0 -0
  179. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/integration/apis/test_info_contract.py +0 -0
  180. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/integration/auth/__init__.py +0 -0
  181. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/integration/auth/test_auth_flow.py +0 -0
  182. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/integration/auth/test_oauth.py +0 -0
  183. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/integration/conftest.py +0 -0
  184. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/integration/file_managers/__init__.py +0 -0
  185. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/integration/file_managers/test_file_routes.py +0 -0
  186. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/integration/security/__init__.py +0 -0
  187. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/integration/security/sqla/__init__.py +0 -0
  188. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/integration/security/sqla/test_security_manager.py +0 -0
  189. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/integration/test_app_smoke.py +0 -0
  190. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/__init__.py +0 -0
  191. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/api/__init__.py +0 -0
  192. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/api/conftest.py +0 -0
  193. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/api/model_rest_api/__init__.py +0 -0
  194. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/api/model_rest_api/test_columns.py +0 -0
  195. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/api/model_rest_api/test_file_mixin.py +0 -0
  196. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/api/model_rest_api/test_init.py +0 -0
  197. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/api/test_base_api.py +0 -0
  198. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/apis/__init__.py +0 -0
  199. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/apis/test_info.py +0 -0
  200. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/apis/test_license.py +0 -0
  201. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/auth/__init__.py +0 -0
  202. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/auth/hashers/__init__.py +0 -0
  203. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/auth/hashers/test_pbkdf2.py +0 -0
  204. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/auth/hashers/test_scrypt.py +0 -0
  205. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/auth/password_helpers/__init__.py +0 -0
  206. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/auth/password_helpers/test_fab.py +0 -0
  207. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/auth/strategies/__init__.py +0 -0
  208. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/auth/strategies/test_config.py +0 -0
  209. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/auth/strategies/test_db.py +0 -0
  210. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/auth/strategies/test_jwt.py +0 -0
  211. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/auth/test_auth.py +0 -0
  212. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/__init__.py +0 -0
  213. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/generic/__init__.py +0 -0
  214. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/generic/test_column.py +0 -0
  215. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/generic/test_db.py +0 -0
  216. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/generic/test_exceptions.py +0 -0
  217. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/generic/test_filters.py +0 -0
  218. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/generic/test_interface.py +0 -0
  219. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/generic/test_model.py +0 -0
  220. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/generic/test_session.py +0 -0
  221. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/sqla/__init__.py +0 -0
  222. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/sqla/conftest.py +0 -0
  223. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/sqla/test_audit.py +0 -0
  224. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/sqla/test_audit_types.py +0 -0
  225. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/sqla/test_column.py +0 -0
  226. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/sqla/test_db.py +0 -0
  227. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/sqla/test_filters.py +0 -0
  228. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/sqla/test_geoalchemy2.py +0 -0
  229. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/sqla/test_interface.py +0 -0
  230. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/sqla/test_model.py +0 -0
  231. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/sqla/test_session.py +0 -0
  232. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/bases/__init__.py +0 -0
  233. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/bases/test_db.py +0 -0
  234. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/bases/test_file_manager.py +0 -0
  235. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/bases/test_filter.py +0 -0
  236. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/bases/test_interface.py +0 -0
  237. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/bases/test_model.py +0 -0
  238. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/bases/test_session.py +0 -0
  239. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/cli/__init__.py +0 -0
  240. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/cli/commands/__init__.py +0 -0
  241. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/cli/commands/test_db.py +0 -0
  242. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/cli/commands/test_export.py +0 -0
  243. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/cli/commands/test_security.py +0 -0
  244. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/cli/commands/test_security_crypto.py +0 -0
  245. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/cli/commands/test_translate.py +0 -0
  246. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/cli/conftest.py +0 -0
  247. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/cli/test_cli.py +0 -0
  248. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/cli/test_types.py +0 -0
  249. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/cli/test_utils.py +0 -0
  250. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/file_managers/__init__.py +0 -0
  251. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/file_managers/conftest.py +0 -0
  252. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/file_managers/test_file_manager.py +0 -0
  253. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/file_managers/test_image_manager.py +0 -0
  254. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/file_managers/test_s3_file_manager.py +0 -0
  255. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/file_managers/test_s3_image_manager.py +0 -0
  256. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/lang/__init__.py +0 -0
  257. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/lang/test_babel_config.py +0 -0
  258. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/lang/test_lazy_text.py +0 -0
  259. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/security/__init__.py +0 -0
  260. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/security/sqla/__init__.py +0 -0
  261. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/security/sqla/conftest.py +0 -0
  262. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/security/sqla/test_apis.py +0 -0
  263. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/security/sqla/test_models.py +0 -0
  264. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/security/sqla/test_security_manager.py +0 -0
  265. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_config.py +0 -0
  266. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_const.py +0 -0
  267. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_db.py +0 -0
  268. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_decorators.py +0 -0
  269. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_dependencies.py +0 -0
  270. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_exceptions.py +0 -0
  271. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_fastapi_react_toolkit.py +0 -0
  272. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_filters.py +0 -0
  273. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_globals.py +0 -0
  274. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_manager.py +0 -0
  275. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_mixins.py +0 -0
  276. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_models.py +0 -0
  277. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_registry.py +0 -0
  278. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_routers.py +0 -0
  279. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_schemas.py +0 -0
  280. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_setting.py +0 -0
  281. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_types.py +0 -0
  282. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_version.py +0 -0
  283. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/__init__.py +0 -0
  284. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_async_task_runner.py +0 -0
  285. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_class_factory.py +0 -0
  286. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_csv_json_converter.py +0 -0
  287. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_deep_merge.py +0 -0
  288. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_extender_mixin.py +0 -0
  289. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_flask_appbuilder_utils.py +0 -0
  290. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_formatter.py +0 -0
  291. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_hooks.py +0 -0
  292. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_lazy.py +0 -0
  293. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_merge_schema.py +0 -0
  294. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_multiple_async_contexts.py +0 -0
  295. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_pydantic.py +0 -0
  296. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_run_utils.py +0 -0
  297. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_self_dependencies.py +0 -0
  298. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_smartdefaultdict.py +0 -0
  299. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_sqla.py +0 -0
  300. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_timezone.py +0 -0
  301. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_update_signature.py +0 -0
  302. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_use_default_when_none.py +0 -0
  303. {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fastapi-rtk
3
- Version: 2.3.2
3
+ Version: 2.3.3
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__ = "2.3.3"
@@ -1,14 +1,13 @@
1
1
  import typing
2
- from typing import TYPE_CHECKING, Any, Dict
3
2
 
4
- from fastapi import APIRouter, Depends
3
+ import fastapi
5
4
 
6
5
  from ..const import PERMISSION_PREFIX, logger
7
6
  from ..registry import APIRouteRegistry
8
7
  from ..utils import T, lazy_self, update_signature
9
8
  from ..utils import lazy as o_lazy
10
9
 
11
- if TYPE_CHECKING:
10
+ if typing.TYPE_CHECKING:
12
11
  from ..fastapi_react_toolkit import FastAPIReactToolkit
13
12
 
14
13
  __all__ = ["BaseApi"]
@@ -103,14 +102,14 @@ class BaseApi:
103
102
  """
104
103
  The FastAPIReactToolkit object. Automatically set when the API is added to the toolkit.
105
104
  """
106
- cache: Dict[str, Any] = lazy(lambda self: dict())
105
+ cache: typing.Dict[str, typing.Any] = lazy(lambda self: dict())
107
106
  """
108
107
  The cache for the API.
109
108
 
110
109
  DO NOT MODIFY.
111
110
  """
112
111
  router = lazy(
113
- lambda self: APIRouter(
112
+ lambda self: fastapi.APIRouter(
114
113
  prefix=f"/api/{self.version}/{self.resource_name}",
115
114
  tags=[self.__class__.__name__],
116
115
  )
@@ -139,7 +138,7 @@ class BaseApi:
139
138
  """
140
139
  pass
141
140
 
142
- def integrate_router(self, app: APIRouter):
141
+ def integrate_router(self, app: fastapi.APIRouter):
143
142
  """
144
143
  Integrates the router into the FastAPI app.
145
144
 
@@ -157,7 +156,7 @@ class BaseApi:
157
156
  if self.toolkit.global_user_dependency and not ignore_g_user:
158
157
  from ..dependencies import set_global_user
159
158
 
160
- rest_data["dependencies"] = [Depends(set_global_user())] + (
159
+ rest_data["dependencies"] = [fastapi.Depends(set_global_user())] + (
161
160
  rest_data.get("dependencies") or []
162
161
  )
163
162
 
@@ -213,10 +212,10 @@ class BaseApi:
213
212
  else:
214
213
  resolved_kwargs[key] = val
215
214
  resolved_dependencies.append(
216
- Depends(func(**resolved_kwargs))
215
+ fastapi.Depends(func(**resolved_kwargs))
217
216
  )
218
217
  else:
219
- resolved_dependencies.append(Depends(func))
218
+ resolved_dependencies.append(fastapi.Depends(func))
220
219
 
221
220
  path, methods, rest_data = (
222
221
  data["path"],
@@ -27,8 +27,6 @@ import typing
27
27
 
28
28
  import fastapi
29
29
  import pydantic
30
- from fastapi import Depends
31
- from pydantic import BaseModel, Field
32
30
 
33
31
  from ...backends.sqla.filters import BaseFilter, BaseOprFilter
34
32
  from ...backends.sqla.interface import SQLAInterface
@@ -52,7 +50,7 @@ from ...utils import T, lazy_self, merge_schema
52
50
  from ..base_api import BaseApi
53
51
  from ._add_mixin import AddMixin
54
52
  from ._bulk_mixin import BulkMixin
55
- from ._columns import ColumnsMixin
53
+ from ._columns_mixin import ColumnsMixin
56
54
  from ._delete_mixin import DeleteMixin
57
55
  from ._download_mixin import DownloadMixin
58
56
  from ._edit_mixin import EditMixin
@@ -275,9 +273,9 @@ class ModelRestApi(
275
273
  {
276
274
  "order_column": (
277
275
  self.order_column_enum | None,
278
- Field(default=None),
276
+ pydantic.Field(default=None),
279
277
  ),
280
- "page_size": (int | None, Field(default=self.page_size)),
278
+ "page_size": (int | None, pydantic.Field(default=self.page_size)),
281
279
  },
282
280
  True,
283
281
  f"{self.__class__.__name__}-QuerySchema",
@@ -292,8 +290,11 @@ class ModelRestApi(
292
290
  lambda self: merge_schema(
293
291
  QueryBody,
294
292
  {
295
- "order_column": (self.order_column_enum | None, Field(default=None)),
296
- "page_size": (int | None, Field(default=self.page_size)),
293
+ "order_column": (
294
+ self.order_column_enum | None,
295
+ pydantic.Field(default=None),
296
+ ),
297
+ "page_size": (int | None, pydantic.Field(default=self.page_size)),
297
298
  },
298
299
  True,
299
300
  f"{self.__class__.__name__}-DownloadBodySchema",
@@ -422,24 +423,38 @@ class ModelRestApi(
422
423
  lambda self: merge_schema(
423
424
  InfoResponse,
424
425
  {
425
- "add_title": (str, Field(default_factory=lambda: self.add_title)),
426
- "edit_title": (str, Field(default_factory=lambda: self.edit_title)),
427
- "filter_options": (dict, Field(default={})),
426
+ "add_title": (
427
+ str,
428
+ pydantic.Field(default_factory=lambda: self.add_title),
429
+ ),
430
+ "edit_title": (
431
+ str,
432
+ pydantic.Field(default_factory=lambda: self.edit_title),
433
+ ),
434
+ "filter_options": (dict, pydantic.Field(default={})),
428
435
  "add_translations": (
429
436
  dict,
430
- Field(default_factory=lambda: self.add_jsonforms_translations),
437
+ pydantic.Field(
438
+ default_factory=lambda: self.add_jsonforms_translations
439
+ ),
431
440
  ),
432
441
  "edit_translations": (
433
442
  dict,
434
- Field(default_factory=lambda: self.edit_jsonforms_translations),
443
+ pydantic.Field(
444
+ default_factory=lambda: self.edit_jsonforms_translations
445
+ ),
435
446
  ),
436
447
  "add_type": (
437
448
  typing.Literal["json"] | typing.Literal["form"],
438
- Field(default="form" if self._is_form_data_add else "json"),
449
+ pydantic.Field(
450
+ default="form" if self._is_form_data_add else "json"
451
+ ),
439
452
  ),
440
453
  "edit_type": (
441
454
  typing.Literal["json"] | typing.Literal["form"],
442
- Field(default="form" if self._is_form_data_edit else "json"),
455
+ pydantic.Field(
456
+ default="form" if self._is_form_data_edit else "json"
457
+ ),
443
458
  ),
444
459
  },
445
460
  name=f"{self.__class__.__name__}-InfoResponse",
@@ -646,9 +661,13 @@ class ModelRestApi(
646
661
  -------------
647
662
  """
648
663
 
649
- add_jsonforms_schema: typing.Dict[str, typing.Any] | None = None
664
+ add_jsonforms_schema: (
665
+ dict[str, typing.Any]
666
+ | typing.Callable[[], dict | typing.Awaitable[dict]]
667
+ | None
668
+ ) = None
650
669
  """
651
- The `JSONForms` schema for the add endpoint. If not provided, Defaults to the schema generated from the `add_columns` property.
670
+ The `JSONForms` schema for the add endpoint. If not provided, Defaults to the schema generated from the `add_columns` property. May also be a sync or async callable returning the schema, resolved via `smart_run`.
652
671
  """
653
672
  add_jsonforms_uischema: typing.Dict[str, typing.Any] | None = None
654
673
  """
@@ -688,9 +707,13 @@ class ModelRestApi(
688
707
  A workaround for issue https://github.com/eclipsesource/jsonforms/issues/2271
689
708
  """
690
709
 
691
- edit_jsonforms_schema: typing.Dict[str, typing.Any] | None = None
710
+ edit_jsonforms_schema: (
711
+ dict[str, typing.Any]
712
+ | typing.Callable[[], dict | typing.Awaitable[dict]]
713
+ | None
714
+ ) = None
692
715
  """
693
- The `JSONForms` schema for the edit endpoint. If not provided, Defaults to the schema generated from the `edit_columns` property.
716
+ The `JSONForms` schema for the edit endpoint. If not provided, Defaults to the schema generated from the `edit_columns` property. May also be a sync or async callable returning the schema, resolved via `smart_run`.
694
717
  """
695
718
  edit_jsonforms_uischema: typing.Dict[str, typing.Any] | None = None
696
719
  """
@@ -800,7 +823,7 @@ class ModelRestApi(
800
823
  -------------
801
824
  """
802
825
 
803
- add_schema: typing.Type[BaseModel] = lazy(
826
+ add_schema: typing.Type[pydantic.BaseModel] = lazy(
804
827
  lambda self: typing.Annotated[
805
828
  self._create_request_schema(
806
829
  merge_schema(
@@ -820,7 +843,7 @@ class ModelRestApi(
820
843
 
821
844
  DO NOT MODIFY UNLESS YOU KNOW WHAT YOU ARE DOING.
822
845
  """
823
- edit_schema: typing.Type[BaseModel] = lazy(
846
+ edit_schema: typing.Type[pydantic.BaseModel] = lazy(
824
847
  lambda self: typing.Annotated[
825
848
  self._create_request_schema(
826
849
  merge_schema(
@@ -851,7 +874,7 @@ class ModelRestApi(
851
874
  ```python
852
875
  add_schema_extra_fields = {
853
876
  "extra_field": str,
854
- "extra_field_with_field_info": (str, Field(default="default_value")),
877
+ "extra_field_with_field_info": (str, pydantic.Field(default="default_value")),
855
878
  }
856
879
  ```
857
880
  """
@@ -865,7 +888,7 @@ class ModelRestApi(
865
888
  ```python
866
889
  edit_schema_extra_fields = {
867
890
  "extra_field": str,
868
- "extra_field_with_field_info": (str, Field(default="default_value")),
891
+ "extra_field_with_field_info": (str, pydantic.Field(default="default_value")),
869
892
  }
870
893
  ```
871
894
  """
@@ -1103,8 +1126,8 @@ class ModelRestApi(
1103
1126
  """
1104
1127
 
1105
1128
  async def dependency(
1106
- q: self.query_schema = Depends(), # type: ignore
1107
- session=Depends(self.datamodel.get_session_factory()),
1129
+ q: self.query_schema = fastapi.Depends(), # type: ignore
1130
+ session=fastapi.Depends(self.datamodel.get_session_factory()),
1108
1131
  ):
1109
1132
  q: QuerySchema = q
1110
1133
  if not self.list_query_count_enabled or not q.with_count:
@@ -6,36 +6,18 @@ implementation, ``pre_add`` and ``post_add`` hooks.
6
6
  import typing
7
7
 
8
8
  import pydantic
9
- from pydantic import BaseModel
10
9
 
11
- from ...backends.sqla.filters import BaseFilter
12
- from ...backends.sqla.interface import SQLAInterface
13
10
  from ...backends.sqla.model import Model
14
11
  from ...backends.sqla.session import SQLASession
15
- from ...const import AVAILABLE_ROUTES
16
12
  from ...decorators import expose, permission_name, priority, protect
17
- from ...schemas import BaseResponseSingle
18
13
  from ...utils import AsyncTaskRunner, SelfDepends, SelfType, smart_run
19
14
  from ._params import PARAM_BODY_SESSION
15
+ from ._typed_base import _TypedModelRestApi
20
16
 
21
17
 
22
- class AddMixin:
18
+ class AddMixin(_TypedModelRestApi):
23
19
  """Add endpoint methods for ``ModelRestApi``."""
24
20
 
25
- if typing.TYPE_CHECKING:
26
- # Attributes supplied by the composed ``ModelRestApi`` class via MRO.
27
- datamodel: SQLAInterface
28
- expose_params: dict[AVAILABLE_ROUTES, dict[str, typing.Any]]
29
- add_return_schema: typing.Type[BaseResponseSingle]
30
- add_query_rel_fields: dict[
31
- str, list[tuple[str, typing.Type[BaseFilter], typing.Any]]
32
- ]
33
- add_schema_extra_fields: dict[
34
- str, type | tuple[type, pydantic.fields.FieldInfo]
35
- ]
36
- add_schema: typing.Type[BaseModel]
37
- protected_routes: typing.List[AVAILABLE_ROUTES]
38
-
39
21
  def post(self):
40
22
  """
41
23
  Post endpoint for the API.
@@ -54,7 +36,7 @@ class AddMixin:
54
36
 
55
37
  async def post_headless(
56
38
  self,
57
- body: BaseModel = SelfType().add_schema,
39
+ body: pydantic.BaseModel = SelfType().add_schema,
58
40
  session: SQLASession = SelfDepends().datamodel.get_session_factory,
59
41
  ):
60
42
  """
@@ -6,24 +6,18 @@ dispatcher, and the subclass-overridable ``bulk_handler``.
6
6
  import typing
7
7
 
8
8
  import fastapi
9
- from fastapi import Body, HTTPException, Response
10
9
 
11
10
  from ...backends.sqla.interface import SQLAInterface
12
11
  from ...backends.sqla.session import SQLASession
13
- from ...const import AVAILABLE_ROUTES, ErrorCode
12
+ from ...const import ErrorCode
14
13
  from ...decorators import expose, permission_name, priority, protect
15
14
  from ...utils import AsyncTaskRunner, SelfDepends, smart_run
15
+ from ._typed_base import _TypedModelRestApi
16
16
 
17
17
 
18
- class BulkMixin:
18
+ class BulkMixin(_TypedModelRestApi):
19
19
  """Bulk endpoint methods for ``ModelRestApi``."""
20
20
 
21
- if typing.TYPE_CHECKING:
22
- # Attributes supplied by the composed ``ModelRestApi`` class via MRO.
23
- datamodel: SQLAInterface
24
- expose_params: dict[AVAILABLE_ROUTES, dict[str, typing.Any]]
25
- protected_routes: typing.List[AVAILABLE_ROUTES]
26
-
27
21
  def bulk(self):
28
22
  """
29
23
  Bulk endpoint for the API.
@@ -42,7 +36,7 @@ class BulkMixin:
42
36
  async def bulk_headless(
43
37
  self,
44
38
  handler: str,
45
- body: dict | list = Body(...),
39
+ body: dict | list = fastapi.Body(...),
46
40
  session: SQLASession = SelfDepends().datamodel.get_session_factory,
47
41
  ):
48
42
  """
@@ -64,20 +58,20 @@ class BulkMixin:
64
58
  self, f"bulk_{handler}", None
65
59
  )
66
60
  if not bulk_handler:
67
- raise HTTPException(
61
+ raise fastapi.HTTPException(
68
62
  fastapi.status.HTTP_404_NOT_FOUND, ErrorCode.HANDLER_NOT_FOUND
69
63
  )
70
64
  try:
71
65
  return await smart_run(bulk_handler, body, self.datamodel, session)
72
66
  except NotImplementedError as e:
73
- raise HTTPException(fastapi.status.HTTP_404_NOT_FOUND, str(e))
67
+ raise fastapi.HTTPException(fastapi.status.HTTP_404_NOT_FOUND, str(e))
74
68
 
75
69
  async def bulk_handler(
76
70
  self,
77
71
  body: dict | list,
78
72
  query: SQLAInterface,
79
73
  session: SQLASession,
80
- ) -> Response:
74
+ ) -> fastapi.Response:
81
75
  """
82
76
  Bulk handler for the API, to be implemented by the subclass.
83
77
 
@@ -26,7 +26,6 @@ import typing
26
26
 
27
27
  import fastapi
28
28
  import pydantic
29
- from pydantic import BaseModel, Field, create_model
30
29
 
31
30
  from ...backends.sqla.filters import BaseFilter
32
31
  from ...backends.sqla.interface import SQLAInterface
@@ -45,22 +44,14 @@ from ...utils import (
45
44
  parse_from_values_or_func,
46
45
  smart_run,
47
46
  )
47
+ from ._typed_base import _TypedModelRestApi
48
48
 
49
49
 
50
- class ColumnsMixin:
50
+ class ColumnsMixin(_TypedModelRestApi):
51
51
  """
52
52
  Column / schema / body helpers shared by every ``ModelRestApi`` route.
53
53
  """
54
54
 
55
- if typing.TYPE_CHECKING:
56
- # Attributes supplied by the composed ``ModelRestApi`` class via MRO.
57
- # Declared type-only so checkers resolve ``self.attr`` references
58
- # inside the mixin without populating runtime ``__annotations__``.
59
- datamodel: SQLAInterface
60
- label_columns: dict[str, str]
61
- description_columns: dict[str, str]
62
- cache: dict[str, typing.Any]
63
-
64
55
  def _gen_labels_columns(self, list_columns: typing.List[str]) -> None:
65
56
  """
66
57
  Auto generates pretty label_columns from list of columns
@@ -152,7 +143,7 @@ class ColumnsMixin:
152
143
 
153
144
  result[key] = (
154
145
  value,
155
- Field(**{"default": None} if is_nullable else {}),
146
+ pydantic.Field(**{"default": None} if is_nullable else {}),
156
147
  )
157
148
  else:
158
149
  result[key] = value
@@ -178,8 +169,8 @@ class ColumnsMixin:
178
169
 
179
170
  def _create_request_schema(
180
171
  self,
181
- schema: typing.Type[BaseModel],
182
- optional=False,
172
+ schema: typing.Type[pydantic.BaseModel],
173
+ optional: bool = False,
183
174
  name: str | None = None,
184
175
  ):
185
176
  """
@@ -220,7 +211,7 @@ class ColumnsMixin:
220
211
  )
221
212
  rel_schema[col] = (
222
213
  type,
223
- Field(**params),
214
+ pydantic.Field(**params),
224
215
  )
225
216
  else:
226
217
  if not optional:
@@ -247,11 +238,11 @@ class ColumnsMixin:
247
238
  related_interface = self.datamodel.get_related_interface(col)
248
239
  rel_schema[col] = (
249
240
  type,
250
- Field(**params),
241
+ pydantic.Field(**params),
251
242
  )
252
243
 
253
244
  new_schema_name = f"{self.__class__.__name__}-{schema.__name__}"
254
- new_schema = create_model(
245
+ new_schema = pydantic.create_model(
255
246
  name or new_schema_name,
256
247
  **rel_schema,
257
248
  __base__=schema,
@@ -262,7 +253,7 @@ class ColumnsMixin:
262
253
  async def _process_body(
263
254
  self,
264
255
  session: SQLASession,
265
- body: BaseModel | typing.Dict[str, typing.Any],
256
+ body: pydantic.BaseModel | typing.Dict[str, typing.Any],
266
257
  filter_dict: dict[str, list[tuple[str, BaseFilter, typing.Any]]],
267
258
  exclude: list[str] | None = None,
268
259
  *,
@@ -286,7 +277,7 @@ class ColumnsMixin:
286
277
  """
287
278
  body_json = (
288
279
  body.model_dump(exclude_unset=True, exclude=exclude)
289
- if isinstance(body, BaseModel)
280
+ if isinstance(body, pydantic.BaseModel)
290
281
  else body
291
282
  )
292
283
  new_body = {}
@@ -530,7 +521,7 @@ class ColumnsMixin:
530
521
 
531
522
  def _generate_jsonforms_schema(
532
523
  self,
533
- schema: type[BaseModel],
524
+ schema: type[pydantic.BaseModel],
534
525
  info_columns: list[ColumnInfo | ColumnEnumInfo | ColumnRelationInfo],
535
526
  use_enum: bool
536
527
  | typing.Callable[[ColumnInfo | ColumnEnumInfo | ColumnRelationInfo], bool]
@@ -6,35 +6,20 @@ implementation, ``pre_delete`` and ``post_delete`` hooks.
6
6
  import typing
7
7
 
8
8
  import fastapi
9
- from fastapi import HTTPException
10
9
 
11
- from ...backends.sqla.filters import BaseFilter, BaseOprFilter
12
- from ...backends.sqla.interface import SQLAInterface
13
10
  from ...backends.sqla.model import Model
14
11
  from ...backends.sqla.session import SQLASession
15
- from ...const import AVAILABLE_ROUTES, ErrorCode
12
+ from ...const import ErrorCode
16
13
  from ...decorators import expose, permission_name, priority, protect
17
14
  from ...schemas import GeneralResponse
18
15
  from ...utils import AsyncTaskRunner, SelfDepends, SelfType, smart_run
19
16
  from ._params import PARAM_ID_SESSION
17
+ from ._typed_base import _TypedModelRestApi
20
18
 
21
19
 
22
- class DeleteMixin:
20
+ class DeleteMixin(_TypedModelRestApi):
23
21
  """Delete endpoint methods for ``ModelRestApi``."""
24
22
 
25
- if typing.TYPE_CHECKING:
26
- # Attributes supplied by the composed ``ModelRestApi`` class via MRO.
27
- datamodel: SQLAInterface
28
- expose_params: dict[AVAILABLE_ROUTES, dict[str, typing.Any]]
29
- protected_routes: typing.List[AVAILABLE_ROUTES]
30
- show_select_columns: list[str]
31
- base_filters: (
32
- typing.List[typing.Tuple[str, typing.Type[BaseFilter], typing.Any]] | None
33
- )
34
- base_opr_filters: (
35
- typing.List[typing.Tuple[typing.Type[BaseOprFilter], typing.Any]] | None
36
- )
37
-
38
23
  def delete(self):
39
24
  """
40
25
  Delete endpoint for the API.
@@ -85,7 +70,7 @@ class DeleteMixin:
85
70
  },
86
71
  )
87
72
  if not item:
88
- raise HTTPException(
73
+ raise fastapi.HTTPException(
89
74
  fastapi.status.HTTP_404_NOT_FOUND, ErrorCode.ITEM_NOT_FOUND
90
75
  )
91
76
  pre_delete = await smart_run(
@@ -5,16 +5,13 @@ and the disabled ``_import_data`` upload helper.
5
5
  """
6
6
 
7
7
  import csv
8
- import typing
9
8
 
10
9
  import fastapi
11
- from fastapi.responses import StreamingResponse
12
- from pydantic import BaseModel
10
+ import fastapi.responses
11
+ import pydantic
13
12
 
14
- from ...backends.sqla.interface import SQLAInterface
15
13
  from ...backends.sqla.model import Model
16
14
  from ...backends.sqla.session import SQLASession
17
- from ...const import AVAILABLE_ROUTES
18
15
  from ...decorators import expose, permission_name, priority, protect
19
16
  from ...exceptions import HTTPWithValidationException
20
17
  from ...lang.lazy_text import translate
@@ -27,23 +24,12 @@ from ...utils import (
27
24
  SelfType,
28
25
  smart_run,
29
26
  )
27
+ from ._typed_base import _TypedModelRestApi
30
28
 
31
29
 
32
- class DownloadMixin:
30
+ class DownloadMixin(_TypedModelRestApi):
33
31
  """Download endpoint methods for ``ModelRestApi``."""
34
32
 
35
- if typing.TYPE_CHECKING:
36
- # Attributes supplied by the composed ``ModelRestApi`` class via MRO.
37
- datamodel: SQLAInterface
38
- expose_params: dict[AVAILABLE_ROUTES, dict[str, typing.Any]]
39
- protected_routes: typing.List[AVAILABLE_ROUTES]
40
- resource_name: str
41
- list_columns: list[str]
42
- label_columns: dict[str, str]
43
- list_obj_schema: typing.Type[BaseModel]
44
- add_columns: list[str]
45
- add_obj_schema: typing.Type[BaseModel]
46
-
47
33
  def download(self):
48
34
  """
49
35
  Download endpoint for the API.
@@ -116,7 +102,7 @@ class DownloadMixin:
116
102
 
117
103
  params = self._handle_query_params(q)
118
104
  params["page_size"] = 100 # Set a default page size for export
119
- return StreamingResponse(
105
+ return fastapi.responses.StreamingResponse(
120
106
  self._export_data(
121
107
  self.datamodel.yield_per(session, params),
122
108
  list_columns,
@@ -137,7 +123,7 @@ class DownloadMixin:
137
123
  data: list[Model],
138
124
  list_columns: list[str],
139
125
  label_columns: dict[str, str],
140
- schema: type[BaseModel],
126
+ schema: type[pydantic.BaseModel],
141
127
  *,
142
128
  export_mode: CSVJSONConverter.ExportMode = "simplified",
143
129
  delimiter: str = ",",
@@ -7,44 +7,19 @@ import typing
7
7
 
8
8
  import fastapi
9
9
  import pydantic
10
- from fastapi import HTTPException
11
- from pydantic import BaseModel
12
10
 
13
- from ...backends.sqla.filters import BaseFilter, BaseOprFilter
14
- from ...backends.sqla.interface import SQLAInterface
15
11
  from ...backends.sqla.model import Model
16
12
  from ...backends.sqla.session import SQLASession
17
- from ...const import AVAILABLE_ROUTES, ErrorCode
13
+ from ...const import ErrorCode
18
14
  from ...decorators import expose, permission_name, priority, protect
19
- from ...schemas import BaseResponseSingle
20
15
  from ...utils import AsyncTaskRunner, SelfDepends, SelfType, smart_run
21
16
  from ._params import PARAM_BODY_SESSION
17
+ from ._typed_base import _TypedModelRestApi
22
18
 
23
19
 
24
- class EditMixin:
20
+ class EditMixin(_TypedModelRestApi):
25
21
  """Edit endpoint methods for ``ModelRestApi``."""
26
22
 
27
- if typing.TYPE_CHECKING:
28
- # Attributes supplied by the composed ``ModelRestApi`` class via MRO.
29
- datamodel: SQLAInterface
30
- expose_params: dict[AVAILABLE_ROUTES, dict[str, typing.Any]]
31
- edit_return_schema: typing.Type[BaseResponseSingle]
32
- edit_query_rel_fields: dict[
33
- str, list[tuple[str, typing.Type[BaseFilter], typing.Any]]
34
- ]
35
- edit_schema_extra_fields: dict[
36
- str, type | tuple[type, pydantic.fields.FieldInfo]
37
- ]
38
- edit_schema: typing.Type[BaseModel]
39
- show_select_columns: list[str]
40
- base_filters: (
41
- typing.List[typing.Tuple[str, typing.Type[BaseFilter], typing.Any]] | None
42
- )
43
- base_opr_filters: (
44
- typing.List[typing.Tuple[typing.Type[BaseOprFilter], typing.Any]] | None
45
- )
46
- protected_routes: typing.List[AVAILABLE_ROUTES]
47
-
48
23
  def put(self):
49
24
  """
50
25
  Put endpoint for the API.
@@ -64,7 +39,7 @@ class EditMixin:
64
39
  async def put_headless(
65
40
  self,
66
41
  id=SelfType().datamodel.id_schema,
67
- body: BaseModel = SelfType().edit_schema,
42
+ body: pydantic.BaseModel = SelfType().edit_schema,
68
43
  session: SQLASession = SelfDepends().datamodel.get_session_factory,
69
44
  ):
70
45
  """
@@ -97,7 +72,7 @@ class EditMixin:
97
72
  },
98
73
  )
99
74
  if not item:
100
- raise HTTPException(
75
+ raise fastapi.HTTPException(
101
76
  fastapi.status.HTTP_404_NOT_FOUND, ErrorCode.ITEM_NOT_FOUND
102
77
  )
103
78
  body_json = await smart_run(