arpakitlib 1.8.17__py3-none-any.whl → 1.8.19__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_v_5/arpakitlib_project_template_info.json +3 -0
- arpakitlib/_arpakit_project_template_v_5/command/alembic_revision_autogenerate.sh +2 -0
- arpakitlib/_arpakit_project_template_v_5/command/reinit_all_sqlalchemy_db.py +13 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/auth.py +5 -5
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/auth2.py +72 -25
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/exception_handler.py +10 -10
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/router/admin/get_arpakitlib_project_template_info.py +2 -2
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/router/client/get_errors_info.py +12 -2
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/router/client/now_utc_datetime.py +2 -2
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/schema/out/admin/common.py +1 -1
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/schema/out/admin/operation.py +2 -2
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/schema/out/admin/story_log.py +2 -2
- arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/admin/user.py +22 -0
- arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/admin/user_token.py +14 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/schema/out/client/common.py +1 -1
- arpakitlib/{_arpakit_project_template_v_4/project/api/schema/out/general → _arpakit_project_template_v_5/project/api/schema/out/common}/error.py +1 -1
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/operation_execution/operation_executor_worker.py +2 -2
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sandbox/sandbox_1.py +3 -1
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqlalchemy_db_/sqlalchemy_model/user.py +1 -1
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/blank/admin.py +2 -8
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/blank/client.py +69 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/callback/client.py +4 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/const.py +7 -6
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/filter_/user_roles_has_admin.py +18 -0
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/filter_/user_roles_has_client.py +18 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/middleware/init_user.py +9 -8
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/router/admin/arpakitlib_project_template_info.py +6 -4
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/admin/clear_log_file.py +33 -0
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/admin/drop_sqlalchemy_db.py +31 -0
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/admin/init_sqlalchemy_db.py +28 -0
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/admin/kb_with_not_modified.py +59 -0
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/admin/kb_with_old_cd.py +40 -0
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/admin/kb_with_raise_error.py +48 -0
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/admin/kb_with_remove_message.py +35 -0
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/admin/log_file.py +37 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/router/admin/me.py +4 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/router/admin/raise_fake_error.py +5 -1
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/router/admin/reinit_sqlalchemy_db.py +7 -3
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/admin/set_tg_bot_commands.py +28 -0
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/client/about.py +30 -0
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/client/error_handler.py +91 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/router/client/healthcheck.py +3 -1
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/router/client/hello_world.py +5 -2
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/client/raw_callback_query.py +30 -0
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/client/raw_inline_query.py +14 -0
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/client/raw_message.py +15 -0
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/client/remove_message.py +28 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/router/client/start.py +3 -2
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/client/support.py +30 -0
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/main_router.py +36 -0
- arpakitlib/_arpakit_project_template_v_5/project/tg_bot/util/notify_admins.py +58 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/util/set_tg_bot_commands.py +26 -4
- arpakitlib/_arpakit_project_template_v_5/project/util/__init__.py +0 -0
- arpakitlib/ar_base_worker_util.py +7 -7
- arpakitlib/ar_blank_util.py +2 -2
- arpakitlib/ar_func_util.py +21 -14
- arpakitlib/ar_logging_util.py +2 -2
- arpakitlib/ar_sqlalchemy_util.py +9 -3
- {arpakitlib-1.8.17.dist-info → arpakitlib-1.8.19.dist-info}/METADATA +1 -1
- arpakitlib-1.8.19.dist-info/RECORD +347 -0
- arpakitlib/_arpakit_project_template_v_4/arpakitlib_project_template_info.json +0 -3
- arpakitlib/_arpakit_project_template_v_4/command/alembic_revision_autogenerate.sh +0 -2
- arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/common.py +0 -5
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/blank/client.py +0 -44
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/error_handler.py +0 -37
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/filter_/user_roles_has_admin.py +0 -27
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/filter_/user_roles_has_client.py +0 -27
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/admin/main_router.py +0 -15
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/client/main_router.py +0 -14
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/main_router.py +0 -13
- arpakitlib-1.8.17.dist-info/RECORD +0 -330
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/.gitignore +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/.python-version +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/LICENSE +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/README.md +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/alembic/README +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/alembic/env.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/alembic/script.py.mako +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/alembic/versions/__init__.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/alembic.ini +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/__init__.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/alembic_history.sh +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/alembic_upgrade_head.sh +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/beautify_json.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/check_logging.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/check_sqlalchemy_db.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/demojize.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/docker_ps_a.sh +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/docker_rm_postgres.sh +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/docker_run_postgres.sh +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/docker_start_postgres.sh +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/docker_stop_postgres.sh +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/drop_json_db.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/drop_sqlalchemy_db.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/generate_settings_env_example.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/git_commit.sh +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/git_push_arpakit_company_github_1.sh +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/git_push_arpakit_company_gitlab_1.sh +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/git_push_arpakit_github_1.sh +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/git_push_arpakit_gitlab_1.sh +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/git_remote_v.sh +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/git_set_arpakit_company_origin.sh +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/git_set_arpakit_origin.sh +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/git_set_divarteam_origin.sh +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/git_status.sh +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/hello_world.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/init_json_db.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/init_sqlalchemy_db.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/poetry_check.sh +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/poetry_clear_cache.sh +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/poetry_config.sh +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/poetry_install.sh +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/poetry_lock.sh +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/poetry_remove_and_add_arpakitlib.sh +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/poetry_show.sh +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/poetry_show_arpakitlib.sh +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/poetry_update.sh +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/poetry_update_arpakitlib.sh +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/reinit_json_db.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/reinit_sqlalchemy_db.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/remove_operations.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/remove_story_logs.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/rm_all_records_in_json_db.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/set_tg_bot_commands.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/show_settings.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/start_api.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/start_api_for_prod.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/start_api_with_reload.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/start_operation_executor_worker.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/start_operation_executor_workers.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/start_scheduled_operation_creator_worker.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/start_sqladmin.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/start_sqladmin_for_prod.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/start_sqladmin_with_reload.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/start_tg_bot.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/start_tg_bot_for_prod.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/example.env +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/note/note_1.txt +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/note/note_2.txt +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/note/note_3.txt +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/note/note_4.txt +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/note/note_5.txt +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/__init__.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/additional_model/__init__.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/additional_model/common.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/__init__.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/asgi.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/const.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/create_api_app.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/event.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/exception.py +1 -1
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/openapi_ui.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/response.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/router/__init__.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/router/admin/__init__.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/router/admin/get_auth_data.py +1 -1
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/router/admin/main_router.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/router/client/__init__.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/router/client/main_router.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/router/general/__init__.py +0 -0
- arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/router/general/healthcheck.py +1 -1
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/router/general/main_router.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/router/main_router.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/schema/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/schema/common.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/schema/in_/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/schema/in_/admin/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/schema/in_/admin/common.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/schema/in_/client/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/schema/in_/client/common.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4/project/api/schema/in_/general → _arpakit_project_template_v_5/project/api/schema/in_/common}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4/project/api/schema/out → _arpakit_project_template_v_5/project/api/schema/in_/general}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/schema/in_/general/common.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4/project/api/schema/out/admin → _arpakit_project_template_v_5/project/api/schema/out}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4/project/api/schema/out/client → _arpakit_project_template_v_5/project/api/schema/out/admin}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4/project/api/schema/out/common → _arpakit_project_template_v_5/project/api/schema/out/client}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4/project/api/schema/out/general → _arpakit_project_template_v_5/project/api/schema/out/common}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/schema/out/common/datetime_.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/schema/out/common/raw_data.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4/project/business_service → _arpakit_project_template_v_5/project/api/schema/out/general}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/schema/out/general/common.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/schema/out/general/errors_info_general.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/schema/out/general/healthcheck.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/util.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4/project/celery_ → _arpakit_project_template_v_5/project/business_service}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/business_service/hello_world.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/business_service/remove_operations.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4/project/core → _arpakit_project_template_v_5/project/celery_}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4/project/json_db → _arpakit_project_template_v_5/project/core}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/core/cache_file_storage_in_dir.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/core/const.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/core/dump_file_storage_in_dir.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/core/jinja2_templates.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/core/media_file_storage_in_dir.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/core/settings.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/core/util.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4/project/operation_execution → _arpakit_project_template_v_5/project/json_db}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/json_db/json_db.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/more/helloworld +0 -0
- /arpakitlib/{_arpakit_project_template_v_4/project/resource → _arpakit_project_template_v_5/project/operation_execution}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/operation_execution/const.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/operation_execution/scheduled_operation_creator_worker.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/operation_execution/scheduled_operations.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/operation_execution/util.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4/project/sandbox → _arpakit_project_template_v_5/project/resource}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/1 +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/healthcheck +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/helloworld +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/openapi-favicon.png +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/redoc/redoc.standalone.js +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/swagger-ui/favicon-16x16.png +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/swagger-ui/favicon-32x32.png +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/swagger-ui/index.css +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/swagger-ui/index.html +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/swagger-ui/oauth2-redirect.html +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/swagger-ui/swagger-initializer.js +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/swagger-ui/swagger-ui-bundle.js +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/swagger-ui/swagger-ui-bundle.js.map +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/swagger-ui/swagger-ui-es-bundle-core.js +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/swagger-ui/swagger-ui-es-bundle-core.js.map +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/swagger-ui/swagger-ui-es-bundle.js +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/swagger-ui/swagger-ui-es-bundle.js.map +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/swagger-ui/swagger-ui-standalone-preset.js +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/swagger-ui/swagger-ui-standalone-preset.js.map +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/swagger-ui/swagger-ui.css +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/swagger-ui/swagger-ui.css.map +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/swagger-ui/swagger-ui.js +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/swagger-ui/swagger-ui.js.map +0 -0
- /arpakitlib/{_arpakit_project_template_v_4/project/site → _arpakit_project_template_v_5/project/sandbox}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sandbox/sandbox_2.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sandbox/sandbox_3.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sandbox/sandbox_4.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sandbox/sandbox_5.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sandbox/sandbox_6.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sandbox/sandbox_7.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4/project/site/router → _arpakit_project_template_v_5/project/site}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/site/asgi.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/site/consts.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/site/create_site_app.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/site/event.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/site/exception_handler.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4/project/sqladmin_ → _arpakit_project_template_v_5/project/site/router}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/site/router/main_router.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4/project/sqlalchemy_db_ → _arpakit_project_template_v_5/project/sqladmin_}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqladmin_/add_admin_in_app.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqladmin_/admin_auth.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqladmin_/asgi.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqladmin_/create_sqladmin_app.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqladmin_/event.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqladmin_/model_view/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqladmin_/model_view/common.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqladmin_/model_view/operation.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqladmin_/model_view/story_log.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4/project/test_data → _arpakit_project_template_v_5/project/sqlalchemy_db_}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqlalchemy_db_/const.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqlalchemy_db_/sqlalchemy_db.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqlalchemy_db_/sqlalchemy_model/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqlalchemy_db_/sqlalchemy_model/api_key.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqlalchemy_db_/sqlalchemy_model/common.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqlalchemy_db_/sqlalchemy_model/operation.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqlalchemy_db_/sqlalchemy_model/story_log.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqlalchemy_db_/sqlalchemy_model/user_token.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqlalchemy_db_/util.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4/project/tg_bot → _arpakit_project_template_v_5/project/test_data}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/test_data/make_test_data_1.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/test_data/make_test_data_2.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/test_data/make_test_data_3.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/test_data/make_test_data_4.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/test_data/make_test_data_5.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4/project/tg_bot/blank → _arpakit_project_template_v_5/project/tg_bot}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4/project/tg_bot/callback → _arpakit_project_template_v_5/project/tg_bot/blank}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/blank/common.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4/project/tg_bot/filter_ → _arpakit_project_template_v_5/project/tg_bot/callback}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/callback/admin.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/callback/common.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/event.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4/project/tg_bot/kb → _arpakit_project_template_v_5/project/tg_bot/filter_}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/filter_/is_private_chat.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/filter_/message_text.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/filter_/not_prod_mode_filter.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/filter_/prod_mode_filter.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4/project/tg_bot/kb/inline_ → _arpakit_project_template_v_5/project/tg_bot/kb}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4/project/tg_bot/kb/inline_/admin → _arpakit_project_template_v_5/project/tg_bot/kb/inline_}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4/project/tg_bot/kb/inline_/client → _arpakit_project_template_v_5/project/tg_bot/kb/inline_/admin}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/kb/inline_/admin/common.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4/project/tg_bot/kb/static_ → _arpakit_project_template_v_5/project/tg_bot/kb/inline_/client}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/kb/inline_/client/common.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/kb/inline_/client/hello_world.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/kb/inline_/common.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4/project/tg_bot/kb/static_/admin → _arpakit_project_template_v_5/project/tg_bot/kb/static_}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4/project/tg_bot/kb/static_/client → _arpakit_project_template_v_5/project/tg_bot/kb/static_/admin}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/kb/static_/admin/common.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4/project/tg_bot/middleware → _arpakit_project_template_v_5/project/tg_bot/kb/static_/client}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/kb/static_/client/common.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/kb/static_/client/hello_world.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/kb/static_/common.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4/project/tg_bot/router → _arpakit_project_template_v_5/project/tg_bot/middleware}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/middleware/common.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/middleware/middleware.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4/project/tg_bot/router/admin → _arpakit_project_template_v_5/project/tg_bot/router}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4/project/tg_bot/router/client → _arpakit_project_template_v_5/project/tg_bot/router/admin}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4/project/tg_bot/util → _arpakit_project_template_v_5/project/tg_bot/router/client}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/start_tg_bot.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/tg_bot.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/tg_bot_dispatcher.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4/project → _arpakit_project_template_v_5/project/tg_bot}/util/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/util/etc.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/util/arpakitlib_project_template.py +0 -0
- {arpakitlib-1.8.17.dist-info → arpakitlib-1.8.19.dist-info}/LICENSE +0 -0
- {arpakitlib-1.8.17.dist-info → arpakitlib-1.8.19.dist-info}/WHEEL +0 -0
- {arpakitlib-1.8.17.dist-info → arpakitlib-1.8.19.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,13 @@
|
|
1
|
+
from project.core.settings import get_cached_settings
|
2
|
+
from project.core.util import setup_logging
|
3
|
+
from project.sqlalchemy_db_.sqlalchemy_db import get_cached_sqlalchemy_db
|
4
|
+
|
5
|
+
|
6
|
+
def __command():
|
7
|
+
setup_logging()
|
8
|
+
get_cached_settings().raise_if_prod_mode()
|
9
|
+
get_cached_sqlalchemy_db().reinit_all()
|
10
|
+
|
11
|
+
|
12
|
+
if __name__ == '__main__':
|
13
|
+
__command()
|
arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/auth.py
RENAMED
@@ -9,7 +9,7 @@ from fastapi import Security
|
|
9
9
|
from fastapi.security import APIKeyHeader
|
10
10
|
from pydantic import BaseModel, ConfigDict
|
11
11
|
|
12
|
-
from arpakitlib.ar_func_util import
|
12
|
+
from arpakitlib.ar_func_util import is_async_func, is_sync_func
|
13
13
|
from arpakitlib.ar_json_util import transfer_data_to_json_str_to_data
|
14
14
|
from arpakitlib.ar_type_util import raise_for_type
|
15
15
|
from project.api.const import APIErrorCodes
|
@@ -199,12 +199,12 @@ def api_auth(
|
|
199
199
|
# is_api_key_correct_func
|
200
200
|
|
201
201
|
if is_api_key_correct_func is not None:
|
202
|
-
if
|
202
|
+
if is_async_func(is_api_key_correct_func):
|
203
203
|
await is_api_key_correct_func(
|
204
204
|
api_auth_data=api_auth_data,
|
205
205
|
request=request
|
206
206
|
)
|
207
|
-
elif
|
207
|
+
elif is_sync_func(is_api_key_correct_func):
|
208
208
|
is_api_key_correct_func(
|
209
209
|
api_auth_data=api_auth_data,
|
210
210
|
request=request
|
@@ -215,12 +215,12 @@ def api_auth(
|
|
215
215
|
# is_user_token_correct_func
|
216
216
|
|
217
217
|
if is_user_token_correct_func is not None:
|
218
|
-
if
|
218
|
+
if is_async_func(is_user_token_correct_func):
|
219
219
|
await is_user_token_correct_func(
|
220
220
|
api_auth_data=api_auth_data,
|
221
221
|
request=request
|
222
222
|
)
|
223
|
-
elif
|
223
|
+
elif is_sync_func(is_user_token_correct_func):
|
224
224
|
is_user_token_correct_func(
|
225
225
|
api_auth_data=api_auth_data,
|
226
226
|
request=request
|
arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/auth2.py
RENAMED
@@ -4,15 +4,18 @@ import fastapi
|
|
4
4
|
import fastapi.exceptions
|
5
5
|
import fastapi.responses
|
6
6
|
import fastapi.security
|
7
|
+
import sqlalchemy
|
7
8
|
from fastapi import Security
|
8
9
|
from fastapi.security import APIKeyHeader
|
9
10
|
from pydantic import BaseModel, ConfigDict
|
10
11
|
|
11
|
-
from arpakitlib.ar_func_util import
|
12
|
+
from arpakitlib.ar_func_util import is_async_func, is_sync_func
|
12
13
|
from arpakitlib.ar_json_util import transfer_data_to_json_str_to_data
|
13
14
|
from project.api.const import APIErrorCodes
|
14
15
|
from project.api.exception import APIException
|
15
16
|
from project.core.settings import get_cached_settings
|
17
|
+
from project.sqlalchemy_db_.sqlalchemy_db import get_cached_sqlalchemy_db
|
18
|
+
from project.sqlalchemy_db_.sqlalchemy_model import ApiKeyDBM, UserTokenDBM
|
16
19
|
|
17
20
|
|
18
21
|
class APIAuthData(BaseModel):
|
@@ -21,15 +24,18 @@ class APIAuthData(BaseModel):
|
|
21
24
|
api_key_string: str | None = None
|
22
25
|
user_token_string: str | None = None
|
23
26
|
|
27
|
+
api_key_dbm: ApiKeyDBM | None = None
|
28
|
+
user_token_dbm: UserTokenDBM | None = None
|
29
|
+
|
24
30
|
prod_mode: bool = False
|
25
31
|
|
26
32
|
|
27
33
|
def api_auth(
|
28
34
|
*,
|
29
|
-
|
35
|
+
middlewares: list[Callable] | None = None
|
30
36
|
) -> Callable:
|
31
|
-
if
|
32
|
-
|
37
|
+
if middlewares is None:
|
38
|
+
middlewares = []
|
33
39
|
|
34
40
|
async def async_func(
|
35
41
|
*,
|
@@ -46,7 +52,7 @@ def api_auth(
|
|
46
52
|
prod_mode=get_cached_settings().prod_mode
|
47
53
|
)
|
48
54
|
|
49
|
-
# parse
|
55
|
+
# parse api_key_string
|
50
56
|
|
51
57
|
api_auth_data.api_key_string = api_key_string
|
52
58
|
|
@@ -56,6 +62,8 @@ def api_auth(
|
|
56
62
|
api_auth_data.api_key_string = request.headers["api-key"]
|
57
63
|
if not api_auth_data.api_key_string and "apikey" in request.headers.keys():
|
58
64
|
api_auth_data.api_key_string = request.headers["apikey"]
|
65
|
+
if not api_auth_data.api_key_string and "api_key_string" in request.headers.keys():
|
66
|
+
api_auth_data.api_key_string = request.headers["api_key_string"]
|
59
67
|
|
60
68
|
if not api_auth_data.api_key_string and "api_key" in request.query_params.keys():
|
61
69
|
api_auth_data.api_key_string = request.query_params["api_key"]
|
@@ -63,13 +71,15 @@ def api_auth(
|
|
63
71
|
api_auth_data.api_key_string = request.query_params["api-key"]
|
64
72
|
if not api_auth_data.api_key_string and "apikey" in request.query_params.keys():
|
65
73
|
api_auth_data.api_key_string = request.query_params["apikey"]
|
74
|
+
if not api_auth_data.api_key_string and "api_key_string" in request.query_params.keys():
|
75
|
+
api_auth_data.api_key_string = request.query_params["api_key_string"]
|
66
76
|
|
67
77
|
if api_auth_data.api_key_string:
|
68
78
|
api_auth_data.api_key_string = api_auth_data.api_key_string.strip()
|
69
79
|
if not api_auth_data.api_key_string:
|
70
80
|
api_auth_data.api_key_string = None
|
71
81
|
|
72
|
-
# parse
|
82
|
+
# parse user_token_string
|
73
83
|
|
74
84
|
api_auth_data.user_token_string = ac.credentials if ac and ac.credentials and ac.credentials.strip() else None
|
75
85
|
|
@@ -98,74 +108,111 @@ def api_auth(
|
|
98
108
|
if not api_auth_data.user_token_string:
|
99
109
|
api_auth_data.user_token_string = None
|
100
110
|
|
101
|
-
#
|
111
|
+
# middlewares
|
102
112
|
|
103
|
-
for
|
104
|
-
if
|
105
|
-
await
|
113
|
+
for middleware in middlewares:
|
114
|
+
if is_async_func(middleware):
|
115
|
+
await middleware(
|
106
116
|
api_auth_data=api_auth_data,
|
107
117
|
request=request
|
108
118
|
)
|
109
|
-
elif
|
110
|
-
|
119
|
+
elif is_sync_func(middleware):
|
120
|
+
middleware(
|
111
121
|
api_auth_data=api_auth_data,
|
112
122
|
request=request
|
113
123
|
)
|
114
124
|
else:
|
115
|
-
raise TypeError("unknown
|
125
|
+
raise TypeError(f"unknown middleware type, {middleware.__name__}")
|
116
126
|
|
117
127
|
return api_auth_data
|
118
128
|
|
119
129
|
return async_func
|
120
130
|
|
121
131
|
|
122
|
-
def
|
132
|
+
def require_prod_mode_api_middleware():
|
123
133
|
def func(*, api_auth_data: APIAuthData, request: fastapi.requests.Request):
|
124
|
-
if
|
134
|
+
if not get_cached_settings().prod_mode:
|
125
135
|
raise APIException(
|
126
136
|
status_code=fastapi.status.HTTP_401_UNAUTHORIZED,
|
127
137
|
error_code=APIErrorCodes.cannot_authorize,
|
128
|
-
error_description="
|
138
|
+
error_description=f"prod_mode={get_cached_settings().prod_mode}",
|
129
139
|
error_data=transfer_data_to_json_str_to_data(api_auth_data.model_dump())
|
130
140
|
)
|
131
141
|
|
132
142
|
return func
|
133
143
|
|
134
144
|
|
135
|
-
def
|
145
|
+
def require_not_prod_mode_api_middleware():
|
136
146
|
def func(*, api_auth_data: APIAuthData, request: fastapi.requests.Request):
|
137
|
-
if
|
147
|
+
if get_cached_settings().prod_mode:
|
138
148
|
raise APIException(
|
139
149
|
status_code=fastapi.status.HTTP_401_UNAUTHORIZED,
|
140
150
|
error_code=APIErrorCodes.cannot_authorize,
|
141
|
-
error_description="
|
151
|
+
error_description=f"prod_mode={get_cached_settings().prod_mode}",
|
142
152
|
error_data=transfer_data_to_json_str_to_data(api_auth_data.model_dump())
|
143
153
|
)
|
144
154
|
|
145
155
|
return func
|
146
156
|
|
147
157
|
|
148
|
-
def
|
158
|
+
def require_api_key_string_api_middleware():
|
149
159
|
def func(*, api_auth_data: APIAuthData, request: fastapi.requests.Request):
|
150
|
-
if
|
160
|
+
if api_auth_data.api_key_string is None:
|
151
161
|
raise APIException(
|
152
162
|
status_code=fastapi.status.HTTP_401_UNAUTHORIZED,
|
153
163
|
error_code=APIErrorCodes.cannot_authorize,
|
154
|
-
error_description=
|
164
|
+
error_description="api_key_string is required",
|
155
165
|
error_data=transfer_data_to_json_str_to_data(api_auth_data.model_dump())
|
156
166
|
)
|
157
167
|
|
158
168
|
return func
|
159
169
|
|
160
170
|
|
161
|
-
def
|
171
|
+
def require_user_token_string_api_middleware():
|
162
172
|
def func(*, api_auth_data: APIAuthData, request: fastapi.requests.Request):
|
163
|
-
if
|
173
|
+
if api_auth_data.user_token_string is None:
|
164
174
|
raise APIException(
|
165
175
|
status_code=fastapi.status.HTTP_401_UNAUTHORIZED,
|
166
176
|
error_code=APIErrorCodes.cannot_authorize,
|
167
|
-
error_description=
|
177
|
+
error_description="user_token_string is required",
|
168
178
|
error_data=transfer_data_to_json_str_to_data(api_auth_data.model_dump())
|
169
179
|
)
|
170
180
|
|
171
181
|
return func
|
182
|
+
|
183
|
+
|
184
|
+
def try_find_api_key_dbm_api_middleware():
|
185
|
+
async def async_func(*, api_auth_data: APIAuthData, request: fastapi.requests.Request):
|
186
|
+
if api_auth_data.api_key_dbm is None:
|
187
|
+
return
|
188
|
+
async with get_cached_sqlalchemy_db().new_async_session() as async_session:
|
189
|
+
api_auth_data.api_key_dbm = await async_session.scalar(
|
190
|
+
sqlalchemy.select(ApiKeyDBM).where(ApiKeyDBM.value == api_auth_data.api_key_string)
|
191
|
+
)
|
192
|
+
|
193
|
+
return async_func
|
194
|
+
|
195
|
+
|
196
|
+
def try_find_user_token_dbm_api_middleware():
|
197
|
+
async def async_func(*, api_auth_data: APIAuthData, request: fastapi.requests.Request):
|
198
|
+
if api_auth_data.user_token_dbm is None:
|
199
|
+
return
|
200
|
+
async with get_cached_sqlalchemy_db().new_async_session() as async_session:
|
201
|
+
api_auth_data.user_token_dbm = await async_session.scalar(
|
202
|
+
sqlalchemy.select(UserTokenDBM).where(UserTokenDBM.value == api_auth_data.user_token_string)
|
203
|
+
)
|
204
|
+
|
205
|
+
return async_func
|
206
|
+
|
207
|
+
|
208
|
+
def require_api_key_dbm_api_middleware():
|
209
|
+
async def async_func(*, api_auth_data: APIAuthData, request: fastapi.requests.Request):
|
210
|
+
if api_auth_data.api_key_dbm is None:
|
211
|
+
raise APIException(
|
212
|
+
status_code=fastapi.status.HTTP_401_UNAUTHORIZED,
|
213
|
+
error_code=APIErrorCodes.cannot_authorize,
|
214
|
+
error_description="api_key_dbm is required",
|
215
|
+
error_data=transfer_data_to_json_str_to_data(api_auth_data.model_dump())
|
216
|
+
)
|
217
|
+
|
218
|
+
return async_func
|
@@ -10,12 +10,12 @@ import starlette.exceptions
|
|
10
10
|
from arpakitlib.ar_datetime_util import now_utc_dt
|
11
11
|
from arpakitlib.ar_dict_util import combine_dicts
|
12
12
|
from arpakitlib.ar_exception_util import exception_to_traceback_str
|
13
|
-
from arpakitlib.ar_func_util import
|
13
|
+
from arpakitlib.ar_func_util import raise_if_not_async_func, is_async_func, is_sync_func
|
14
14
|
from arpakitlib.ar_json_util import transfer_data_to_json_str
|
15
15
|
from project.api.const import APIErrorCodes
|
16
16
|
from project.api.exception import APIException
|
17
17
|
from project.api.response import APIJSONResponse
|
18
|
-
from project.api.schema.out.
|
18
|
+
from project.api.schema.out.common.error import ErrorCommonSO
|
19
19
|
from project.core.settings import get_cached_settings
|
20
20
|
from project.sqlalchemy_db_.sqlalchemy_db import get_cached_sqlalchemy_db
|
21
21
|
from project.sqlalchemy_db_.sqlalchemy_model import StoryLogDBM
|
@@ -42,7 +42,7 @@ def create_api_exception_handler(
|
|
42
42
|
) -> APIJSONResponse:
|
43
43
|
status_code = fastapi.status.HTTP_500_INTERNAL_SERVER_ERROR
|
44
44
|
|
45
|
-
error_common_so =
|
45
|
+
error_common_so = ErrorCommonSO(
|
46
46
|
has_error=True,
|
47
47
|
error_code=APIErrorCodes.unknown_error,
|
48
48
|
error_data={
|
@@ -102,7 +102,7 @@ def create_api_exception_handler(
|
|
102
102
|
|
103
103
|
_transmitted_kwargs = {}
|
104
104
|
for func_before in funcs_before:
|
105
|
-
if
|
105
|
+
if is_async_func(func_before):
|
106
106
|
try:
|
107
107
|
await func_before(
|
108
108
|
request=request,
|
@@ -114,7 +114,7 @@ def create_api_exception_handler(
|
|
114
114
|
except Exception as exception_:
|
115
115
|
_logger.exception(exception_)
|
116
116
|
raise exception_
|
117
|
-
elif
|
117
|
+
elif is_sync_func(func_before):
|
118
118
|
try:
|
119
119
|
func_before(
|
120
120
|
request=request,
|
@@ -132,7 +132,7 @@ def create_api_exception_handler(
|
|
132
132
|
# async_funcs_after
|
133
133
|
|
134
134
|
for async_func_after in async_funcs_after:
|
135
|
-
|
135
|
+
raise_if_not_async_func(async_func_after)
|
136
136
|
_ = asyncio.create_task(async_func_after(
|
137
137
|
request=request, status_code=status_code, error_common_so=error_common_so, exception=exception
|
138
138
|
))
|
@@ -157,7 +157,7 @@ def logging_func_before_in_api_exception_handler(
|
|
157
157
|
*,
|
158
158
|
request: fastapi.requests.Request,
|
159
159
|
status_code: int,
|
160
|
-
error_common_so:
|
160
|
+
error_common_so: ErrorCommonSO,
|
161
161
|
exception: Exception,
|
162
162
|
transmitted_kwargs: dict[str, Any],
|
163
163
|
**kwargs
|
@@ -192,7 +192,7 @@ def create_story_log_func_before_in_api_exception_handler(
|
|
192
192
|
*,
|
193
193
|
request: fastapi.requests.Request,
|
194
194
|
status_code: int,
|
195
|
-
error_common_so:
|
195
|
+
error_common_so: ErrorCommonSO,
|
196
196
|
exception: Exception,
|
197
197
|
transmitted_kwargs: dict[str, Any],
|
198
198
|
**kwargs
|
@@ -216,9 +216,9 @@ def create_story_log_func_before_in_api_exception_handler(
|
|
216
216
|
type=StoryLogDBM.Types.error_in_api,
|
217
217
|
title=f"{status_code}, {type(exception)}",
|
218
218
|
data={
|
219
|
-
"
|
219
|
+
"exception": str(exception),
|
220
220
|
"error_common_so": error_common_so.model_dump(),
|
221
|
-
"
|
221
|
+
"exception_traceback": exception_to_traceback_str(exception=exception)
|
222
222
|
}
|
223
223
|
)
|
224
224
|
session.add(story_log_dbm)
|
@@ -1,8 +1,8 @@
|
|
1
1
|
import fastapi
|
2
2
|
from fastapi import APIRouter
|
3
3
|
|
4
|
+
from project.api.schema.out.common.error import ErrorCommonSO
|
4
5
|
from project.api.schema.out.common.raw_data import RawDataCommonSO
|
5
|
-
from project.api.schema.out.general.error import ErrorGeneralSO
|
6
6
|
from project.util.arpakitlib_project_template import get_arpakitlib_project_template_info
|
7
7
|
|
8
8
|
api_router = APIRouter()
|
@@ -12,7 +12,7 @@ api_router = APIRouter()
|
|
12
12
|
"",
|
13
13
|
name="Get arpakitlib project template info",
|
14
14
|
status_code=fastapi.status.HTTP_200_OK,
|
15
|
-
response_model=RawDataCommonSO |
|
15
|
+
response_model=RawDataCommonSO | ErrorCommonSO
|
16
16
|
)
|
17
17
|
async def _(
|
18
18
|
*,
|
@@ -1,8 +1,11 @@
|
|
1
1
|
import fastapi.requests
|
2
2
|
from fastapi import APIRouter
|
3
|
-
from project.api.schema.out.common.error import ErrorCommonSO
|
4
3
|
|
4
|
+
from project.api.auth2 import APIAuthData, api_auth, require_api_key_string_api_middleware, \
|
5
|
+
require_user_token_string_api_middleware, try_find_api_key_dbm_api_middleware, \
|
6
|
+
try_find_user_token_dbm_api_middleware
|
5
7
|
from project.api.const import APIErrorCodes, APIErrorSpecificationCodes
|
8
|
+
from project.api.schema.out.common.error import ErrorCommonSO
|
6
9
|
from project.api.schema.out.general.errors_info_general import ErrorsInfoGeneralSO
|
7
10
|
|
8
11
|
api_router = APIRouter()
|
@@ -17,7 +20,14 @@ api_router = APIRouter()
|
|
17
20
|
async def _(
|
18
21
|
*,
|
19
22
|
request: fastapi.requests.Request,
|
20
|
-
response: fastapi.responses.Response
|
23
|
+
response: fastapi.responses.Response,
|
24
|
+
api_auth_data: APIAuthData = fastapi.Depends(api_auth(middlewares=[
|
25
|
+
require_api_key_string_api_middleware(),
|
26
|
+
require_user_token_string_api_middleware(),
|
27
|
+
try_find_api_key_dbm_api_middleware(),
|
28
|
+
try_find_user_token_dbm_api_middleware(),
|
29
|
+
|
30
|
+
]))
|
21
31
|
):
|
22
32
|
return ErrorsInfoGeneralSO(
|
23
33
|
api_error_codes=APIErrorCodes.values_list(),
|
@@ -3,7 +3,7 @@ from fastapi import APIRouter
|
|
3
3
|
|
4
4
|
from arpakitlib.ar_datetime_util import now_utc_dt
|
5
5
|
from project.api.schema.out.common.datetime_ import DatetimeCommonSO
|
6
|
-
from project.api.schema.out.
|
6
|
+
from project.api.schema.out.common.error import ErrorCommonSO
|
7
7
|
|
8
8
|
api_router = APIRouter()
|
9
9
|
|
@@ -12,7 +12,7 @@ api_router = APIRouter()
|
|
12
12
|
"",
|
13
13
|
name="Now UTC datetime",
|
14
14
|
status_code=fastapi.status.HTTP_200_OK,
|
15
|
-
response_model=DatetimeCommonSO |
|
15
|
+
response_model=DatetimeCommonSO | ErrorCommonSO,
|
16
16
|
)
|
17
17
|
async def _(
|
18
18
|
*,
|
@@ -3,11 +3,11 @@ from __future__ import annotations
|
|
3
3
|
import datetime as dt
|
4
4
|
from typing import Any
|
5
5
|
|
6
|
-
from project.api.schema.out.admin.common import
|
6
|
+
from project.api.schema.out.admin.common import SimpleDBMAdminSO
|
7
7
|
from project.sqlalchemy_db_.sqlalchemy_model import OperationDBM
|
8
8
|
|
9
9
|
|
10
|
-
class OperationAdminSO(
|
10
|
+
class OperationAdminSO(SimpleDBMAdminSO):
|
11
11
|
execution_start_dt: dt.datetime | None
|
12
12
|
execution_finish_dt: dt.datetime | None
|
13
13
|
status: str
|
@@ -2,11 +2,11 @@ from __future__ import annotations
|
|
2
2
|
|
3
3
|
from typing import Any
|
4
4
|
|
5
|
-
from project.api.schema.out.admin.common import
|
5
|
+
from project.api.schema.out.admin.common import SimpleDBMAdminSO
|
6
6
|
from project.sqlalchemy_db_.sqlalchemy_model import StoryLogDBM
|
7
7
|
|
8
8
|
|
9
|
-
class StoryLogAdminSO(
|
9
|
+
class StoryLogAdminSO(SimpleDBMAdminSO):
|
10
10
|
level: str
|
11
11
|
type: str | None
|
12
12
|
title: str | None
|
@@ -0,0 +1,22 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
import datetime as dt
|
4
|
+
from typing import Any
|
5
|
+
|
6
|
+
from project.api.schema.out.admin.common import SimpleDBMAdminSO
|
7
|
+
from project.sqlalchemy_db_.sqlalchemy_model import UserDBM
|
8
|
+
|
9
|
+
|
10
|
+
class UserDBMSAdminSO(SimpleDBMAdminSO):
|
11
|
+
mail: str | None
|
12
|
+
roles: list[str]
|
13
|
+
is_enabled: bool
|
14
|
+
tg_id: int | None
|
15
|
+
tg_bot_last_action_dt: dt.datetime | None
|
16
|
+
tg_data: dict[str, Any] | None
|
17
|
+
roles_has_admin: bool
|
18
|
+
roles_has_client: bool
|
19
|
+
|
20
|
+
@classmethod
|
21
|
+
def from_user_dbm(cls, *, user_dbm: UserDBM) -> UserDBMSAdminSO:
|
22
|
+
return cls.model_validate(user_dbm.simple_dict_with_sd_properties())
|
@@ -0,0 +1,14 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from project.api.schema.out.admin.common import SimpleDBMAdminSO
|
4
|
+
from project.sqlalchemy_db_.sqlalchemy_model import UserTokenDBM
|
5
|
+
|
6
|
+
|
7
|
+
class UserTokenDBMSAdminSO(SimpleDBMAdminSO):
|
8
|
+
value: str
|
9
|
+
user_id: int
|
10
|
+
is_enabled: bool
|
11
|
+
|
12
|
+
@classmethod
|
13
|
+
def from_user_token_dbm(cls, *, user_dbm: UserTokenDBM) -> UserTokenDBMSAdminSO:
|
14
|
+
return cls.model_validate(user_dbm.simple_dict_with_sd_properties())
|
@@ -113,7 +113,7 @@ class OperationExecutorWorker(BaseWorker):
|
|
113
113
|
operation_dbm.error_data,
|
114
114
|
{
|
115
115
|
"exception_in_execute_operation": str(exception_in_execute_operation),
|
116
|
-
"
|
116
|
+
"traceback_in_execute_operation": exception_to_traceback_str(
|
117
117
|
exception=exception_in_execute_operation
|
118
118
|
),
|
119
119
|
}
|
@@ -208,7 +208,7 @@ class OperationExecutorWorker(BaseWorker):
|
|
208
208
|
operation_dbm.error_data = combine_dicts(
|
209
209
|
{
|
210
210
|
"exception_in_execute_operation": str(exception_in_execute_operation),
|
211
|
-
"
|
211
|
+
"traceback_in_execute_operation": exception_to_traceback_str(
|
212
212
|
exception=exception_in_execute_operation
|
213
213
|
)
|
214
214
|
},
|
@@ -1,21 +1,15 @@
|
|
1
1
|
from functools import lru_cache
|
2
|
-
from typing import Any
|
3
2
|
|
4
3
|
from emoji import emojize
|
5
4
|
|
6
|
-
from arpakitlib.ar_json_util import transfer_data_to_json_str
|
7
5
|
from project.sqlalchemy_db_.sqlalchemy_model import UserDBM
|
8
6
|
from project.tg_bot.blank.common import SimpleBlankTgBot
|
9
7
|
from project.util.arpakitlib_project_template import get_arpakitlib_project_template_info
|
10
8
|
|
11
9
|
|
12
10
|
class AdminTgBotBlank(SimpleBlankTgBot):
|
13
|
-
def
|
14
|
-
res = "
|
15
|
-
return emojize(res.strip())
|
16
|
-
|
17
|
-
def arpakit_project_template_info(self, *, arpakitlib_project_template_info: dict[str, Any]) -> str:
|
18
|
-
res = transfer_data_to_json_str(arpakitlib_project_template_info, beautify=True)
|
11
|
+
def good(self) -> str:
|
12
|
+
res = "good"
|
19
13
|
return emojize(res.strip())
|
20
14
|
|
21
15
|
def user_dbm(self, *, user_dbm: UserDBM | None) -> str:
|
@@ -0,0 +1,69 @@
|
|
1
|
+
from functools import lru_cache
|
2
|
+
|
3
|
+
from emoji import emojize
|
4
|
+
|
5
|
+
from project.tg_bot.blank.common import SimpleBlankTgBot
|
6
|
+
from project.tg_bot.const import ClientTgBotCommands
|
7
|
+
|
8
|
+
|
9
|
+
class ClientTgBotBlank(SimpleBlankTgBot):
|
10
|
+
def command_to_desc(self) -> dict[str, str]:
|
11
|
+
return {
|
12
|
+
ClientTgBotCommands.start: emojize(":waving_hand: Начать"),
|
13
|
+
ClientTgBotCommands.about: emojize(":information: О проекте")
|
14
|
+
}
|
15
|
+
|
16
|
+
def but_hello_world(self) -> str:
|
17
|
+
res = "hello_world"
|
18
|
+
return emojize(res.strip())
|
19
|
+
|
20
|
+
def error(self) -> str:
|
21
|
+
res = ":warning: <b>Произошла неполадка</b> :warning:"
|
22
|
+
res += "\n\n:wrench: Мы уже работаем над исправлением"
|
23
|
+
res += "\n\n:red_heart: Просим прощения :red_heart:"
|
24
|
+
return emojize(res.strip())
|
25
|
+
|
26
|
+
def hello_world(self) -> str:
|
27
|
+
res = ":waving_hand: <b>Hello world</b> :waving_hand:"
|
28
|
+
return emojize(res.strip())
|
29
|
+
|
30
|
+
def healthcheck(self) -> str:
|
31
|
+
res = "healthcheck"
|
32
|
+
return emojize(res.strip())
|
33
|
+
|
34
|
+
def welcome(self) -> str:
|
35
|
+
res = ":waving_hand: <b>Welcome</b> :waving_hand:"
|
36
|
+
return emojize(res.strip())
|
37
|
+
|
38
|
+
def raw_message(self) -> str:
|
39
|
+
res = ":warning: <b>Сообщние не обработано</b> :warning:"
|
40
|
+
return emojize(res.strip())
|
41
|
+
|
42
|
+
def about_project(self) -> str:
|
43
|
+
res = ":information: <b>О проекте</b>"
|
44
|
+
return emojize(res.strip())
|
45
|
+
|
46
|
+
def support_info(self) -> str:
|
47
|
+
res = ":red_heart: <b>Поддержка</b>"
|
48
|
+
return emojize(res.strip())
|
49
|
+
|
50
|
+
def keyboard_is_old(self) -> str:
|
51
|
+
res = ":information: Данная клавиатура устарела :information:"
|
52
|
+
return emojize(res.strip())
|
53
|
+
|
54
|
+
|
55
|
+
def create_client_tg_bot_blank() -> ClientTgBotBlank:
|
56
|
+
return ClientTgBotBlank()
|
57
|
+
|
58
|
+
|
59
|
+
@lru_cache()
|
60
|
+
def get_cached_client_tg_bot_blank() -> ClientTgBotBlank:
|
61
|
+
return ClientTgBotBlank()
|
62
|
+
|
63
|
+
|
64
|
+
def __example():
|
65
|
+
print(get_cached_client_tg_bot_blank().welcome())
|
66
|
+
|
67
|
+
|
68
|
+
if __name__ == '__main__':
|
69
|
+
__example()
|