arpakitlib 1.7.256__py3-none-any.whl → 1.8.0__py3-none-any.whl
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.
- arpakitlib/{_arpakit_project_template → _arpakit_project_template_v1}/README.md +1 -1
- arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v1}/admin1/add_admin_in_app.py +6 -12
- arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v1}/admin1/admin_auth.py +2 -6
- arpakitlib/_arpakit_project_template_v1/admin1/model_view.py +95 -0
- arpakitlib/{_arpakit_project_template → _arpakit_project_template_v1}/alembic/env.py +3 -3
- arpakitlib/_arpakit_project_template_v1/api/asgi.py +3 -0
- arpakitlib/_arpakit_project_template_v1/api/auth.py +244 -0
- arpakitlib/_arpakit_project_template_v1/api/const.py +18 -0
- arpakitlib/_arpakit_project_template_v1/api/create_api_app.py +72 -0
- arpakitlib/_arpakit_project_template_v1/api/event.py +69 -0
- arpakitlib/_arpakit_project_template_v1/api/exception.py +39 -0
- arpakitlib/_arpakit_project_template_v1/api/exception_handler.py +297 -0
- arpakitlib/_arpakit_project_template_v1/api/openapi_ui.py +28 -0
- arpakitlib/_arpakit_project_template_v1/api/response.py +27 -0
- arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v1}/api/router/main_router.py +3 -2
- arpakitlib/_arpakit_project_template_v1/api/router/v1/arpakitlib_.py +27 -0
- arpakitlib/_arpakit_project_template_v1/api/router/v1/check_auth.py +30 -0
- arpakitlib/_arpakit_project_template_v1/api/router/v1/get_errors_info.py +24 -0
- arpakitlib/_arpakit_project_template_v1/api/router/v1/healthcheck.py +21 -0
- arpakitlib/_arpakit_project_template_v1/api/router/v1/main_router.py +54 -0
- arpakitlib/_arpakit_project_template_v1/api/router/v1/now_utc_datetime.py +21 -0
- arpakitlib/_arpakit_project_template_v1/api/router/v1/raise_fake_error.py +21 -0
- arpakitlib/_arpakit_project_template_v1/api/schema/base_schema.py +26 -0
- arpakitlib/_arpakit_project_template_v1/api/schema/common/in_.py +5 -0
- arpakitlib/_arpakit_project_template_v1/api/schema/common/out.py +60 -0
- arpakitlib/_arpakit_project_template_v1/api/schema/v1/in_.py +5 -0
- arpakitlib/_arpakit_project_template_v1/api/schema/v1/out.py +53 -0
- arpakitlib/_arpakit_project_template_v1/api/transmitted_api_data.py +66 -0
- arpakitlib/_arpakit_project_template_v1/arpakitlib_project_template.json +3 -0
- arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v1}/business_service/hello_world.py +1 -1
- arpakitlib/_arpakit_project_template_v1/business_service/remove_operations.py +51 -0
- arpakitlib/_arpakit_project_template_v1/command/alembic_history.sh +2 -0
- arpakitlib/_arpakit_project_template_v1/command/alembic_revision_autogenerate.sh +2 -0
- arpakitlib/{_arpakit_project_template/manage/json_beautify.py → _arpakit_project_template_v1/command/beautify_json.py} +2 -2
- arpakitlib/{_arpakit_project_template/src/core/_check_logging.py → _arpakit_project_template_v1/command/check_logging.py} +3 -3
- arpakitlib/_arpakit_project_template_v1/command/check_sqlalchemy_db.py +11 -0
- arpakitlib/_arpakit_project_template_v1/command/drop_json_db.py +13 -0
- arpakitlib/_arpakit_project_template_v1/command/drop_sqlalchemy_db.py +14 -0
- arpakitlib/{_arpakit_project_template/src/core/_generate_settings_env_example.py → _arpakit_project_template_v1/command/generate_settings_env_example.py} +4 -4
- arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v1/command}/hello_world.py +2 -2
- arpakitlib/_arpakit_project_template_v1/command/init_json_db.py +11 -0
- arpakitlib/_arpakit_project_template_v1/command/init_sqlalchemy_db.py +11 -0
- arpakitlib/_arpakit_project_template_v1/command/reinit_json_db.py +13 -0
- arpakitlib/_arpakit_project_template_v1/command/reinit_sqlalchemy_db.py +13 -0
- arpakitlib/_arpakit_project_template_v1/command/remove_operations.py +13 -0
- arpakitlib/_arpakit_project_template_v1/command/remove_story_logs.py +16 -0
- arpakitlib/_arpakit_project_template_v1/command/rm_all_records_in_json_db.py +13 -0
- arpakitlib/{_arpakit_project_template/src/core/_show_settings.py → _arpakit_project_template_v1/command/show_settings.py} +3 -3
- arpakitlib/{_arpakit_project_template/src/api/_start_api_with_reload.py → _arpakit_project_template_v1/command/start_api_with_reload.py} +5 -5
- arpakitlib/{_arpakit_project_template/src/api/_start_api_without_reload.py → _arpakit_project_template_v1/command/start_api_without_reload.py} +5 -5
- arpakitlib/_arpakit_project_template_v1/command/start_async_operation_executor_worker.py +14 -0
- arpakitlib/_arpakit_project_template_v1/command/start_async_scheduled_operation_creator_worker.py +14 -0
- arpakitlib/_arpakit_project_template_v1/command/start_sync_operation_executor_worker.py +15 -0
- arpakitlib/_arpakit_project_template_v1/command/start_sync_operation_executor_workers.py +22 -0
- arpakitlib/_arpakit_project_template_v1/command/start_sync_scheduled_operation_creator_worker.py +12 -0
- arpakitlib/_arpakit_project_template_v1/core/cache_file_storage_in_dir.py +21 -0
- arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v1}/core/const.py +2 -9
- arpakitlib/_arpakit_project_template_v1/core/dump_file_storage_in_dir.py +21 -0
- arpakitlib/_arpakit_project_template_v1/core/media_file_storage_in_dir.py +21 -0
- arpakitlib/_arpakit_project_template_v1/core/settings.py +193 -0
- arpakitlib/_arpakit_project_template_v1/core/util.py +29 -0
- arpakitlib/{_arpakit_project_template → _arpakit_project_template_v1}/example.env +10 -5
- arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v1}/json_db/util.py +2 -2
- arpakitlib/_arpakit_project_template_v1/operation_execution/operation_executor_worker.py +256 -0
- arpakitlib/_arpakit_project_template_v1/operation_execution/scheduled_operation_creator_worker.py +106 -0
- arpakitlib/_arpakit_project_template_v1/operation_execution/scheduled_operations.py +49 -0
- arpakitlib/_arpakit_project_template_v1/operation_execution/util.py +29 -0
- arpakitlib/_arpakit_project_template_v1/resource/static/openapi-favicon.png +0 -0
- arpakitlib/_arpakit_project_template_v1/resource/static/swagger-ui/index.html +19 -0
- arpakitlib/_arpakit_project_template_v1/resource/static/swagger-ui/swagger-ui-bundle.js +2 -0
- arpakitlib/{ar_fastapi_static → _arpakit_project_template_v1/resource/static}/swagger-ui/swagger-ui-es-bundle-core.js +1 -1
- arpakitlib/_arpakit_project_template_v1/resource/static/swagger-ui/swagger-ui-es-bundle-core.js.map +1 -0
- arpakitlib/_arpakit_project_template_v1/resource/static/swagger-ui/swagger-ui-es-bundle.js +2 -0
- arpakitlib/_arpakit_project_template_v1/resource/static/swagger-ui/swagger-ui-standalone-preset.js +2 -0
- arpakitlib/{ar_fastapi_static → _arpakit_project_template_v1/resource/static}/swagger-ui/swagger-ui.js +1 -1
- arpakitlib/_arpakit_project_template_v1/resource/static/swagger-ui/swagger-ui.js.map +1 -0
- arpakitlib/_arpakit_project_template_v1/sandbox/sandbox_1.py +14 -0
- arpakitlib/_arpakit_project_template_v1/sandbox/sandbox_2.py +14 -0
- arpakitlib/_arpakit_project_template_v1/sandbox/sandbox_3.py +14 -0
- arpakitlib/_arpakit_project_template_v1/sandbox/sandbox_4.py +14 -0
- arpakitlib/_arpakit_project_template_v1/sandbox/sandbox_5.py +14 -0
- arpakitlib/_arpakit_project_template_v1/sandbox/sandbox_6.py +14 -0
- arpakitlib/_arpakit_project_template_v1/sandbox/sandbox_7.py +14 -0
- arpakitlib/{_arpakit_project_template/src/sqlalchemy_db/util.py → _arpakit_project_template_v1/sqlalchemy_db/sqlalchemy_db.py} +3 -11
- arpakitlib/_arpakit_project_template_v1/sqlalchemy_db/sqlalchemy_model.py +129 -0
- arpakitlib/_arpakit_project_template_v1/sqlalchemy_db/util.py +28 -0
- arpakitlib/{_arpakit_project_template/src/sandbox/sandbox_3.py → _arpakit_project_template_v1/test_data/make_test_data_1.py} +8 -3
- arpakitlib/{_arpakit_project_template/src/sandbox/sandbox_4.py → _arpakit_project_template_v1/test_data/make_test_data_2.py} +8 -3
- arpakitlib/{_arpakit_project_template/src/sandbox/sandbox_1.py → _arpakit_project_template_v1/test_data/make_test_data_3.py} +8 -3
- arpakitlib/{_arpakit_project_template/src/sandbox/sandbox_2.py → _arpakit_project_template_v1/test_data/make_test_data_4.py} +8 -3
- arpakitlib/_arpakit_project_template_v1/test_data/make_test_data_5.py +22 -0
- arpakitlib/_arpakit_project_template_v1/tg_bot/blank/blank.py +5 -0
- arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v1}/tg_bot/blank/util.py +1 -1
- arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v1}/tg_bot/const.py +6 -3
- arpakitlib/_arpakit_project_template_v1/tg_bot/event.py +51 -0
- arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v1}/tg_bot/filter/not_prod_mode.py +1 -1
- arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v1}/tg_bot/filter/prod_mode.py +1 -1
- arpakitlib/_arpakit_project_template_v1/tg_bot/middleware/init_user.py +24 -0
- arpakitlib/_arpakit_project_template_v1/tg_bot/middleware/middleware.py +12 -0
- arpakitlib/_arpakit_project_template_v1/tg_bot/router/arpakitlib_.py +10 -0
- arpakitlib/_arpakit_project_template_v1/tg_bot/router/error.py +15 -0
- arpakitlib/_arpakit_project_template_v1/tg_bot/router/healthcheck.py +10 -0
- arpakitlib/_arpakit_project_template_v1/tg_bot/router/main_router.py +14 -0
- arpakitlib/_arpakit_project_template_v1/tg_bot/start_tg_bot.py +34 -0
- arpakitlib/_arpakit_project_template_v1/tg_bot/tg_bot.py +24 -0
- arpakitlib/_arpakit_project_template_v1/tg_bot/tg_bot_dispatcher.py +19 -0
- arpakitlib/_arpakit_project_template_v1/tg_bot/transmitted_tg_data.py +58 -0
- arpakitlib/_arpakit_project_template_v1/util/read_arpakitlib_project_template_file.py +17 -0
- arpakitlib/ar_aiogram_util.py +41 -52
- arpakitlib/ar_arpakit_project_template_util.py +8 -11
- arpakitlib/ar_arpakitlib_cli_util.py +14 -5
- arpakitlib/ar_base_worker_util.py +35 -17
- arpakitlib/ar_class_util.py +11 -0
- arpakitlib/ar_func_util.py +19 -29
- arpakitlib/ar_http_request_util.py +10 -2
- arpakitlib/ar_need_type_util.py +3 -0
- arpakitlib/ar_rat_func_util.py +1 -1
- arpakitlib/ar_retry_func_util.py +4 -4
- arpakitlib/ar_schedule_uust_api_client_util.py +1 -1
- arpakitlib/ar_settings_util.py +3 -204
- arpakitlib/ar_sqladmin_util.py +7 -102
- arpakitlib/ar_sqlalchemy_util.py +65 -13
- arpakitlib/ar_type_util.py +0 -2
- {arpakitlib-1.7.256.dist-info → arpakitlib-1.8.0.dist-info}/METADATA +7 -6
- arpakitlib-1.8.0.dist-info/RECORD +251 -0
- {arpakitlib-1.7.256.dist-info → arpakitlib-1.8.0.dist-info}/WHEEL +1 -1
- arpakitlib/_arpakit_project_template/ARPAKITLIB +0 -1
- arpakitlib/_arpakit_project_template/manage/docker_ps.sh +0 -2
- arpakitlib/_arpakit_project_template/manage/git_branch.sh +0 -2
- arpakitlib/_arpakit_project_template/manage/poetry_add_plugin_export.sh +0 -2
- arpakitlib/_arpakit_project_template/manage/poetry_config_virtualenvs_in_project_true.sh +0 -2
- arpakitlib/_arpakit_project_template/manage/poetry_self_add_plugin_export.sh +0 -2
- arpakitlib/_arpakit_project_template/src/admin1/model_view.py +0 -1
- arpakitlib/_arpakit_project_template/src/api/asgi.py +0 -3
- arpakitlib/_arpakit_project_template/src/api/auth.py +0 -53
- arpakitlib/_arpakit_project_template/src/api/const.py +0 -13
- arpakitlib/_arpakit_project_template/src/api/create_api_app.py +0 -43
- arpakitlib/_arpakit_project_template/src/api/create_handle_exception_.py +0 -59
- arpakitlib/_arpakit_project_template/src/api/event.py +0 -83
- arpakitlib/_arpakit_project_template/src/api/router/v1/get_api_error_info.py +0 -27
- arpakitlib/_arpakit_project_template/src/api/router/v1/main_router.py +0 -15
- arpakitlib/_arpakit_project_template/src/api/schema/v1/in_.py +0 -1
- arpakitlib/_arpakit_project_template/src/api/schema/v1/out.py +0 -1
- arpakitlib/_arpakit_project_template/src/api/transmitted_api_data.py +0 -7
- arpakitlib/_arpakit_project_template/src/api/util.py +0 -44
- arpakitlib/_arpakit_project_template/src/core/settings.py +0 -21
- arpakitlib/_arpakit_project_template/src/core/util.py +0 -61
- arpakitlib/_arpakit_project_template/src/json_db/_drop_json_db.py +0 -13
- arpakitlib/_arpakit_project_template/src/json_db/_init_json_db.py +0 -11
- arpakitlib/_arpakit_project_template/src/json_db/_reinit_json_db.py +0 -13
- arpakitlib/_arpakit_project_template/src/json_db/_rm_all_records_in_json_db.py +0 -13
- arpakitlib/_arpakit_project_template/src/just_script/example.py +0 -16
- arpakitlib/_arpakit_project_template/src/operation_execution/_start_operation_executor_worker.py +0 -17
- arpakitlib/_arpakit_project_template/src/operation_execution/_start_scheduled_operation_creator_worker.py +0 -17
- arpakitlib/_arpakit_project_template/src/operation_execution/const.py +0 -9
- arpakitlib/_arpakit_project_template/src/operation_execution/operation_executor.py +0 -16
- arpakitlib/_arpakit_project_template/src/operation_execution/scheduled_operations.py +0 -29
- arpakitlib/_arpakit_project_template/src/operation_execution/util.py +0 -1
- arpakitlib/_arpakit_project_template/src/sandbox/sandbox_5.py +0 -17
- arpakitlib/_arpakit_project_template/src/sandbox/sandbox_6.py +0 -17
- arpakitlib/_arpakit_project_template/src/sandbox/sandbox_7.py +0 -17
- arpakitlib/_arpakit_project_template/src/sqlalchemy_db/_check_conn_sqlalchemy_db.py +0 -11
- arpakitlib/_arpakit_project_template/src/sqlalchemy_db/_drop_sqlalchemy_db.py +0 -13
- arpakitlib/_arpakit_project_template/src/sqlalchemy_db/_init_sqlalchemy_db.py +0 -11
- arpakitlib/_arpakit_project_template/src/sqlalchemy_db/_reinit_sqlalchemy_db.py +0 -13
- arpakitlib/_arpakit_project_template/src/sqlalchemy_db/_remove_operations.py +0 -15
- arpakitlib/_arpakit_project_template/src/sqlalchemy_db/_remove_story_logs.py +0 -16
- arpakitlib/_arpakit_project_template/src/sqlalchemy_db/sqlalchemy_model.py +0 -13
- arpakitlib/_arpakit_project_template/src/test_data/make_test_data_1.py +0 -8
- arpakitlib/_arpakit_project_template/src/test_data/make_test_data_2.py +0 -8
- arpakitlib/_arpakit_project_template/src/test_data/make_test_data_3.py +0 -8
- arpakitlib/_arpakit_project_template/src/test_data/make_test_data_4.py +0 -8
- arpakitlib/_arpakit_project_template/src/test_data/make_test_data_5.py +0 -8
- arpakitlib/_arpakit_project_template/src/tg_bot/blank/blank.py +0 -10
- arpakitlib/_arpakit_project_template/src/tg_bot/event.py +0 -39
- arpakitlib/_arpakit_project_template/src/tg_bot/handler/cmd_healthcheck.py +0 -0
- arpakitlib/_arpakit_project_template/src/tg_bot/router/error.py +0 -3
- arpakitlib/_arpakit_project_template/src/tg_bot/router/router.py +0 -7
- arpakitlib/_arpakit_project_template/src/tg_bot/start_tg_bot.py +0 -11
- arpakitlib/_arpakit_project_template/src/tg_bot/transmitted_tg_data.py +0 -6
- arpakitlib/_arpakit_project_template/src/tg_bot/util.py +0 -44
- arpakitlib/ar_api_key_util.py +0 -21
- arpakitlib/ar_fastapi_static/healthcheck +0 -1
- arpakitlib/ar_fastapi_static/swagger-ui/index.html +0 -19
- arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-bundle.js +0 -2
- arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-es-bundle-core.js.map +0 -1
- arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-es-bundle.js +0 -2
- arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-standalone-preset.js +0 -2
- arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui.js.map +0 -1
- arpakitlib/ar_fastapi_util.py +0 -862
- arpakitlib/ar_operation_execution_util.py +0 -504
- arpakitlib/ar_sqlalchemy_model_util.py +0 -183
- arpakitlib-1.7.256.dist-info/RECORD +0 -236
- /arpakitlib/{_arpakit_project_template → _arpakit_project_template_v1}/.gitignore +0 -0
- /arpakitlib/{_arpakit_project_template → _arpakit_project_template_v1}/.python-version +0 -0
- /arpakitlib/{_arpakit_project_template → _arpakit_project_template_v1}/LICENSE +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v1/additional_model}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v1}/additional_model/additional_model.py +0 -0
- /arpakitlib/{_arpakit_project_template/manage/note → _arpakit_project_template_v1/admin1}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template → _arpakit_project_template_v1}/alembic/README +0 -0
- /arpakitlib/{_arpakit_project_template → _arpakit_project_template_v1}/alembic/script.py.mako +0 -0
- /arpakitlib/{_arpakit_project_template → _arpakit_project_template_v1}/alembic.ini +0 -0
- /arpakitlib/{_arpakit_project_template/resource → _arpakit_project_template_v1/api}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/resource/static → _arpakit_project_template_v1/api/router}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v1/api/router/v1}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src/additional_model → _arpakit_project_template_v1/api/schema}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src/admin1 → _arpakit_project_template_v1/api/schema/common}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src/api → _arpakit_project_template_v1/api/schema/v1}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/manage/note/note_1.txt → _arpakit_project_template_v1/api/util.py} +0 -0
- /arpakitlib/{_arpakit_project_template/src/api/router → _arpakit_project_template_v1/business_service}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src/api/router/v1 → _arpakit_project_template_v1/command}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v1/command}/alembic_upgrade_head .sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v1/command}/docker_ps_a.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v1/command}/docker_rm_postgres.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v1/command}/docker_run_postgres.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v1/command}/docker_start_postgres.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v1/command}/docker_stop_postgres.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v1/command}/git_commit.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v1/command}/git_push_arpakit_company_github_1.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v1/command}/git_push_arpakit_company_gitlab_1.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v1/command}/git_push_arpakit_github_1.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v1/command}/git_push_arpakit_gitlab_1.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage/git_remote_v.sh → _arpakit_project_template_v1/command/git_remote.sh} +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v1/command}/git_set_arpakit_company_origin.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v1/command}/git_set_arpakit_origin.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v1/command}/git_status.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v1/command}/poetry_check.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v1/command}/poetry_clear_cache.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v1/command}/poetry_config.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v1/command}/poetry_install.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v1/command}/poetry_lock.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v1/command}/poetry_remove_and_add_arpakitlib.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v1/command}/poetry_show.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v1/command}/poetry_show_arpakitlib.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v1/command}/poetry_update.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v1/command}/poetry_update_arpakitlib.sh +0 -0
- /arpakitlib/{_arpakit_project_template/src/api/schema → _arpakit_project_template_v1/core}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src/api/schema/v1 → _arpakit_project_template_v1/json_db}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v1}/json_db/json_db.py +0 -0
- /arpakitlib/{_arpakit_project_template/src/business_service → _arpakit_project_template_v1/note}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/manage/note/note_2.txt → _arpakit_project_template_v1/note/note_1.txt} +0 -0
- /arpakitlib/{_arpakit_project_template/manage/note/note_3.txt → _arpakit_project_template_v1/note/note_2.txt} +0 -0
- /arpakitlib/{_arpakit_project_template/manage/note/note_4.txt → _arpakit_project_template_v1/note/note_3.txt} +0 -0
- /arpakitlib/{_arpakit_project_template/manage/note/note_5.txt → _arpakit_project_template_v1/note/note_4.txt} +0 -0
- /arpakitlib/{_arpakit_project_template/src/core/__init__.py → _arpakit_project_template_v1/note/note_5.txt} +0 -0
- /arpakitlib/{_arpakit_project_template/src/json_db → _arpakit_project_template_v1/operation_execution}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src/just_script/__init__.py → _arpakit_project_template_v1/operation_execution/const.py} +0 -0
- /arpakitlib/{_arpakit_project_template/src/operation_execution → _arpakit_project_template_v1/resource}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src/sandbox → _arpakit_project_template_v1/resource/static}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template → _arpakit_project_template_v1}/resource/static/healthcheck +0 -0
- /arpakitlib/{_arpakit_project_template → _arpakit_project_template_v1}/resource/static/helloworld +0 -0
- /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v1/resource/static}/redoc/redoc.standalone.js +0 -0
- /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v1/resource/static}/swagger-ui/favicon-16x16.png +0 -0
- /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v1/resource/static}/swagger-ui/favicon-32x32.png +0 -0
- /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v1/resource/static}/swagger-ui/index.css +0 -0
- /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v1/resource/static}/swagger-ui/oauth2-redirect.html +0 -0
- /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v1/resource/static}/swagger-ui/swagger-initializer.js +0 -0
- /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v1/resource/static}/swagger-ui/swagger-ui-bundle.js.map +0 -0
- /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v1/resource/static}/swagger-ui/swagger-ui-es-bundle.js.map +0 -0
- /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v1/resource/static}/swagger-ui/swagger-ui-standalone-preset.js.map +0 -0
- /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v1/resource/static}/swagger-ui/swagger-ui.css +0 -0
- /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v1/resource/static}/swagger-ui/swagger-ui.css.map +0 -0
- /arpakitlib/{_arpakit_project_template/src/sqlalchemy_db → _arpakit_project_template_v1/sandbox}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src/test_data → _arpakit_project_template_v1/sqlalchemy_db}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v1}/sqlalchemy_db/const.py +0 -0
- /arpakitlib/{_arpakit_project_template/src/tg_bot → _arpakit_project_template_v1/test_data}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src/tg_bot/blank → _arpakit_project_template_v1/tg_bot}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src/tg_bot/filter → _arpakit_project_template_v1/tg_bot/blank}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src/tg_bot/handler → _arpakit_project_template_v1/tg_bot/filter}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v1}/tg_bot/kb/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v1}/tg_bot/kb/inline_/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v1}/tg_bot/kb/inline_/callback.py +0 -0
- /arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v1}/tg_bot/kb/inline_/common.py +0 -0
- /arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v1}/tg_bot/kb/static_/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v1}/tg_bot/kb/static_/common.py +0 -0
- /arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v1}/tg_bot/middleware/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v1}/tg_bot/router/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src/tg_bot/handler/cmd_arpakitlib.py → _arpakit_project_template_v1/tg_bot/util.py} +0 -0
- /arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v1}/util/__init__.py +0 -0
- {arpakitlib-1.7.256.dist-info → arpakitlib-1.8.0.dist-info}/LICENSE +0 -0
- {arpakitlib-1.7.256.dist-info → arpakitlib-1.8.0.dist-info}/entry_points.txt +0 -0
arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v1}/admin1/add_admin_in_app.py
RENAMED
@@ -1,19 +1,16 @@
|
|
1
|
-
import importlib
|
2
|
-
from contextlib import suppress
|
3
|
-
|
4
1
|
from fastapi import FastAPI
|
5
2
|
from sqladmin import Admin
|
6
3
|
|
7
|
-
from
|
8
|
-
from
|
9
|
-
from
|
10
|
-
from
|
4
|
+
from admin1.admin_auth import Admin1Auth
|
5
|
+
from admin1.model_view import get_simple_mv
|
6
|
+
from api.transmitted_api_data import TransmittedAPIData
|
7
|
+
from core.settings import get_cached_settings
|
11
8
|
|
12
9
|
|
13
10
|
def add_admin1_in_app(*, app: FastAPI) -> FastAPI:
|
14
11
|
transmitted_api_data: TransmittedAPIData = app.state.transmitted_api_data
|
15
12
|
|
16
|
-
authentication_backend =
|
13
|
+
authentication_backend = Admin1Auth()
|
17
14
|
|
18
15
|
admin = Admin(
|
19
16
|
app=app,
|
@@ -23,10 +20,7 @@ def add_admin1_in_app(*, app: FastAPI) -> FastAPI:
|
|
23
20
|
title=get_cached_settings().project_name
|
24
21
|
)
|
25
22
|
|
26
|
-
|
27
|
-
importlib.import_module("src.admin1.model_view")
|
28
|
-
|
29
|
-
for model_view in SimpleModelView.all_subclasses:
|
23
|
+
for model_view in get_simple_mv().__subclasses__():
|
30
24
|
admin.add_model_view(model_view)
|
31
25
|
|
32
26
|
return app
|
arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v1}/admin1/admin_auth.py
RENAMED
@@ -3,19 +3,17 @@ import logging
|
|
3
3
|
from sqladmin.authentication import AuthenticationBackend
|
4
4
|
from starlette.requests import Request
|
5
5
|
|
6
|
-
from
|
6
|
+
from core.settings import get_cached_settings
|
7
7
|
|
8
8
|
|
9
|
-
class
|
9
|
+
class Admin1Auth(AuthenticationBackend):
|
10
10
|
def __init__(self):
|
11
11
|
self._logger = logging.getLogger(self.__class__.__name__)
|
12
12
|
super().__init__(secret_key=get_cached_settings().admin1_secret_key)
|
13
13
|
|
14
14
|
async def login(self, request: Request) -> bool:
|
15
|
-
# ...
|
16
15
|
# form = await request.form()
|
17
16
|
# request.session.update(...)
|
18
|
-
# ...
|
19
17
|
return True
|
20
18
|
|
21
19
|
async def logout(self, request: Request) -> bool:
|
@@ -23,7 +21,5 @@ class AdminAuth(AuthenticationBackend):
|
|
23
21
|
return True
|
24
22
|
|
25
23
|
async def authenticate(self, request: Request) -> bool:
|
26
|
-
# ...
|
27
24
|
# request.session.get("...")
|
28
|
-
# ...
|
29
25
|
return True
|
@@ -0,0 +1,95 @@
|
|
1
|
+
from sqladmin import ModelView
|
2
|
+
|
3
|
+
from arpakitlib.ar_sqladmin_util import get_string_info_from_model_view
|
4
|
+
from sqlalchemy_db.sqlalchemy_model import StoryLogDBM, OperationDBM
|
5
|
+
|
6
|
+
|
7
|
+
class SimpleMV(ModelView):
|
8
|
+
can_create = True
|
9
|
+
can_edit = True
|
10
|
+
can_delete = True
|
11
|
+
can_view_details = True
|
12
|
+
can_export = True
|
13
|
+
page_size = 50
|
14
|
+
page_size_options = [50, 100, 200]
|
15
|
+
save_as = True
|
16
|
+
save_as_continue = True
|
17
|
+
export_types = ["xlsx", "csv", "json"]
|
18
|
+
|
19
|
+
|
20
|
+
class StoryLogMV(SimpleMV, model=StoryLogDBM):
|
21
|
+
name = "StoryLog"
|
22
|
+
name_plural = "StoryLogs"
|
23
|
+
column_list = [
|
24
|
+
StoryLogDBM.id,
|
25
|
+
StoryLogDBM.long_id,
|
26
|
+
StoryLogDBM.creation_dt,
|
27
|
+
StoryLogDBM.level,
|
28
|
+
StoryLogDBM.type,
|
29
|
+
StoryLogDBM.title,
|
30
|
+
StoryLogDBM.data
|
31
|
+
]
|
32
|
+
form_columns = [
|
33
|
+
StoryLogDBM.level,
|
34
|
+
StoryLogDBM.type,
|
35
|
+
StoryLogDBM.title,
|
36
|
+
StoryLogDBM.data
|
37
|
+
]
|
38
|
+
column_default_sort = [
|
39
|
+
(StoryLogDBM.creation_dt, True)
|
40
|
+
]
|
41
|
+
column_searchable_list = [
|
42
|
+
StoryLogDBM.id,
|
43
|
+
StoryLogDBM.long_id,
|
44
|
+
StoryLogDBM.level,
|
45
|
+
StoryLogDBM.type,
|
46
|
+
StoryLogDBM.title,
|
47
|
+
StoryLogDBM.data
|
48
|
+
]
|
49
|
+
|
50
|
+
|
51
|
+
class OperationMV(SimpleMV, model=OperationDBM):
|
52
|
+
name = "Operation"
|
53
|
+
name_plural = "Operations"
|
54
|
+
column_list = [
|
55
|
+
OperationDBM.id,
|
56
|
+
OperationDBM.long_id,
|
57
|
+
OperationDBM.creation_dt,
|
58
|
+
OperationDBM.status,
|
59
|
+
OperationDBM.type,
|
60
|
+
OperationDBM.execution_start_dt,
|
61
|
+
OperationDBM.execution_finish_dt,
|
62
|
+
OperationDBM.input_data,
|
63
|
+
OperationDBM.output_data,
|
64
|
+
OperationDBM.error_data
|
65
|
+
]
|
66
|
+
form_columns = [
|
67
|
+
OperationDBM.status,
|
68
|
+
OperationDBM.type,
|
69
|
+
OperationDBM.execution_start_dt,
|
70
|
+
OperationDBM.execution_finish_dt,
|
71
|
+
OperationDBM.input_data,
|
72
|
+
OperationDBM.output_data,
|
73
|
+
OperationDBM.error_data
|
74
|
+
]
|
75
|
+
column_default_sort = [
|
76
|
+
(OperationDBM.creation_dt, True)
|
77
|
+
]
|
78
|
+
column_searchable_list = [
|
79
|
+
OperationDBM.id,
|
80
|
+
OperationDBM.long_id,
|
81
|
+
OperationDBM.status,
|
82
|
+
OperationDBM.type,
|
83
|
+
]
|
84
|
+
|
85
|
+
|
86
|
+
def get_simple_mv() -> type[SimpleMV]:
|
87
|
+
return SimpleMV
|
88
|
+
|
89
|
+
|
90
|
+
def import_sqladmin_model_views():
|
91
|
+
pass
|
92
|
+
|
93
|
+
|
94
|
+
if __name__ == '__main__':
|
95
|
+
print(get_string_info_from_model_view(class_=SimpleMV))
|
@@ -5,8 +5,8 @@ from sqlalchemy import engine_from_config
|
|
5
5
|
from sqlalchemy import pool
|
6
6
|
|
7
7
|
from arpakitlib.ar_type_util import raise_for_type
|
8
|
-
from
|
9
|
-
from
|
8
|
+
from core.settings import get_cached_settings
|
9
|
+
from sqlalchemy_db.sqlalchemy_model import get_simple_dbm
|
10
10
|
|
11
11
|
# this is the Alembic Config object, which provides
|
12
12
|
# access to the values within the .ini file in use.
|
@@ -24,7 +24,7 @@ if config.config_file_name is not None:
|
|
24
24
|
# for 'autogenerate' support
|
25
25
|
# from myapp import mymodel
|
26
26
|
# target_metadata = mymodel.Base.metadata
|
27
|
-
target_metadata =
|
27
|
+
target_metadata = get_simple_dbm().metadata
|
28
28
|
|
29
29
|
|
30
30
|
# other values from the config, defined by the needs of env.py,
|
@@ -0,0 +1,244 @@
|
|
1
|
+
from typing import Callable
|
2
|
+
|
3
|
+
import fastapi
|
4
|
+
import fastapi.exceptions
|
5
|
+
import fastapi.responses
|
6
|
+
import fastapi.security
|
7
|
+
import starlette.exceptions
|
8
|
+
import starlette.requests
|
9
|
+
import starlette.requests
|
10
|
+
import starlette.status
|
11
|
+
from fastapi import Security, Depends
|
12
|
+
from fastapi.security import APIKeyHeader
|
13
|
+
from pydantic import BaseModel, ConfigDict
|
14
|
+
|
15
|
+
from api.const import APIErrorCodes
|
16
|
+
from api.exception import APIException
|
17
|
+
from api.transmitted_api_data import TransmittedAPIData, get_transmitted_api_data
|
18
|
+
from arpakitlib.ar_func_util import is_async_callable, is_sync_function
|
19
|
+
from arpakitlib.ar_json_util import safely_transfer_obj_to_json_str_to_json_obj
|
20
|
+
from arpakitlib.ar_type_util import raise_for_type
|
21
|
+
|
22
|
+
|
23
|
+
class APIAuthData(BaseModel):
|
24
|
+
model_config = ConfigDict(extra="forbid", arbitrary_types_allowed=True, from_attributes=True)
|
25
|
+
|
26
|
+
require_api_key_string: bool = False
|
27
|
+
require_token_string: bool = False
|
28
|
+
|
29
|
+
require_correct_api_key: bool = False
|
30
|
+
require_correct_token: bool = False
|
31
|
+
|
32
|
+
token_string: str | None = None
|
33
|
+
api_key_string: str | None = None
|
34
|
+
|
35
|
+
is_token_correct: bool | None = None
|
36
|
+
is_api_key_correct: bool | None = None
|
37
|
+
|
38
|
+
|
39
|
+
def api_auth(
|
40
|
+
*,
|
41
|
+
require_api_key_string: bool = False,
|
42
|
+
require_token_string: bool = False,
|
43
|
+
validate_api_key_func: Callable | None = None,
|
44
|
+
validate_token_func: Callable | None = None,
|
45
|
+
correct_api_keys: str | list[str] | None = None,
|
46
|
+
correct_tokens: str | list[str] | None = None,
|
47
|
+
require_correct_api_key: bool = False,
|
48
|
+
require_correct_token: bool = False
|
49
|
+
) -> Callable:
|
50
|
+
if isinstance(correct_api_keys, str):
|
51
|
+
correct_api_keys = [correct_api_keys]
|
52
|
+
if correct_api_keys is not None:
|
53
|
+
raise_for_type(correct_api_keys, list)
|
54
|
+
|
55
|
+
if validate_api_key_func is None and correct_api_keys is not None:
|
56
|
+
validate_api_key_func = lambda *args, **kwargs_: kwargs_["api_auth_data"].api_key_string in correct_api_keys
|
57
|
+
|
58
|
+
if isinstance(correct_tokens, str):
|
59
|
+
correct_tokens = [correct_tokens]
|
60
|
+
if correct_tokens is not None:
|
61
|
+
raise_for_type(correct_tokens, list)
|
62
|
+
|
63
|
+
if validate_token_func is None and correct_tokens is not None:
|
64
|
+
validate_token_func = lambda *args, **kwargs_: kwargs_["api_auth_data"].token_string in correct_tokens
|
65
|
+
|
66
|
+
if require_correct_api_key is True:
|
67
|
+
require_api_key_string = True
|
68
|
+
|
69
|
+
if require_correct_token is True:
|
70
|
+
require_token_string = True
|
71
|
+
|
72
|
+
async def func(
|
73
|
+
*,
|
74
|
+
ac: fastapi.security.HTTPAuthorizationCredentials | None = fastapi.Security(
|
75
|
+
fastapi.security.HTTPBearer(auto_error=False)
|
76
|
+
),
|
77
|
+
api_key_string: str | None = Security(
|
78
|
+
APIKeyHeader(name="apikey", auto_error=False)
|
79
|
+
),
|
80
|
+
request: starlette.requests.Request,
|
81
|
+
transmitted_api_data: TransmittedAPIData = Depends(get_transmitted_api_data)
|
82
|
+
) -> APIAuthData:
|
83
|
+
|
84
|
+
api_auth_data = APIAuthData(
|
85
|
+
require_api_key_string=require_api_key_string,
|
86
|
+
require_token_string=require_token_string,
|
87
|
+
require_correct_api_key=require_correct_api_key,
|
88
|
+
require_correct_token=require_correct_token
|
89
|
+
)
|
90
|
+
|
91
|
+
# parse api_key
|
92
|
+
|
93
|
+
api_auth_data.api_key_string = api_key_string
|
94
|
+
|
95
|
+
if not api_auth_data.api_key_string and "api_key" in request.headers.keys():
|
96
|
+
api_auth_data.api_key_string = request.headers["api_key"]
|
97
|
+
if not api_auth_data.api_key_string and "api-key" in request.headers.keys():
|
98
|
+
api_auth_data.api_key_string = request.headers["api-key"]
|
99
|
+
if not api_auth_data.api_key_string and "apikey" in request.headers.keys():
|
100
|
+
api_auth_data.api_key_string = request.headers["apikey"]
|
101
|
+
|
102
|
+
if not api_auth_data.api_key_string and "api_key" in request.query_params.keys():
|
103
|
+
api_auth_data.api_key_string = request.query_params["api_key"]
|
104
|
+
if not api_auth_data.api_key_string and "api-key" in request.query_params.keys():
|
105
|
+
api_auth_data.api_key_string = request.query_params["api-key"]
|
106
|
+
if not api_auth_data.api_key_string and "apikey" in request.query_params.keys():
|
107
|
+
api_auth_data.api_key_string = request.query_params["apikey"]
|
108
|
+
|
109
|
+
# parse token
|
110
|
+
|
111
|
+
api_auth_data.token_string = ac.credentials if ac and ac.credentials and ac.credentials.strip() else None
|
112
|
+
|
113
|
+
if not api_auth_data.token_string and "token" in request.headers.keys():
|
114
|
+
api_auth_data.token_string = request.headers["token"]
|
115
|
+
|
116
|
+
if not api_auth_data.token_string and "user_token" in request.headers.keys():
|
117
|
+
api_auth_data.token_string = request.headers["user_token"]
|
118
|
+
if not api_auth_data.token_string and "user-token" in request.headers.keys():
|
119
|
+
api_auth_data.token_string = request.headers["user-token"]
|
120
|
+
if not api_auth_data.token_string and "usertoken" in request.headers.keys():
|
121
|
+
api_auth_data.token_string = request.headers["usertoken"]
|
122
|
+
|
123
|
+
if not api_auth_data.token_string and "token" in request.query_params.keys():
|
124
|
+
api_auth_data.token_string = request.query_params["token"]
|
125
|
+
|
126
|
+
if not api_auth_data.token_string and "user_token" in request.query_params.keys():
|
127
|
+
api_auth_data.token_string = request.query_params["user_token"]
|
128
|
+
if not api_auth_data.token_string and "user-token" in request.query_params.keys():
|
129
|
+
api_auth_data.token_string = request.query_params["user-token"]
|
130
|
+
if not api_auth_data.token_string and "usertoken" in request.query_params.keys():
|
131
|
+
api_auth_data.token_string = request.query_params["usertoken"]
|
132
|
+
|
133
|
+
if api_auth_data.token_string:
|
134
|
+
api_auth_data.token_string = api_auth_data.token_string.strip()
|
135
|
+
if not api_auth_data.token_string:
|
136
|
+
api_auth_data.token_string = None
|
137
|
+
|
138
|
+
# require_api_key_string
|
139
|
+
|
140
|
+
if require_api_key_string and not api_auth_data.api_key_string:
|
141
|
+
raise APIException(
|
142
|
+
status_code=starlette.status.HTTP_401_UNAUTHORIZED,
|
143
|
+
error_code=APIErrorCodes.cannot_authorize,
|
144
|
+
error_data=safely_transfer_obj_to_json_str_to_json_obj(api_auth_data.model_dump())
|
145
|
+
)
|
146
|
+
|
147
|
+
# require_token_string
|
148
|
+
|
149
|
+
if require_token_string and not api_auth_data.token_string:
|
150
|
+
raise APIException(
|
151
|
+
status_code=starlette.status.HTTP_401_UNAUTHORIZED,
|
152
|
+
error_code=APIErrorCodes.cannot_authorize,
|
153
|
+
error_data=safely_transfer_obj_to_json_str_to_json_obj(api_auth_data.model_dump())
|
154
|
+
)
|
155
|
+
|
156
|
+
# validate_api_key_func
|
157
|
+
|
158
|
+
if validate_api_key_func is not None:
|
159
|
+
if is_async_callable(validate_api_key_func):
|
160
|
+
api_auth_data.is_api_key_correct = await validate_api_key_func(
|
161
|
+
api_auth_data=api_auth_data,
|
162
|
+
transmitted_api_data=transmitted_api_data,
|
163
|
+
request=request
|
164
|
+
)
|
165
|
+
elif is_sync_function(validate_api_key_func):
|
166
|
+
api_auth_data.is_api_key_correct = validate_api_key_func()
|
167
|
+
else:
|
168
|
+
raise TypeError("unknown validate_api_key_func type")
|
169
|
+
|
170
|
+
# validate_token_func
|
171
|
+
|
172
|
+
if validate_token_func is not None:
|
173
|
+
if is_async_callable(validate_token_func):
|
174
|
+
api_auth_data.is_token_correct = await validate_token_func(
|
175
|
+
api_auth_data=api_auth_data,
|
176
|
+
transmitted_api_data=transmitted_api_data,
|
177
|
+
request=request
|
178
|
+
)
|
179
|
+
elif is_sync_function(validate_token_func):
|
180
|
+
api_auth_data.is_token_correct = validate_token_func()
|
181
|
+
else:
|
182
|
+
raise TypeError("unknown validate_token_func type")
|
183
|
+
|
184
|
+
# require_correct_api_key
|
185
|
+
|
186
|
+
if require_correct_api_key:
|
187
|
+
if not api_auth_data.is_api_key_correct:
|
188
|
+
raise APIException(
|
189
|
+
status_code=starlette.status.HTTP_401_UNAUTHORIZED,
|
190
|
+
error_code=APIErrorCodes.cannot_authorize,
|
191
|
+
error_description="not api_auth_data.is_api_key_correct",
|
192
|
+
error_data=safely_transfer_obj_to_json_str_to_json_obj(api_auth_data.model_dump()),
|
193
|
+
)
|
194
|
+
|
195
|
+
# require_correct_token
|
196
|
+
|
197
|
+
if require_correct_token:
|
198
|
+
if not api_auth_data.is_token_correct:
|
199
|
+
raise APIException(
|
200
|
+
status_code=starlette.status.HTTP_401_UNAUTHORIZED,
|
201
|
+
error_code=APIErrorCodes.cannot_authorize,
|
202
|
+
error_description="not api_auth_data.is_token_correct",
|
203
|
+
error_data=safely_transfer_obj_to_json_str_to_json_obj(api_auth_data.model_dump())
|
204
|
+
)
|
205
|
+
|
206
|
+
return api_auth_data
|
207
|
+
|
208
|
+
return func
|
209
|
+
|
210
|
+
|
211
|
+
def correct_api_key_from_settings__validate_api_key_func() -> Callable:
|
212
|
+
async def func(
|
213
|
+
*,
|
214
|
+
api_auth_data: APIAuthData,
|
215
|
+
transmitted_api_data: TransmittedAPIData,
|
216
|
+
request: starlette.requests.Request,
|
217
|
+
):
|
218
|
+
if transmitted_api_data.settings.api_correct_api_keys is None:
|
219
|
+
return True
|
220
|
+
if api_auth_data.api_key_string is None:
|
221
|
+
return False
|
222
|
+
if api_auth_data.api_key_string.strip() not in transmitted_api_data.settings.api_correct_api_keys:
|
223
|
+
return False
|
224
|
+
return True
|
225
|
+
|
226
|
+
return func
|
227
|
+
|
228
|
+
|
229
|
+
def correct_token_from_settings__validate_api_key_func() -> Callable:
|
230
|
+
async def func(
|
231
|
+
*,
|
232
|
+
api_auth_data: APIAuthData,
|
233
|
+
transmitted_api_data: TransmittedAPIData,
|
234
|
+
request: starlette.requests.Request,
|
235
|
+
):
|
236
|
+
if transmitted_api_data.settings.api_correct_tokens is None:
|
237
|
+
return True
|
238
|
+
if api_auth_data.token_string is None:
|
239
|
+
return False
|
240
|
+
if api_auth_data.token_string.strip() not in transmitted_api_data.settings.api_correct_tokens:
|
241
|
+
return False
|
242
|
+
return True
|
243
|
+
|
244
|
+
return func
|
@@ -0,0 +1,18 @@
|
|
1
|
+
from arpakitlib.ar_enumeration_util import Enumeration
|
2
|
+
|
3
|
+
|
4
|
+
class APIErrorCodes(Enumeration):
|
5
|
+
cannot_authorize = "CANNOT_AUTHORIZE"
|
6
|
+
unknown_error = "UNKNOWN_ERROR"
|
7
|
+
error_in_request = "ERROR_IN_REQUEST"
|
8
|
+
not_found = "NOT_FOUND"
|
9
|
+
|
10
|
+
|
11
|
+
class APIErrorSpecificationCodes(Enumeration):
|
12
|
+
pass
|
13
|
+
|
14
|
+
|
15
|
+
if __name__ == '__main__':
|
16
|
+
print(APIErrorCodes.str_for_print())
|
17
|
+
print()
|
18
|
+
print(APIErrorSpecificationCodes.str_for_print())
|
@@ -0,0 +1,72 @@
|
|
1
|
+
import logging
|
2
|
+
import os
|
3
|
+
|
4
|
+
from fastapi import FastAPI
|
5
|
+
from starlette.middleware.cors import CORSMiddleware
|
6
|
+
from starlette.staticfiles import StaticFiles
|
7
|
+
|
8
|
+
from api.event import get_api_startup_events, get_api_shutdown_events
|
9
|
+
from api.exception_handler import add_exception_handler_to_app
|
10
|
+
from api.openapi_ui import add_local_openapi_ui_to_app
|
11
|
+
from api.router.main_router import main_api_router
|
12
|
+
from api.transmitted_api_data import get_cached_transmitted_api_data
|
13
|
+
from core.const import ProjectPaths
|
14
|
+
from core.util import setup_logging
|
15
|
+
|
16
|
+
_logger = logging.getLogger(__name__)
|
17
|
+
|
18
|
+
|
19
|
+
def create_api_app() -> FastAPI:
|
20
|
+
setup_logging()
|
21
|
+
|
22
|
+
_logger.info("start")
|
23
|
+
|
24
|
+
transmitted_api_data = get_cached_transmitted_api_data()
|
25
|
+
|
26
|
+
api_app = FastAPI(
|
27
|
+
title=transmitted_api_data.settings.project_name,
|
28
|
+
description=transmitted_api_data.settings.project_name,
|
29
|
+
docs_url=None,
|
30
|
+
redoc_url=None,
|
31
|
+
openapi_url="/openapi",
|
32
|
+
on_startup=get_api_startup_events(),
|
33
|
+
on_shutdown=get_api_shutdown_events(),
|
34
|
+
contact={
|
35
|
+
"name": "ARPAKIT Company",
|
36
|
+
"url": "https://arpakit.com/",
|
37
|
+
"email": "support@arpakit.com",
|
38
|
+
},
|
39
|
+
)
|
40
|
+
|
41
|
+
api_app.state.transmitted_api_data = transmitted_api_data
|
42
|
+
|
43
|
+
if transmitted_api_data.settings.media_dirpath is not None:
|
44
|
+
if not os.path.exists(transmitted_api_data.settings.media_dirpath):
|
45
|
+
os.makedirs(transmitted_api_data.settings.media_dirpath, exist_ok=True)
|
46
|
+
api_app.mount("/media", StaticFiles(directory=transmitted_api_data.settings.media_dirpath), name="media")
|
47
|
+
|
48
|
+
if not os.path.exists(ProjectPaths.static_dirpath):
|
49
|
+
os.makedirs(ProjectPaths.static_dirpath, exist_ok=True)
|
50
|
+
api_app.mount("/static", StaticFiles(directory=ProjectPaths.static_dirpath), name="static")
|
51
|
+
|
52
|
+
api_app.add_middleware(
|
53
|
+
CORSMiddleware,
|
54
|
+
allow_origins=["*"],
|
55
|
+
allow_credentials=True,
|
56
|
+
allow_methods=["*"],
|
57
|
+
allow_headers=["*"],
|
58
|
+
)
|
59
|
+
|
60
|
+
add_local_openapi_ui_to_app(app=api_app)
|
61
|
+
|
62
|
+
add_exception_handler_to_app(app=api_app)
|
63
|
+
|
64
|
+
api_app.include_router(router=main_api_router)
|
65
|
+
|
66
|
+
if transmitted_api_data.settings.api_enable_admin1:
|
67
|
+
from admin1.add_admin_in_app import add_admin1_in_app
|
68
|
+
add_admin1_in_app(app=api_app)
|
69
|
+
|
70
|
+
_logger.info("finish")
|
71
|
+
|
72
|
+
return api_app
|
@@ -0,0 +1,69 @@
|
|
1
|
+
import logging
|
2
|
+
from typing import Callable
|
3
|
+
|
4
|
+
from api.transmitted_api_data import get_cached_transmitted_api_data
|
5
|
+
from arpakitlib.ar_base_worker_util import safe_run_worker_in_background, SafeRunInBackgroundModes
|
6
|
+
from operation_execution.operation_executor_worker import create_operation_executor_worker
|
7
|
+
from operation_execution.scheduled_operation_creator_worker import create_scheduled_operation_creator_worker
|
8
|
+
|
9
|
+
_logger = logging.getLogger(__name__)
|
10
|
+
|
11
|
+
|
12
|
+
# STARTUP API EVENTS
|
13
|
+
|
14
|
+
|
15
|
+
async def async_api_startup_event():
|
16
|
+
_logger.info("start")
|
17
|
+
|
18
|
+
if get_cached_transmitted_api_data().media_file_storage_in_dir is not None:
|
19
|
+
get_cached_transmitted_api_data().media_file_storage_in_dir.init()
|
20
|
+
|
21
|
+
if get_cached_transmitted_api_data().cache_file_storage_in_dir is not None:
|
22
|
+
get_cached_transmitted_api_data().cache_file_storage_in_dir.init()
|
23
|
+
|
24
|
+
if get_cached_transmitted_api_data().dump_file_storage_in_dir is not None:
|
25
|
+
get_cached_transmitted_api_data().dump_file_storage_in_dir.init()
|
26
|
+
|
27
|
+
if (
|
28
|
+
get_cached_transmitted_api_data().sqlalchemy_db is not None
|
29
|
+
and get_cached_transmitted_api_data().settings.api_init_sqlalchemy_db
|
30
|
+
):
|
31
|
+
get_cached_transmitted_api_data().sqlalchemy_db.init()
|
32
|
+
|
33
|
+
if (
|
34
|
+
get_cached_transmitted_api_data().json_db is not None
|
35
|
+
and get_cached_transmitted_api_data().settings.api_init_json_db
|
36
|
+
):
|
37
|
+
get_cached_transmitted_api_data().json_db.init()
|
38
|
+
|
39
|
+
if get_cached_transmitted_api_data().settings.api_start_operation_executor_worker:
|
40
|
+
_ = safe_run_worker_in_background(
|
41
|
+
worker=create_operation_executor_worker(),
|
42
|
+
mode=SafeRunInBackgroundModes.thread
|
43
|
+
)
|
44
|
+
|
45
|
+
if get_cached_transmitted_api_data().settings.api_start_scheduled_operation_creator_worker:
|
46
|
+
_ = safe_run_worker_in_background(
|
47
|
+
worker=create_scheduled_operation_creator_worker(),
|
48
|
+
mode=SafeRunInBackgroundModes.async_task
|
49
|
+
)
|
50
|
+
|
51
|
+
_logger.info("finish")
|
52
|
+
|
53
|
+
|
54
|
+
def get_api_startup_events() -> list[Callable]:
|
55
|
+
res = [async_api_startup_event]
|
56
|
+
return res
|
57
|
+
|
58
|
+
|
59
|
+
# SHUTDOWN API EVENTS
|
60
|
+
|
61
|
+
|
62
|
+
async def async_api_shutdown_event():
|
63
|
+
_logger.info("start")
|
64
|
+
_logger.info("finish")
|
65
|
+
|
66
|
+
|
67
|
+
def get_api_shutdown_events() -> list[Callable]:
|
68
|
+
res = [async_api_shutdown_event]
|
69
|
+
return res
|
@@ -0,0 +1,39 @@
|
|
1
|
+
from typing import Any
|
2
|
+
|
3
|
+
import fastapi.security
|
4
|
+
import starlette.status
|
5
|
+
|
6
|
+
from api.const import APIErrorCodes
|
7
|
+
from api.schema.common.out import ErrorCommonSO
|
8
|
+
|
9
|
+
|
10
|
+
class APIException(fastapi.exceptions.HTTPException):
|
11
|
+
def __init__(
|
12
|
+
self,
|
13
|
+
*,
|
14
|
+
status_code: int = starlette.status.HTTP_400_BAD_REQUEST,
|
15
|
+
error_code: str | None = APIErrorCodes.unknown_error,
|
16
|
+
error_specification_code: str | None = None,
|
17
|
+
error_description: str | None = None,
|
18
|
+
error_data: dict[str, Any] | None = None
|
19
|
+
):
|
20
|
+
self.status_code = status_code
|
21
|
+
self.error_code = error_code
|
22
|
+
self.error_specification_code = error_specification_code
|
23
|
+
self.error_description = error_description
|
24
|
+
if error_data is None:
|
25
|
+
error_data = {}
|
26
|
+
self.error_data = error_data
|
27
|
+
|
28
|
+
self.error_common_so = ErrorCommonSO(
|
29
|
+
has_error=True,
|
30
|
+
error_code=self.error_code,
|
31
|
+
error_specification_code=self.error_specification_code,
|
32
|
+
error_description=self.error_description,
|
33
|
+
error_data=self.error_data
|
34
|
+
)
|
35
|
+
|
36
|
+
super().__init__(
|
37
|
+
status_code=self.status_code,
|
38
|
+
detail=self.error_common_so.model_dump(mode="json")
|
39
|
+
)
|