arpakitlib 1.8.18__py3-none-any.whl → 1.8.20__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 (315) hide show
  1. arpakitlib/_arpakit_project_template_v_5/arpakitlib_project_template_info.json +3 -0
  2. arpakitlib/_arpakit_project_template_v_5/command/alembic_revision_autogenerate.sh +2 -0
  3. arpakitlib/_arpakit_project_template_v_5/command/reinit_all_sqlalchemy_db.py +13 -0
  4. arpakitlib/{_arpakit_project_template_v_4/project/api/auth2.py → _arpakit_project_template_v_5/project/api/auth.py} +133 -26
  5. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/exception_handler.py +11 -12
  6. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/router/admin/get_arpakitlib_project_template_info.py +9 -3
  7. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/router/admin/get_auth_data.py +7 -9
  8. arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/main_router.py +20 -0
  9. arpakitlib/_arpakit_project_template_v_5/project/api/router/admin/raise_fake_error.py +27 -0
  10. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/router/client/get_errors_info.py +8 -2
  11. arpakitlib/_arpakit_project_template_v_5/project/api/router/client/main_router.py +10 -0
  12. arpakitlib/_arpakit_project_template_v_5/project/api/router/general/main_router.py +14 -0
  13. arpakitlib/{_arpakit_project_template_v_4/project/api/router/client → _arpakit_project_template_v_5/project/api/router/general}/now_utc_datetime.py +3 -3
  14. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/schema/out/admin/common.py +1 -1
  15. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/schema/out/admin/operation.py +2 -2
  16. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/schema/out/admin/story_log.py +2 -2
  17. arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/admin/user.py +22 -0
  18. arpakitlib/_arpakit_project_template_v_5/project/api/schema/out/admin/user_token.py +14 -0
  19. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/schema/out/client/common.py +1 -1
  20. arpakitlib/{_arpakit_project_template_v_4/project/api/schema/out/general → _arpakit_project_template_v_5/project/api/schema/out/common}/error.py +1 -1
  21. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/core/settings.py +3 -17
  22. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/operation_execution/operation_executor_worker.py +2 -2
  23. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sandbox/sandbox_1.py +3 -1
  24. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqlalchemy_db_/sqlalchemy_model/api_key.py +1 -1
  25. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqlalchemy_db_/sqlalchemy_model/user.py +2 -2
  26. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqlalchemy_db_/sqlalchemy_model/user_token.py +1 -1
  27. arpakitlib/_arpakit_project_template_v_5/project/test_data/make_test_api_keys.py +35 -0
  28. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/test_data/make_test_data_1.py +4 -2
  29. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/test_data/make_test_data_2.py +4 -2
  30. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/test_data/make_test_data_3.py +4 -2
  31. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/test_data/make_test_data_4.py +4 -2
  32. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/test_data/make_test_data_5.py +4 -2
  33. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/blank/admin.py +2 -8
  34. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/blank/client.py +69 -0
  35. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/callback/client.py +4 -0
  36. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/const.py +7 -6
  37. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/filter_/user_roles_has_admin.py +18 -0
  38. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/filter_/user_roles_has_client.py +18 -0
  39. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/middleware/init_user.py +9 -8
  40. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/router/admin/arpakitlib_project_template_info.py +6 -4
  41. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/admin/clear_log_file.py +33 -0
  42. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/admin/drop_sqlalchemy_db.py +31 -0
  43. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/admin/init_sqlalchemy_db.py +28 -0
  44. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/admin/kb_with_not_modified.py +59 -0
  45. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/admin/kb_with_old_cd.py +40 -0
  46. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/admin/kb_with_raise_error.py +48 -0
  47. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/admin/kb_with_remove_message.py +35 -0
  48. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/admin/log_file.py +37 -0
  49. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/router/admin/me.py +4 -0
  50. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/router/admin/raise_fake_error.py +5 -1
  51. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/router/admin/reinit_sqlalchemy_db.py +7 -3
  52. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/admin/set_tg_bot_commands.py +28 -0
  53. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/client/about.py +30 -0
  54. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/client/error_handler.py +91 -0
  55. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/router/client/healthcheck.py +3 -1
  56. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/router/client/hello_world.py +5 -2
  57. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/client/raw_callback_query.py +30 -0
  58. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/client/raw_inline_query.py +14 -0
  59. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/client/raw_message.py +15 -0
  60. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/client/remove_message.py +28 -0
  61. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/router/client/start.py +3 -2
  62. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/client/support.py +30 -0
  63. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/router/main_router.py +36 -0
  64. arpakitlib/_arpakit_project_template_v_5/project/tg_bot/util/notify_admins.py +58 -0
  65. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/util/set_tg_bot_commands.py +26 -4
  66. arpakitlib/_arpakit_project_template_v_5/project/util/__init__.py +0 -0
  67. arpakitlib/ar_base_worker_util.py +7 -7
  68. arpakitlib/ar_blank_util.py +2 -2
  69. arpakitlib/ar_func_util.py +21 -14
  70. arpakitlib/ar_sqlalchemy_util.py +9 -3
  71. {arpakitlib-1.8.18.dist-info → arpakitlib-1.8.20.dist-info}/METADATA +1 -1
  72. arpakitlib-1.8.20.dist-info/RECORD +348 -0
  73. arpakitlib/_arpakit_project_template_v_4/arpakitlib_project_template_info.json +0 -3
  74. arpakitlib/_arpakit_project_template_v_4/command/alembic_revision_autogenerate.sh +0 -2
  75. arpakitlib/_arpakit_project_template_v_4/project/api/auth.py +0 -353
  76. arpakitlib/_arpakit_project_template_v_4/project/api/router/admin/main_router.py +0 -3
  77. arpakitlib/_arpakit_project_template_v_4/project/api/router/client/main_router.py +0 -3
  78. arpakitlib/_arpakit_project_template_v_4/project/api/router/general/main_router.py +0 -10
  79. arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/common.py +0 -5
  80. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/blank/client.py +0 -44
  81. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/error_handler.py +0 -37
  82. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/filter_/user_roles_has_admin.py +0 -27
  83. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/filter_/user_roles_has_client.py +0 -27
  84. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/admin/main_router.py +0 -15
  85. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/client/main_router.py +0 -14
  86. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/main_router.py +0 -13
  87. arpakitlib-1.8.18.dist-info/RECORD +0 -330
  88. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/.gitignore +0 -0
  89. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/.python-version +0 -0
  90. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/LICENSE +0 -0
  91. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/README.md +0 -0
  92. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/alembic/README +0 -0
  93. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/alembic/env.py +0 -0
  94. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/alembic/script.py.mako +0 -0
  95. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/alembic/versions/__init__.py +0 -0
  96. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/alembic.ini +0 -0
  97. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/__init__.py +0 -0
  98. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/alembic_history.sh +0 -0
  99. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/alembic_upgrade_head.sh +0 -0
  100. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/beautify_json.py +0 -0
  101. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/check_logging.py +0 -0
  102. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/check_sqlalchemy_db.py +0 -0
  103. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/demojize.py +0 -0
  104. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/docker_ps_a.sh +0 -0
  105. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/docker_rm_postgres.sh +0 -0
  106. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/docker_run_postgres.sh +0 -0
  107. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/docker_start_postgres.sh +0 -0
  108. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/docker_stop_postgres.sh +0 -0
  109. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/drop_json_db.py +0 -0
  110. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/drop_sqlalchemy_db.py +0 -0
  111. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/generate_settings_env_example.py +0 -0
  112. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/git_commit.sh +0 -0
  113. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/git_push_arpakit_company_github_1.sh +0 -0
  114. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/git_push_arpakit_company_gitlab_1.sh +0 -0
  115. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/git_push_arpakit_github_1.sh +0 -0
  116. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/git_push_arpakit_gitlab_1.sh +0 -0
  117. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/git_remote_v.sh +0 -0
  118. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/git_set_arpakit_company_origin.sh +0 -0
  119. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/git_set_arpakit_origin.sh +0 -0
  120. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/git_set_divarteam_origin.sh +0 -0
  121. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/git_status.sh +0 -0
  122. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/hello_world.py +0 -0
  123. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/init_json_db.py +0 -0
  124. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/init_sqlalchemy_db.py +0 -0
  125. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/poetry_check.sh +0 -0
  126. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/poetry_clear_cache.sh +0 -0
  127. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/poetry_config.sh +0 -0
  128. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/poetry_install.sh +0 -0
  129. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/poetry_lock.sh +0 -0
  130. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/poetry_remove_and_add_arpakitlib.sh +0 -0
  131. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/poetry_show.sh +0 -0
  132. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/poetry_show_arpakitlib.sh +0 -0
  133. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/poetry_update.sh +0 -0
  134. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/poetry_update_arpakitlib.sh +0 -0
  135. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/reinit_json_db.py +0 -0
  136. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/reinit_sqlalchemy_db.py +0 -0
  137. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/remove_operations.py +0 -0
  138. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/remove_story_logs.py +0 -0
  139. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/rm_all_records_in_json_db.py +0 -0
  140. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/set_tg_bot_commands.py +0 -0
  141. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/show_settings.py +0 -0
  142. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/start_api.py +0 -0
  143. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/start_api_for_prod.py +0 -0
  144. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/start_api_with_reload.py +0 -0
  145. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/start_operation_executor_worker.py +0 -0
  146. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/start_operation_executor_workers.py +0 -0
  147. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/start_scheduled_operation_creator_worker.py +0 -0
  148. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/start_sqladmin.py +0 -0
  149. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/start_sqladmin_for_prod.py +0 -0
  150. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/start_sqladmin_with_reload.py +0 -0
  151. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/start_tg_bot.py +0 -0
  152. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/command/start_tg_bot_for_prod.py +0 -0
  153. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/example.env +0 -0
  154. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/note/note_1.txt +0 -0
  155. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/note/note_2.txt +0 -0
  156. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/note/note_3.txt +0 -0
  157. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/note/note_4.txt +0 -0
  158. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/note/note_5.txt +0 -0
  159. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/__init__.py +0 -0
  160. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/additional_model/__init__.py +0 -0
  161. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/additional_model/common.py +0 -0
  162. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/__init__.py +0 -0
  163. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/asgi.py +0 -0
  164. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/const.py +0 -0
  165. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/create_api_app.py +0 -0
  166. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/event.py +0 -0
  167. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/exception.py +1 -1
  168. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/openapi_ui.py +0 -0
  169. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/response.py +0 -0
  170. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/router/__init__.py +0 -0
  171. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/router/admin/__init__.py +0 -0
  172. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/router/client/__init__.py +0 -0
  173. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/router/general/__init__.py +0 -0
  174. arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/router/general/healthcheck.py +1 -1
  175. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/router/main_router.py +0 -0
  176. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/schema/__init__.py +0 -0
  177. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/schema/common.py +0 -0
  178. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/schema/in_/__init__.py +0 -0
  179. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/schema/in_/admin/__init__.py +0 -0
  180. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/schema/in_/admin/common.py +0 -0
  181. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/schema/in_/client/__init__.py +0 -0
  182. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/schema/in_/client/common.py +0 -0
  183. /arpakitlib/{_arpakit_project_template_v_4/project/api/schema/in_/general → _arpakit_project_template_v_5/project/api/schema/in_/common}/__init__.py +0 -0
  184. /arpakitlib/{_arpakit_project_template_v_4/project/api/schema/out → _arpakit_project_template_v_5/project/api/schema/in_/general}/__init__.py +0 -0
  185. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/schema/in_/general/common.py +0 -0
  186. /arpakitlib/{_arpakit_project_template_v_4/project/api/schema/out/admin → _arpakit_project_template_v_5/project/api/schema/out}/__init__.py +0 -0
  187. /arpakitlib/{_arpakit_project_template_v_4/project/api/schema/out/client → _arpakit_project_template_v_5/project/api/schema/out/admin}/__init__.py +0 -0
  188. /arpakitlib/{_arpakit_project_template_v_4/project/api/schema/out/common → _arpakit_project_template_v_5/project/api/schema/out/client}/__init__.py +0 -0
  189. /arpakitlib/{_arpakit_project_template_v_4/project/api/schema/out/general → _arpakit_project_template_v_5/project/api/schema/out/common}/__init__.py +0 -0
  190. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/schema/out/common/datetime_.py +0 -0
  191. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/schema/out/common/raw_data.py +0 -0
  192. /arpakitlib/{_arpakit_project_template_v_4/project/business_service → _arpakit_project_template_v_5/project/api/schema/out/general}/__init__.py +0 -0
  193. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/schema/out/general/common.py +0 -0
  194. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/schema/out/general/errors_info_general.py +0 -0
  195. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/schema/out/general/healthcheck.py +0 -0
  196. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/api/util.py +0 -0
  197. /arpakitlib/{_arpakit_project_template_v_4/project/celery_ → _arpakit_project_template_v_5/project/business_service}/__init__.py +0 -0
  198. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/business_service/hello_world.py +0 -0
  199. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/business_service/remove_operations.py +0 -0
  200. /arpakitlib/{_arpakit_project_template_v_4/project/core → _arpakit_project_template_v_5/project/celery_}/__init__.py +0 -0
  201. /arpakitlib/{_arpakit_project_template_v_4/project/json_db → _arpakit_project_template_v_5/project/core}/__init__.py +0 -0
  202. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/core/cache_file_storage_in_dir.py +0 -0
  203. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/core/const.py +0 -0
  204. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/core/dump_file_storage_in_dir.py +0 -0
  205. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/core/jinja2_templates.py +0 -0
  206. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/core/media_file_storage_in_dir.py +0 -0
  207. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/core/util.py +0 -0
  208. /arpakitlib/{_arpakit_project_template_v_4/project/operation_execution → _arpakit_project_template_v_5/project/json_db}/__init__.py +0 -0
  209. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/json_db/json_db.py +0 -0
  210. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/more/helloworld +0 -0
  211. /arpakitlib/{_arpakit_project_template_v_4/project/resource → _arpakit_project_template_v_5/project/operation_execution}/__init__.py +0 -0
  212. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/operation_execution/const.py +0 -0
  213. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/operation_execution/scheduled_operation_creator_worker.py +0 -0
  214. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/operation_execution/scheduled_operations.py +0 -0
  215. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/operation_execution/util.py +0 -0
  216. /arpakitlib/{_arpakit_project_template_v_4/project/sandbox → _arpakit_project_template_v_5/project/resource}/__init__.py +0 -0
  217. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/1 +0 -0
  218. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/healthcheck +0 -0
  219. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/helloworld +0 -0
  220. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/openapi-favicon.png +0 -0
  221. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/redoc/redoc.standalone.js +0 -0
  222. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/swagger-ui/favicon-16x16.png +0 -0
  223. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/swagger-ui/favicon-32x32.png +0 -0
  224. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/swagger-ui/index.css +0 -0
  225. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/swagger-ui/index.html +0 -0
  226. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/swagger-ui/oauth2-redirect.html +0 -0
  227. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/swagger-ui/swagger-initializer.js +0 -0
  228. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/swagger-ui/swagger-ui-bundle.js +0 -0
  229. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/swagger-ui/swagger-ui-bundle.js.map +0 -0
  230. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/swagger-ui/swagger-ui-es-bundle-core.js +0 -0
  231. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/swagger-ui/swagger-ui-es-bundle-core.js.map +0 -0
  232. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/swagger-ui/swagger-ui-es-bundle.js +0 -0
  233. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/swagger-ui/swagger-ui-es-bundle.js.map +0 -0
  234. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/swagger-ui/swagger-ui-standalone-preset.js +0 -0
  235. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/swagger-ui/swagger-ui-standalone-preset.js.map +0 -0
  236. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/swagger-ui/swagger-ui.css +0 -0
  237. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/swagger-ui/swagger-ui.css.map +0 -0
  238. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/swagger-ui/swagger-ui.js +0 -0
  239. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/resource/static/swagger-ui/swagger-ui.js.map +0 -0
  240. /arpakitlib/{_arpakit_project_template_v_4/project/site → _arpakit_project_template_v_5/project/sandbox}/__init__.py +0 -0
  241. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sandbox/sandbox_2.py +0 -0
  242. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sandbox/sandbox_3.py +0 -0
  243. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sandbox/sandbox_4.py +0 -0
  244. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sandbox/sandbox_5.py +0 -0
  245. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sandbox/sandbox_6.py +0 -0
  246. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sandbox/sandbox_7.py +0 -0
  247. /arpakitlib/{_arpakit_project_template_v_4/project/site/router → _arpakit_project_template_v_5/project/site}/__init__.py +0 -0
  248. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/site/asgi.py +0 -0
  249. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/site/consts.py +0 -0
  250. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/site/create_site_app.py +0 -0
  251. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/site/event.py +0 -0
  252. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/site/exception_handler.py +0 -0
  253. /arpakitlib/{_arpakit_project_template_v_4/project/sqladmin_ → _arpakit_project_template_v_5/project/site/router}/__init__.py +0 -0
  254. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/site/router/main_router.py +0 -0
  255. /arpakitlib/{_arpakit_project_template_v_4/project/sqlalchemy_db_ → _arpakit_project_template_v_5/project/sqladmin_}/__init__.py +0 -0
  256. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqladmin_/add_admin_in_app.py +0 -0
  257. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqladmin_/admin_auth.py +0 -0
  258. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqladmin_/asgi.py +0 -0
  259. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqladmin_/create_sqladmin_app.py +0 -0
  260. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqladmin_/event.py +0 -0
  261. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqladmin_/model_view/__init__.py +0 -0
  262. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqladmin_/model_view/common.py +0 -0
  263. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqladmin_/model_view/operation.py +0 -0
  264. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqladmin_/model_view/story_log.py +0 -0
  265. /arpakitlib/{_arpakit_project_template_v_4/project/test_data → _arpakit_project_template_v_5/project/sqlalchemy_db_}/__init__.py +0 -0
  266. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqlalchemy_db_/const.py +0 -0
  267. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqlalchemy_db_/sqlalchemy_db.py +0 -0
  268. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqlalchemy_db_/sqlalchemy_model/__init__.py +0 -0
  269. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqlalchemy_db_/sqlalchemy_model/common.py +0 -0
  270. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqlalchemy_db_/sqlalchemy_model/operation.py +0 -0
  271. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqlalchemy_db_/sqlalchemy_model/story_log.py +0 -0
  272. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/sqlalchemy_db_/util.py +0 -0
  273. /arpakitlib/{_arpakit_project_template_v_4/project/tg_bot → _arpakit_project_template_v_5/project/test_data}/__init__.py +0 -0
  274. /arpakitlib/{_arpakit_project_template_v_4/project/tg_bot/blank → _arpakit_project_template_v_5/project/tg_bot}/__init__.py +0 -0
  275. /arpakitlib/{_arpakit_project_template_v_4/project/tg_bot/callback → _arpakit_project_template_v_5/project/tg_bot/blank}/__init__.py +0 -0
  276. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/blank/common.py +0 -0
  277. /arpakitlib/{_arpakit_project_template_v_4/project/tg_bot/filter_ → _arpakit_project_template_v_5/project/tg_bot/callback}/__init__.py +0 -0
  278. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/callback/admin.py +0 -0
  279. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/callback/common.py +0 -0
  280. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/event.py +0 -0
  281. /arpakitlib/{_arpakit_project_template_v_4/project/tg_bot/kb → _arpakit_project_template_v_5/project/tg_bot/filter_}/__init__.py +0 -0
  282. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/filter_/is_private_chat.py +0 -0
  283. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/filter_/message_text.py +0 -0
  284. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/filter_/not_prod_mode_filter.py +0 -0
  285. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/filter_/prod_mode_filter.py +0 -0
  286. /arpakitlib/{_arpakit_project_template_v_4/project/tg_bot/kb/inline_ → _arpakit_project_template_v_5/project/tg_bot/kb}/__init__.py +0 -0
  287. /arpakitlib/{_arpakit_project_template_v_4/project/tg_bot/kb/inline_/admin → _arpakit_project_template_v_5/project/tg_bot/kb/inline_}/__init__.py +0 -0
  288. /arpakitlib/{_arpakit_project_template_v_4/project/tg_bot/kb/inline_/client → _arpakit_project_template_v_5/project/tg_bot/kb/inline_/admin}/__init__.py +0 -0
  289. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/kb/inline_/admin/common.py +0 -0
  290. /arpakitlib/{_arpakit_project_template_v_4/project/tg_bot/kb/static_ → _arpakit_project_template_v_5/project/tg_bot/kb/inline_/client}/__init__.py +0 -0
  291. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/kb/inline_/client/common.py +0 -0
  292. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/kb/inline_/client/hello_world.py +0 -0
  293. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/kb/inline_/common.py +0 -0
  294. /arpakitlib/{_arpakit_project_template_v_4/project/tg_bot/kb/static_/admin → _arpakit_project_template_v_5/project/tg_bot/kb/static_}/__init__.py +0 -0
  295. /arpakitlib/{_arpakit_project_template_v_4/project/tg_bot/kb/static_/client → _arpakit_project_template_v_5/project/tg_bot/kb/static_/admin}/__init__.py +0 -0
  296. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/kb/static_/admin/common.py +0 -0
  297. /arpakitlib/{_arpakit_project_template_v_4/project/tg_bot/middleware → _arpakit_project_template_v_5/project/tg_bot/kb/static_/client}/__init__.py +0 -0
  298. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/kb/static_/client/common.py +0 -0
  299. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/kb/static_/client/hello_world.py +0 -0
  300. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/kb/static_/common.py +0 -0
  301. /arpakitlib/{_arpakit_project_template_v_4/project/tg_bot/router → _arpakit_project_template_v_5/project/tg_bot/middleware}/__init__.py +0 -0
  302. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/middleware/common.py +0 -0
  303. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/middleware/middleware.py +0 -0
  304. /arpakitlib/{_arpakit_project_template_v_4/project/tg_bot/router/admin → _arpakit_project_template_v_5/project/tg_bot/router}/__init__.py +0 -0
  305. /arpakitlib/{_arpakit_project_template_v_4/project/tg_bot/router/client → _arpakit_project_template_v_5/project/tg_bot/router/admin}/__init__.py +0 -0
  306. /arpakitlib/{_arpakit_project_template_v_4/project/tg_bot/util → _arpakit_project_template_v_5/project/tg_bot/router/client}/__init__.py +0 -0
  307. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/start_tg_bot.py +0 -0
  308. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/tg_bot.py +0 -0
  309. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/tg_bot_dispatcher.py +0 -0
  310. /arpakitlib/{_arpakit_project_template_v_4/project → _arpakit_project_template_v_5/project/tg_bot}/util/__init__.py +0 -0
  311. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/tg_bot/util/etc.py +0 -0
  312. /arpakitlib/{_arpakit_project_template_v_4 → _arpakit_project_template_v_5}/project/util/arpakitlib_project_template.py +0 -0
  313. {arpakitlib-1.8.18.dist-info → arpakitlib-1.8.20.dist-info}/LICENSE +0 -0
  314. {arpakitlib-1.8.18.dist-info → arpakitlib-1.8.20.dist-info}/WHEEL +0 -0
  315. {arpakitlib-1.8.18.dist-info → arpakitlib-1.8.20.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ "arpakitlib_project_template_version": "5"
3
+ }
@@ -0,0 +1,2 @@
1
+ cd ..
2
+ alembic revision --autogenerate -m "ar"
@@ -0,0 +1,13 @@
1
+ from project.core.settings import get_cached_settings
2
+ from project.core.util import setup_logging
3
+ from project.sqlalchemy_db_.sqlalchemy_db import get_cached_sqlalchemy_db
4
+
5
+
6
+ def __command():
7
+ setup_logging()
8
+ get_cached_settings().raise_if_prod_mode()
9
+ get_cached_sqlalchemy_db().reinit_all()
10
+
11
+
12
+ if __name__ == '__main__':
13
+ __command()
@@ -1,18 +1,23 @@
1
- from typing import Callable
1
+ import functools
2
+ from typing import Callable, Any
2
3
 
3
4
  import fastapi
4
5
  import fastapi.exceptions
5
6
  import fastapi.responses
6
7
  import fastapi.security
8
+ import sqlalchemy
7
9
  from fastapi import Security
8
10
  from fastapi.security import APIKeyHeader
9
11
  from pydantic import BaseModel, ConfigDict
12
+ from sqlalchemy.orm import joinedload
10
13
 
11
- from arpakitlib.ar_func_util import is_async_callable, is_sync_function
14
+ from arpakitlib.ar_func_util import is_async_func, is_sync_func
12
15
  from arpakitlib.ar_json_util import transfer_data_to_json_str_to_data
13
16
  from project.api.const import APIErrorCodes
14
17
  from project.api.exception import APIException
15
18
  from project.core.settings import get_cached_settings
19
+ from project.sqlalchemy_db_.sqlalchemy_db import get_cached_sqlalchemy_db
20
+ from project.sqlalchemy_db_.sqlalchemy_model import ApiKeyDBM, UserTokenDBM
16
21
 
17
22
 
18
23
  class APIAuthData(BaseModel):
@@ -21,15 +26,22 @@ class APIAuthData(BaseModel):
21
26
  api_key_string: str | None = None
22
27
  user_token_string: str | None = None
23
28
 
29
+ is_api_key_correct: bool | None = None
30
+
31
+ api_key_dbm: ApiKeyDBM | None = None
32
+ user_token_dbm: UserTokenDBM | None = None
33
+
24
34
  prod_mode: bool = False
25
35
 
36
+ extra_data: dict[str, Any] = {}
37
+
26
38
 
27
39
  def api_auth(
28
40
  *,
29
- middleware_funcs: list[Callable] | None = None
41
+ middlewares: list[Callable] | None = None
30
42
  ) -> Callable:
31
- if middleware_funcs is None:
32
- middleware_funcs = []
43
+ if middlewares is None:
44
+ middlewares = []
33
45
 
34
46
  async def async_func(
35
47
  *,
@@ -46,7 +58,7 @@ def api_auth(
46
58
  prod_mode=get_cached_settings().prod_mode
47
59
  )
48
60
 
49
- # parse api_key
61
+ # parse api_key_string
50
62
 
51
63
  api_auth_data.api_key_string = api_key_string
52
64
 
@@ -56,6 +68,8 @@ def api_auth(
56
68
  api_auth_data.api_key_string = request.headers["api-key"]
57
69
  if not api_auth_data.api_key_string and "apikey" in request.headers.keys():
58
70
  api_auth_data.api_key_string = request.headers["apikey"]
71
+ if not api_auth_data.api_key_string and "api_key_string" in request.headers.keys():
72
+ api_auth_data.api_key_string = request.headers["api_key_string"]
59
73
 
60
74
  if not api_auth_data.api_key_string and "api_key" in request.query_params.keys():
61
75
  api_auth_data.api_key_string = request.query_params["api_key"]
@@ -63,13 +77,15 @@ def api_auth(
63
77
  api_auth_data.api_key_string = request.query_params["api-key"]
64
78
  if not api_auth_data.api_key_string and "apikey" in request.query_params.keys():
65
79
  api_auth_data.api_key_string = request.query_params["apikey"]
80
+ if not api_auth_data.api_key_string and "api_key_string" in request.query_params.keys():
81
+ api_auth_data.api_key_string = request.query_params["api_key_string"]
66
82
 
67
83
  if api_auth_data.api_key_string:
68
84
  api_auth_data.api_key_string = api_auth_data.api_key_string.strip()
69
85
  if not api_auth_data.api_key_string:
70
86
  api_auth_data.api_key_string = None
71
87
 
72
- # parse user_token
88
+ # parse user_token_string
73
89
 
74
90
  api_auth_data.user_token_string = ac.credentials if ac and ac.credentials and ac.credentials.strip() else None
75
91
 
@@ -98,74 +114,165 @@ def api_auth(
98
114
  if not api_auth_data.user_token_string:
99
115
  api_auth_data.user_token_string = None
100
116
 
101
- # middleware_funcs
117
+ # is_api_key_correct
118
+
119
+ if api_auth_data.api_key_string is not None:
120
+ if get_cached_settings().api_correct_api_keys is None:
121
+ api_auth_data.is_api_key_correct = None
122
+ else:
123
+ api_auth_data.is_api_key_correct = api_auth_data.api_key_string in get_cached_settings().api_correct_api_keys
124
+
125
+ # api_key_dbm
126
+
127
+ if api_auth_data.api_key_string is not None:
128
+ if get_cached_sqlalchemy_db() is not None:
129
+ async with get_cached_sqlalchemy_db().new_async_session() as async_session:
130
+ api_auth_data.api_key_dbm = await async_session.scalar(
131
+ sqlalchemy.select(ApiKeyDBM).where(ApiKeyDBM.value == api_auth_data.api_key_string)
132
+ )
133
+
134
+ # user_token_dbm
102
135
 
103
- for middleware_func in middleware_funcs:
104
- if is_async_callable(middleware_func):
105
- await middleware_func(
136
+ if api_auth_data.api_key_string is not None:
137
+ if get_cached_sqlalchemy_db() is not None:
138
+ async with get_cached_sqlalchemy_db().new_async_session() as async_session:
139
+ api_auth_data.user_token_dbm = await async_session.scalar(
140
+ sqlalchemy.select(UserTokenDBM)
141
+ .options(joinedload(UserTokenDBM.user))
142
+ .where(UserTokenDBM.value == api_auth_data.user_token_string)
143
+ )
144
+
145
+ # middlewares
146
+
147
+ for middleware in middlewares:
148
+ api_auth_data.extra_data[middleware.__name__] = True
149
+
150
+ for middleware in middlewares:
151
+ if is_async_func(middleware):
152
+ await middleware(
106
153
  api_auth_data=api_auth_data,
107
154
  request=request
108
155
  )
109
- elif is_sync_function(middleware_func):
110
- middleware_func(
156
+ elif is_sync_func(middleware):
157
+ middleware(
111
158
  api_auth_data=api_auth_data,
112
159
  request=request
113
160
  )
114
161
  else:
115
- raise TypeError("unknown middleware_func type")
162
+ raise TypeError(f"unknown middleware type, {middleware.__name__}")
116
163
 
117
164
  return api_auth_data
118
165
 
119
166
  return async_func
120
167
 
121
168
 
122
- def require_api_key_string_middleware_func():
169
+ def require_prod_mode_api_middleware():
170
+ @functools.wraps(require_prod_mode_api_middleware)
123
171
  def func(*, api_auth_data: APIAuthData, request: fastapi.requests.Request):
124
- if api_auth_data.api_key_string is None:
172
+ if not get_cached_settings().prod_mode:
125
173
  raise APIException(
126
174
  status_code=fastapi.status.HTTP_401_UNAUTHORIZED,
127
175
  error_code=APIErrorCodes.cannot_authorize,
128
- error_description="api_key string is required",
176
+ error_description=f"prod_mode={get_cached_settings().prod_mode}",
129
177
  error_data=transfer_data_to_json_str_to_data(api_auth_data.model_dump())
130
178
  )
131
179
 
132
180
  return func
133
181
 
134
182
 
135
- def require_user_token_string_middleware_func():
183
+ def require_not_prod_mode_api_middleware():
184
+ @functools.wraps(require_not_prod_mode_api_middleware)
136
185
  def func(*, api_auth_data: APIAuthData, request: fastapi.requests.Request):
137
- if api_auth_data.user_token_string is None:
186
+ if get_cached_settings().prod_mode:
138
187
  raise APIException(
139
188
  status_code=fastapi.status.HTTP_401_UNAUTHORIZED,
140
189
  error_code=APIErrorCodes.cannot_authorize,
141
- error_description="user_token string is required",
190
+ error_description=f"prod_mode={get_cached_settings().prod_mode}",
142
191
  error_data=transfer_data_to_json_str_to_data(api_auth_data.model_dump())
143
192
  )
144
193
 
145
194
  return func
146
195
 
147
196
 
148
- def require_prod_mode_middleware_func():
197
+ def require_api_key_string_api_middleware():
198
+ @functools.wraps(require_api_key_string_api_middleware)
149
199
  def func(*, api_auth_data: APIAuthData, request: fastapi.requests.Request):
150
- if not get_cached_settings().prod_mode:
200
+ if api_auth_data.api_key_string is None:
151
201
  raise APIException(
152
202
  status_code=fastapi.status.HTTP_401_UNAUTHORIZED,
153
203
  error_code=APIErrorCodes.cannot_authorize,
154
- error_description=f"prod_mode={get_cached_settings().prod_mode}",
204
+ error_description="api_key_string is required",
155
205
  error_data=transfer_data_to_json_str_to_data(api_auth_data.model_dump())
156
206
  )
157
207
 
158
208
  return func
159
209
 
160
210
 
161
- def require_not_prod_mode_middleware_func():
211
+ def require_user_token_string_api_middleware():
212
+ @functools.wraps(require_user_token_string_api_middleware)
162
213
  def func(*, api_auth_data: APIAuthData, request: fastapi.requests.Request):
163
- if get_cached_settings().prod_mode:
214
+ if api_auth_data.user_token_string is None:
164
215
  raise APIException(
165
216
  status_code=fastapi.status.HTTP_401_UNAUTHORIZED,
166
217
  error_code=APIErrorCodes.cannot_authorize,
167
- error_description=f"prod_mode={get_cached_settings().prod_mode}",
218
+ error_description="user_token_string is required",
168
219
  error_data=transfer_data_to_json_str_to_data(api_auth_data.model_dump())
169
220
  )
170
221
 
171
222
  return func
223
+
224
+
225
+ def require_correct_api_key_dbm_api_middleware():
226
+ @functools.wraps(require_correct_api_key_dbm_api_middleware)
227
+ def func(*, api_auth_data: APIAuthData, request: fastapi.requests.Request):
228
+ if not api_auth_data.is_api_key_correct:
229
+ raise APIException(
230
+ status_code=fastapi.status.HTTP_401_UNAUTHORIZED,
231
+ error_code=APIErrorCodes.cannot_authorize,
232
+ error_description="api_key_string is not correct",
233
+ error_data=transfer_data_to_json_str_to_data(api_auth_data.model_dump())
234
+ )
235
+
236
+ return func
237
+
238
+
239
+ def require_api_key_dbm_api_middleware(*, require_active: bool = True):
240
+ @functools.wraps(require_api_key_dbm_api_middleware)
241
+ async def async_func(*, api_auth_data: APIAuthData, request: fastapi.requests.Request):
242
+ if api_auth_data.api_key_dbm is None:
243
+ raise APIException(
244
+ status_code=fastapi.status.HTTP_401_UNAUTHORIZED,
245
+ error_code=APIErrorCodes.cannot_authorize,
246
+ error_description="api_key_dbm is required",
247
+ error_data=transfer_data_to_json_str_to_data(api_auth_data.model_dump())
248
+ )
249
+ if require_active and not api_auth_data.api_key_dbm.is_active:
250
+ raise APIException(
251
+ status_code=fastapi.status.HTTP_401_UNAUTHORIZED,
252
+ error_code=APIErrorCodes.cannot_authorize,
253
+ error_description="api_key_dbm is not active",
254
+ error_data=transfer_data_to_json_str_to_data(api_auth_data.model_dump())
255
+ )
256
+
257
+ return async_func
258
+
259
+
260
+ def require_user_token_dbm_api_middleware(*, require_active: bool = True):
261
+ @functools.wraps(require_user_token_dbm_api_middleware)
262
+ async def async_func(*, api_auth_data: APIAuthData, request: fastapi.requests.Request):
263
+ if api_auth_data.user_token_dbm is None:
264
+ raise APIException(
265
+ status_code=fastapi.status.HTTP_401_UNAUTHORIZED,
266
+ error_code=APIErrorCodes.cannot_authorize,
267
+ error_description="user_key_dbm is required",
268
+ error_data=transfer_data_to_json_str_to_data(api_auth_data.model_dump())
269
+ )
270
+ if require_active and not api_auth_data.user_token_dbm.is_active:
271
+ raise APIException(
272
+ status_code=fastapi.status.HTTP_401_UNAUTHORIZED,
273
+ error_code=APIErrorCodes.cannot_authorize,
274
+ error_description="user_key_dbm is not active",
275
+ error_data=transfer_data_to_json_str_to_data(api_auth_data.model_dump())
276
+ )
277
+
278
+ return async_func
@@ -10,12 +10,11 @@ import starlette.exceptions
10
10
  from arpakitlib.ar_datetime_util import now_utc_dt
11
11
  from arpakitlib.ar_dict_util import combine_dicts
12
12
  from arpakitlib.ar_exception_util import exception_to_traceback_str
13
- from arpakitlib.ar_func_util import raise_if_not_async_callable, is_async_callable, is_sync_function
14
- from arpakitlib.ar_json_util import transfer_data_to_json_str
13
+ from arpakitlib.ar_func_util import raise_if_not_async_func, is_async_func, is_sync_func
15
14
  from project.api.const import APIErrorCodes
16
15
  from project.api.exception import APIException
17
16
  from project.api.response import APIJSONResponse
18
- from project.api.schema.out.general.error import ErrorGeneralSO
17
+ from project.api.schema.out.common.error import ErrorCommonSO
19
18
  from project.core.settings import get_cached_settings
20
19
  from project.sqlalchemy_db_.sqlalchemy_db import get_cached_sqlalchemy_db
21
20
  from project.sqlalchemy_db_.sqlalchemy_model import StoryLogDBM
@@ -42,7 +41,7 @@ def create_api_exception_handler(
42
41
  ) -> APIJSONResponse:
43
42
  status_code = fastapi.status.HTTP_500_INTERNAL_SERVER_ERROR
44
43
 
45
- error_common_so = ErrorGeneralSO(
44
+ error_common_so = ErrorCommonSO(
46
45
  has_error=True,
47
46
  error_code=APIErrorCodes.unknown_error,
48
47
  error_data={
@@ -102,7 +101,7 @@ def create_api_exception_handler(
102
101
 
103
102
  _transmitted_kwargs = {}
104
103
  for func_before in funcs_before:
105
- if is_async_callable(func_before):
104
+ if is_async_func(func_before):
106
105
  try:
107
106
  await func_before(
108
107
  request=request,
@@ -114,7 +113,7 @@ def create_api_exception_handler(
114
113
  except Exception as exception_:
115
114
  _logger.exception(exception_)
116
115
  raise exception_
117
- elif is_sync_function(func_before):
116
+ elif is_sync_func(func_before):
118
117
  try:
119
118
  func_before(
120
119
  request=request,
@@ -132,7 +131,7 @@ def create_api_exception_handler(
132
131
  # async_funcs_after
133
132
 
134
133
  for async_func_after in async_funcs_after:
135
- raise_if_not_async_callable(async_func_after)
134
+ raise_if_not_async_func(async_func_after)
136
135
  _ = asyncio.create_task(async_func_after(
137
136
  request=request, status_code=status_code, error_common_so=error_common_so, exception=exception
138
137
  ))
@@ -157,7 +156,7 @@ def logging_func_before_in_api_exception_handler(
157
156
  *,
158
157
  request: fastapi.requests.Request,
159
158
  status_code: int,
160
- error_common_so: ErrorGeneralSO,
159
+ error_common_so: ErrorCommonSO,
161
160
  exception: Exception,
162
161
  transmitted_kwargs: dict[str, Any],
163
162
  **kwargs
@@ -175,7 +174,7 @@ def logging_func_before_in_api_exception_handler(
175
174
  ):
176
175
  return
177
176
 
178
- _logger.error(transfer_data_to_json_str(error_common_so.model_dump()), exc_info=False)
177
+ _logger.exception(exception)
179
178
 
180
179
  return func
181
180
 
@@ -192,7 +191,7 @@ def create_story_log_func_before_in_api_exception_handler(
192
191
  *,
193
192
  request: fastapi.requests.Request,
194
193
  status_code: int,
195
- error_common_so: ErrorGeneralSO,
194
+ error_common_so: ErrorCommonSO,
196
195
  exception: Exception,
197
196
  transmitted_kwargs: dict[str, Any],
198
197
  **kwargs
@@ -216,9 +215,9 @@ def create_story_log_func_before_in_api_exception_handler(
216
215
  type=StoryLogDBM.Types.error_in_api,
217
216
  title=f"{status_code}, {type(exception)}",
218
217
  data={
219
- "exception_str": str(exception),
218
+ "exception": str(exception),
220
219
  "error_common_so": error_common_so.model_dump(),
221
- "error_traceback_str": exception_to_traceback_str(exception=exception)
220
+ "exception_traceback": exception_to_traceback_str(exception=exception)
222
221
  }
223
222
  )
224
223
  session.add(story_log_dbm)
@@ -1,8 +1,10 @@
1
1
  import fastapi
2
2
  from fastapi import APIRouter
3
3
 
4
+ from project.api.auth import require_user_token_dbm_api_middleware, require_api_key_dbm_api_middleware, APIAuthData, \
5
+ api_auth
6
+ from project.api.schema.out.common.error import ErrorCommonSO
4
7
  from project.api.schema.out.common.raw_data import RawDataCommonSO
5
- from project.api.schema.out.general.error import ErrorGeneralSO
6
8
  from project.util.arpakitlib_project_template import get_arpakitlib_project_template_info
7
9
 
8
10
  api_router = APIRouter()
@@ -12,12 +14,16 @@ api_router = APIRouter()
12
14
  "",
13
15
  name="Get arpakitlib project template info",
14
16
  status_code=fastapi.status.HTTP_200_OK,
15
- response_model=RawDataCommonSO | ErrorGeneralSO
17
+ response_model=RawDataCommonSO | ErrorCommonSO
16
18
  )
17
19
  async def _(
18
20
  *,
19
21
  request: fastapi.requests.Request,
20
- response: fastapi.responses.Response
22
+ response: fastapi.responses.Response,
23
+ api_auth_data: APIAuthData = fastapi.Depends(api_auth(middlewares=[
24
+ require_api_key_dbm_api_middleware(require_active=True),
25
+ require_user_token_dbm_api_middleware(require_active=True)
26
+ ]))
21
27
  ):
22
28
  arpakitlib_project_template_data = get_arpakitlib_project_template_info()
23
29
  return RawDataCommonSO(data=arpakitlib_project_template_data)
@@ -1,9 +1,10 @@
1
1
  import fastapi.requests
2
2
  from fastapi import APIRouter
3
- from project.api.schema.out.common.error import ErrorCommonSO
4
3
 
5
4
  from arpakitlib.ar_json_util import transfer_data_to_json_str_to_data
6
- from project.api.auth import APIAuthData, api_auth
5
+ from project.api.auth import APIAuthData, api_auth, require_user_token_dbm_api_middleware, \
6
+ require_api_key_dbm_api_middleware
7
+ from project.api.schema.out.common.error import ErrorCommonSO
7
8
  from project.api.schema.out.common.raw_data import RawDataCommonSO
8
9
 
9
10
  api_router = APIRouter()
@@ -19,12 +20,9 @@ async def _(
19
20
  *,
20
21
  request: fastapi.requests.Request,
21
22
  response: fastapi.responses.Response,
22
- api_auth_data: APIAuthData = fastapi.Depends(api_auth(
23
- require_not_prod_mode=True,
24
- try_find_api_key_dbm_from_sqlalchemy_db=True,
25
- try_find_user_token_dbm_from_sqlalchemy_db=True,
26
- require_api_key_dbm_from_sqlalchemy_db=True,
27
- require_user_token_dbm_from_sqlalchemy_db=True
28
- ))
23
+ api_auth_data: APIAuthData = fastapi.Depends(api_auth(middlewares=[
24
+ require_api_key_dbm_api_middleware(require_active=True),
25
+ require_user_token_dbm_api_middleware(require_active=True)
26
+ ]))
29
27
  ):
30
28
  return RawDataCommonSO(data=transfer_data_to_json_str_to_data(api_auth_data.model_dump()))
@@ -0,0 +1,20 @@
1
+ from fastapi import APIRouter
2
+
3
+ from project.api.router.admin import get_auth_data, get_arpakitlib_project_template_info, raise_fake_error
4
+
5
+ main_admin_api_router = APIRouter()
6
+
7
+ main_admin_api_router.include_router(
8
+ router=get_arpakitlib_project_template_info.api_router,
9
+ prefix="/get_arpakitlib_project_template_info"
10
+ )
11
+
12
+ main_admin_api_router.include_router(
13
+ router=get_auth_data.api_router,
14
+ prefix="/get_auth_data"
15
+ )
16
+
17
+ main_admin_api_router.include_router(
18
+ router=raise_fake_error.api_router,
19
+ prefix="/raise_fake_error"
20
+ )
@@ -0,0 +1,27 @@
1
+ import fastapi.requests
2
+ from fastapi import APIRouter
3
+
4
+ from project.api.auth import APIAuthData, api_auth, require_user_token_dbm_api_middleware, \
5
+ require_api_key_dbm_api_middleware
6
+ from project.api.schema.out.common.error import ErrorCommonSO
7
+ from project.api.schema.out.common.raw_data import RawDataCommonSO
8
+
9
+ api_router = APIRouter()
10
+
11
+
12
+ @api_router.get(
13
+ path="",
14
+ name="Raise fake error",
15
+ status_code=fastapi.status.HTTP_200_OK,
16
+ response_model=RawDataCommonSO | ErrorCommonSO,
17
+ )
18
+ async def _(
19
+ *,
20
+ request: fastapi.requests.Request,
21
+ response: fastapi.responses.Response,
22
+ api_auth_data: APIAuthData = fastapi.Depends(api_auth(middlewares=[
23
+ require_api_key_dbm_api_middleware(require_active=True),
24
+ require_user_token_dbm_api_middleware(require_active=True)
25
+ ]))
26
+ ):
27
+ raise Exception("fake error")
@@ -1,8 +1,10 @@
1
1
  import fastapi.requests
2
2
  from fastapi import APIRouter
3
- from project.api.schema.out.common.error import ErrorCommonSO
4
3
 
4
+ from project.api.auth import APIAuthData, api_auth, require_api_key_dbm_api_middleware, \
5
+ require_user_token_dbm_api_middleware
5
6
  from project.api.const import APIErrorCodes, APIErrorSpecificationCodes
7
+ from project.api.schema.out.common.error import ErrorCommonSO
6
8
  from project.api.schema.out.general.errors_info_general import ErrorsInfoGeneralSO
7
9
 
8
10
  api_router = APIRouter()
@@ -17,7 +19,11 @@ api_router = APIRouter()
17
19
  async def _(
18
20
  *,
19
21
  request: fastapi.requests.Request,
20
- response: fastapi.responses.Response
22
+ response: fastapi.responses.Response,
23
+ api_auth_data: APIAuthData = fastapi.Depends(api_auth(middlewares=[
24
+ require_api_key_dbm_api_middleware(require_active=True),
25
+ require_user_token_dbm_api_middleware(require_active=True)
26
+ ]))
21
27
  ):
22
28
  return ErrorsInfoGeneralSO(
23
29
  api_error_codes=APIErrorCodes.values_list(),
@@ -0,0 +1,10 @@
1
+ from fastapi import APIRouter
2
+
3
+ from project.api.router.client import get_errors_info
4
+
5
+ main_client_api_router = APIRouter()
6
+
7
+ main_client_api_router.include_router(
8
+ router=get_errors_info.api_router,
9
+ prefix="/get_errors_info"
10
+ )
@@ -0,0 +1,14 @@
1
+ from fastapi import APIRouter
2
+
3
+ from project.api.router.general import healthcheck, now_utc_datetime
4
+
5
+ main_general_api_router = APIRouter()
6
+
7
+ main_general_api_router.include_router(
8
+ router=healthcheck.api_router,
9
+ prefix="/healthcheck"
10
+ )
11
+ main_general_api_router.include_router(
12
+ router=now_utc_datetime.api_router,
13
+ prefix="/now_utc_datetime"
14
+ )
@@ -3,7 +3,7 @@ from fastapi import APIRouter
3
3
 
4
4
  from arpakitlib.ar_datetime_util import now_utc_dt
5
5
  from project.api.schema.out.common.datetime_ import DatetimeCommonSO
6
- from project.api.schema.out.general.error import ErrorGeneralSO
6
+ from project.api.schema.out.common.error import ErrorCommonSO
7
7
 
8
8
  api_router = APIRouter()
9
9
 
@@ -12,11 +12,11 @@ api_router = APIRouter()
12
12
  "",
13
13
  name="Now UTC datetime",
14
14
  status_code=fastapi.status.HTTP_200_OK,
15
- response_model=DatetimeCommonSO | ErrorGeneralSO,
15
+ response_model=DatetimeCommonSO | ErrorCommonSO,
16
16
  )
17
17
  async def _(
18
18
  *,
19
19
  request: fastapi.requests.Request,
20
- response: fastapi.responses.Response
20
+ response: fastapi.responses.Response,
21
21
  ):
22
22
  return DatetimeCommonSO.from_datetime(datetime_=now_utc_dt())
@@ -3,7 +3,7 @@ import datetime as dt
3
3
  from project.api.schema.common import BaseSO
4
4
 
5
5
 
6
- class SimpleDBMAdminCommonSO(BaseSO):
6
+ class SimpleDBMAdminSO(BaseSO):
7
7
  id: int
8
8
  long_id: str
9
9
  slug: str | None
@@ -3,11 +3,11 @@ from __future__ import annotations
3
3
  import datetime as dt
4
4
  from typing import Any
5
5
 
6
- from project.api.schema.out.admin.common import SimpleDBMAdminCommonSO
6
+ from project.api.schema.out.admin.common import SimpleDBMAdminSO
7
7
  from project.sqlalchemy_db_.sqlalchemy_model import OperationDBM
8
8
 
9
9
 
10
- class OperationAdminSO(SimpleDBMAdminCommonSO):
10
+ class OperationAdminSO(SimpleDBMAdminSO):
11
11
  execution_start_dt: dt.datetime | None
12
12
  execution_finish_dt: dt.datetime | None
13
13
  status: str
@@ -2,11 +2,11 @@ from __future__ import annotations
2
2
 
3
3
  from typing import Any
4
4
 
5
- from project.api.schema.out.admin.common import SimpleDBMAdminCommonSO
5
+ from project.api.schema.out.admin.common import SimpleDBMAdminSO
6
6
  from project.sqlalchemy_db_.sqlalchemy_model import StoryLogDBM
7
7
 
8
8
 
9
- class StoryLogAdminSO(SimpleDBMAdminCommonSO):
9
+ class StoryLogAdminSO(SimpleDBMAdminSO):
10
10
  level: str
11
11
  type: str | None
12
12
  title: str | None
@@ -0,0 +1,22 @@
1
+ from __future__ import annotations
2
+
3
+ import datetime as dt
4
+ from typing import Any
5
+
6
+ from project.api.schema.out.admin.common import SimpleDBMAdminSO
7
+ from project.sqlalchemy_db_.sqlalchemy_model import UserDBM
8
+
9
+
10
+ class UserDBMSAdminSO(SimpleDBMAdminSO):
11
+ mail: str | None
12
+ roles: list[str]
13
+ is_active: bool
14
+ tg_id: int | None
15
+ tg_bot_last_action_dt: dt.datetime | None
16
+ tg_data: dict[str, Any] | None
17
+ roles_has_admin: bool
18
+ roles_has_client: bool
19
+
20
+ @classmethod
21
+ def from_user_dbm(cls, *, user_dbm: UserDBM) -> UserDBMSAdminSO:
22
+ return cls.model_validate(user_dbm.simple_dict_with_sd_properties())
@@ -0,0 +1,14 @@
1
+ from __future__ import annotations
2
+
3
+ from project.api.schema.out.admin.common import SimpleDBMAdminSO
4
+ from project.sqlalchemy_db_.sqlalchemy_model import UserTokenDBM
5
+
6
+
7
+ class UserTokenDBMSAdminSO(SimpleDBMAdminSO):
8
+ value: str
9
+ user_id: int
10
+ is_active: bool
11
+
12
+ @classmethod
13
+ def from_user_token_dbm(cls, *, user_dbm: UserTokenDBM) -> UserTokenDBMSAdminSO:
14
+ return cls.model_validate(user_dbm.simple_dict_with_sd_properties())
@@ -3,7 +3,7 @@ import datetime as dt
3
3
  from project.api.schema.common import BaseSO
4
4
 
5
5
 
6
- class SimpleDBMClientCommonSO(BaseSO):
6
+ class SimpleDBMClientSO(BaseSO):
7
7
  id: int
8
8
  long_id: str
9
9
  slug: str | None
@@ -3,7 +3,7 @@ from typing import Any
3
3
  from project.api.schema.common import BaseSO
4
4
 
5
5
 
6
- class ErrorGeneralSO(BaseSO):
6
+ class ErrorCommonSO(BaseSO):
7
7
  has_error: bool = True
8
8
  error_code: str | None = None
9
9
  error_specification_code: str | None = None