fastapi-rtk 2.3.3__tar.gz → 2.3.4__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.3 → fastapi_rtk-2.3.4}/PKG-INFO +1 -1
- fastapi_rtk-2.3.4/fastapi_rtk/_version.py +1 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/api/base_api.py +4 -3
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/api/model_rest_api/__init__.py +71 -47
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/api/model_rest_api/_bulk_mixin.py +2 -2
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/api/model_rest_api/_columns_mixin.py +20 -15
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/api/model_rest_api/_info_mixin.py +6 -6
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/api/model_rest_api/_list_mixin.py +1 -1
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/api/model_rest_api/_params.py +4 -4
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/api/model_rest_api/_typed_base.py +36 -39
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/auth/auth.py +19 -13
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/auth/hashers/pbkdf2.py +6 -7
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/auth/hashers/scrypt.py +6 -7
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/auth/password_helpers/fab.py +1 -4
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/auth/strategies/config.py +6 -6
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/auth/strategies/db.py +5 -5
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/generic/column.py +15 -14
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/generic/db.py +1 -1
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/generic/interface.py +3 -4
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/generic/session.py +6 -5
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/db.py +0 -8
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/extensions/audit/_decorators_mixin.py +25 -23
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/extensions/audit/_lifecycle_mixin.py +15 -13
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/extensions/audit/_processing_mixin.py +7 -7
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/extensions/audit/audit.py +15 -16
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/interface.py +4 -3
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/model.py +8 -5
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/bases/file_manager.py +5 -4
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/bases/interface.py +10 -9
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/cli.py +2 -2
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/commands/_security_crypto.py +3 -2
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/commands/db/__init__.py +28 -28
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/commands/export.py +1 -1
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/commands/security.py +1 -1
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/commands/translate.py +1 -1
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/utils.py +6 -4
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/db.py +12 -17
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/decorators.py +28 -25
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/exceptions.py +4 -4
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/fastapi_react_toolkit.py +15 -11
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/file_managers/s3_file_manager.py +3 -2
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/manager.py +15 -18
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/middlewares.py +4 -4
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/registry.py +21 -11
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/routers.py +7 -6
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/schemas.py +4 -4
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/security/sqla/apis.py +1 -3
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/security/sqla/security_manager/__init__.py +2 -2
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/security/sqla/security_manager/_import.py +3 -2
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/security/sqla/security_manager/_role_mixin.py +7 -5
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/setting.py +2 -2
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/async_task_runner.py +14 -12
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/deep_merge.py +6 -5
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/formatter.py +2 -2
- fastapi_rtk-2.3.4/fastapi_rtk/utils/hooks.py +42 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/lazy.py +10 -7
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/merge_schema.py +5 -6
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/pydantic.py +4 -4
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/run_utils.py +19 -16
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/smartdefaultdict.py +3 -2
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/sqla.py +1 -3
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/update_signature.py +6 -3
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/conftest.py +8 -7
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/integration/api/test_model_rest_api.py +3 -2
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/integration/auth/test_oauth.py +77 -61
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/integration/conftest.py +3 -6
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/integration/file_managers/test_file_routes.py +2 -2
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/integration/security/sqla/test_security_manager.py +6 -10
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/api/model_rest_api/test_columns.py +66 -7
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/api/model_rest_api/test_file_mixin.py +5 -5
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/api/model_rest_api/test_init.py +5 -3
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/api/test_base_api.py +12 -13
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/apis/test_info.py +10 -10
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/auth/password_helpers/test_fab.py +3 -2
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/auth/strategies/test_config.py +5 -4
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/auth/strategies/test_db.py +10 -4
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/auth/strategies/test_jwt.py +3 -2
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/auth/test_auth.py +28 -28
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/backends/generic/test_filters.py +8 -8
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/backends/generic/test_interface.py +0 -2
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/backends/generic/test_session.py +9 -6
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/backends/sqla/conftest.py +7 -6
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/backends/sqla/test_audit.py +21 -33
- fastapi_rtk-2.3.4/tests/unit/backends/sqla/test_column.py +27 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/backends/sqla/test_db.py +18 -22
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/backends/sqla/test_filters.py +28 -23
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/backends/sqla/test_geoalchemy2.py +41 -52
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/backends/sqla/test_interface.py +6 -8
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/backends/sqla/test_model.py +8 -11
- fastapi_rtk-2.3.4/tests/unit/backends/sqla/test_session.py +43 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/bases/test_db.py +0 -2
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/bases/test_file_manager.py +5 -7
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/cli/commands/conftest.py +6 -6
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/cli/commands/test_db.py +6 -5
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/cli/commands/test_export.py +34 -53
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/cli/commands/test_security.py +136 -111
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/cli/commands/test_translate.py +15 -25
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/cli/test_cli.py +7 -6
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/cli/test_decorators.py +31 -25
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/file_managers/test_file_manager.py +3 -2
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/file_managers/test_s3_file_manager.py +59 -37
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/file_managers/test_s3_image_manager.py +3 -3
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/lang/test_babel_cli.py +8 -7
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/lang/test_lazy_text.py +15 -8
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/security/sqla/conftest.py +5 -4
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/security/sqla/test_apis.py +5 -6
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/security/sqla/test_models.py +3 -2
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/security/sqla/test_security_manager.py +24 -26
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_db.py +31 -30
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_decorators.py +12 -10
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_dependencies.py +51 -51
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_fastapi_react_toolkit.py +49 -54
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_globals.py +3 -2
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_manager.py +131 -80
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_middlewares.py +17 -13
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_routers.py +265 -278
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_types.py +11 -8
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/test_async_task_runner.py +5 -4
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/test_csv_json_converter.py +11 -10
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/test_flask_appbuilder_utils.py +3 -2
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/test_lazy.py +3 -2
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/test_pydantic.py +8 -8
- fastapi_rtk-2.3.4/tests/unit/utils/test_sqla.py +82 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/test_timezone.py +21 -18
- fastapi_rtk-2.3.3/fastapi_rtk/_version.py +0 -1
- fastapi_rtk-2.3.3/fastapi_rtk/utils/hooks.py +0 -37
- fastapi_rtk-2.3.3/tests/unit/backends/sqla/test_column.py +0 -29
- fastapi_rtk-2.3.3/tests/unit/backends/sqla/test_session.py +0 -37
- fastapi_rtk-2.3.3/tests/unit/utils/test_sqla.py +0 -81
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/.gitignore +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/LICENSE +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/README.md +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/api/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/api/model_rest_api/_add_mixin.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/api/model_rest_api/_delete_mixin.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/api/model_rest_api/_download_mixin.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/api/model_rest_api/_edit_mixin.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/api/model_rest_api/_file_mixin.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/api/model_rest_api/_show_mixin.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/api/model_rest_api/_upload_mixin.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/apis/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/apis/info.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/apis/license.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/auth/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/auth/hashers/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/auth/ldap.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/auth/password_helpers/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/auth/strategies/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/auth/strategies/jwt.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/generic/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/generic/exceptions.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/generic/filters.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/generic/model.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/column.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/exceptions.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/extensions/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/extensions/audit/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/extensions/audit/_logger.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/extensions/audit/types.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/extensions/geoalchemy2/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/extensions/geoalchemy2/filters.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/extensions/geoalchemy2/geometry_converter.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/filters.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/backends/sqla/session.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/bases/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/bases/db.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/bases/filter.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/bases/model.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/bases/session.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/commands/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/commands/db/templates/fastapi/README +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/commands/db/templates/fastapi/alembic.ini.mako +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/commands/db/templates/fastapi/env.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/commands/db/templates/fastapi/script.py.mako +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/commands/db/templates/fastapi-multidb/README +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/commands/db/templates/fastapi-multidb/alembic.ini.mako +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/commands/db/templates/fastapi-multidb/env.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/commands/db/templates/fastapi-multidb/script.py.mako +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/const.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/decorators.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/cli/types.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/config.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/const.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/dependencies.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/file_managers/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/file_managers/file_manager.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/file_managers/image_manager.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/file_managers/s3_image_manager.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/filters.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/globals.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/lang/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/lang/babel/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/lang/babel/cli.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/lang/babel/config.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/lang/babel.cfg +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/lang/lazy_text.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/lang/messages.pot +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/lang/translations/de/LC_MESSAGES/messages.mo +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/lang/translations/de/LC_MESSAGES/messages.po +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/lang/translations/en/LC_MESSAGES/messages.mo +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/lang/translations/en/LC_MESSAGES/messages.po +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/mixins.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/models.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/py.typed +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/security/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/security/sqla/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/security/sqla/models.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/security/sqla/security_manager/_association_mixin.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/security/sqla/security_manager/_builtin_role_mixin.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/security/sqla/security_manager/_cleanup_mixin.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/security/sqla/security_manager/_exception_filters.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/security/sqla/security_manager/_export.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/security/sqla/security_manager/_user_mixin.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/types.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/class_factory.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/csv_json_converter.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/extender_mixin.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/flask_appbuilder_utils.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/multiple_async_contexts.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/self_dependencies.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/timezone.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/utils/use_default_when_none.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/fastapi_rtk/version.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/pyproject.toml +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/docker-compose.gis.yml +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/integration/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/integration/api/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/integration/apis/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/integration/apis/test_info_callable_schema.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/integration/apis/test_info_contract.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/integration/auth/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/integration/auth/test_auth_flow.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/integration/file_managers/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/integration/security/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/integration/security/sqla/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/integration/test_app_smoke.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/api/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/api/conftest.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/api/model_rest_api/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/api/model_rest_api/test_typed_base_consistency.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/apis/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/apis/test_license.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/auth/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/auth/hashers/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/auth/hashers/test_pbkdf2.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/auth/hashers/test_scrypt.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/auth/password_helpers/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/auth/strategies/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/backends/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/backends/generic/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/backends/generic/test_column.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/backends/generic/test_db.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/backends/generic/test_exceptions.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/backends/generic/test_model.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/backends/sqla/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/backends/sqla/test_audit_types.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/bases/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/bases/test_filter.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/bases/test_interface.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/bases/test_model.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/bases/test_session.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/cli/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/cli/commands/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/cli/commands/test_security_crypto.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/cli/conftest.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/cli/test_types.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/cli/test_utils.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/file_managers/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/file_managers/conftest.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/file_managers/test_image_manager.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/lang/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/lang/test_babel_config.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/security/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/security/sqla/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_config.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_const.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_exceptions.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_filters.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_mixins.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_models.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_registry.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_schemas.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_setting.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/test_version.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/__init__.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/test_class_factory.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/test_deep_merge.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/test_extender_mixin.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/test_formatter.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/test_hooks.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/test_merge_schema.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/test_multiple_async_contexts.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/test_run_utils.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/test_self_dependencies.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/test_smartdefaultdict.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/test_update_signature.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/tests/unit/utils/test_use_default_when_none.py +0 -0
- {fastapi_rtk-2.3.3 → fastapi_rtk-2.3.4}/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.4
|
|
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.4"
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import collections.abc
|
|
1
2
|
import typing
|
|
2
3
|
|
|
3
4
|
import fastapi
|
|
@@ -87,9 +88,9 @@ class BaseApi:
|
|
|
87
88
|
"""
|
|
88
89
|
routes_to_register: list[
|
|
89
90
|
tuple[
|
|
90
|
-
|
|
91
|
+
collections.abc.Callable,
|
|
91
92
|
dict[str, typing.Any],
|
|
92
|
-
|
|
93
|
+
collections.abc.Callable,
|
|
93
94
|
dict[str, typing.Any],
|
|
94
95
|
]
|
|
95
96
|
] = lazy(lambda self: [])
|
|
@@ -102,7 +103,7 @@ class BaseApi:
|
|
|
102
103
|
"""
|
|
103
104
|
The FastAPIReactToolkit object. Automatically set when the API is added to the toolkit.
|
|
104
105
|
"""
|
|
105
|
-
cache:
|
|
106
|
+
cache: dict[str, typing.Any] = lazy(lambda self: dict())
|
|
106
107
|
"""
|
|
107
108
|
The cache for the API.
|
|
108
109
|
|
|
@@ -22,6 +22,7 @@ remain on the composed class so they can be overridden in subclasses with
|
|
|
22
22
|
the usual ``class MyApi(ModelRestApi): list_columns = [...]`` idiom.
|
|
23
23
|
"""
|
|
24
24
|
|
|
25
|
+
import collections.abc
|
|
25
26
|
import enum
|
|
26
27
|
import typing
|
|
27
28
|
|
|
@@ -170,17 +171,17 @@ class ModelRestApi(
|
|
|
170
171
|
"""
|
|
171
172
|
The list of routes to expose. Available routes: `info`, `download`, `bulk`, `get_list`, `get`, `post`, `put`, `delete`.
|
|
172
173
|
"""
|
|
173
|
-
exclude_routes:
|
|
174
|
+
exclude_routes: list[AVAILABLE_ROUTES] = lazy(lambda: [])
|
|
174
175
|
"""
|
|
175
176
|
The list of routes to exclude. Available routes: `info`, `download`, `bulk`, `get_list`, `get`, `post`, `put`, `delete`.
|
|
176
177
|
"""
|
|
177
|
-
protected_routes:
|
|
178
|
+
protected_routes: list[AVAILABLE_ROUTES] = lazy(
|
|
178
179
|
lambda self: [x for x in self.routes if x not in self.exclude_protected_routes]
|
|
179
180
|
)
|
|
180
181
|
"""
|
|
181
182
|
The list of routes to protect. Defaults to all routes within `routes` property except those in `exclude_protected_routes`.
|
|
182
183
|
"""
|
|
183
|
-
exclude_protected_routes:
|
|
184
|
+
exclude_protected_routes: list[AVAILABLE_ROUTES] = lazy(lambda: [])
|
|
184
185
|
"""
|
|
185
186
|
The list of routes to exclude from protection. Defaults to `[]`.
|
|
186
187
|
"""
|
|
@@ -197,7 +198,7 @@ class ModelRestApi(
|
|
|
197
198
|
}
|
|
198
199
|
```
|
|
199
200
|
"""
|
|
200
|
-
base_order:
|
|
201
|
+
base_order: tuple[str, typing.Literal["asc", "desc"]] | None = None
|
|
201
202
|
"""
|
|
202
203
|
The default order for the list endpoint. Set this to set the default order for the list endpoint.
|
|
203
204
|
|
|
@@ -206,9 +207,7 @@ class ModelRestApi(
|
|
|
206
207
|
base_order = ("name", "asc")
|
|
207
208
|
```
|
|
208
209
|
"""
|
|
209
|
-
base_filters:
|
|
210
|
-
typing.List[typing.Tuple[str, typing.Type[BaseFilter], typing.Any]] | None
|
|
211
|
-
) = None
|
|
210
|
+
base_filters: list[tuple[str, type[BaseFilter], typing.Any]] | None = None
|
|
212
211
|
"""
|
|
213
212
|
The default filters to apply for the following endpoints: `download`, `list`, `show`, `add`, and `edit`. Defaults to None.
|
|
214
213
|
|
|
@@ -219,9 +218,7 @@ class ModelRestApi(
|
|
|
219
218
|
]
|
|
220
219
|
```
|
|
221
220
|
"""
|
|
222
|
-
base_opr_filters:
|
|
223
|
-
typing.List[typing.Tuple[typing.Type[BaseOprFilter], typing.Any]] | None
|
|
224
|
-
) = None
|
|
221
|
+
base_opr_filters: list[tuple[type[BaseOprFilter], typing.Any]] | None = None
|
|
225
222
|
"""
|
|
226
223
|
The default opr filters to apply for the following endpoints: `download`, `list`, `show`, `add`, and `edit`. Defaults to None.
|
|
227
224
|
|
|
@@ -232,7 +229,7 @@ class ModelRestApi(
|
|
|
232
229
|
]
|
|
233
230
|
```
|
|
234
231
|
"""
|
|
235
|
-
opr_filters:
|
|
232
|
+
opr_filters: list[type[BaseOprFilter]] | None = None
|
|
236
233
|
"""
|
|
237
234
|
The list of opr filters to be exposed to the user. Defaults to None, which means no opr filters will be exposed.
|
|
238
235
|
|
|
@@ -267,7 +264,7 @@ class ModelRestApi(
|
|
|
267
264
|
"""
|
|
268
265
|
The enum for the order columns in the list endpoint.
|
|
269
266
|
"""
|
|
270
|
-
query_schema:
|
|
267
|
+
query_schema: type[QuerySchema] = lazy(
|
|
271
268
|
lambda self: merge_schema(
|
|
272
269
|
QuerySchema,
|
|
273
270
|
{
|
|
@@ -286,7 +283,7 @@ class ModelRestApi(
|
|
|
286
283
|
|
|
287
284
|
DO NOT MODIFY UNLESS YOU KNOW WHAT YOU ARE DOING.
|
|
288
285
|
"""
|
|
289
|
-
download_body_schema:
|
|
286
|
+
download_body_schema: type[QueryBody] = lazy(
|
|
290
287
|
lambda self: merge_schema(
|
|
291
288
|
QueryBody,
|
|
292
289
|
{
|
|
@@ -336,7 +333,7 @@ class ModelRestApi(
|
|
|
336
333
|
```
|
|
337
334
|
"""
|
|
338
335
|
add_query_rel_fields = lazy(
|
|
339
|
-
lambda: dict[str, list[tuple[str,
|
|
336
|
+
lambda: dict[str, list[tuple[str, type[BaseFilter], typing.Any]]]()
|
|
340
337
|
)
|
|
341
338
|
"""
|
|
342
339
|
The query fields for the related fields in the add_columns property.
|
|
@@ -351,7 +348,7 @@ class ModelRestApi(
|
|
|
351
348
|
```
|
|
352
349
|
"""
|
|
353
350
|
edit_query_rel_fields = lazy(
|
|
354
|
-
lambda: dict[str, list[tuple[str,
|
|
351
|
+
lambda: dict[str, list[tuple[str, type[BaseFilter], typing.Any]]]()
|
|
355
352
|
)
|
|
356
353
|
"""
|
|
357
354
|
The query fields for the related fields in the edit_columns property.
|
|
@@ -366,7 +363,7 @@ class ModelRestApi(
|
|
|
366
363
|
```
|
|
367
364
|
"""
|
|
368
365
|
search_query_rel_fields = lazy(
|
|
369
|
-
lambda: dict[str, list[tuple[str,
|
|
366
|
+
lambda: dict[str, list[tuple[str, type[BaseFilter], typing.Any]]]()
|
|
370
367
|
)
|
|
371
368
|
"""
|
|
372
369
|
The query fields for the related fields in the filters.
|
|
@@ -393,7 +390,7 @@ class ModelRestApi(
|
|
|
393
390
|
}
|
|
394
391
|
```
|
|
395
392
|
"""
|
|
396
|
-
search_filters = lazy(lambda: dict[str, list[
|
|
393
|
+
search_filters = lazy(lambda: dict[str, list[type[BaseFilter]]]())
|
|
397
394
|
"""
|
|
398
395
|
Add additional filters to the search columns.
|
|
399
396
|
|
|
@@ -404,9 +401,7 @@ class ModelRestApi(
|
|
|
404
401
|
}
|
|
405
402
|
```
|
|
406
403
|
"""
|
|
407
|
-
search_exclude_filters = lazy(
|
|
408
|
-
lambda: dict[str, list[typing.Type[BaseFilter] | str]]()
|
|
409
|
-
)
|
|
404
|
+
search_exclude_filters = lazy(lambda: dict[str, list[type[BaseFilter] | str]]())
|
|
410
405
|
"""
|
|
411
406
|
Exclude filters from the search columns.
|
|
412
407
|
|
|
@@ -419,7 +414,7 @@ class ModelRestApi(
|
|
|
419
414
|
}
|
|
420
415
|
```
|
|
421
416
|
"""
|
|
422
|
-
info_return_schema:
|
|
417
|
+
info_return_schema: type[InfoResponse] = lazy(
|
|
423
418
|
lambda self: merge_schema(
|
|
424
419
|
InfoResponse,
|
|
425
420
|
{
|
|
@@ -663,13 +658,13 @@ class ModelRestApi(
|
|
|
663
658
|
|
|
664
659
|
add_jsonforms_schema: (
|
|
665
660
|
dict[str, typing.Any]
|
|
666
|
-
|
|
|
661
|
+
| collections.abc.Callable[[], dict | collections.abc.Awaitable[dict]]
|
|
667
662
|
| None
|
|
668
663
|
) = None
|
|
669
664
|
"""
|
|
670
665
|
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`.
|
|
671
666
|
"""
|
|
672
|
-
add_jsonforms_uischema:
|
|
667
|
+
add_jsonforms_uischema: dict[str, typing.Any] | None = None
|
|
673
668
|
"""
|
|
674
669
|
The `JSONForms` uischema for the add endpoint. If not provided, it will let `JSONForms` generate the uischema.
|
|
675
670
|
"""
|
|
@@ -679,11 +674,15 @@ class ModelRestApi(
|
|
|
679
674
|
"""
|
|
680
675
|
add_jsonforms_use_enum: (
|
|
681
676
|
bool
|
|
682
|
-
|
|
|
677
|
+
| collections.abc.Callable[
|
|
678
|
+
[ColumnInfo | ColumnEnumInfo | ColumnRelationInfo], bool
|
|
679
|
+
]
|
|
683
680
|
| dict[
|
|
684
681
|
str,
|
|
685
682
|
bool
|
|
686
|
-
|
|
|
683
|
+
| collections.abc.Callable[
|
|
684
|
+
[ColumnInfo | ColumnEnumInfo | ColumnRelationInfo], bool
|
|
685
|
+
],
|
|
687
686
|
]
|
|
688
687
|
) = lazy(lambda: lambda info: len(info.values) > 100)
|
|
689
688
|
"""
|
|
@@ -709,13 +708,13 @@ class ModelRestApi(
|
|
|
709
708
|
|
|
710
709
|
edit_jsonforms_schema: (
|
|
711
710
|
dict[str, typing.Any]
|
|
712
|
-
|
|
|
711
|
+
| collections.abc.Callable[[], dict | collections.abc.Awaitable[dict]]
|
|
713
712
|
| None
|
|
714
713
|
) = None
|
|
715
714
|
"""
|
|
716
715
|
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`.
|
|
717
716
|
"""
|
|
718
|
-
edit_jsonforms_uischema:
|
|
717
|
+
edit_jsonforms_uischema: dict[str, typing.Any] | None = None
|
|
719
718
|
"""
|
|
720
719
|
The `JSONForms` uischema for the edit endpoint. If not provided, it will let `JSONForms` generate the uischema.
|
|
721
720
|
"""
|
|
@@ -725,11 +724,15 @@ class ModelRestApi(
|
|
|
725
724
|
"""
|
|
726
725
|
edit_jsonforms_use_enum: (
|
|
727
726
|
bool
|
|
728
|
-
|
|
|
727
|
+
| collections.abc.Callable[
|
|
728
|
+
[ColumnInfo | ColumnEnumInfo | ColumnRelationInfo], bool
|
|
729
|
+
]
|
|
729
730
|
| dict[
|
|
730
731
|
str,
|
|
731
732
|
bool
|
|
732
|
-
|
|
|
733
|
+
| collections.abc.Callable[
|
|
734
|
+
[ColumnInfo | ColumnEnumInfo | ColumnRelationInfo], bool
|
|
735
|
+
],
|
|
733
736
|
]
|
|
734
737
|
) = lazy(lambda: lambda info: len(info.values) > 100)
|
|
735
738
|
"""
|
|
@@ -823,14 +826,14 @@ class ModelRestApi(
|
|
|
823
826
|
-------------
|
|
824
827
|
"""
|
|
825
828
|
|
|
826
|
-
add_schema:
|
|
829
|
+
add_schema: type[pydantic.BaseModel] = lazy(
|
|
827
830
|
lambda self: typing.Annotated[
|
|
828
|
-
|
|
829
|
-
|
|
831
|
+
merge_schema(
|
|
832
|
+
self._create_request_schema(
|
|
830
833
|
self.add_obj_schema,
|
|
831
|
-
self.
|
|
832
|
-
name=f"{self.__class__.__name__}-AddObjSchema-Merged",
|
|
834
|
+
name=f"{self.__class__.__name__}-AddObjSchema-Request",
|
|
833
835
|
),
|
|
836
|
+
self._handle_schema_extra_fields(self.add_schema_extra_fields),
|
|
834
837
|
name=f"{self.__class__.__name__}-AddSchema",
|
|
835
838
|
),
|
|
836
839
|
fastapi.Form(media_type="multipart/form-data")
|
|
@@ -843,15 +846,15 @@ class ModelRestApi(
|
|
|
843
846
|
|
|
844
847
|
DO NOT MODIFY UNLESS YOU KNOW WHAT YOU ARE DOING.
|
|
845
848
|
"""
|
|
846
|
-
edit_schema:
|
|
849
|
+
edit_schema: type[pydantic.BaseModel] = lazy(
|
|
847
850
|
lambda self: typing.Annotated[
|
|
848
|
-
|
|
849
|
-
|
|
851
|
+
merge_schema(
|
|
852
|
+
self._create_request_schema(
|
|
850
853
|
self.edit_obj_schema,
|
|
851
|
-
|
|
852
|
-
name=f"{self.__class__.__name__}-EditObjSchema-
|
|
854
|
+
optional=True,
|
|
855
|
+
name=f"{self.__class__.__name__}-EditObjSchema-Request",
|
|
853
856
|
),
|
|
854
|
-
|
|
857
|
+
self._handle_schema_extra_fields(self.edit_schema_extra_fields),
|
|
855
858
|
name=f"{self.__class__.__name__}-EditSchema",
|
|
856
859
|
),
|
|
857
860
|
fastapi.Form(media_type="multipart/form-data")
|
|
@@ -870,6 +873,8 @@ class ModelRestApi(
|
|
|
870
873
|
"""
|
|
871
874
|
Extra fields to add to the add schema. Useful when you want to add extra fields in the body of the add endpoint for your custom logic.
|
|
872
875
|
|
|
876
|
+
Keys must not collide with `add_columns`; a colliding name raises `ValueError` at API setup, since extra fields override the request body but not the JSONForms / object schema.
|
|
877
|
+
|
|
873
878
|
Example:
|
|
874
879
|
```python
|
|
875
880
|
add_schema_extra_fields = {
|
|
@@ -884,6 +889,8 @@ class ModelRestApi(
|
|
|
884
889
|
"""
|
|
885
890
|
Extra fields to add to the edit schema. Useful when you want to add extra fields in the body of the edit endpoint for your custom logic.
|
|
886
891
|
|
|
892
|
+
Keys must not collide with `edit_columns`; a colliding name raises `ValueError` at API setup, since extra fields override the request body but not the JSONForms / object schema.
|
|
893
|
+
|
|
887
894
|
Example:
|
|
888
895
|
```python
|
|
889
896
|
edit_schema_extra_fields = {
|
|
@@ -899,12 +906,12 @@ class ModelRestApi(
|
|
|
899
906
|
-------------
|
|
900
907
|
"""
|
|
901
908
|
|
|
902
|
-
list_return_schema:
|
|
909
|
+
list_return_schema: type[BaseResponseMany] = lazy(
|
|
903
910
|
lambda self: merge_schema(
|
|
904
911
|
BaseResponseMany,
|
|
905
912
|
{
|
|
906
913
|
**vars(self),
|
|
907
|
-
"result": (
|
|
914
|
+
"result": (list[self.list_obj_schema], ...),
|
|
908
915
|
},
|
|
909
916
|
True,
|
|
910
917
|
f"{self.__class__.__name__}-ListResponse",
|
|
@@ -915,7 +922,7 @@ class ModelRestApi(
|
|
|
915
922
|
|
|
916
923
|
DO NOT MODIFY UNLESS YOU KNOW WHAT YOU ARE DOING.
|
|
917
924
|
"""
|
|
918
|
-
show_return_schema:
|
|
925
|
+
show_return_schema: type[BaseResponseSingle] = lazy(
|
|
919
926
|
lambda self: merge_schema(
|
|
920
927
|
BaseResponseSingle,
|
|
921
928
|
{
|
|
@@ -931,7 +938,7 @@ class ModelRestApi(
|
|
|
931
938
|
|
|
932
939
|
DO NOT MODIFY UNLESS YOU KNOW WHAT YOU ARE DOING.
|
|
933
940
|
"""
|
|
934
|
-
add_return_schema:
|
|
941
|
+
add_return_schema: type[BaseResponseSingle] = lazy(
|
|
935
942
|
lambda self: merge_schema(
|
|
936
943
|
self.show_return_schema,
|
|
937
944
|
{},
|
|
@@ -943,7 +950,7 @@ class ModelRestApi(
|
|
|
943
950
|
|
|
944
951
|
DO NOT MODIFY UNLESS YOU KNOW WHAT YOU ARE DOING.
|
|
945
952
|
"""
|
|
946
|
-
edit_return_schema:
|
|
953
|
+
edit_return_schema: type[BaseResponseSingle] = lazy(
|
|
947
954
|
lambda self: merge_schema(
|
|
948
955
|
self.show_return_schema,
|
|
949
956
|
{},
|
|
@@ -1055,6 +1062,23 @@ class ModelRestApi(
|
|
|
1055
1062
|
f"Search columns with 2nd level relations are not supported: {not_supported_search_columns}"
|
|
1056
1063
|
)
|
|
1057
1064
|
|
|
1065
|
+
# Extra fields override the request schema but never the JSONForms /
|
|
1066
|
+
# object schema, so a name in both desyncs the form from the body.
|
|
1067
|
+
add_collisions = set(self.add_schema_extra_fields) & set(self.add_columns)
|
|
1068
|
+
if add_collisions:
|
|
1069
|
+
raise ValueError(
|
|
1070
|
+
f"add_schema_extra_fields keys collide with add_columns in "
|
|
1071
|
+
f"{self.__class__.__name__}: {sorted(add_collisions)}. Remove them "
|
|
1072
|
+
f"from add_columns or rename the extra fields."
|
|
1073
|
+
)
|
|
1074
|
+
edit_collisions = set(self.edit_schema_extra_fields) & set(self.edit_columns)
|
|
1075
|
+
if edit_collisions:
|
|
1076
|
+
raise ValueError(
|
|
1077
|
+
f"edit_schema_extra_fields keys collide with edit_columns in "
|
|
1078
|
+
f"{self.__class__.__name__}: {sorted(edit_collisions)}. Remove them "
|
|
1079
|
+
f"from edit_columns or rename the extra fields."
|
|
1080
|
+
)
|
|
1081
|
+
|
|
1058
1082
|
self._gen_labels_columns(self.list_columns)
|
|
1059
1083
|
self._gen_labels_columns(self.show_columns)
|
|
1060
1084
|
self._gen_labels_columns(self.search_columns)
|
|
@@ -1111,7 +1135,7 @@ class ModelRestApi(
|
|
|
1111
1135
|
Returns the current permissions dependency.
|
|
1112
1136
|
|
|
1113
1137
|
Returns:
|
|
1114
|
-
|
|
1138
|
+
collections.abc.Callable[..., Coroutine[typing.Any, typing.Any, typing.Any | list]]: The current permissions that the user has for the API dependency.
|
|
1115
1139
|
"""
|
|
1116
1140
|
return current_permissions(self)
|
|
1117
1141
|
|
|
@@ -1122,7 +1146,7 @@ class ModelRestApi(
|
|
|
1122
1146
|
If `list_query_count_enabled` is False or `q.with_count` is False, the session will be None.
|
|
1123
1147
|
|
|
1124
1148
|
Returns:
|
|
1125
|
-
|
|
1149
|
+
collections.abc.Callable[..., Coroutine[typing.Any, typing.Any, tuple[QuerySchema, SQLASession | None]]]: The dependency that yields the tuple.
|
|
1126
1150
|
"""
|
|
1127
1151
|
|
|
1128
1152
|
async def dependency(
|
|
@@ -3,7 +3,7 @@ Bulk route mixin for ``ModelRestApi``: ``bulk`` registration, ``bulk_headless``
|
|
|
3
3
|
dispatcher, and the subclass-overridable ``bulk_handler``.
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
|
-
import
|
|
6
|
+
import collections.abc
|
|
7
7
|
|
|
8
8
|
import fastapi
|
|
9
9
|
|
|
@@ -54,7 +54,7 @@ class BulkMixin(_TypedModelRestApi):
|
|
|
54
54
|
If you are overriding this method, make sure to copy all the decorators too.
|
|
55
55
|
"""
|
|
56
56
|
async with AsyncTaskRunner():
|
|
57
|
-
bulk_handler:
|
|
57
|
+
bulk_handler: collections.abc.Callable | None = getattr(
|
|
58
58
|
self, f"bulk_{handler}", None
|
|
59
59
|
)
|
|
60
60
|
if not bulk_handler:
|
|
@@ -19,6 +19,7 @@ This mixin holds:
|
|
|
19
19
|
derive the JSONForms schema served by ``/_info``.
|
|
20
20
|
"""
|
|
21
21
|
|
|
22
|
+
import collections.abc
|
|
22
23
|
import enum
|
|
23
24
|
import re
|
|
24
25
|
import types
|
|
@@ -52,7 +53,7 @@ class ColumnsMixin(_TypedModelRestApi):
|
|
|
52
53
|
Column / schema / body helpers shared by every ``ModelRestApi`` route.
|
|
53
54
|
"""
|
|
54
55
|
|
|
55
|
-
def _gen_labels_columns(self, list_columns:
|
|
56
|
+
def _gen_labels_columns(self, list_columns: list[str]) -> None:
|
|
56
57
|
"""
|
|
57
58
|
Auto generates pretty label_columns from list of columns
|
|
58
59
|
"""
|
|
@@ -87,17 +88,17 @@ class ColumnsMixin(_TypedModelRestApi):
|
|
|
87
88
|
def _init_filters(
|
|
88
89
|
self,
|
|
89
90
|
datamodel: SQLAInterface,
|
|
90
|
-
filters:
|
|
91
|
+
filters: list[tuple[str, type[BaseFilter], typing.Any]],
|
|
91
92
|
):
|
|
92
93
|
"""
|
|
93
94
|
Initialize the filter for the API.
|
|
94
95
|
|
|
95
96
|
Args:
|
|
96
97
|
datamodel (SQLAInterface): The datamodel object.
|
|
97
|
-
filters (
|
|
98
|
+
filters (list[tuple[str, type[BaseFilter], typing.Any]]): The list of filters to initialize.
|
|
98
99
|
|
|
99
100
|
Returns:
|
|
100
|
-
|
|
101
|
+
list[tuple[str, type[BaseFilter], typing.Any]]: The initialized filters.
|
|
101
102
|
"""
|
|
102
103
|
return [
|
|
103
104
|
(
|
|
@@ -158,7 +159,7 @@ class ColumnsMixin(_TypedModelRestApi):
|
|
|
158
159
|
col (str): The column name.
|
|
159
160
|
|
|
160
161
|
Returns:
|
|
161
|
-
|
|
162
|
+
tuple[SQLAInterface, str]: The datamodel and the related column name.
|
|
162
163
|
"""
|
|
163
164
|
datamodel = self.datamodel
|
|
164
165
|
col_to_get = col
|
|
@@ -169,7 +170,7 @@ class ColumnsMixin(_TypedModelRestApi):
|
|
|
169
170
|
|
|
170
171
|
def _create_request_schema(
|
|
171
172
|
self,
|
|
172
|
-
schema:
|
|
173
|
+
schema: type[pydantic.BaseModel],
|
|
173
174
|
optional: bool = False,
|
|
174
175
|
name: str | None = None,
|
|
175
176
|
):
|
|
@@ -177,7 +178,7 @@ class ColumnsMixin(_TypedModelRestApi):
|
|
|
177
178
|
Create a request schema from `schema` for add and edit endpoints, transforming relation columns into the appropriate schema.
|
|
178
179
|
|
|
179
180
|
Args:
|
|
180
|
-
schema (
|
|
181
|
+
schema (type[BaseModel]): The base schema to create the request schema from.
|
|
181
182
|
optional (bool, optional): Flag indicating whether the request schema is optional. Defaults to False.
|
|
182
183
|
name (str | None, optional): The name of the request schema. Defaults to None.
|
|
183
184
|
|
|
@@ -217,8 +218,8 @@ class ColumnsMixin(_TypedModelRestApi):
|
|
|
217
218
|
if not optional:
|
|
218
219
|
params["default"] = []
|
|
219
220
|
type = (
|
|
220
|
-
|
|
221
|
-
|
|
|
221
|
+
list[self.datamodel.get_related_interface(col).id_schema]
|
|
222
|
+
| list[RelInfo]
|
|
222
223
|
)
|
|
223
224
|
if optional or self.datamodel.is_nullable(col):
|
|
224
225
|
type = (
|
|
@@ -253,24 +254,24 @@ class ColumnsMixin(_TypedModelRestApi):
|
|
|
253
254
|
async def _process_body(
|
|
254
255
|
self,
|
|
255
256
|
session: SQLASession,
|
|
256
|
-
body: pydantic.BaseModel |
|
|
257
|
+
body: pydantic.BaseModel | dict[str, typing.Any],
|
|
257
258
|
filter_dict: dict[str, list[tuple[str, BaseFilter, typing.Any]]],
|
|
258
259
|
exclude: list[str] | None = None,
|
|
259
260
|
*,
|
|
260
261
|
item: Model | None = None,
|
|
261
|
-
) ->
|
|
262
|
+
) -> dict[str, typing.Any]:
|
|
262
263
|
"""
|
|
263
264
|
Process the body of the request by handling relations and returning a new body dictionary.
|
|
264
265
|
|
|
265
266
|
Args:
|
|
266
267
|
session (SQLASession): The session object for the database connection.
|
|
267
|
-
body (BaseModel |
|
|
268
|
+
body (BaseModel | dict[str, typing.Any]): The request body.
|
|
268
269
|
filter_dict (dict[str, list[tuple[str, BaseFilter, typing.Any]]): The filter dictionary.
|
|
269
270
|
exclude (list[str] | None, optional): The list of fields to exclude from the body. Defaults to None.
|
|
270
271
|
item (Model | None, optional): The item to be updated. Defaults to None.
|
|
271
272
|
|
|
272
273
|
Returns:
|
|
273
|
-
|
|
274
|
+
dict[str, typing.Any]: The transformed body dictionary.
|
|
274
275
|
|
|
275
276
|
Raises:
|
|
276
277
|
HTTPException: If any related items are not found or if an item is not found for a one-to-one or many-to-one relation.
|
|
@@ -524,11 +525,15 @@ class ColumnsMixin(_TypedModelRestApi):
|
|
|
524
525
|
schema: type[pydantic.BaseModel],
|
|
525
526
|
info_columns: list[ColumnInfo | ColumnEnumInfo | ColumnRelationInfo],
|
|
526
527
|
use_enum: bool
|
|
527
|
-
|
|
|
528
|
+
| collections.abc.Callable[
|
|
529
|
+
[ColumnInfo | ColumnEnumInfo | ColumnRelationInfo], bool
|
|
530
|
+
]
|
|
528
531
|
| dict[
|
|
529
532
|
str,
|
|
530
533
|
bool
|
|
531
|
-
|
|
|
534
|
+
| collections.abc.Callable[
|
|
535
|
+
[ColumnInfo | ColumnEnumInfo | ColumnRelationInfo], bool
|
|
536
|
+
],
|
|
532
537
|
] = False,
|
|
533
538
|
):
|
|
534
539
|
"""
|
|
@@ -33,7 +33,7 @@ class InfoMixin(_TypedModelRestApi):
|
|
|
33
33
|
|
|
34
34
|
async def info_headless(
|
|
35
35
|
self,
|
|
36
|
-
permissions:
|
|
36
|
+
permissions: list[str] = SelfDepends().get_current_permissions,
|
|
37
37
|
session: SQLASession = SelfDepends().datamodel.get_session_factory,
|
|
38
38
|
session_count: SQLASession = SelfDepends().datamodel.get_session_factory,
|
|
39
39
|
):
|
|
@@ -41,7 +41,7 @@ class InfoMixin(_TypedModelRestApi):
|
|
|
41
41
|
Retrieves information in headless mode.
|
|
42
42
|
|
|
43
43
|
Args:
|
|
44
|
-
permissions (
|
|
44
|
+
permissions (list[str]): A list of permissions.
|
|
45
45
|
session (SQLASession): A database session from the model's
|
|
46
46
|
session factory.
|
|
47
47
|
|
|
@@ -67,7 +67,7 @@ class InfoMixin(_TypedModelRestApi):
|
|
|
67
67
|
async def pre_info(
|
|
68
68
|
self,
|
|
69
69
|
info: InfoResponse,
|
|
70
|
-
permissions:
|
|
70
|
+
permissions: list[str],
|
|
71
71
|
session: SQLASession,
|
|
72
72
|
):
|
|
73
73
|
"""
|
|
@@ -76,7 +76,7 @@ class InfoMixin(_TypedModelRestApi):
|
|
|
76
76
|
|
|
77
77
|
Args:
|
|
78
78
|
info (InfoResponse): The info response.
|
|
79
|
-
permissions (
|
|
79
|
+
permissions (list[str]): A list of permissions.
|
|
80
80
|
session (SQLASession): The database session passed through from
|
|
81
81
|
`info_headless`.
|
|
82
82
|
"""
|
|
@@ -84,7 +84,7 @@ class InfoMixin(_TypedModelRestApi):
|
|
|
84
84
|
|
|
85
85
|
async def _generate_info_schema(
|
|
86
86
|
self,
|
|
87
|
-
permissions:
|
|
87
|
+
permissions: list[str],
|
|
88
88
|
session: SQLASession,
|
|
89
89
|
session_count: SQLASession,
|
|
90
90
|
):
|
|
@@ -92,7 +92,7 @@ class InfoMixin(_TypedModelRestApi):
|
|
|
92
92
|
Generates the information schema for the API.
|
|
93
93
|
|
|
94
94
|
Args:
|
|
95
|
-
permissions (
|
|
95
|
+
permissions (list[str]): The list of permissions for the API.
|
|
96
96
|
session (SQLASession): The database session.
|
|
97
97
|
session_count (SQLASession): The database session for counting.
|
|
98
98
|
|
|
@@ -35,12 +35,12 @@ __all__ = [
|
|
|
35
35
|
class Params(pydantic.BaseModel):
|
|
36
36
|
model_config = pydantic.ConfigDict(arbitrary_types_allowed=True)
|
|
37
37
|
id: PRIMARY_KEY | None = None
|
|
38
|
-
ids:
|
|
38
|
+
ids: list[PRIMARY_KEY] | None = None
|
|
39
39
|
q: QuerySchema | None = None
|
|
40
40
|
session: SQLASession | AbstractSession | typing.Any | None = None
|
|
41
41
|
body: pydantic.BaseModel | None = None
|
|
42
42
|
item: Model | typing.Any | None = None
|
|
43
|
-
items:
|
|
43
|
+
items: list[Model | typing.Any] | None = None
|
|
44
44
|
extra: typing.Any | None = None
|
|
45
45
|
|
|
46
46
|
|
|
@@ -49,7 +49,7 @@ class P_ID(Params):
|
|
|
49
49
|
|
|
50
50
|
|
|
51
51
|
class P_IDS(Params):
|
|
52
|
-
ids:
|
|
52
|
+
ids: list[PRIMARY_KEY]
|
|
53
53
|
|
|
54
54
|
|
|
55
55
|
class P_Q(Params):
|
|
@@ -69,7 +69,7 @@ class P_ITEM(Params):
|
|
|
69
69
|
|
|
70
70
|
|
|
71
71
|
class P_ITEMS(Params):
|
|
72
|
-
items:
|
|
72
|
+
items: list[Model | typing.Any]
|
|
73
73
|
|
|
74
74
|
|
|
75
75
|
class PARAM_Q(P_Q):
|