arpakitlib 1.8.14__py3-none-any.whl → 1.8.16__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_4/arpakitlib_project_template_info.json +3 -0
- arpakitlib/_arpakit_project_template_v_4/command/beautify_json.py +10 -0
- arpakitlib/_arpakit_project_template_v_4/command/demojize.py +9 -0
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/drop_json_db.py +1 -1
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/drop_sqlalchemy_db.py +1 -1
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/generate_settings_env_example.py +2 -2
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/reinit_json_db.py +1 -1
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/reinit_sqlalchemy_db.py +1 -1
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/remove_operations.py +1 -1
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/remove_story_logs.py +1 -1
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/rm_all_records_in_json_db.py +1 -1
- arpakitlib/_arpakit_project_template_v_4/command/set_tg_bot_commands.py +16 -0
- arpakitlib/_arpakit_project_template_v_4/command/show_settings.py +10 -0
- arpakitlib/_arpakit_project_template_v_4/command/start_sqladmin.py +19 -0
- arpakitlib/_arpakit_project_template_v_4/command/start_sqladmin_for_prod.py +19 -0
- arpakitlib/_arpakit_project_template_v_4/command/start_sqladmin_with_reload.py +19 -0
- arpakitlib/_arpakit_project_template_v_4/command/start_tg_bot_for_prod.py +11 -0
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/example.env +11 -5
- arpakitlib/_arpakit_project_template_v_4/project/additional_model/common.py +8 -0
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/auth.py +112 -36
- arpakitlib/_arpakit_project_template_v_4/project/api/auth2.py +171 -0
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/create_api_app.py +7 -7
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/event.py +8 -8
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/exception.py +1 -1
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/exception_handler.py +38 -36
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/openapi_ui.py +1 -1
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/response.py +5 -5
- arpakitlib/_arpakit_project_template_v_4/project/api/router/admin/get_arpakitlib_project_template_info.py +23 -0
- arpakitlib/_arpakit_project_template_v_4/project/api/router/admin/get_auth_data.py +30 -0
- arpakitlib/_arpakit_project_template_v_4/project/api/router/admin/main_router.py +3 -0
- arpakitlib/{_arpakit_project_template_v_2/project/api/router/general → _arpakit_project_template_v_4/project/api/router/client}/get_errors_info.py +3 -9
- arpakitlib/_arpakit_project_template_v_4/project/api/router/client/main_router.py +3 -0
- arpakitlib/_arpakit_project_template_v_4/project/api/router/client/now_utc_datetime.py +22 -0
- arpakitlib/_arpakit_project_template_v_4/project/api/router/general/healthcheck.py +21 -0
- arpakitlib/_arpakit_project_template_v_4/project/api/router/general/main_router.py +10 -0
- arpakitlib/_arpakit_project_template_v_4/project/api/router/main_router.py +23 -0
- arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/admin/common.py +10 -0
- arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/admin/operation.py +23 -0
- arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/admin/story_log.py +17 -0
- arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/client/common.py +10 -0
- arpakitlib/{_arpakit_project_template_v_2/project/api/schema/common/out.py → _arpakit_project_template_v_4/project/api/schema/out/common/datetime_.py} +2 -19
- arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/common/raw_data.py +7 -0
- arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/common.py +5 -0
- arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/general/error.py +11 -0
- arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/general/errors_info_general.py +6 -0
- arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/general/healthcheck.py +5 -0
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/core/const.py +2 -2
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/core/settings.py +43 -39
- arpakitlib/_arpakit_project_template_v_4/project/site/router/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/sqladmin_/__init__.py +0 -0
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqladmin_/admin_auth.py +17 -12
- arpakitlib/_arpakit_project_template_v_4/project/sqladmin_/asgi.py +3 -0
- arpakitlib/_arpakit_project_template_v_4/project/sqladmin_/create_sqladmin_app.py +49 -0
- arpakitlib/_arpakit_project_template_v_4/project/sqladmin_/event.py +40 -0
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqladmin_/model_view/operation.py +1 -1
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqladmin_/model_view/story_log.py +1 -1
- arpakitlib/_arpakit_project_template_v_4/project/sqlalchemy_db_/__init__.py +0 -0
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqlalchemy_db_/sqlalchemy_model/__init__.py +4 -0
- arpakitlib/_arpakit_project_template_v_4/project/sqlalchemy_db_/sqlalchemy_model/api_key.py +44 -0
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqlalchemy_db_/sqlalchemy_model/common.py +29 -6
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqlalchemy_db_/sqlalchemy_model/story_log.py +2 -1
- arpakitlib/_arpakit_project_template_v_4/project/sqlalchemy_db_/sqlalchemy_model/user.py +87 -0
- arpakitlib/_arpakit_project_template_v_4/project/sqlalchemy_db_/sqlalchemy_model/user_token.py +41 -0
- arpakitlib/_arpakit_project_template_v_4/project/test_data/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/blank/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/blank/admin.py +45 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/blank/client.py +44 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/blank/common.py +5 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/callback/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/callback/admin.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/callback/client.py +5 -0
- arpakitlib/{_arpakit_project_template_v_2/project/tg_bot/kb/inline_/callback.py → _arpakit_project_template_v_4/project/tg_bot/callback/common.py} +7 -7
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/tg_bot/const.py +22 -6
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/error_handler.py +37 -0
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/tg_bot/event.py +43 -13
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/filter_/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/filter_/is_private_chat.py +12 -0
- arpakitlib/{_arpakit_project_template_v_2/project/tg_bot/filter_.py → _arpakit_project_template_v_4/project/tg_bot/filter_/message_text.py} +1 -22
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/filter_/not_prod_mode_filter.py +8 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/filter_/prod_mode_filter.py +8 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/filter_/user_roles_has_admin.py +27 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/filter_/user_roles_has_client.py +27 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/inline_/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/inline_/admin/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/inline_/admin/common.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/inline_/client/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/inline_/client/common.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/inline_/client/hello_world.py +16 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/inline_/common.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/static_/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/static_/admin/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/static_/admin/common.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/static_/client/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/static_/client/common.py +0 -0
- arpakitlib/{_arpakit_project_template_v_2/project/tg_bot/kb/static_/common.py → _arpakit_project_template_v_4/project/tg_bot/kb/static_/client/hello_world.py} +3 -3
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/static_/common.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/middleware/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/middleware/common.py +13 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/middleware/init_user.py +84 -0
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/tg_bot/middleware/middleware.py +1 -2
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/admin/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/admin/arpakitlib_project_template_info.py +25 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/admin/main_router.py +15 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/admin/me.py +20 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/admin/raise_fake_error.py +20 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/admin/reinit_sqlalchemy_db.py +27 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/client/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/client/healthcheck.py +16 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/client/hello_world.py +44 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/client/main_router.py +14 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/client/start.py +33 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/main_router.py +13 -0
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/tg_bot/start_tg_bot.py +2 -2
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/tg_bot/tg_bot.py +7 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/util/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/util/etc.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/util/set_tg_bot_commands.py +76 -0
- arpakitlib/_arpakit_project_template_v_4/project/util/__init__.py +0 -0
- arpakitlib/ar_aiogram_util.py +0 -3
- arpakitlib/ar_arpakit_schedule_uust_api_client_util.py +1 -65
- arpakitlib/ar_json_util.py +43 -12
- arpakitlib/ar_sqlalchemy_util.py +2 -2
- arpakitlib/ar_ssh_runner_util.py +2 -2
- arpakitlib/ar_str_util.py +15 -0
- {arpakitlib-1.8.14.dist-info → arpakitlib-1.8.16.dist-info}/METADATA +2 -1
- arpakitlib-1.8.16.dist-info/RECORD +330 -0
- arpakitlib/_arpakit_project_template_v_2/arpakitlib_project_template_info.json +0 -3
- arpakitlib/_arpakit_project_template_v_2/command/beautify_json.py +0 -10
- arpakitlib/_arpakit_project_template_v_2/command/show_settings.py +0 -10
- arpakitlib/_arpakit_project_template_v_2/project/additional_model/common.py +0 -1
- arpakitlib/_arpakit_project_template_v_2/project/api/router/general/get_auth_data.py +0 -31
- arpakitlib/_arpakit_project_template_v_2/project/api/router/general/healthcheck.py +0 -26
- arpakitlib/_arpakit_project_template_v_2/project/api/router/general/main_router.py +0 -24
- arpakitlib/_arpakit_project_template_v_2/project/api/router/general/now_utc_datetime.py +0 -26
- arpakitlib/_arpakit_project_template_v_2/project/api/router/main_router.py +0 -11
- arpakitlib/_arpakit_project_template_v_2/project/api/schema/common/in_.py +0 -5
- arpakitlib/_arpakit_project_template_v_2/project/api/schema/example/in_.py +0 -5
- arpakitlib/_arpakit_project_template_v_2/project/api/schema/example/out.py +0 -45
- arpakitlib/_arpakit_project_template_v_2/project/api/schema/general/in_.py +0 -5
- arpakitlib/_arpakit_project_template_v_2/project/api/schema/general/out.py +0 -14
- arpakitlib/_arpakit_project_template_v_2/project/tg_bot/blank/blank.py +0 -24
- arpakitlib/_arpakit_project_template_v_2/project/tg_bot/kb/inline_/common.py +0 -15
- arpakitlib/_arpakit_project_template_v_2/project/tg_bot/middleware/init_user.py +0 -21
- arpakitlib/_arpakit_project_template_v_2/project/tg_bot/router/arpakitlib_project_template_info.py +0 -14
- arpakitlib/_arpakit_project_template_v_2/project/tg_bot/router/error.py +0 -16
- arpakitlib/_arpakit_project_template_v_2/project/tg_bot/router/healthcheck.py +0 -11
- arpakitlib/_arpakit_project_template_v_2/project/tg_bot/router/main_router.py +0 -12
- arpakitlib/_arpakit_project_template_v_2/project/tg_bot/util.py +0 -1
- arpakitlib-1.8.14.dist-info/RECORD +0 -265
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/.gitignore +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/.python-version +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/LICENSE +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/README.md +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/alembic/README +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/alembic/env.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/alembic/script.py.mako +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/alembic/versions/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/alembic.ini +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/alembic_history.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/alembic_revision_autogenerate.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/alembic_upgrade_head.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/check_logging.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/check_sqlalchemy_db.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/docker_ps_a.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/docker_rm_postgres.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/docker_run_postgres.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/docker_start_postgres.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/docker_stop_postgres.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_commit.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_push_arpakit_company_github_1.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_push_arpakit_company_gitlab_1.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_push_arpakit_github_1.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_push_arpakit_gitlab_1.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_remote_v.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_set_arpakit_company_origin.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_set_arpakit_origin.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_set_divarteam_origin.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_status.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/hello_world.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/init_json_db.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/init_sqlalchemy_db.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_check.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_clear_cache.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_config.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_install.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_lock.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_remove_and_add_arpakitlib.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_show.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_show_arpakitlib.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_update.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_update_arpakitlib.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/command/start_api_for_not_prod.py → _arpakit_project_template_v_4/command/start_api.py} +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/start_api_for_prod.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/command/start_api_with_reload_for_not_prod.py → _arpakit_project_template_v_4/command/start_api_with_reload.py} +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/command/start_operation_executor_worker_for_not_prod.py → _arpakit_project_template_v_4/command/start_operation_executor_worker.py} +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/command/start_operation_executor_workers_for_not_prod.py → _arpakit_project_template_v_4/command/start_operation_executor_workers.py} +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/command/start_scheduled_operation_creator_worker_for_not_prod.py → _arpakit_project_template_v_4/command/start_scheduled_operation_creator_worker.py} +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/command/start_tg_bot_for_prod.py → _arpakit_project_template_v_4/command/start_tg_bot.py} +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/note/note_1.txt +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/note/note_2.txt +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/note/note_3.txt +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/note/note_4.txt +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/note/note_5.txt +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/additional_model/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/asgi.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/const.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/router/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/api/router/general → _arpakit_project_template_v_4/project/api/router/admin}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/api/schema → _arpakit_project_template_v_4/project/api/router/client}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/api/schema/common → _arpakit_project_template_v_4/project/api/router/general}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/api/schema/example → _arpakit_project_template_v_4/project/api/schema}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/api/schema/base_schema.py → _arpakit_project_template_v_4/project/api/schema/common.py} +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/api/schema/general → _arpakit_project_template_v_4/project/api/schema/in_}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/business_service → _arpakit_project_template_v_4/project/api/schema/in_/admin}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/api/util.py → _arpakit_project_template_v_4/project/api/schema/in_/admin/common.py} +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/celery_ → _arpakit_project_template_v_4/project/api/schema/in_/client}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/core/__init__.py → _arpakit_project_template_v_4/project/api/schema/in_/client/common.py} +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/json_db → _arpakit_project_template_v_4/project/api/schema/in_/general}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/operation_execution/__init__.py → _arpakit_project_template_v_4/project/api/schema/in_/general/common.py} +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/resource → _arpakit_project_template_v_4/project/api/schema/out}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/sandbox → _arpakit_project_template_v_4/project/api/schema/out/admin}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/site → _arpakit_project_template_v_4/project/api/schema/out/client}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/site/router → _arpakit_project_template_v_4/project/api/schema/out/common}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/sqladmin_ → _arpakit_project_template_v_4/project/api/schema/out/general}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/site/consts.py → _arpakit_project_template_v_4/project/api/schema/out/general/common.py} +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/site/exception_handler.py → _arpakit_project_template_v_4/project/api/util.py} +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/sqlalchemy_db_ → _arpakit_project_template_v_4/project/business_service}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/business_service/hello_world.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/business_service/remove_operations.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/test_data → _arpakit_project_template_v_4/project/celery_}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/tg_bot → _arpakit_project_template_v_4/project/core}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/core/cache_file_storage_in_dir.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/core/dump_file_storage_in_dir.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/core/jinja2_templates.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/core/media_file_storage_in_dir.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/core/util.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/tg_bot/blank → _arpakit_project_template_v_4/project/json_db}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/json_db/json_db.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/more/helloworld +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/tg_bot/kb → _arpakit_project_template_v_4/project/operation_execution}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/operation_execution/const.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/operation_execution/operation_executor_worker.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/operation_execution/scheduled_operation_creator_worker.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/operation_execution/scheduled_operations.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/operation_execution/util.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/tg_bot/kb/inline_ → _arpakit_project_template_v_4/project/resource}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/1 +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/healthcheck +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/helloworld +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/openapi-favicon.png +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/redoc/redoc.standalone.js +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/favicon-16x16.png +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/favicon-32x32.png +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/index.css +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/index.html +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/oauth2-redirect.html +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-initializer.js +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui-bundle.js +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui-bundle.js.map +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui-es-bundle-core.js +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui-es-bundle-core.js.map +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui-es-bundle.js +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui-es-bundle.js.map +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui-standalone-preset.js +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui-standalone-preset.js.map +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui.css +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui.css.map +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui.js +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui.js.map +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/tg_bot/kb/static_ → _arpakit_project_template_v_4/project/sandbox}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sandbox/sandbox_1.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sandbox/sandbox_2.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sandbox/sandbox_3.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sandbox/sandbox_4.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sandbox/sandbox_5.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sandbox/sandbox_6.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sandbox/sandbox_7.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/tg_bot/middleware → _arpakit_project_template_v_4/project/site}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/site/asgi.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/tg_bot/router/__init__.py → _arpakit_project_template_v_4/project/site/consts.py} +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/site/create_site_app.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/site/event.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/util/__init__.py → _arpakit_project_template_v_4/project/site/exception_handler.py} +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/site/router/main_router.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqladmin_/add_admin_in_app.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqladmin_/model_view/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqladmin_/model_view/common.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqlalchemy_db_/const.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqlalchemy_db_/sqlalchemy_db.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqlalchemy_db_/sqlalchemy_model/operation.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqlalchemy_db_/util.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/test_data/make_test_data_1.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/test_data/make_test_data_2.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/test_data/make_test_data_3.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/test_data/make_test_data_4.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/test_data/make_test_data_5.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/tg_bot/tg_bot_dispatcher.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/util/arpakitlib_project_template.py +0 -0
- {arpakitlib-1.8.14.dist-info → arpakitlib-1.8.16.dist-info}/LICENSE +0 -0
- {arpakitlib-1.8.14.dist-info → arpakitlib-1.8.16.dist-info}/WHEEL +0 -0
- {arpakitlib-1.8.14.dist-info → arpakitlib-1.8.16.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,87 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
import datetime as dt
|
4
|
+
from typing import TYPE_CHECKING, Any
|
5
|
+
|
6
|
+
import sqlalchemy
|
7
|
+
from sqlalchemy.orm import Mapped, mapped_column, relationship
|
8
|
+
|
9
|
+
from arpakitlib.ar_enumeration_util import Enumeration
|
10
|
+
from arpakitlib.ar_type_util import raise_for_type
|
11
|
+
from project.sqlalchemy_db_.sqlalchemy_model.common import SimpleDBM
|
12
|
+
|
13
|
+
if TYPE_CHECKING:
|
14
|
+
from project.sqlalchemy_db_.sqlalchemy_model.user_token import UserTokenDBM
|
15
|
+
|
16
|
+
|
17
|
+
class UserDBM(SimpleDBM):
|
18
|
+
__tablename__ = "user"
|
19
|
+
|
20
|
+
class Roles(Enumeration):
|
21
|
+
admin = "admin"
|
22
|
+
client = "client"
|
23
|
+
|
24
|
+
mail: Mapped[str] = mapped_column(
|
25
|
+
sqlalchemy.TEXT,
|
26
|
+
index=True,
|
27
|
+
insert_default=None,
|
28
|
+
nullable=True
|
29
|
+
)
|
30
|
+
roles: Mapped[list[str]] = mapped_column(
|
31
|
+
sqlalchemy.ARRAY(sqlalchemy.TEXT),
|
32
|
+
insert_default=[Roles.client],
|
33
|
+
index=True,
|
34
|
+
nullable=False
|
35
|
+
)
|
36
|
+
is_enabled: Mapped[bool] = mapped_column(
|
37
|
+
sqlalchemy.Boolean,
|
38
|
+
index=True,
|
39
|
+
insert_default=True,
|
40
|
+
server_default="true",
|
41
|
+
nullable=False
|
42
|
+
)
|
43
|
+
tg_id: Mapped[int | None] = mapped_column(
|
44
|
+
sqlalchemy.BIGINT,
|
45
|
+
unique=True,
|
46
|
+
nullable=True
|
47
|
+
)
|
48
|
+
tg_bot_last_action_dt: Mapped[dt.datetime | None] = mapped_column(
|
49
|
+
sqlalchemy.TIMESTAMP(timezone=True),
|
50
|
+
insert_default=None,
|
51
|
+
nullable=True
|
52
|
+
)
|
53
|
+
tg_data: Mapped[dict[str, Any] | None] = mapped_column(
|
54
|
+
sqlalchemy.JSON,
|
55
|
+
insert_default={},
|
56
|
+
server_default="{}",
|
57
|
+
nullable=True
|
58
|
+
)
|
59
|
+
|
60
|
+
user_tokens: Mapped[list[UserTokenDBM]] = relationship(
|
61
|
+
"UserTokenDBM",
|
62
|
+
uselist=True,
|
63
|
+
back_populates="user",
|
64
|
+
foreign_keys="UserTokenDBM.user_id"
|
65
|
+
)
|
66
|
+
|
67
|
+
@property
|
68
|
+
def roles_has_admin(self) -> bool:
|
69
|
+
return self.Roles.admin in self.roles
|
70
|
+
|
71
|
+
@property
|
72
|
+
def sdp_roles_has_admin(self) -> bool:
|
73
|
+
return self.roles_has_admin
|
74
|
+
|
75
|
+
@property
|
76
|
+
def roles_has_client(self) -> bool:
|
77
|
+
return self.Roles.client in self.roles
|
78
|
+
|
79
|
+
@property
|
80
|
+
def sdp_roles_has_client(self) -> bool:
|
81
|
+
return self.roles_has_client
|
82
|
+
|
83
|
+
def compare_roles(self, roles: list[str] | str) -> bool:
|
84
|
+
if isinstance(roles, str):
|
85
|
+
roles = [roles]
|
86
|
+
raise_for_type(roles, list)
|
87
|
+
return bool(set(roles) & set(self.roles))
|
arpakitlib/_arpakit_project_template_v_4/project/sqlalchemy_db_/sqlalchemy_model/user_token.py
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from typing import TYPE_CHECKING
|
4
|
+
|
5
|
+
import sqlalchemy
|
6
|
+
from sqlalchemy.orm import Mapped, mapped_column, relationship
|
7
|
+
|
8
|
+
from project.sqlalchemy_db_.sqlalchemy_model.common import SimpleDBM
|
9
|
+
|
10
|
+
if TYPE_CHECKING:
|
11
|
+
from project.sqlalchemy_db_.sqlalchemy_model.user import UserDBM
|
12
|
+
|
13
|
+
|
14
|
+
class UserTokenDBM(SimpleDBM):
|
15
|
+
__tablename__ = "user_token"
|
16
|
+
|
17
|
+
value: Mapped[str] = mapped_column(
|
18
|
+
sqlalchemy.TEXT,
|
19
|
+
index=True,
|
20
|
+
nullable=False
|
21
|
+
)
|
22
|
+
user_id: Mapped[int] = mapped_column(
|
23
|
+
sqlalchemy.INTEGER,
|
24
|
+
sqlalchemy.ForeignKey("user.id", ondelete="CASCADE"),
|
25
|
+
index=True,
|
26
|
+
nullable=False
|
27
|
+
)
|
28
|
+
is_enabled: Mapped[bool] = mapped_column(
|
29
|
+
sqlalchemy.Boolean,
|
30
|
+
index=True,
|
31
|
+
insert_default=True,
|
32
|
+
server_default="true",
|
33
|
+
nullable=False
|
34
|
+
)
|
35
|
+
|
36
|
+
user: Mapped[UserDBM] = relationship(
|
37
|
+
"UserDBM",
|
38
|
+
uselist=False,
|
39
|
+
back_populates="user_tokens",
|
40
|
+
foreign_keys=[user_id]
|
41
|
+
)
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,45 @@
|
|
1
|
+
from functools import lru_cache
|
2
|
+
from typing import Any
|
3
|
+
|
4
|
+
from emoji import emojize
|
5
|
+
|
6
|
+
from arpakitlib.ar_json_util import transfer_data_to_json_str
|
7
|
+
from project.sqlalchemy_db_.sqlalchemy_model import UserDBM
|
8
|
+
from project.tg_bot.blank.common import SimpleBlankTgBot
|
9
|
+
from project.util.arpakitlib_project_template import get_arpakitlib_project_template_info
|
10
|
+
|
11
|
+
|
12
|
+
class AdminTgBotBlank(SimpleBlankTgBot):
|
13
|
+
def done(self) -> str:
|
14
|
+
res = "Done"
|
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)
|
19
|
+
return emojize(res.strip())
|
20
|
+
|
21
|
+
def user_dbm(self, *, user_dbm: UserDBM | None) -> str:
|
22
|
+
if user_dbm is None:
|
23
|
+
return "None"
|
24
|
+
return user_dbm.simple_dict_json(include_sd_properties=True)
|
25
|
+
|
26
|
+
|
27
|
+
def create_admin_tg_bot_blank() -> AdminTgBotBlank:
|
28
|
+
return AdminTgBotBlank()
|
29
|
+
|
30
|
+
|
31
|
+
@lru_cache()
|
32
|
+
def get_cached_admin_tg_bot_blank() -> AdminTgBotBlank:
|
33
|
+
return AdminTgBotBlank()
|
34
|
+
|
35
|
+
|
36
|
+
def __example():
|
37
|
+
print(
|
38
|
+
get_cached_admin_tg_bot_blank().arpakit_project_template_info(
|
39
|
+
arpakitlib_project_template_info=get_arpakitlib_project_template_info()
|
40
|
+
)
|
41
|
+
)
|
42
|
+
|
43
|
+
|
44
|
+
if __name__ == '__main__':
|
45
|
+
__example()
|
@@ -0,0 +1,44 @@
|
|
1
|
+
from functools import lru_cache
|
2
|
+
|
3
|
+
from emoji import emojize
|
4
|
+
|
5
|
+
from project.tg_bot.blank.common import SimpleBlankTgBot
|
6
|
+
|
7
|
+
|
8
|
+
class ClientTgBotBlank(SimpleBlankTgBot):
|
9
|
+
|
10
|
+
def command_to_desc(self) -> dict[str, str]:
|
11
|
+
return {}
|
12
|
+
|
13
|
+
def but_hello_world(self) -> str:
|
14
|
+
res = "hello_world"
|
15
|
+
return emojize(res.strip())
|
16
|
+
|
17
|
+
def hello_world(self) -> str:
|
18
|
+
res = ":waving_hand: <b>Hello world</b> :waving_hand:"
|
19
|
+
return emojize(res.strip())
|
20
|
+
|
21
|
+
def healthcheck(self) -> str:
|
22
|
+
res = "healthcheck"
|
23
|
+
return emojize(res.strip())
|
24
|
+
|
25
|
+
def welcome(self) -> str:
|
26
|
+
res = ":waving_hand: <b>Welcome</b> :waving_hand:"
|
27
|
+
return emojize(res.strip())
|
28
|
+
|
29
|
+
|
30
|
+
def create_client_tg_bot_blank() -> ClientTgBotBlank:
|
31
|
+
return ClientTgBotBlank()
|
32
|
+
|
33
|
+
|
34
|
+
@lru_cache()
|
35
|
+
def get_cached_client_tg_bot_blank() -> ClientTgBotBlank:
|
36
|
+
return ClientTgBotBlank()
|
37
|
+
|
38
|
+
|
39
|
+
def __example():
|
40
|
+
print(get_cached_client_tg_bot_blank().welcome())
|
41
|
+
|
42
|
+
|
43
|
+
if __name__ == '__main__':
|
44
|
+
__example()
|
File without changes
|
File without changes
|
@@ -1,13 +1,13 @@
|
|
1
1
|
from aiogram.filters.callback_data import CallbackData
|
2
2
|
|
3
|
-
|
3
|
+
_USED_CD_PREFIXES = set()
|
4
4
|
|
5
5
|
|
6
6
|
def get_used_cd_prefixes() -> set[str]:
|
7
|
-
return
|
7
|
+
return _USED_CD_PREFIXES
|
8
8
|
|
9
9
|
|
10
|
-
def
|
10
|
+
def generate_tg_bot_callback_data_prefix(string: str) -> str:
|
11
11
|
res = 0
|
12
12
|
for s_ in string:
|
13
13
|
res += ord(s_)
|
@@ -23,12 +23,12 @@ class BaseCD(CallbackData, prefix="BaseCD"):
|
|
23
23
|
raise ValueError("callback data class should ends with CD")
|
24
24
|
|
25
25
|
if "prefix" not in kwargs:
|
26
|
-
kwargs["prefix"] = str(
|
26
|
+
kwargs["prefix"] = str(generate_tg_bot_callback_data_prefix(cls.__name__.lower().removesuffix("cd")))
|
27
27
|
prefix = kwargs["prefix"]
|
28
28
|
|
29
|
-
if prefix in
|
30
|
-
raise ValueError(f"prefix({prefix}) already in _used_cd_prefixes({
|
31
|
-
|
29
|
+
if prefix in _USED_CD_PREFIXES:
|
30
|
+
raise ValueError(f"prefix({prefix}) already in _used_cd_prefixes({_USED_CD_PREFIXES})")
|
31
|
+
_USED_CD_PREFIXES.add(prefix)
|
32
32
|
|
33
33
|
super().__init_subclass__(**kwargs)
|
34
34
|
|
arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/tg_bot/const.py
RENAMED
@@ -1,22 +1,38 @@
|
|
1
1
|
from arpakitlib.ar_enumeration_util import Enumeration
|
2
2
|
|
3
3
|
|
4
|
-
class
|
5
|
-
# public
|
6
|
-
healthcheck = "healthcheck"
|
7
|
-
arpakitlib_project_template_info = "arpakitlib_project_template_info"
|
4
|
+
class ClientTgBotCommands(Enumeration):
|
8
5
|
start = "start"
|
9
6
|
about = "about"
|
7
|
+
healthcheck = "healthcheck"
|
8
|
+
hello_world = "hello_world"
|
10
9
|
|
11
|
-
|
10
|
+
|
11
|
+
class AdminTgBotCommands(Enumeration):
|
12
|
+
arpakitlib_project_template_info = "arpakitlib_project_template_info"
|
12
13
|
init_db = "init_db"
|
13
|
-
|
14
|
+
reinit_sqlalchemy_db = "reinit_sqlalchemy_db"
|
14
15
|
drop_db = "drop_db"
|
15
16
|
set_tg_bot_commands = "set_tg_bot_commands"
|
16
17
|
raise_fake_err = "raise_fake_err"
|
18
|
+
me = "me"
|
17
19
|
log_file = "log_file"
|
18
20
|
clear_log_file = "clear_log_file"
|
19
21
|
kb_with_old_data = "kb_with_old_data"
|
20
22
|
kb_with_not_modified = "kb_with_not_modified"
|
21
23
|
kb_with_fake_error = "kb_with_fake_error"
|
22
24
|
kb_with_remove_message = "kb_with_remove_message"
|
25
|
+
|
26
|
+
|
27
|
+
def __example():
|
28
|
+
print("ClientCommandsTgBot:")
|
29
|
+
for v in ClientTgBotCommands.values_list():
|
30
|
+
print(f"- {v}")
|
31
|
+
print()
|
32
|
+
print("AdminCommandsTgBot:")
|
33
|
+
for v in AdminTgBotCommands.values_list():
|
34
|
+
print(f"- {v}")
|
35
|
+
|
36
|
+
|
37
|
+
if __name__ == '__main__':
|
38
|
+
__example()
|
@@ -0,0 +1,37 @@
|
|
1
|
+
import logging
|
2
|
+
|
3
|
+
import aiogram
|
4
|
+
from aiogram import Router
|
5
|
+
|
6
|
+
from arpakitlib.ar_exception_util import exception_to_traceback_str
|
7
|
+
from project.sqlalchemy_db_.sqlalchemy_db import get_cached_sqlalchemy_db
|
8
|
+
from project.sqlalchemy_db_.sqlalchemy_model import StoryLogDBM
|
9
|
+
from project.tg_bot.middleware.common import MiddlewareDataTgBot
|
10
|
+
|
11
|
+
_logger = logging.getLogger(__name__)
|
12
|
+
|
13
|
+
tg_bot_router = Router()
|
14
|
+
|
15
|
+
|
16
|
+
@tg_bot_router.error()
|
17
|
+
async def _(
|
18
|
+
event: aiogram.types.ErrorEvent,
|
19
|
+
middleware_data_tg_bot: MiddlewareDataTgBot,
|
20
|
+
**kwargs
|
21
|
+
):
|
22
|
+
_logger.exception(event.exception)
|
23
|
+
|
24
|
+
if get_cached_sqlalchemy_db() is not None:
|
25
|
+
async with get_cached_sqlalchemy_db().new_async_session() as session:
|
26
|
+
story_log_dbm = StoryLogDBM(
|
27
|
+
level=StoryLogDBM.Levels.error,
|
28
|
+
type=StoryLogDBM.Types.error_in_tg_bot,
|
29
|
+
title=f"{type(event.exception)}",
|
30
|
+
data={
|
31
|
+
"exception_str": str(event.exception),
|
32
|
+
"exception_traceback_str": exception_to_traceback_str(exception=event.exception)
|
33
|
+
}
|
34
|
+
)
|
35
|
+
session.add(story_log_dbm)
|
36
|
+
await session.commit()
|
37
|
+
await session.refresh(story_log_dbm)
|
arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/tg_bot/event.py
RENAMED
@@ -12,11 +12,15 @@ from project.json_db.json_db import get_cached_json_db
|
|
12
12
|
from project.operation_execution.operation_executor_worker import create_operation_executor_worker
|
13
13
|
from project.operation_execution.scheduled_operation_creator_worker import create_scheduled_operation_creator_worker
|
14
14
|
from project.sqlalchemy_db_.sqlalchemy_db import get_cached_sqlalchemy_db
|
15
|
+
from project.tg_bot.tg_bot import get_cached_tg_bot
|
15
16
|
|
16
17
|
_logger = logging.getLogger(__name__)
|
17
18
|
|
18
19
|
|
19
|
-
|
20
|
+
# TG BOT STARTUP EVENTS
|
21
|
+
|
22
|
+
|
23
|
+
async def startup_tg_bot_event():
|
20
24
|
_logger.info("start")
|
21
25
|
|
22
26
|
if get_cached_media_file_storage_in_dir() is not None:
|
@@ -30,23 +34,39 @@ async def on_startup():
|
|
30
34
|
|
31
35
|
if (
|
32
36
|
get_cached_sqlalchemy_db() is not None
|
33
|
-
and get_cached_settings().
|
37
|
+
and get_cached_settings().tg_bot_init_sqlalchemy_db
|
34
38
|
):
|
35
39
|
get_cached_sqlalchemy_db().init()
|
36
40
|
|
37
41
|
if (
|
38
42
|
get_cached_json_db() is not None
|
39
|
-
and get_cached_settings().
|
43
|
+
and get_cached_settings().tg_bot_init_json_db
|
40
44
|
):
|
41
45
|
get_cached_json_db().init()
|
42
46
|
|
43
|
-
if get_cached_settings().
|
47
|
+
if get_cached_settings().tg_bot_drop_pending_updates:
|
48
|
+
await get_cached_tg_bot().delete_webhook(drop_pending_updates=True)
|
49
|
+
|
50
|
+
if get_cached_settings().tg_bot_webhook_enabled:
|
51
|
+
await get_cached_tg_bot().delete_webhook(drop_pending_updates=True)
|
52
|
+
await get_cached_tg_bot().set_webhook(
|
53
|
+
(
|
54
|
+
f"{get_cached_settings().tg_bot_webhook_url.removesuffix('/')}"
|
55
|
+
f"/"
|
56
|
+
f"{get_cached_settings().tg_bot_webhook_path.removeprefix('/')}"
|
57
|
+
),
|
58
|
+
secret_token=get_cached_settings().tg_bot_webhook_secret,
|
59
|
+
drop_pending_updates=True,
|
60
|
+
allowed_updates=[]
|
61
|
+
)
|
62
|
+
|
63
|
+
if get_cached_settings().tg_bot_start_operation_executor_worker:
|
44
64
|
_ = safe_run_worker_in_background(
|
45
65
|
worker=create_operation_executor_worker(),
|
46
66
|
mode=SafeRunInBackgroundModes.thread
|
47
67
|
)
|
48
68
|
|
49
|
-
if get_cached_settings().
|
69
|
+
if get_cached_settings().tg_bot_start_scheduled_operation_creator_worker:
|
50
70
|
_ = safe_run_worker_in_background(
|
51
71
|
worker=create_scheduled_operation_creator_worker(),
|
52
72
|
mode=SafeRunInBackgroundModes.async_task
|
@@ -55,23 +75,33 @@ async def on_startup():
|
|
55
75
|
_logger.info("finish")
|
56
76
|
|
57
77
|
|
58
|
-
|
78
|
+
def get_startup_tg_bot_events() -> list[Callable]:
|
79
|
+
res = [startup_tg_bot_event]
|
80
|
+
return res
|
81
|
+
|
82
|
+
|
83
|
+
# TG BOT SHUTDOWN EVENTS
|
84
|
+
|
85
|
+
|
86
|
+
async def shutdown_tg_bot_event(*args, **kwargs):
|
59
87
|
_logger.info("start")
|
88
|
+
|
89
|
+
if get_cached_settings().tg_bot_webhook_enabled:
|
90
|
+
await get_cached_tg_bot().delete_webhook(drop_pending_updates=True)
|
91
|
+
|
60
92
|
_logger.info("finish")
|
61
93
|
|
62
94
|
|
63
|
-
def
|
64
|
-
res = [
|
95
|
+
def get_shutdown_tg_bot_events() -> list[Callable]:
|
96
|
+
res = [shutdown_tg_bot_event]
|
65
97
|
return res
|
66
98
|
|
67
99
|
|
68
|
-
|
69
|
-
res = [on_shutdown]
|
70
|
-
return res
|
100
|
+
#
|
71
101
|
|
72
102
|
|
73
103
|
def add_events_to_tg_bot_dispatcher(*, tg_bot_dispatcher: Dispatcher):
|
74
|
-
for tg_bot_event in
|
104
|
+
for tg_bot_event in get_startup_tg_bot_events():
|
75
105
|
tg_bot_dispatcher.startup.register(tg_bot_event)
|
76
|
-
for tg_bot_event in
|
106
|
+
for tg_bot_event in get_shutdown_tg_bot_events():
|
77
107
|
tg_bot_dispatcher.shutdown.register(tg_bot_event)
|
File without changes
|
@@ -0,0 +1,12 @@
|
|
1
|
+
import aiogram.types
|
2
|
+
from aiogram.filters import Filter
|
3
|
+
|
4
|
+
|
5
|
+
class IsPrivateChatTgBotFilter(Filter):
|
6
|
+
async def __call__(self, update: aiogram.types.Message | aiogram.types.CallbackQuery) -> bool:
|
7
|
+
if isinstance(update, aiogram.types.Message):
|
8
|
+
return update.chat.type == aiogram.enums.ChatType.PRIVATE
|
9
|
+
elif isinstance(update, aiogram.types.CallbackQuery):
|
10
|
+
return update.message.chat.type == aiogram.enums.ChatType.PRIVATE
|
11
|
+
else:
|
12
|
+
return False
|
@@ -4,20 +4,9 @@ import aiogram.types
|
|
4
4
|
from aiogram.filters import Filter
|
5
5
|
|
6
6
|
from arpakitlib.ar_type_util import raise_for_type
|
7
|
-
from project.core.settings import get_cached_settings
|
8
7
|
|
9
8
|
|
10
|
-
class
|
11
|
-
async def __call__(self, *args, **kwargs) -> bool:
|
12
|
-
return get_cached_settings().is_mode_type_not_prod
|
13
|
-
|
14
|
-
|
15
|
-
class ProdModeFilterTgBotFilter(Filter):
|
16
|
-
async def __call__(self, *args, **kwargs) -> bool:
|
17
|
-
return get_cached_settings().is_mode_type_prod
|
18
|
-
|
19
|
-
|
20
|
-
class TextFilterTgBotFilter(Filter):
|
9
|
+
class MessageTextTgBotFilter(Filter):
|
21
10
|
|
22
11
|
def __init__(
|
23
12
|
self,
|
@@ -57,13 +46,3 @@ class TextFilterTgBotFilter(Filter):
|
|
57
46
|
text = text.lower()
|
58
47
|
|
59
48
|
return text in self.texts
|
60
|
-
|
61
|
-
|
62
|
-
class IsPrivateChatTgBotFilter(Filter):
|
63
|
-
async def __call__(self, update: aiogram.types.Message | aiogram.types.CallbackQuery) -> bool:
|
64
|
-
if isinstance(update, aiogram.types.Message):
|
65
|
-
return update.chat.type == aiogram.enums.ChatType.PRIVATE
|
66
|
-
elif isinstance(update, aiogram.types.CallbackQuery):
|
67
|
-
return update.message.chat.type == aiogram.enums.ChatType.PRIVATE
|
68
|
-
else:
|
69
|
-
return False
|
@@ -0,0 +1,27 @@
|
|
1
|
+
import aiogram.types
|
2
|
+
from aiogram.filters import Filter
|
3
|
+
|
4
|
+
from project.sqlalchemy_db_.sqlalchemy_db import get_cached_sqlalchemy_db
|
5
|
+
from project.sqlalchemy_db_.sqlalchemy_model import UserDBM
|
6
|
+
|
7
|
+
|
8
|
+
class UserRolesHasAdminTgBotFilter(Filter):
|
9
|
+
|
10
|
+
async def __call__(
|
11
|
+
self, update: aiogram.types.Message | aiogram.types.CallbackQuery | aiogram.types.TelegramObject, **kwargs
|
12
|
+
) -> bool:
|
13
|
+
tg_user: None | aiogram.types.User = None
|
14
|
+
|
15
|
+
if isinstance(update, aiogram.types.Message) and update.from_user is not None:
|
16
|
+
tg_user = update.from_user
|
17
|
+
if isinstance(update, aiogram.types.CallbackQuery) and update.from_user is not None:
|
18
|
+
tg_user = update.from_user
|
19
|
+
|
20
|
+
if get_cached_sqlalchemy_db() is not None and tg_user is not None:
|
21
|
+
with get_cached_sqlalchemy_db().new_session() as session:
|
22
|
+
user_dbm: UserDBM | None = session.query(UserDBM).filter(UserDBM.tg_id == tg_user.id).one_or_none()
|
23
|
+
if user_dbm is not None:
|
24
|
+
if user_dbm.roles_has_admin:
|
25
|
+
return True
|
26
|
+
|
27
|
+
return False
|
@@ -0,0 +1,27 @@
|
|
1
|
+
import aiogram.types
|
2
|
+
from aiogram.filters import Filter
|
3
|
+
|
4
|
+
from project.sqlalchemy_db_.sqlalchemy_db import get_cached_sqlalchemy_db
|
5
|
+
from project.sqlalchemy_db_.sqlalchemy_model import UserDBM
|
6
|
+
|
7
|
+
|
8
|
+
class UserRolesHasClientTgBotFilter(Filter):
|
9
|
+
|
10
|
+
async def __call__(
|
11
|
+
self, update: aiogram.types.Message | aiogram.types.CallbackQuery | aiogram.types.TelegramObject, **kwargs
|
12
|
+
) -> bool:
|
13
|
+
tg_user: None | aiogram.types.User = None
|
14
|
+
|
15
|
+
if isinstance(update, aiogram.types.Message) and update.from_user is not None:
|
16
|
+
tg_user = update.from_user
|
17
|
+
if isinstance(update, aiogram.types.CallbackQuery) and update.from_user is not None:
|
18
|
+
tg_user = update.from_user
|
19
|
+
|
20
|
+
if get_cached_sqlalchemy_db() is not None and tg_user is not None:
|
21
|
+
with get_cached_sqlalchemy_db().new_session() as session:
|
22
|
+
user_dbm: UserDBM | None = session.query(UserDBM).filter(UserDBM.tg_id == tg_user.id).one_or_none()
|
23
|
+
if user_dbm is not None:
|
24
|
+
if user_dbm.roles_has_client:
|
25
|
+
return True
|
26
|
+
|
27
|
+
return False
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,16 @@
|
|
1
|
+
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
|
2
|
+
from aiogram.utils.keyboard import InlineKeyboardBuilder
|
3
|
+
|
4
|
+
from project.tg_bot.blank.client import get_cached_client_tg_bot_blank
|
5
|
+
from project.tg_bot.callback.client import HelloWorldClientCD
|
6
|
+
|
7
|
+
|
8
|
+
def hello_world_client_inline_kb_tg_bot() -> InlineKeyboardMarkup:
|
9
|
+
kb_builder = InlineKeyboardBuilder()
|
10
|
+
|
11
|
+
kb_builder.row(InlineKeyboardButton(
|
12
|
+
text=get_cached_client_tg_bot_blank().but_hello_world(),
|
13
|
+
callback_data=HelloWorldClientCD(hello_world=True).pack()
|
14
|
+
))
|
15
|
+
|
16
|
+
return kb_builder.as_markup()
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -1,14 +1,14 @@
|
|
1
1
|
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton
|
2
2
|
from aiogram.utils.keyboard import ReplyKeyboardBuilder
|
3
3
|
|
4
|
-
from project.tg_bot.blank.
|
4
|
+
from project.tg_bot.blank.client import get_cached_client_tg_bot_blank
|
5
5
|
|
6
6
|
|
7
|
-
def
|
7
|
+
def hello_world_client_static_kb_tg_bot() -> ReplyKeyboardMarkup:
|
8
8
|
kb_builder = ReplyKeyboardBuilder()
|
9
9
|
|
10
10
|
kb_builder.row(KeyboardButton(
|
11
|
-
text=
|
11
|
+
text=get_cached_client_tg_bot_blank().but_hello_world()
|
12
12
|
))
|
13
13
|
|
14
14
|
return kb_builder.as_markup(resize_keyboard=True, one_time_keyboard=False)
|
File without changes
|
File without changes
|