arpakitlib 1.8.15__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.
Files changed (307) hide show
  1. arpakitlib/_arpakit_project_template_v_4/arpakitlib_project_template_info.json +3 -0
  2. arpakitlib/_arpakit_project_template_v_4/command/beautify_json.py +10 -0
  3. arpakitlib/_arpakit_project_template_v_4/command/demojize.py +9 -0
  4. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/drop_json_db.py +1 -1
  5. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/drop_sqlalchemy_db.py +1 -1
  6. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/generate_settings_env_example.py +2 -2
  7. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/reinit_json_db.py +1 -1
  8. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/reinit_sqlalchemy_db.py +1 -1
  9. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/remove_operations.py +1 -1
  10. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/remove_story_logs.py +1 -1
  11. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/rm_all_records_in_json_db.py +1 -1
  12. arpakitlib/_arpakit_project_template_v_4/command/set_tg_bot_commands.py +16 -0
  13. arpakitlib/_arpakit_project_template_v_4/command/show_settings.py +10 -0
  14. arpakitlib/_arpakit_project_template_v_4/command/start_sqladmin.py +19 -0
  15. arpakitlib/_arpakit_project_template_v_4/command/start_sqladmin_for_prod.py +19 -0
  16. arpakitlib/_arpakit_project_template_v_4/command/start_sqladmin_with_reload.py +19 -0
  17. arpakitlib/_arpakit_project_template_v_4/command/start_tg_bot_for_prod.py +11 -0
  18. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/example.env +11 -5
  19. arpakitlib/_arpakit_project_template_v_4/project/additional_model/common.py +8 -0
  20. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/auth.py +111 -35
  21. arpakitlib/_arpakit_project_template_v_4/project/api/auth2.py +171 -0
  22. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/create_api_app.py +7 -7
  23. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/event.py +8 -8
  24. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/exception.py +1 -1
  25. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/exception_handler.py +38 -36
  26. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/openapi_ui.py +1 -1
  27. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/response.py +5 -5
  28. arpakitlib/_arpakit_project_template_v_4/project/api/router/admin/get_arpakitlib_project_template_info.py +23 -0
  29. arpakitlib/_arpakit_project_template_v_4/project/api/router/admin/get_auth_data.py +30 -0
  30. arpakitlib/_arpakit_project_template_v_4/project/api/router/admin/main_router.py +3 -0
  31. 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
  32. arpakitlib/_arpakit_project_template_v_4/project/api/router/client/main_router.py +3 -0
  33. arpakitlib/_arpakit_project_template_v_4/project/api/router/client/now_utc_datetime.py +22 -0
  34. arpakitlib/_arpakit_project_template_v_4/project/api/router/general/healthcheck.py +21 -0
  35. arpakitlib/_arpakit_project_template_v_4/project/api/router/general/main_router.py +10 -0
  36. arpakitlib/_arpakit_project_template_v_4/project/api/router/main_router.py +23 -0
  37. arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/admin/common.py +10 -0
  38. arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/admin/operation.py +23 -0
  39. arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/admin/story_log.py +17 -0
  40. arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/client/common.py +10 -0
  41. 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
  42. arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/common/raw_data.py +7 -0
  43. arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/common.py +5 -0
  44. arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/general/error.py +11 -0
  45. arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/general/errors_info_general.py +6 -0
  46. arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/general/healthcheck.py +5 -0
  47. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/core/const.py +2 -2
  48. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/core/settings.py +43 -39
  49. arpakitlib/_arpakit_project_template_v_4/project/site/router/__init__.py +0 -0
  50. arpakitlib/_arpakit_project_template_v_4/project/sqladmin_/__init__.py +0 -0
  51. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqladmin_/admin_auth.py +17 -12
  52. arpakitlib/_arpakit_project_template_v_4/project/sqladmin_/asgi.py +3 -0
  53. arpakitlib/_arpakit_project_template_v_4/project/sqladmin_/create_sqladmin_app.py +49 -0
  54. arpakitlib/_arpakit_project_template_v_4/project/sqladmin_/event.py +40 -0
  55. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqladmin_/model_view/operation.py +1 -1
  56. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqladmin_/model_view/story_log.py +1 -1
  57. arpakitlib/_arpakit_project_template_v_4/project/sqlalchemy_db_/__init__.py +0 -0
  58. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqlalchemy_db_/sqlalchemy_model/__init__.py +4 -0
  59. arpakitlib/_arpakit_project_template_v_4/project/sqlalchemy_db_/sqlalchemy_model/api_key.py +44 -0
  60. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqlalchemy_db_/sqlalchemy_model/common.py +29 -6
  61. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqlalchemy_db_/sqlalchemy_model/story_log.py +2 -1
  62. arpakitlib/_arpakit_project_template_v_4/project/sqlalchemy_db_/sqlalchemy_model/user.py +87 -0
  63. arpakitlib/_arpakit_project_template_v_4/project/sqlalchemy_db_/sqlalchemy_model/user_token.py +41 -0
  64. arpakitlib/_arpakit_project_template_v_4/project/test_data/__init__.py +0 -0
  65. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/__init__.py +0 -0
  66. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/blank/__init__.py +0 -0
  67. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/blank/admin.py +45 -0
  68. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/blank/client.py +44 -0
  69. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/blank/common.py +5 -0
  70. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/callback/__init__.py +0 -0
  71. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/callback/admin.py +0 -0
  72. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/callback/client.py +5 -0
  73. 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
  74. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/tg_bot/const.py +22 -6
  75. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/error_handler.py +37 -0
  76. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/tg_bot/event.py +43 -13
  77. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/filter_/__init__.py +0 -0
  78. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/filter_/is_private_chat.py +12 -0
  79. 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
  80. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/filter_/not_prod_mode_filter.py +8 -0
  81. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/filter_/prod_mode_filter.py +8 -0
  82. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/filter_/user_roles_has_admin.py +27 -0
  83. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/filter_/user_roles_has_client.py +27 -0
  84. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/__init__.py +0 -0
  85. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/inline_/__init__.py +0 -0
  86. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/inline_/admin/__init__.py +0 -0
  87. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/inline_/admin/common.py +0 -0
  88. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/inline_/client/__init__.py +0 -0
  89. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/inline_/client/common.py +0 -0
  90. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/inline_/client/hello_world.py +16 -0
  91. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/inline_/common.py +0 -0
  92. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/static_/__init__.py +0 -0
  93. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/static_/admin/__init__.py +0 -0
  94. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/static_/admin/common.py +0 -0
  95. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/static_/client/__init__.py +0 -0
  96. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/static_/client/common.py +0 -0
  97. 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
  98. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/static_/common.py +0 -0
  99. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/middleware/__init__.py +0 -0
  100. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/middleware/common.py +13 -0
  101. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/middleware/init_user.py +84 -0
  102. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/tg_bot/middleware/middleware.py +1 -2
  103. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/__init__.py +0 -0
  104. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/admin/__init__.py +0 -0
  105. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/admin/arpakitlib_project_template_info.py +25 -0
  106. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/admin/main_router.py +15 -0
  107. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/admin/me.py +20 -0
  108. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/admin/raise_fake_error.py +20 -0
  109. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/admin/reinit_sqlalchemy_db.py +27 -0
  110. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/client/__init__.py +0 -0
  111. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/client/healthcheck.py +16 -0
  112. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/client/hello_world.py +44 -0
  113. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/client/main_router.py +14 -0
  114. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/client/start.py +33 -0
  115. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/main_router.py +13 -0
  116. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/tg_bot/start_tg_bot.py +2 -2
  117. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/tg_bot/tg_bot.py +7 -0
  118. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/util/__init__.py +0 -0
  119. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/util/etc.py +0 -0
  120. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/util/set_tg_bot_commands.py +76 -0
  121. arpakitlib/_arpakit_project_template_v_4/project/util/__init__.py +0 -0
  122. arpakitlib/ar_aiogram_util.py +0 -3
  123. arpakitlib/ar_arpakit_schedule_uust_api_client_util.py +1 -65
  124. arpakitlib/ar_json_util.py +43 -12
  125. arpakitlib/ar_sqlalchemy_util.py +2 -2
  126. arpakitlib/ar_ssh_runner_util.py +2 -2
  127. arpakitlib/ar_str_util.py +15 -0
  128. {arpakitlib-1.8.15.dist-info → arpakitlib-1.8.16.dist-info}/METADATA +2 -1
  129. arpakitlib-1.8.16.dist-info/RECORD +330 -0
  130. arpakitlib/_arpakit_project_template_v_2/arpakitlib_project_template_info.json +0 -3
  131. arpakitlib/_arpakit_project_template_v_2/command/beautify_json.py +0 -10
  132. arpakitlib/_arpakit_project_template_v_2/command/show_settings.py +0 -10
  133. arpakitlib/_arpakit_project_template_v_2/project/additional_model/common.py +0 -1
  134. arpakitlib/_arpakit_project_template_v_2/project/api/router/general/get_auth_data.py +0 -31
  135. arpakitlib/_arpakit_project_template_v_2/project/api/router/general/healthcheck.py +0 -26
  136. arpakitlib/_arpakit_project_template_v_2/project/api/router/general/main_router.py +0 -24
  137. arpakitlib/_arpakit_project_template_v_2/project/api/router/general/now_utc_datetime.py +0 -26
  138. arpakitlib/_arpakit_project_template_v_2/project/api/router/main_router.py +0 -11
  139. arpakitlib/_arpakit_project_template_v_2/project/api/schema/common/in_.py +0 -5
  140. arpakitlib/_arpakit_project_template_v_2/project/api/schema/example/in_.py +0 -5
  141. arpakitlib/_arpakit_project_template_v_2/project/api/schema/example/out.py +0 -45
  142. arpakitlib/_arpakit_project_template_v_2/project/api/schema/general/in_.py +0 -5
  143. arpakitlib/_arpakit_project_template_v_2/project/api/schema/general/out.py +0 -14
  144. arpakitlib/_arpakit_project_template_v_2/project/tg_bot/blank/blank.py +0 -24
  145. arpakitlib/_arpakit_project_template_v_2/project/tg_bot/kb/inline_/common.py +0 -15
  146. arpakitlib/_arpakit_project_template_v_2/project/tg_bot/middleware/init_user.py +0 -21
  147. arpakitlib/_arpakit_project_template_v_2/project/tg_bot/router/arpakitlib_project_template_info.py +0 -14
  148. arpakitlib/_arpakit_project_template_v_2/project/tg_bot/router/error.py +0 -16
  149. arpakitlib/_arpakit_project_template_v_2/project/tg_bot/router/healthcheck.py +0 -11
  150. arpakitlib/_arpakit_project_template_v_2/project/tg_bot/router/main_router.py +0 -12
  151. arpakitlib/_arpakit_project_template_v_2/project/tg_bot/util.py +0 -1
  152. arpakitlib-1.8.15.dist-info/RECORD +0 -265
  153. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/.gitignore +0 -0
  154. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/.python-version +0 -0
  155. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/LICENSE +0 -0
  156. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/README.md +0 -0
  157. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/alembic/README +0 -0
  158. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/alembic/env.py +0 -0
  159. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/alembic/script.py.mako +0 -0
  160. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/alembic/versions/__init__.py +0 -0
  161. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/alembic.ini +0 -0
  162. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/__init__.py +0 -0
  163. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/alembic_history.sh +0 -0
  164. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/alembic_revision_autogenerate.sh +0 -0
  165. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/alembic_upgrade_head.sh +0 -0
  166. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/check_logging.py +0 -0
  167. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/check_sqlalchemy_db.py +0 -0
  168. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/docker_ps_a.sh +0 -0
  169. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/docker_rm_postgres.sh +0 -0
  170. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/docker_run_postgres.sh +0 -0
  171. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/docker_start_postgres.sh +0 -0
  172. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/docker_stop_postgres.sh +0 -0
  173. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_commit.sh +0 -0
  174. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_push_arpakit_company_github_1.sh +0 -0
  175. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_push_arpakit_company_gitlab_1.sh +0 -0
  176. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_push_arpakit_github_1.sh +0 -0
  177. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_push_arpakit_gitlab_1.sh +0 -0
  178. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_remote_v.sh +0 -0
  179. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_set_arpakit_company_origin.sh +0 -0
  180. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_set_arpakit_origin.sh +0 -0
  181. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_set_divarteam_origin.sh +0 -0
  182. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_status.sh +0 -0
  183. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/hello_world.py +0 -0
  184. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/init_json_db.py +0 -0
  185. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/init_sqlalchemy_db.py +0 -0
  186. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_check.sh +0 -0
  187. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_clear_cache.sh +0 -0
  188. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_config.sh +0 -0
  189. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_install.sh +0 -0
  190. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_lock.sh +0 -0
  191. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_remove_and_add_arpakitlib.sh +0 -0
  192. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_show.sh +0 -0
  193. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_show_arpakitlib.sh +0 -0
  194. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_update.sh +0 -0
  195. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_update_arpakitlib.sh +0 -0
  196. /arpakitlib/{_arpakit_project_template_v_2/command/start_api_for_not_prod.py → _arpakit_project_template_v_4/command/start_api.py} +0 -0
  197. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/start_api_for_prod.py +0 -0
  198. /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
  199. /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
  200. /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
  201. /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
  202. /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
  203. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/note/note_1.txt +0 -0
  204. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/note/note_2.txt +0 -0
  205. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/note/note_3.txt +0 -0
  206. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/note/note_4.txt +0 -0
  207. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/note/note_5.txt +0 -0
  208. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/__init__.py +0 -0
  209. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/additional_model/__init__.py +0 -0
  210. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/__init__.py +0 -0
  211. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/asgi.py +0 -0
  212. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/const.py +0 -0
  213. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/router/__init__.py +0 -0
  214. /arpakitlib/{_arpakit_project_template_v_2/project/api/router/general → _arpakit_project_template_v_4/project/api/router/admin}/__init__.py +0 -0
  215. /arpakitlib/{_arpakit_project_template_v_2/project/api/schema → _arpakit_project_template_v_4/project/api/router/client}/__init__.py +0 -0
  216. /arpakitlib/{_arpakit_project_template_v_2/project/api/schema/common → _arpakit_project_template_v_4/project/api/router/general}/__init__.py +0 -0
  217. /arpakitlib/{_arpakit_project_template_v_2/project/api/schema/example → _arpakit_project_template_v_4/project/api/schema}/__init__.py +0 -0
  218. /arpakitlib/{_arpakit_project_template_v_2/project/api/schema/base_schema.py → _arpakit_project_template_v_4/project/api/schema/common.py} +0 -0
  219. /arpakitlib/{_arpakit_project_template_v_2/project/api/schema/general → _arpakit_project_template_v_4/project/api/schema/in_}/__init__.py +0 -0
  220. /arpakitlib/{_arpakit_project_template_v_2/project/business_service → _arpakit_project_template_v_4/project/api/schema/in_/admin}/__init__.py +0 -0
  221. /arpakitlib/{_arpakit_project_template_v_2/project/api/util.py → _arpakit_project_template_v_4/project/api/schema/in_/admin/common.py} +0 -0
  222. /arpakitlib/{_arpakit_project_template_v_2/project/celery_ → _arpakit_project_template_v_4/project/api/schema/in_/client}/__init__.py +0 -0
  223. /arpakitlib/{_arpakit_project_template_v_2/project/core/__init__.py → _arpakit_project_template_v_4/project/api/schema/in_/client/common.py} +0 -0
  224. /arpakitlib/{_arpakit_project_template_v_2/project/json_db → _arpakit_project_template_v_4/project/api/schema/in_/general}/__init__.py +0 -0
  225. /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
  226. /arpakitlib/{_arpakit_project_template_v_2/project/resource → _arpakit_project_template_v_4/project/api/schema/out}/__init__.py +0 -0
  227. /arpakitlib/{_arpakit_project_template_v_2/project/sandbox → _arpakit_project_template_v_4/project/api/schema/out/admin}/__init__.py +0 -0
  228. /arpakitlib/{_arpakit_project_template_v_2/project/site → _arpakit_project_template_v_4/project/api/schema/out/client}/__init__.py +0 -0
  229. /arpakitlib/{_arpakit_project_template_v_2/project/site/router → _arpakit_project_template_v_4/project/api/schema/out/common}/__init__.py +0 -0
  230. /arpakitlib/{_arpakit_project_template_v_2/project/sqladmin_ → _arpakit_project_template_v_4/project/api/schema/out/general}/__init__.py +0 -0
  231. /arpakitlib/{_arpakit_project_template_v_2/project/site/consts.py → _arpakit_project_template_v_4/project/api/schema/out/general/common.py} +0 -0
  232. /arpakitlib/{_arpakit_project_template_v_2/project/site/exception_handler.py → _arpakit_project_template_v_4/project/api/util.py} +0 -0
  233. /arpakitlib/{_arpakit_project_template_v_2/project/sqlalchemy_db_ → _arpakit_project_template_v_4/project/business_service}/__init__.py +0 -0
  234. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/business_service/hello_world.py +0 -0
  235. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/business_service/remove_operations.py +0 -0
  236. /arpakitlib/{_arpakit_project_template_v_2/project/test_data → _arpakit_project_template_v_4/project/celery_}/__init__.py +0 -0
  237. /arpakitlib/{_arpakit_project_template_v_2/project/tg_bot → _arpakit_project_template_v_4/project/core}/__init__.py +0 -0
  238. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/core/cache_file_storage_in_dir.py +0 -0
  239. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/core/dump_file_storage_in_dir.py +0 -0
  240. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/core/jinja2_templates.py +0 -0
  241. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/core/media_file_storage_in_dir.py +0 -0
  242. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/core/util.py +0 -0
  243. /arpakitlib/{_arpakit_project_template_v_2/project/tg_bot/blank → _arpakit_project_template_v_4/project/json_db}/__init__.py +0 -0
  244. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/json_db/json_db.py +0 -0
  245. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/more/helloworld +0 -0
  246. /arpakitlib/{_arpakit_project_template_v_2/project/tg_bot/kb → _arpakit_project_template_v_4/project/operation_execution}/__init__.py +0 -0
  247. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/operation_execution/const.py +0 -0
  248. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/operation_execution/operation_executor_worker.py +0 -0
  249. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/operation_execution/scheduled_operation_creator_worker.py +0 -0
  250. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/operation_execution/scheduled_operations.py +0 -0
  251. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/operation_execution/util.py +0 -0
  252. /arpakitlib/{_arpakit_project_template_v_2/project/tg_bot/kb/inline_ → _arpakit_project_template_v_4/project/resource}/__init__.py +0 -0
  253. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/1 +0 -0
  254. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/healthcheck +0 -0
  255. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/helloworld +0 -0
  256. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/openapi-favicon.png +0 -0
  257. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/redoc/redoc.standalone.js +0 -0
  258. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/favicon-16x16.png +0 -0
  259. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/favicon-32x32.png +0 -0
  260. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/index.css +0 -0
  261. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/index.html +0 -0
  262. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/oauth2-redirect.html +0 -0
  263. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-initializer.js +0 -0
  264. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui-bundle.js +0 -0
  265. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui-bundle.js.map +0 -0
  266. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui-es-bundle-core.js +0 -0
  267. /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
  268. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui-es-bundle.js +0 -0
  269. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui-es-bundle.js.map +0 -0
  270. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui-standalone-preset.js +0 -0
  271. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui-standalone-preset.js.map +0 -0
  272. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui.css +0 -0
  273. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui.css.map +0 -0
  274. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui.js +0 -0
  275. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui.js.map +0 -0
  276. /arpakitlib/{_arpakit_project_template_v_2/project/tg_bot/kb/static_ → _arpakit_project_template_v_4/project/sandbox}/__init__.py +0 -0
  277. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sandbox/sandbox_1.py +0 -0
  278. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sandbox/sandbox_2.py +0 -0
  279. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sandbox/sandbox_3.py +0 -0
  280. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sandbox/sandbox_4.py +0 -0
  281. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sandbox/sandbox_5.py +0 -0
  282. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sandbox/sandbox_6.py +0 -0
  283. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sandbox/sandbox_7.py +0 -0
  284. /arpakitlib/{_arpakit_project_template_v_2/project/tg_bot/middleware → _arpakit_project_template_v_4/project/site}/__init__.py +0 -0
  285. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/site/asgi.py +0 -0
  286. /arpakitlib/{_arpakit_project_template_v_2/project/tg_bot/router/__init__.py → _arpakit_project_template_v_4/project/site/consts.py} +0 -0
  287. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/site/create_site_app.py +0 -0
  288. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/site/event.py +0 -0
  289. /arpakitlib/{_arpakit_project_template_v_2/project/util/__init__.py → _arpakit_project_template_v_4/project/site/exception_handler.py} +0 -0
  290. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/site/router/main_router.py +0 -0
  291. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqladmin_/add_admin_in_app.py +0 -0
  292. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqladmin_/model_view/__init__.py +0 -0
  293. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqladmin_/model_view/common.py +0 -0
  294. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqlalchemy_db_/const.py +0 -0
  295. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqlalchemy_db_/sqlalchemy_db.py +0 -0
  296. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqlalchemy_db_/sqlalchemy_model/operation.py +0 -0
  297. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqlalchemy_db_/util.py +0 -0
  298. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/test_data/make_test_data_1.py +0 -0
  299. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/test_data/make_test_data_2.py +0 -0
  300. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/test_data/make_test_data_3.py +0 -0
  301. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/test_data/make_test_data_4.py +0 -0
  302. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/test_data/make_test_data_5.py +0 -0
  303. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/tg_bot/tg_bot_dispatcher.py +0 -0
  304. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/util/arpakitlib_project_template.py +0 -0
  305. {arpakitlib-1.8.15.dist-info → arpakitlib-1.8.16.dist-info}/LICENSE +0 -0
  306. {arpakitlib-1.8.15.dist-info → arpakitlib-1.8.16.dist-info}/WHEEL +0 -0
  307. {arpakitlib-1.8.15.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))
@@ -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
+ )
@@ -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()
@@ -0,0 +1,5 @@
1
+ from arpakitlib.ar_blank_util import BaseBlank
2
+
3
+
4
+ class SimpleBlankTgBot(BaseBlank):
5
+ pass
@@ -0,0 +1,5 @@
1
+ from project.tg_bot.callback.common import BaseCD
2
+
3
+
4
+ class HelloWorldClientCD(BaseCD):
5
+ hello_world: bool = True
@@ -1,13 +1,13 @@
1
1
  from aiogram.filters.callback_data import CallbackData
2
2
 
3
- _used_cd_prefixes = set()
3
+ _USED_CD_PREFIXES = set()
4
4
 
5
5
 
6
6
  def get_used_cd_prefixes() -> set[str]:
7
- return _used_cd_prefixes
7
+ return _USED_CD_PREFIXES
8
8
 
9
9
 
10
- def generate_callback_data_prefix(string: str) -> str:
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(generate_callback_data_prefix(cls.__name__.lower().removesuffix("cd")))
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 _used_cd_prefixes:
30
- raise ValueError(f"prefix({prefix}) already in _used_cd_prefixes({_used_cd_prefixes})")
31
- _used_cd_prefixes.add(prefix)
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
 
@@ -1,22 +1,38 @@
1
1
  from arpakitlib.ar_enumeration_util import Enumeration
2
2
 
3
3
 
4
- class TgBotCommands(Enumeration):
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
- # private
10
+
11
+ class AdminTgBotCommands(Enumeration):
12
+ arpakitlib_project_template_info = "arpakitlib_project_template_info"
12
13
  init_db = "init_db"
13
- reinit_db = "reinit_db"
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)
@@ -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
- async def on_startup():
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().api_init_sqlalchemy_db
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().api_init_json_db
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().api_start_operation_executor_worker:
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().api_start_scheduled_operation_creator_worker:
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
- async def on_shutdown(*args, **kwargs):
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 get_tg_bot_startup_events() -> list[Callable]:
64
- res = [on_startup]
95
+ def get_shutdown_tg_bot_events() -> list[Callable]:
96
+ res = [shutdown_tg_bot_event]
65
97
  return res
66
98
 
67
99
 
68
- def get_tg_bot_shutdown_events() -> list[Callable]:
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 get_tg_bot_startup_events():
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 get_tg_bot_shutdown_events():
106
+ for tg_bot_event in get_shutdown_tg_bot_events():
77
107
  tg_bot_dispatcher.shutdown.register(tg_bot_event)
@@ -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 NotProdModeFilterTgBotFilter(Filter):
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,8 @@
1
+ from aiogram.filters import Filter
2
+
3
+ from project.core.settings import get_cached_settings
4
+
5
+
6
+ class NotProdModeTgBotFilter(Filter):
7
+ async def __call__(self, *args, **kwargs) -> bool:
8
+ return not get_cached_settings().prod_mode
@@ -0,0 +1,8 @@
1
+ from aiogram.filters import Filter
2
+
3
+ from project.core.settings import get_cached_settings
4
+
5
+
6
+ class ProdModeTgBotFilter(Filter):
7
+ async def __call__(self, *args, **kwargs) -> bool:
8
+ return get_cached_settings().is_mode_type_prod
@@ -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
@@ -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()
@@ -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.blank import get_cached_tg_bot_blank
4
+ from project.tg_bot.blank.client import get_cached_client_tg_bot_blank
5
5
 
6
6
 
7
- def hello_world_static_kb() -> ReplyKeyboardMarkup:
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=get_cached_tg_bot_blank().hello_world()
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)