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.
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/PKG-INFO +1 -1
- fastapi_rtk-2.3.3/fastapi_rtk/_version.py +1 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/api/base_api.py +8 -9
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/api/model_rest_api/__init__.py +47 -24
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/api/model_rest_api/_add_mixin.py +3 -21
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/api/model_rest_api/_bulk_mixin.py +7 -13
- 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
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/api/model_rest_api/_delete_mixin.py +4 -19
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/api/model_rest_api/_download_mixin.py +6 -20
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/api/model_rest_api/_edit_mixin.py +5 -30
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/api/model_rest_api/_file_mixin.py +14 -17
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/api/model_rest_api/_info_mixin.py +13 -72
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/api/model_rest_api/_list_mixin.py +2 -15
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/api/model_rest_api/_params.py +5 -5
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/api/model_rest_api/_show_mixin.py +4 -24
- fastapi_rtk-2.3.3/fastapi_rtk/api/model_rest_api/_typed_base.py +179 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/auth/auth.py +82 -71
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/auth/hashers/pbkdf2.py +7 -7
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/auth/hashers/scrypt.py +7 -7
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/auth/password_helpers/fab.py +8 -6
- fastapi_rtk-2.3.3/fastapi_rtk/auth/strategies/config.py +25 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/auth/strategies/db.py +47 -32
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/auth/strategies/jwt.py +5 -5
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/generic/column.py +5 -11
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/generic/exceptions.py +2 -2
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/generic/filters.py +17 -9
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/generic/interface.py +4 -4
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/generic/session.py +4 -4
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/sqla/db.py +34 -20
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/sqla/extensions/geoalchemy2/filters.py +51 -21
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/sqla/filters.py +19 -16
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/sqla/interface.py +85 -52
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/sqla/model.py +32 -26
- fastapi_rtk-2.3.3/fastapi_rtk/backends/sqla/session.py +32 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/cli.py +6 -7
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/commands/_security_crypto.py +11 -7
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/commands/db/__init__.py +103 -85
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/commands/security.py +87 -79
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/commands/translate.py +9 -9
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/decorators.py +7 -7
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/utils.py +13 -8
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/config.py +2 -2
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/const.py +3 -3
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/db.py +676 -671
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/decorators.py +28 -27
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/dependencies.py +7 -8
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/fastapi_react_toolkit.py +63 -36
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/file_managers/file_manager.py +2 -2
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/globals.py +30 -29
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/lang/babel/cli.py +2 -2
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/manager.py +71 -60
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/middlewares.py +24 -24
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/routers.py +183 -137
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/schemas.py +47 -50
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/security/sqla/apis.py +17 -15
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/security/sqla/models.py +108 -60
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/security/sqla/security_manager/_export.py +4 -4
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/security/sqla/security_manager/_user_mixin.py +5 -5
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/types.py +7 -7
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/run_utils.py +7 -5
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/sqla.py +3 -3
- fastapi_rtk-2.3.3/fastapi_rtk/utils/timezone.py +19 -0
- fastapi_rtk-2.3.3/tests/integration/apis/test_info_callable_schema.py +102 -0
- fastapi_rtk-2.3.3/tests/unit/api/model_rest_api/test_typed_base_consistency.py +104 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/cli/commands/conftest.py +3 -1
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/cli/test_decorators.py +11 -11
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/lang/test_babel_cli.py +4 -4
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_middlewares.py +3 -4
- fastapi_rtk-2.3.2/fastapi_rtk/_version.py +0 -1
- fastapi_rtk-2.3.2/fastapi_rtk/auth/strategies/config.py +0 -24
- fastapi_rtk-2.3.2/fastapi_rtk/backends/sqla/session.py +0 -29
- fastapi_rtk-2.3.2/fastapi_rtk/utils/timezone.py +0 -19
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/.gitignore +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/LICENSE +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/README.md +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/api/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/api/model_rest_api/_upload_mixin.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/apis/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/apis/info.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/apis/license.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/auth/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/auth/hashers/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/auth/ldap.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/auth/password_helpers/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/auth/strategies/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/generic/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/generic/db.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/generic/model.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/sqla/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/sqla/column.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/sqla/exceptions.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/sqla/extensions/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/sqla/extensions/audit/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/sqla/extensions/audit/_decorators_mixin.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/sqla/extensions/audit/_lifecycle_mixin.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/sqla/extensions/audit/_logger.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/sqla/extensions/audit/_processing_mixin.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/sqla/extensions/audit/audit.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/sqla/extensions/audit/types.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/sqla/extensions/geoalchemy2/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/backends/sqla/extensions/geoalchemy2/geometry_converter.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/bases/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/bases/db.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/bases/file_manager.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/bases/filter.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/bases/interface.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/bases/model.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/bases/session.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/commands/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/commands/db/templates/fastapi/README +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/commands/db/templates/fastapi/alembic.ini.mako +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/commands/db/templates/fastapi/env.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/commands/db/templates/fastapi/script.py.mako +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/commands/db/templates/fastapi-multidb/README +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/commands/db/templates/fastapi-multidb/alembic.ini.mako +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/commands/db/templates/fastapi-multidb/env.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/commands/db/templates/fastapi-multidb/script.py.mako +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/commands/export.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/const.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/cli/types.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/exceptions.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/file_managers/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/file_managers/image_manager.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/file_managers/s3_file_manager.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/file_managers/s3_image_manager.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/filters.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/lang/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/lang/babel/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/lang/babel/config.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/lang/babel.cfg +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/lang/lazy_text.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/lang/messages.pot +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/lang/translations/de/LC_MESSAGES/messages.mo +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/lang/translations/de/LC_MESSAGES/messages.po +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/lang/translations/en/LC_MESSAGES/messages.mo +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/lang/translations/en/LC_MESSAGES/messages.po +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/mixins.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/models.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/py.typed +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/registry.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/security/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/security/sqla/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/security/sqla/security_manager/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/security/sqla/security_manager/_association_mixin.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/security/sqla/security_manager/_builtin_role_mixin.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/security/sqla/security_manager/_cleanup_mixin.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/security/sqla/security_manager/_exception_filters.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/security/sqla/security_manager/_import.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/security/sqla/security_manager/_role_mixin.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/setting.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/async_task_runner.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/class_factory.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/csv_json_converter.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/deep_merge.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/extender_mixin.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/flask_appbuilder_utils.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/formatter.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/hooks.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/lazy.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/merge_schema.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/multiple_async_contexts.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/pydantic.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/self_dependencies.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/smartdefaultdict.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/update_signature.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/utils/use_default_when_none.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/fastapi_rtk/version.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/pyproject.toml +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/conftest.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/docker-compose.gis.yml +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/integration/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/integration/api/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/integration/api/test_model_rest_api.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/integration/apis/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/integration/apis/test_info_contract.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/integration/auth/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/integration/auth/test_auth_flow.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/integration/auth/test_oauth.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/integration/conftest.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/integration/file_managers/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/integration/file_managers/test_file_routes.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/integration/security/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/integration/security/sqla/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/integration/security/sqla/test_security_manager.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/integration/test_app_smoke.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/api/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/api/conftest.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/api/model_rest_api/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/api/model_rest_api/test_columns.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/api/model_rest_api/test_file_mixin.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/api/model_rest_api/test_init.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/api/test_base_api.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/apis/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/apis/test_info.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/apis/test_license.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/auth/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/auth/hashers/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/auth/hashers/test_pbkdf2.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/auth/hashers/test_scrypt.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/auth/password_helpers/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/auth/password_helpers/test_fab.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/auth/strategies/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/auth/strategies/test_config.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/auth/strategies/test_db.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/auth/strategies/test_jwt.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/auth/test_auth.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/generic/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/generic/test_column.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/generic/test_db.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/generic/test_exceptions.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/generic/test_filters.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/generic/test_interface.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/generic/test_model.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/generic/test_session.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/sqla/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/sqla/conftest.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/sqla/test_audit.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/sqla/test_audit_types.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/sqla/test_column.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/sqla/test_db.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/sqla/test_filters.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/sqla/test_geoalchemy2.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/sqla/test_interface.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/sqla/test_model.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/backends/sqla/test_session.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/bases/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/bases/test_db.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/bases/test_file_manager.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/bases/test_filter.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/bases/test_interface.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/bases/test_model.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/bases/test_session.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/cli/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/cli/commands/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/cli/commands/test_db.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/cli/commands/test_export.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/cli/commands/test_security.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/cli/commands/test_security_crypto.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/cli/commands/test_translate.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/cli/conftest.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/cli/test_cli.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/cli/test_types.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/cli/test_utils.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/file_managers/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/file_managers/conftest.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/file_managers/test_file_manager.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/file_managers/test_image_manager.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/file_managers/test_s3_file_manager.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/file_managers/test_s3_image_manager.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/lang/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/lang/test_babel_config.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/lang/test_lazy_text.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/security/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/security/sqla/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/security/sqla/conftest.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/security/sqla/test_apis.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/security/sqla/test_models.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/security/sqla/test_security_manager.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_config.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_const.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_db.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_decorators.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_dependencies.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_exceptions.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_fastapi_react_toolkit.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_filters.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_globals.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_manager.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_mixins.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_models.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_registry.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_routers.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_schemas.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_setting.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_types.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/test_version.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/__init__.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_async_task_runner.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_class_factory.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_csv_json_converter.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_deep_merge.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_extender_mixin.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_flask_appbuilder_utils.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_formatter.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_hooks.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_lazy.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_merge_schema.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_multiple_async_contexts.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_pydantic.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_run_utils.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_self_dependencies.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_smartdefaultdict.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_sqla.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_timezone.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_update_signature.py +0 -0
- {fastapi_rtk-2.3.2 → fastapi_rtk-2.3.3}/tests/unit/utils/test_use_default_when_none.py +0 -0
- {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.
|
|
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
|
-
|
|
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 .
|
|
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": (
|
|
296
|
-
|
|
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": (
|
|
426
|
-
|
|
427
|
-
|
|
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(
|
|
437
|
+
pydantic.Field(
|
|
438
|
+
default_factory=lambda: self.add_jsonforms_translations
|
|
439
|
+
),
|
|
431
440
|
),
|
|
432
441
|
"edit_translations": (
|
|
433
442
|
dict,
|
|
434
|
-
Field(
|
|
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(
|
|
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(
|
|
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:
|
|
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:
|
|
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
|
|
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
|
|
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
|
-
|
|
12
|
-
|
|
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
|
|
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(
|