fastapi-rtk 2.1.3__tar.gz → 2.1.5__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.1.3 → fastapi_rtk-2.1.5}/PKG-INFO +1 -1
- fastapi_rtk-2.1.5/fastapi_rtk/_version.py +1 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/api/base_api.py +5 -10
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/api/model_rest_api/__init__.py +28 -22
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/api/model_rest_api/_add_mixin.py +1 -2
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/api/model_rest_api/_bulk_mixin.py +1 -2
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/api/model_rest_api/_columns.py +5 -3
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/api/model_rest_api/_delete_mixin.py +0 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/api/model_rest_api/_download_mixin.py +2 -3
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/api/model_rest_api/_edit_mixin.py +4 -5
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/api/model_rest_api/_file_mixin.py +6 -6
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/api/model_rest_api/_info_mixin.py +4 -8
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/api/model_rest_api/_list_mixin.py +1 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/api/model_rest_api/_show_mixin.py +1 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/api/model_rest_api/_upload_mixin.py +3 -3
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/apis/license.py +1 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/auth/auth.py +21 -58
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/auth/ldap.py +6 -25
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/auth/password_helpers/fab.py +1 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/auth/strategies/db.py +4 -6
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/backends/generic/column.py +7 -5
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/backends/generic/filters.py +1 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/backends/generic/interface.py +3 -3
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/backends/generic/model.py +2 -2
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/backends/generic/session.py +9 -13
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/backends/sqla/db.py +19 -17
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/backends/sqla/extensions/audit/_decorators_mixin.py +7 -11
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/backends/sqla/extensions/audit/_lifecycle_mixin.py +2 -2
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/backends/sqla/extensions/audit/_processing_mixin.py +3 -7
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/backends/sqla/extensions/audit/audit.py +6 -6
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/backends/sqla/extensions/audit/types.py +1 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/backends/sqla/interface.py +1 -4
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/backends/sqla/model.py +9 -13
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/bases/db.py +2 -2
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/bases/file_manager.py +2 -3
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/bases/filter.py +1 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/bases/interface.py +17 -21
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/bases/model.py +2 -2
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/cli/cli.py +0 -3
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/cli/commands/__init__.py +0 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/cli/commands/export.py +0 -15
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/cli/commands/security.py +15 -12
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/cli/commands/translate.py +3 -6
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/cli/types.py +0 -28
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/cli/utils.py +5 -5
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/config.py +1 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/db.py +17 -31
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/decorators.py +7 -5
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/fastapi_react_toolkit.py +5 -9
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/file_managers/file_manager.py +2 -2
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/file_managers/image_manager.py +1 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/file_managers/s3_file_manager.py +3 -3
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/file_managers/s3_image_manager.py +1 -2
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/globals.py +4 -10
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/lang/babel/cli.py +2 -6
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/lang/lazy_text.py +5 -5
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/manager.py +4 -3
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/middlewares.py +13 -19
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/mixins.py +1 -3
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/registry.py +3 -3
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/schemas.py +7 -3
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/security/sqla/apis.py +1 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/security/sqla/security_manager/__init__.py +2 -2
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/security/sqla/security_manager/_association_mixin.py +8 -8
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/security/sqla/security_manager/_builtin_role_mixin.py +5 -5
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/security/sqla/security_manager/_cleanup_mixin.py +2 -2
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/security/sqla/security_manager/_role_mixin.py +4 -4
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/security/sqla/security_manager/_user_mixin.py +8 -6
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/setting.py +2 -2
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/types.py +4 -4
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/utils/async_task_runner.py +21 -29
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/utils/csv_json_converter.py +2 -8
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/utils/deep_merge.py +1 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/utils/extender_mixin.py +3 -3
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/utils/lazy.py +13 -14
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/utils/run_utils.py +5 -9
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/utils/self_dependencies.py +8 -10
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/utils/timezone.py +1 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/utils/update_signature.py +2 -4
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/conftest.py +0 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/integration/api/test_model_rest_api.py +27 -6
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/integration/apis/test_info_contract.py +1 -3
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/integration/auth/test_oauth.py +17 -25
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/integration/conftest.py +0 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/integration/file_managers/test_file_routes.py +4 -12
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/api/conftest.py +0 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/api/model_rest_api/test_columns.py +3 -9
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/api/model_rest_api/test_file_mixin.py +0 -2
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/api/model_rest_api/test_init.py +24 -10
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/api/test_base_api.py +1 -3
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/auth/password_helpers/test_fab.py +1 -2
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/auth/strategies/test_config.py +2 -3
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/auth/strategies/test_db.py +1 -2
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/auth/strategies/test_jwt.py +2 -5
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/auth/test_auth.py +9 -9
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/backends/generic/test_column.py +0 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/backends/generic/test_db.py +2 -7
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/backends/generic/test_filters.py +0 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/backends/generic/test_interface.py +1 -2
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/backends/generic/test_model.py +3 -2
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/backends/generic/test_session.py +2 -7
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/backends/sqla/conftest.py +1 -2
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/backends/sqla/test_audit.py +2 -7
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/backends/sqla/test_column.py +5 -6
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/backends/sqla/test_db.py +11 -26
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/backends/sqla/test_filters.py +1 -3
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/backends/sqla/test_geoalchemy2.py +49 -39
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/backends/sqla/test_interface.py +1 -2
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/backends/sqla/test_model.py +2 -5
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/backends/sqla/test_session.py +4 -5
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/bases/test_db.py +0 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/bases/test_file_manager.py +0 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/bases/test_filter.py +0 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/bases/test_interface.py +0 -2
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/bases/test_model.py +0 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/cli/commands/conftest.py +0 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/cli/commands/test_export.py +1 -6
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/cli/commands/test_security.py +21 -39
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/cli/commands/test_security_crypto.py +0 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/cli/conftest.py +0 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/cli/test_cli.py +1 -2
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/cli/test_decorators.py +0 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/cli/test_utils.py +0 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/file_managers/conftest.py +0 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/file_managers/test_file_manager.py +0 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/file_managers/test_image_manager.py +0 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/file_managers/test_s3_file_manager.py +0 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/lang/test_babel_cli.py +0 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/lang/test_babel_config.py +0 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/lang/test_lazy_text.py +0 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/security/sqla/conftest.py +1 -2
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/security/sqla/test_apis.py +10 -4
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/security/sqla/test_models.py +1 -4
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/security/sqla/test_security_manager.py +1 -5
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/test_config.py +0 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/test_const.py +0 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/test_db.py +9 -21
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/test_decorators.py +11 -12
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/test_dependencies.py +2 -5
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/test_exceptions.py +0 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/test_globals.py +0 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/test_manager.py +3 -4
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/test_middlewares.py +1 -4
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/test_registry.py +0 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/test_routers.py +29 -34
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/test_schemas.py +2 -4
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/test_setting.py +0 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/test_types.py +3 -2
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/utils/test_async_task_runner.py +1 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/utils/test_extender_mixin.py +0 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/utils/test_flask_appbuilder_utils.py +0 -1
- fastapi_rtk-2.1.3/fastapi_rtk/_version.py +0 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/.gitignore +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/LICENSE +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/README.md +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/api/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/api/model_rest_api/_params.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/apis/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/apis/info.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/auth/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/auth/hashers/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/auth/hashers/pbkdf2.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/auth/hashers/scrypt.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/auth/password_helpers/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/auth/strategies/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/auth/strategies/config.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/auth/strategies/jwt.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/backends/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/backends/generic/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/backends/generic/db.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/backends/generic/exceptions.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/backends/sqla/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/backends/sqla/column.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/backends/sqla/exceptions.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/backends/sqla/extensions/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/backends/sqla/extensions/audit/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/backends/sqla/extensions/audit/_logger.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/backends/sqla/extensions/geoalchemy2/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/backends/sqla/extensions/geoalchemy2/filters.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/backends/sqla/extensions/geoalchemy2/geometry_converter.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/backends/sqla/filters.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/backends/sqla/session.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/bases/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/bases/session.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/cli/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/cli/commands/_security_crypto.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/cli/commands/db/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/cli/commands/db/templates/fastapi/README +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/cli/commands/db/templates/fastapi/alembic.ini.mako +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/cli/commands/db/templates/fastapi/env.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/cli/commands/db/templates/fastapi/script.py.mako +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/cli/commands/db/templates/fastapi-multidb/README +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/cli/commands/db/templates/fastapi-multidb/alembic.ini.mako +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/cli/commands/db/templates/fastapi-multidb/env.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/cli/commands/db/templates/fastapi-multidb/script.py.mako +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/cli/const.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/cli/decorators.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/const.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/dependencies.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/exceptions.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/file_managers/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/filters.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/lang/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/lang/babel/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/lang/babel/config.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/lang/babel.cfg +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/lang/messages.pot +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/lang/translations/de/LC_MESSAGES/messages.mo +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/lang/translations/de/LC_MESSAGES/messages.po +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/lang/translations/en/LC_MESSAGES/messages.mo +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/lang/translations/en/LC_MESSAGES/messages.po +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/models.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/py.typed +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/routers.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/security/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/security/sqla/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/security/sqla/models.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/security/sqla/security_manager/_exception_filters.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/security/sqla/security_manager/_export.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/security/sqla/security_manager/_import.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/utils/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/utils/class_factory.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/utils/flask_appbuilder_utils.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/utils/formatter.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/utils/hooks.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/utils/merge_schema.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/utils/multiple_async_contexts.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/utils/pydantic.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/utils/smartdefaultdict.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/utils/sqla.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/utils/use_default_when_none.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/fastapi_rtk/version.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/pyproject.toml +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/docker-compose.gis.yml +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/integration/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/integration/api/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/integration/apis/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/integration/auth/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/integration/auth/test_auth_flow.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/integration/file_managers/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/integration/security/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/integration/security/sqla/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/integration/security/sqla/test_security_manager.py +1 -1
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/integration/test_app_smoke.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/api/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/api/model_rest_api/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/apis/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/apis/test_info.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/apis/test_license.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/auth/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/auth/hashers/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/auth/hashers/test_pbkdf2.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/auth/hashers/test_scrypt.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/auth/password_helpers/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/auth/strategies/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/backends/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/backends/generic/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/backends/generic/test_exceptions.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/backends/sqla/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/backends/sqla/test_audit_types.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/bases/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/bases/test_session.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/cli/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/cli/commands/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/cli/commands/test_db.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/cli/commands/test_translate.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/cli/test_types.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/file_managers/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/file_managers/test_s3_image_manager.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/lang/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/security/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/security/sqla/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/test_fastapi_react_toolkit.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/test_filters.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/test_mixins.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/test_models.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/test_version.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/utils/__init__.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/utils/test_class_factory.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/utils/test_csv_json_converter.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/utils/test_deep_merge.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/utils/test_formatter.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/utils/test_hooks.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/utils/test_lazy.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/utils/test_merge_schema.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/utils/test_multiple_async_contexts.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/utils/test_pydantic.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/utils/test_run_utils.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/utils/test_self_dependencies.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/utils/test_smartdefaultdict.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/utils/test_sqla.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/utils/test_timezone.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/utils/test_update_signature.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/tests/unit/utils/test_use_default_when_none.py +0 -0
- {fastapi_rtk-2.1.3 → fastapi_rtk-2.1.5}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: fastapi-rtk
|
|
3
|
-
Version: 2.1.
|
|
3
|
+
Version: 2.1.5
|
|
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.1.5"
|
|
@@ -21,11 +21,10 @@ class BaseApi:
|
|
|
21
21
|
"""
|
|
22
22
|
Base API class for FastAPI.
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
secure and extensible APIs.
|
|
24
|
+
Exposes API routes with integrated permission and authentication support,
|
|
25
|
+
handling route registration, permission management, and toolkit integration.
|
|
27
26
|
|
|
28
|
-
See [FastAPI path]("https://fastapi.tiangolo.com/tutorial/path-params/") and [FastAPI query]("https://fastapi.tiangolo.com/tutorial/query-params/") for
|
|
27
|
+
See [FastAPI path]("https://fastapi.tiangolo.com/tutorial/path-params/") and [FastAPI query]("https://fastapi.tiangolo.com/tutorial/query-params/") for details on path and query parameters in your API endpoints.
|
|
29
28
|
|
|
30
29
|
Usage:
|
|
31
30
|
|
|
@@ -130,17 +129,13 @@ class BaseApi:
|
|
|
130
129
|
|
|
131
130
|
async def on_startup(self):
|
|
132
131
|
"""
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
This will be called by `FastAPIReactToolkit` when the application starts.
|
|
132
|
+
Called by `FastAPIReactToolkit` when the application starts.
|
|
136
133
|
"""
|
|
137
134
|
pass
|
|
138
135
|
|
|
139
136
|
async def on_shutdown(self):
|
|
140
137
|
"""
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
This will be called by `FastAPIReactToolkit` when the application shuts down.
|
|
138
|
+
Called by `FastAPIReactToolkit` when the application shuts down.
|
|
144
139
|
"""
|
|
145
140
|
pass
|
|
146
141
|
|
|
@@ -32,11 +32,11 @@ from pydantic import BaseModel, Field
|
|
|
32
32
|
|
|
33
33
|
from ...backends.sqla.filters import BaseFilter, BaseOprFilter
|
|
34
34
|
from ...backends.sqla.interface import SQLAInterface
|
|
35
|
+
from ...bases import DBQueryParams
|
|
35
36
|
from ...const import AVAILABLE_ROUTES
|
|
36
37
|
from ...dependencies import current_permissions
|
|
37
38
|
from ...exceptions import HTTPWithValidationException, raise_exception
|
|
38
39
|
from ...lang.lazy_text import translate
|
|
39
|
-
from ...bases import DBQueryParams
|
|
40
40
|
from ...schemas import (
|
|
41
41
|
BaseResponseMany,
|
|
42
42
|
BaseResponseSingle,
|
|
@@ -59,13 +59,7 @@ from ._edit_mixin import EditMixin
|
|
|
59
59
|
from ._file_mixin import FileMixin
|
|
60
60
|
from ._info_mixin import InfoMixin
|
|
61
61
|
from ._list_mixin import ListMixin
|
|
62
|
-
from ._upload_mixin import UploadMixin
|
|
63
62
|
from ._params import (
|
|
64
|
-
PARAM_BODY_SESSION,
|
|
65
|
-
PARAM_ID_SESSION,
|
|
66
|
-
PARAM_ID_SESSION_ITEM,
|
|
67
|
-
PARAM_IDS_Q_SESSION_ITEMS,
|
|
68
|
-
PARAM_Q,
|
|
69
63
|
P_BODY,
|
|
70
64
|
P_ID,
|
|
71
65
|
P_IDS,
|
|
@@ -73,9 +67,15 @@ from ._params import (
|
|
|
73
67
|
P_ITEMS,
|
|
74
68
|
P_Q,
|
|
75
69
|
P_SESSION,
|
|
70
|
+
PARAM_BODY_SESSION,
|
|
71
|
+
PARAM_ID_SESSION,
|
|
72
|
+
PARAM_ID_SESSION_ITEM,
|
|
73
|
+
PARAM_IDS_Q_SESSION_ITEMS,
|
|
74
|
+
PARAM_Q,
|
|
76
75
|
Params,
|
|
77
76
|
)
|
|
78
77
|
from ._show_mixin import ShowMixin
|
|
78
|
+
from ._upload_mixin import UploadMixin
|
|
79
79
|
|
|
80
80
|
__all__ = ["ModelRestApi"]
|
|
81
81
|
|
|
@@ -100,9 +100,9 @@ class ModelRestApi(
|
|
|
100
100
|
"""
|
|
101
101
|
Base API class for FastAPI with built-in RESTful endpoints for common data operations.
|
|
102
102
|
|
|
103
|
-
|
|
103
|
+
Delivers standard routes for CRUD (Create, Read, Update, Delete),
|
|
104
104
|
file and image management, data download, bulk operations, filtering, and pagination.
|
|
105
|
-
Each route is extensible with
|
|
105
|
+
Each route is extensible with pre- and post-processing methods for custom logic
|
|
106
106
|
before and after the main operation.
|
|
107
107
|
|
|
108
108
|
Usage:
|
|
@@ -170,11 +170,11 @@ class ModelRestApi(
|
|
|
170
170
|
]
|
|
171
171
|
)
|
|
172
172
|
"""
|
|
173
|
-
The list of routes to expose.
|
|
173
|
+
The list of routes to expose. Available routes: `info`, `download`, `bulk`, `get_list`, `get`, `post`, `put`, `delete`.
|
|
174
174
|
"""
|
|
175
175
|
exclude_routes: typing.List[AVAILABLE_ROUTES] = lazy(lambda: [])
|
|
176
176
|
"""
|
|
177
|
-
The list of routes to exclude.
|
|
177
|
+
The list of routes to exclude. Available routes: `info`, `download`, `bulk`, `get_list`, `get`, `post`, `put`, `delete`.
|
|
178
178
|
"""
|
|
179
179
|
protected_routes: typing.List[AVAILABLE_ROUTES] = lazy(
|
|
180
180
|
lambda self: [x for x in self.routes if x not in self.exclude_protected_routes]
|
|
@@ -208,7 +208,9 @@ class ModelRestApi(
|
|
|
208
208
|
base_order = ("name", "asc")
|
|
209
209
|
```
|
|
210
210
|
"""
|
|
211
|
-
base_filters:
|
|
211
|
+
base_filters: (
|
|
212
|
+
typing.List[typing.Tuple[str, typing.Type[BaseFilter], typing.Any]] | None
|
|
213
|
+
) = None
|
|
212
214
|
"""
|
|
213
215
|
The default filters to apply for the following endpoints: `download`, `list`, `show`, `add`, and `edit`. Defaults to None.
|
|
214
216
|
|
|
@@ -219,7 +221,9 @@ class ModelRestApi(
|
|
|
219
221
|
]
|
|
220
222
|
```
|
|
221
223
|
"""
|
|
222
|
-
base_opr_filters:
|
|
224
|
+
base_opr_filters: (
|
|
225
|
+
typing.List[typing.Tuple[typing.Type[BaseOprFilter], typing.Any]] | None
|
|
226
|
+
) = None
|
|
223
227
|
"""
|
|
224
228
|
The default opr filters to apply for the following endpoints: `download`, `list`, `show`, `add`, and `edit`. Defaults to None.
|
|
225
229
|
|
|
@@ -471,7 +475,7 @@ class ModelRestApi(
|
|
|
471
475
|
cache=False,
|
|
472
476
|
)
|
|
473
477
|
"""
|
|
474
|
-
The title for the list endpoint. If not provided,
|
|
478
|
+
The title for the list endpoint. If not provided, defaults to "List {ModelName}".
|
|
475
479
|
"""
|
|
476
480
|
show_title = lazy(
|
|
477
481
|
lambda self: translate(
|
|
@@ -480,7 +484,7 @@ class ModelRestApi(
|
|
|
480
484
|
cache=False,
|
|
481
485
|
)
|
|
482
486
|
"""
|
|
483
|
-
The title for the show endpoint. If not provided,
|
|
487
|
+
The title for the show endpoint. If not provided, defaults to "Show {ModelName}".
|
|
484
488
|
"""
|
|
485
489
|
add_title = lazy(
|
|
486
490
|
lambda self: translate(
|
|
@@ -489,7 +493,7 @@ class ModelRestApi(
|
|
|
489
493
|
cache=False,
|
|
490
494
|
)
|
|
491
495
|
"""
|
|
492
|
-
The title for the add endpoint. If not provided,
|
|
496
|
+
The title for the add endpoint. If not provided, defaults to "Add {ModelName}".
|
|
493
497
|
"""
|
|
494
498
|
edit_title = lazy(
|
|
495
499
|
lambda self: translate(
|
|
@@ -498,7 +502,7 @@ class ModelRestApi(
|
|
|
498
502
|
cache=False,
|
|
499
503
|
)
|
|
500
504
|
"""
|
|
501
|
-
The title for the edit endpoint. If not provided,
|
|
505
|
+
The title for the edit endpoint. If not provided, defaults to "Edit {ModelName}".
|
|
502
506
|
"""
|
|
503
507
|
|
|
504
508
|
"""
|
|
@@ -613,7 +617,7 @@ class ModelRestApi(
|
|
|
613
617
|
|
|
614
618
|
extra_list_fetch_columns = lazy(lambda: list[str]())
|
|
615
619
|
"""
|
|
616
|
-
The list of columns to be
|
|
620
|
+
The list of columns to be fetched from the database alongside the `list_columns`. Useful if you don't want some columns to be shown but still want to fetch them.
|
|
617
621
|
"""
|
|
618
622
|
list_select_columns = lazy(
|
|
619
623
|
lambda self: self.list_columns + self.extra_list_fetch_columns
|
|
@@ -625,7 +629,7 @@ class ModelRestApi(
|
|
|
625
629
|
"""
|
|
626
630
|
extra_show_fetch_columns = lazy(lambda: list[str]())
|
|
627
631
|
"""
|
|
628
|
-
The list of columns to be
|
|
632
|
+
The list of columns to be fetched from the database alongside the `show_columns`. Useful if you don't want some columns to be shown but still want to fetch them.
|
|
629
633
|
"""
|
|
630
634
|
show_select_columns = lazy(
|
|
631
635
|
lambda self: self.show_columns + self.extra_show_fetch_columns
|
|
@@ -659,7 +663,8 @@ class ModelRestApi(
|
|
|
659
663
|
| typing.Callable[[ColumnInfo | ColumnEnumInfo | ColumnRelationInfo], bool]
|
|
660
664
|
| dict[
|
|
661
665
|
str,
|
|
662
|
-
bool
|
|
666
|
+
bool
|
|
667
|
+
| typing.Callable[[ColumnInfo | ColumnEnumInfo | ColumnRelationInfo], bool],
|
|
663
668
|
]
|
|
664
669
|
) = lazy(lambda: lambda info: len(info.values) > 100)
|
|
665
670
|
"""
|
|
@@ -700,7 +705,8 @@ class ModelRestApi(
|
|
|
700
705
|
| typing.Callable[[ColumnInfo | ColumnEnumInfo | ColumnRelationInfo], bool]
|
|
701
706
|
| dict[
|
|
702
707
|
str,
|
|
703
|
-
bool
|
|
708
|
+
bool
|
|
709
|
+
| typing.Callable[[ColumnInfo | ColumnEnumInfo | ColumnRelationInfo], bool],
|
|
704
710
|
]
|
|
705
711
|
) = lazy(lambda: lambda info: len(info.values) > 100)
|
|
706
712
|
"""
|
|
@@ -1172,7 +1178,7 @@ class ModelRestApi(
|
|
|
1172
1178
|
filter_classes=self.base_filters,
|
|
1173
1179
|
opr_filters=q.opr_filters,
|
|
1174
1180
|
opr_filter_classes=self.base_opr_filters,
|
|
1175
|
-
global_filter=(self.list_columns, q.global_filter)
|
|
1181
|
+
global_filter=(q.columns or self.list_columns, q.global_filter)
|
|
1176
1182
|
if q.global_filter
|
|
1177
1183
|
else None,
|
|
1178
1184
|
)
|
|
@@ -134,8 +134,7 @@ class AddMixin:
|
|
|
134
134
|
self, item: Model, params: PARAM_BODY_SESSION
|
|
135
135
|
) -> None | Model | typing.Any:
|
|
136
136
|
"""
|
|
137
|
-
Post-process the item after adding it to the database.
|
|
138
|
-
But before sending the response.
|
|
137
|
+
Post-process the item after adding it to the database, before sending the response.
|
|
139
138
|
|
|
140
139
|
- When a `Model` is returned, it will replace the current `item`.
|
|
141
140
|
- When any other value is returned, it is assumed to be a response to be returned directly.
|
|
@@ -94,7 +94,9 @@ class ColumnsMixin:
|
|
|
94
94
|
return re.sub("[._]", " ", name).title()
|
|
95
95
|
|
|
96
96
|
def _init_filters(
|
|
97
|
-
self,
|
|
97
|
+
self,
|
|
98
|
+
datamodel: SQLAInterface,
|
|
99
|
+
filters: typing.List[typing.Tuple[str, typing.Type[BaseFilter], typing.Any]],
|
|
98
100
|
):
|
|
99
101
|
"""
|
|
100
102
|
Initialize the filter for the API.
|
|
@@ -125,7 +127,7 @@ class ColumnsMixin:
|
|
|
125
127
|
):
|
|
126
128
|
"""
|
|
127
129
|
Handle the schema extra fields for the API.
|
|
128
|
-
|
|
130
|
+
Transforms non-tuple fields into a dictionary mapping field name to field type.
|
|
129
131
|
|
|
130
132
|
Args:
|
|
131
133
|
schema_extra_fields (dict[str, type | tuple[type, pydantic.fields.FieldInfo]]): The schema extra fields to handle.
|
|
@@ -181,7 +183,7 @@ class ColumnsMixin:
|
|
|
181
183
|
name: str | None = None,
|
|
182
184
|
):
|
|
183
185
|
"""
|
|
184
|
-
Create a request schema
|
|
186
|
+
Create a request schema from `schema` for add and edit endpoints, transforming relation columns into the appropriate schema.
|
|
185
187
|
|
|
186
188
|
Args:
|
|
187
189
|
schema (typing.Type[BaseModel]): The base schema to create the request schema from.
|
|
@@ -73,7 +73,7 @@ class DownloadMixin:
|
|
|
73
73
|
Downloads a file in a headless mode.
|
|
74
74
|
|
|
75
75
|
Args:
|
|
76
|
-
|
|
76
|
+
q (QuerySchema): The query schema.
|
|
77
77
|
session (SQLASession): A database scoped session.
|
|
78
78
|
export_mode (ExportMode): The export mode. Can be "simplified" or "detailed". Defaults to "simplified".
|
|
79
79
|
delimiter (str): The delimiter for the CSV file. Defaults to ",".
|
|
@@ -193,11 +193,10 @@ class DownloadMixin:
|
|
|
193
193
|
quotechar: str = '"',
|
|
194
194
|
):
|
|
195
195
|
"""
|
|
196
|
-
Import data from CSV format
|
|
196
|
+
Import data from CSV format, parsing it and resolving any relationships.
|
|
197
197
|
|
|
198
198
|
Args:
|
|
199
199
|
data (str | bytes): The CSV data to import.
|
|
200
|
-
query (QueryManager): The query manager object.
|
|
201
200
|
session (SQLASession): The session object for the database connection.
|
|
202
201
|
delimiter (str, optional): Delimiter for the CSV file. Defaults to ",".
|
|
203
202
|
quotechar (str): Quote character for the CSV file. Defaults to '"'.
|
|
@@ -68,7 +68,7 @@ class EditMixin:
|
|
|
68
68
|
session: SQLASession = SelfDepends().datamodel.get_session_factory,
|
|
69
69
|
):
|
|
70
70
|
"""
|
|
71
|
-
Updates an item in
|
|
71
|
+
Updates an item in headless mode.
|
|
72
72
|
|
|
73
73
|
Args:
|
|
74
74
|
id (str): The id of the item.
|
|
@@ -76,7 +76,7 @@ class EditMixin:
|
|
|
76
76
|
session (SQLASession): A database scoped session.
|
|
77
77
|
|
|
78
78
|
Returns:
|
|
79
|
-
|
|
79
|
+
edit_return_schema: The edit return schema.
|
|
80
80
|
|
|
81
81
|
### Note:
|
|
82
82
|
If you are overriding this method, make sure to copy all the decorators too.
|
|
@@ -159,7 +159,7 @@ class EditMixin:
|
|
|
159
159
|
Args:
|
|
160
160
|
item (Model): The item that will be updated in the database.
|
|
161
161
|
data (dict[str, typing.Any]): The data to merge with the item.
|
|
162
|
-
params (
|
|
162
|
+
params (PARAM_BODY_SESSION): Additional data passed to the handler.
|
|
163
163
|
"""
|
|
164
164
|
pass
|
|
165
165
|
|
|
@@ -182,8 +182,7 @@ class EditMixin:
|
|
|
182
182
|
self, item: Model, params: PARAM_BODY_SESSION
|
|
183
183
|
) -> None | Model | typing.Any:
|
|
184
184
|
"""
|
|
185
|
-
Post-process the item after updating it in the database.
|
|
186
|
-
But before sending the response.
|
|
185
|
+
Post-process the item after updating it in the database, before sending the response.
|
|
187
186
|
|
|
188
187
|
- When a `Model` is returned, it will replace the current `item`.
|
|
189
188
|
- When any other value is returned, it is assumed to be a response to be returned directly.
|
|
@@ -27,9 +27,9 @@ class FileMixin:
|
|
|
27
27
|
|
|
28
28
|
def image(self):
|
|
29
29
|
"""
|
|
30
|
-
Image endpoint for the API.
|
|
30
|
+
Image endpoint for the API.
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
Only available if the model has image columns.
|
|
33
33
|
"""
|
|
34
34
|
if not self.datamodel.get_image_column_list():
|
|
35
35
|
return
|
|
@@ -50,9 +50,9 @@ class FileMixin:
|
|
|
50
50
|
|
|
51
51
|
def file(self):
|
|
52
52
|
"""
|
|
53
|
-
File endpoint for the API.
|
|
53
|
+
File endpoint for the API.
|
|
54
54
|
|
|
55
|
-
|
|
55
|
+
Only available if the model has file columns.
|
|
56
56
|
"""
|
|
57
57
|
if not self.datamodel.get_file_column_list():
|
|
58
58
|
return
|
|
@@ -73,7 +73,7 @@ class FileMixin:
|
|
|
73
73
|
|
|
74
74
|
async def image_headless(self, filename: str):
|
|
75
75
|
"""
|
|
76
|
-
Retrieves an image
|
|
76
|
+
Retrieves an image by filename.
|
|
77
77
|
"""
|
|
78
78
|
async with AsyncTaskRunner():
|
|
79
79
|
pre_image = await smart_run(self.pre_image, filename)
|
|
@@ -91,7 +91,7 @@ class FileMixin:
|
|
|
91
91
|
|
|
92
92
|
async def file_headless(self, filename: str):
|
|
93
93
|
"""
|
|
94
|
-
Retrieves a file
|
|
94
|
+
Retrieves a file by filename.
|
|
95
95
|
"""
|
|
96
96
|
async with AsyncTaskRunner():
|
|
97
97
|
pre_file = await smart_run(self.pre_file, filename)
|
|
@@ -48,9 +48,7 @@ class InfoMixin:
|
|
|
48
48
|
add_obj_schema: typing.Type[BaseModel]
|
|
49
49
|
add_jsonforms_use_enum: (
|
|
50
50
|
bool
|
|
51
|
-
| typing.Callable[
|
|
52
|
-
[ColumnInfo | ColumnEnumInfo | ColumnRelationInfo], bool
|
|
53
|
-
]
|
|
51
|
+
| typing.Callable[[ColumnInfo | ColumnEnumInfo | ColumnRelationInfo], bool]
|
|
54
52
|
| dict[
|
|
55
53
|
str,
|
|
56
54
|
bool
|
|
@@ -64,9 +62,7 @@ class InfoMixin:
|
|
|
64
62
|
edit_obj_schema: typing.Type[BaseModel]
|
|
65
63
|
edit_jsonforms_use_enum: (
|
|
66
64
|
bool
|
|
67
|
-
| typing.Callable[
|
|
68
|
-
[ColumnInfo | ColumnEnumInfo | ColumnRelationInfo], bool
|
|
69
|
-
]
|
|
65
|
+
| typing.Callable[[ColumnInfo | ColumnEnumInfo | ColumnRelationInfo], bool]
|
|
70
66
|
| dict[
|
|
71
67
|
str,
|
|
72
68
|
bool
|
|
@@ -104,7 +100,7 @@ class InfoMixin:
|
|
|
104
100
|
session_count: SQLASession = SelfDepends().datamodel.get_session_factory,
|
|
105
101
|
):
|
|
106
102
|
"""
|
|
107
|
-
Retrieves information in
|
|
103
|
+
Retrieves information in headless mode.
|
|
108
104
|
|
|
109
105
|
Args:
|
|
110
106
|
permissions (typing.List[str]): A list of permissions.
|
|
@@ -155,7 +151,7 @@ class InfoMixin:
|
|
|
155
151
|
session_count: SQLASession,
|
|
156
152
|
):
|
|
157
153
|
"""
|
|
158
|
-
Generates the information schema for the API
|
|
154
|
+
Generates the information schema for the API.
|
|
159
155
|
|
|
160
156
|
Args:
|
|
161
157
|
permissions (typing.List[str]): The list of permissions for the API.
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
Upload route mixin for ``ModelRestApi``.
|
|
3
3
|
|
|
4
4
|
The ``upload`` registration and ``upload_headless`` implementation are
|
|
5
|
-
disabled (commented out) until further notice. The mixin
|
|
6
|
-
``ModelRestApi`` so the route can be re-enabled by uncommenting the
|
|
7
|
-
|
|
5
|
+
disabled (commented out) until further notice. The mixin stays wired into
|
|
6
|
+
``ModelRestApi`` so the route can be re-enabled by uncommenting the blocks
|
|
7
|
+
below.
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
10
|
|
|
@@ -16,7 +16,7 @@ from ..utils import lazy, prettify_dict
|
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
class LicenseParserError(Exception):
|
|
19
|
-
"""
|
|
19
|
+
"""Raised on license parsing failures."""
|
|
20
20
|
|
|
21
21
|
def __init__(
|
|
22
22
|
self, data: typing.Any, message: str = "Error processing license data"
|