arpakitlib 1.7.256__py3-none-any.whl → 1.8.0__py3-none-any.whl

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