zrb 1.0.0a21__py3-none-any.whl → 1.0.0b5__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 (207) hide show
  1. zrb/__init__.py +2 -1
  2. zrb/__main__.py +3 -3
  3. zrb/builtin/__init__.py +3 -0
  4. zrb/builtin/group.py +1 -0
  5. zrb/builtin/llm/llm_chat.py +87 -7
  6. zrb/builtin/llm/previous-session.js +21 -0
  7. zrb/builtin/llm/tool/api.py +29 -0
  8. zrb/builtin/llm/tool/cli.py +1 -1
  9. zrb/builtin/llm/tool/rag.py +108 -145
  10. zrb/builtin/llm/tool/web.py +1 -1
  11. zrb/builtin/project/add/fastapp/fastapp_task.py +2 -0
  12. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/config.py +5 -2
  13. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/add_entity_task.py +80 -20
  14. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/add_entity_util.py +150 -42
  15. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/module/my_module/service/my_entity/my_entity_service.py +113 -0
  16. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/module/my_module/service/my_entity/my_entity_service_factory.py +9 -0
  17. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/module/my_module/service/my_entity/repository/my_entity_db_repository.py +0 -10
  18. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/module/my_module/service/my_entity/repository/my_entity_repository.py +37 -16
  19. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/module/my_module/service/my_entity/repository/{factory.py → my_entity_repository_factory.py} +2 -2
  20. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/schema/my_entity.py +16 -6
  21. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/client_method.py +57 -0
  22. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/gateway_subroute.py +74 -0
  23. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/format_task.py +1 -1
  24. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/input.py +13 -0
  25. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/add_module_task.py +23 -0
  26. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/add_module_util.py +42 -0
  27. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/gateway/subroute/my_module.py +7 -0
  28. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/client/my_module_api_client.py +6 -0
  29. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/client/{any_client.py → my_module_client.py} +1 -1
  30. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/client/my_module_client_factory.py +11 -0
  31. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/client/my_module_direct_client.py +5 -0
  32. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/route.py +11 -11
  33. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/module_task_definition.py +2 -2
  34. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/task.py +8 -8
  35. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/util.py +47 -20
  36. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/app_factory.py +29 -0
  37. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/base_db_repository.py +230 -102
  38. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/base_service.py +236 -0
  39. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/{db_engine.py → db_engine_factory.py} +1 -1
  40. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/error.py +12 -0
  41. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/logger_factory.py +10 -0
  42. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/parser_factory.py +7 -0
  43. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/app.py +47 -0
  44. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/parser.py +105 -0
  45. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/user_agent.py +58 -0
  46. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/view.py +37 -0
  47. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/config.py +37 -1
  48. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/main.py +1 -1
  49. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_api_client.py +16 -0
  50. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_client.py +169 -0
  51. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_client_factory.py +9 -0
  52. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_direct_client.py +15 -0
  53. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/versions/3093c7336477_add_auth_tables.py +160 -0
  54. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration_metadata.py +18 -1
  55. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/route.py +7 -3
  56. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/permission_service.py +117 -0
  57. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/permission_service_factory.py +11 -0
  58. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/repository/permission_db_repository.py +26 -0
  59. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/repository/permission_repository.py +61 -0
  60. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/repository/permission_repository_factory.py +13 -0
  61. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/repository/role_db_repository.py +89 -0
  62. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/repository/role_repository.py +67 -0
  63. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/repository/role_repository_factory.py +13 -0
  64. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/role_service.py +137 -0
  65. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/role_service_factory.py +7 -0
  66. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/repository/user_db_repository.py +179 -12
  67. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/repository/user_repository.py +67 -17
  68. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/repository/user_repository_factory.py +2 -2
  69. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/user_service.py +127 -0
  70. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/user_service_factory.py +7 -0
  71. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/route.py +43 -14
  72. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/subroute/auth.py +200 -30
  73. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/util/view.py +74 -0
  74. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/error.html +6 -0
  75. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/homepage.html +6 -0
  76. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/images/android-chrome-192x192.png +0 -0
  77. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/images/android-chrome-512x512.png +0 -0
  78. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/images/favicon-32x32.png +0 -0
  79. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.amber.min.css +4 -0
  80. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.blue.min.css +4 -0
  81. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.cyan.min.css +4 -0
  82. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.fuchsia.min.css +4 -0
  83. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.green.min.css +4 -0
  84. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.grey.min.css +4 -0
  85. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.indigo.min.css +4 -0
  86. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.jade.min.css +4 -0
  87. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.lime.min.css +4 -0
  88. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.min.css +4 -0
  89. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.orange.min.css +4 -0
  90. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.pink.min.css +4 -0
  91. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.pumpkin.min.css +4 -0
  92. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.purple.min.css +4 -0
  93. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.red.min.css +4 -0
  94. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.sand.min.css +4 -0
  95. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.slate.min.css +4 -0
  96. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.violet.min.css +4 -0
  97. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.yellow.min.css +4 -0
  98. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.zinc.min.css +4 -0
  99. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/template/default.html +34 -0
  100. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/requirements.txt +1 -0
  101. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/permission.py +17 -5
  102. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/role.py +78 -4
  103. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/session.py +48 -0
  104. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/user.py +69 -5
  105. zrb/builtin/python.py +1 -1
  106. zrb/builtin/random.py +61 -0
  107. zrb/builtin/todo.py +1 -0
  108. zrb/cmd/cmd_val.py +6 -5
  109. zrb/config.py +15 -4
  110. zrb/content_transformer/any_content_transformer.py +7 -0
  111. zrb/content_transformer/content_transformer.py +6 -0
  112. zrb/input/any_input.py +5 -0
  113. zrb/input/base_input.py +6 -0
  114. zrb/input/bool_input.py +2 -0
  115. zrb/input/float_input.py +2 -0
  116. zrb/input/int_input.py +2 -0
  117. zrb/input/option_input.py +2 -0
  118. zrb/input/password_input.py +2 -0
  119. zrb/input/text_input.py +2 -0
  120. zrb/runner/cli.py +14 -7
  121. zrb/runner/common_util.py +1 -1
  122. zrb/runner/web_app.py +28 -280
  123. zrb/runner/web_config/config.py +91 -0
  124. zrb/runner/web_config/config_factory.py +26 -0
  125. zrb/runner/web_route/docs_route.py +17 -0
  126. zrb/runner/web_route/error_page/serve_default_404.py +28 -0
  127. zrb/runner/{web_controller/error_page/controller.py → web_route/error_page/show_error_page.py} +4 -3
  128. zrb/runner/{web_controller → web_route}/error_page/view.html +5 -0
  129. zrb/runner/web_route/home_page/home_page_route.py +51 -0
  130. zrb/runner/web_route/login_api_route.py +31 -0
  131. zrb/runner/web_route/login_page/login_page_route.py +39 -0
  132. zrb/runner/web_route/logout_api_route.py +18 -0
  133. zrb/runner/web_route/logout_page/logout_page_route.py +40 -0
  134. zrb/runner/{web_controller/group_info_page/controller.py → web_route/node_page/group/show_group_page.py} +3 -3
  135. zrb/runner/web_route/node_page/node_page_route.py +50 -0
  136. zrb/runner/{web_controller/session_page/controller.py → web_route/node_page/task/show_task_page.py} +3 -3
  137. zrb/runner/{web_controller/session_page → web_route/node_page/task}/view.html +1 -1
  138. zrb/runner/web_route/refresh_token_api_route.py +38 -0
  139. zrb/runner/{web_controller/static → web_route/static/resources}/session/current-session.js +12 -6
  140. zrb/runner/{web_controller/static → web_route/static/resources}/session/event.js +17 -2
  141. zrb/runner/web_route/static/static_route.py +44 -0
  142. zrb/runner/web_route/task_input_api_route.py +47 -0
  143. zrb/runner/web_route/task_session_api_route.py +147 -0
  144. zrb/runner/web_schema/session.py +5 -0
  145. zrb/runner/web_schema/token.py +11 -0
  146. zrb/runner/web_schema/user.py +32 -0
  147. zrb/runner/web_util/cookie.py +29 -0
  148. zrb/runner/{web_util.py → web_util/html.py} +1 -23
  149. zrb/runner/web_util/token.py +72 -0
  150. zrb/runner/web_util/user.py +63 -0
  151. zrb/session/session.py +6 -4
  152. zrb/session_state_logger/{default_session_state_logger.py → session_state_logger_factory.py} +1 -1
  153. zrb/task/base_task.py +56 -8
  154. zrb/task/base_trigger.py +2 -0
  155. zrb/task/cmd_task.py +9 -5
  156. zrb/task/http_check.py +2 -0
  157. zrb/task/llm_task.py +93 -110
  158. zrb/task/make_task.py +2 -0
  159. zrb/task/rsync_task.py +2 -0
  160. zrb/task/scaffolder.py +8 -5
  161. zrb/task/scheduler.py +2 -0
  162. zrb/task/tcp_check.py +2 -0
  163. zrb/task_status/task_status.py +4 -3
  164. zrb/util/cmd/command.py +1 -0
  165. zrb/util/file.py +7 -1
  166. zrb/util/llm/tool.py +36 -12
  167. {zrb-1.0.0a21.dist-info → zrb-1.0.0b5.dist-info}/METADATA +3 -2
  168. zrb-1.0.0b5.dist-info/RECORD +309 -0
  169. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/any_client_method.py +0 -27
  170. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/module/my_module/service/my_entity/my_entity_usecase.py +0 -65
  171. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/client/api_client.py +0 -6
  172. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/client/direct_client.py +0 -6
  173. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/client/factory.py +0 -9
  174. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/app.py +0 -20
  175. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/base_usecase.py +0 -245
  176. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/any_client.py +0 -33
  177. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/api_client.py +0 -7
  178. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/direct_client.py +0 -6
  179. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/factory.py +0 -9
  180. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/versions/3093c7336477_add_user_table.py +0 -37
  181. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/user_usecase.py +0 -53
  182. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/user_usecase_factory.py +0 -6
  183. zrb/runner/web_config.py +0 -274
  184. zrb/runner/web_controller/home_page/controller.py +0 -33
  185. zrb/runner/web_controller/login_page/controller.py +0 -25
  186. zrb/runner/web_controller/logout_page/controller.py +0 -26
  187. zrb-1.0.0a21.dist-info/RECORD +0 -244
  188. /zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/column/{create_column_task.py → add_column_task.py} +0 -0
  189. /zrb/{runner/web_controller → builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission}/__init__.py +0 -0
  190. /zrb/{runner/web_controller/group_info_page → builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role}/__init__.py +0 -0
  191. /zrb/runner/{web_controller/home_page → web_route}/__init__.py +0 -0
  192. /zrb/runner/{web_controller/session_page → web_route/home_page}/__init__.py +0 -0
  193. /zrb/runner/{web_controller → web_route}/home_page/view.html +0 -0
  194. /zrb/runner/{web_controller → web_route}/login_page/view.html +0 -0
  195. /zrb/runner/{web_controller → web_route}/logout_page/view.html +0 -0
  196. /zrb/runner/{web_controller/group_info_page → web_route/node_page/group}/view.html +0 -0
  197. /zrb/runner/{web_controller/session_page → web_route/node_page/task}/partial/input.html +0 -0
  198. /zrb/runner/{refresh-token.template.js → web_route/static/refresh-token.template.js} +0 -0
  199. /zrb/runner/{web_controller/static → web_route/static/resources}/common.css +0 -0
  200. /zrb/runner/{web_controller/static → web_route/static/resources}/favicon-32x32.png +0 -0
  201. /zrb/runner/{web_controller/static → web_route/static/resources}/login/event.js +0 -0
  202. /zrb/runner/{web_controller/static → web_route/static/resources}/logout/event.js +0 -0
  203. /zrb/runner/{web_controller/static → web_route/static/resources}/pico.min.css +0 -0
  204. /zrb/runner/{web_controller/static → web_route/static/resources}/session/common-util.js +0 -0
  205. /zrb/runner/{web_controller/static → web_route/static/resources}/session/past-session.js +0 -0
  206. {zrb-1.0.0a21.dist-info → zrb-1.0.0b5.dist-info}/WHEEL +0 -0
  207. {zrb-1.0.0a21.dist-info → zrb-1.0.0b5.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,105 @@
1
+ import re
2
+ from typing import Callable
3
+
4
+ from sqlalchemy import asc, desc
5
+ from sqlalchemy.sql import ClauseElement, ColumnElement
6
+ from sqlmodel import SQLModel
7
+
8
+
9
+ def create_default_sort_param_parser() -> (
10
+ Callable[[SQLModel, str], list[ColumnElement]]
11
+ ):
12
+ def parse_sort_param(model: SQLModel, query: str) -> list[ColumnElement]:
13
+ """
14
+ Parse the sort parameter and return a list of SQLAlchemy ColumnElement objects.
15
+
16
+ Args:
17
+ model (Type[SQLModel]): The SQLModel class to be queried.
18
+ query (str): A comma-separated string of fields to sort by.
19
+ Prefix a field with '-' for descending order.
20
+
21
+ Returns:
22
+ list[ColumnElement]: A list of SQLAlchemy ColumnElement objects representing the sort order.
23
+
24
+ Example:
25
+ parse_sort_param(UserModel, "name,-age")
26
+ # Returns [asc(UserModel.name), desc(UserModel.age)]
27
+ """
28
+ sorts: list[ColumnElement] = []
29
+ sort_parts = query.split(",")
30
+ for part in sort_parts:
31
+ if part.startswith("-"):
32
+ key = part[1:]
33
+ order = desc
34
+ else:
35
+ key = part
36
+ order = asc
37
+ if hasattr(model, key):
38
+ sorts.append(order(getattr(model, key)))
39
+ return sorts
40
+
41
+ return parse_sort_param
42
+
43
+
44
+ def create_default_filter_param_parser() -> (
45
+ Callable[[SQLModel, str], list[ClauseElement]]
46
+ ):
47
+ def parse_filter_param(model: SQLModel, query: str) -> list[ClauseElement]:
48
+ """
49
+ Parse the filter parameter and return a list of SQLAlchemy ClauseElement objects.
50
+
51
+ Args:
52
+ model (Type[SQLModel]): The SQLModel class to be queried.
53
+ query (str): A comma-separated string of filters.
54
+ Each filter should be in the format "field:operator:value".
55
+ Use '\,' to escape commas within values.
56
+
57
+ Returns:
58
+ list[ClauseElement]: A list of SQLAlchemy ClauseElement objects representing the filters.
59
+
60
+ Supported operators:
61
+ eq: Equal to
62
+ ne: Not equal to
63
+ gt: Greater than
64
+ gte: Greater than or equal to
65
+ lt: Less than
66
+ lte: Less than or equal to
67
+ like: SQL LIKE (use % for wildcards)
68
+ in: In a list of values (semicolon-separated)
69
+
70
+ Example:
71
+ parse_filter_param(UserModel, "age:gte:18,name:like:John%,role:in:admin;user,address:eq:123\, Main St.")
72
+ # Returns [UserModel.age >= 18, UserModel.name.like("John%"), UserModel.role.in_(["admin", "user"]), UserModel.address == "123, Main St."]
73
+ """
74
+ filters: list[ClauseElement] = []
75
+ filter_parts = split_by_comma(query)
76
+ for part in filter_parts:
77
+ match = re.match(r"(.+):(.+):(.+)", part)
78
+ if match:
79
+ key, op, value = match.groups()
80
+ value = value.replace(r"\,", ",") # Unescape commas in the value
81
+ if hasattr(model, key):
82
+ column = getattr(model, key)
83
+ if op == "eq":
84
+ filters.append(column == value)
85
+ elif op == "ne":
86
+ filters.append(column != value)
87
+ elif op == "gt":
88
+ filters.append(column > value)
89
+ elif op == "gte":
90
+ filters.append(column >= value)
91
+ elif op == "lt":
92
+ filters.append(column < value)
93
+ elif op == "lte":
94
+ filters.append(column <= value)
95
+ elif op == "like":
96
+ filters.append(column.like(value))
97
+ elif op == "in":
98
+ filters.append(column.in_(value.split(";")))
99
+ return filters
100
+
101
+ return parse_filter_param
102
+
103
+
104
+ def split_by_comma(s: str, delimiter: str = ",") -> list[str]:
105
+ return re.split(r"(?<!\\)" + re.escape(delimiter), s)
@@ -0,0 +1,58 @@
1
+ import re
2
+
3
+
4
+ def get_os_from_user_agent(user_agent: str) -> str:
5
+ os_patterns = [
6
+ (r"Windows NT (\d+\.\d+)", "Windows"),
7
+ (r"Mac OS X (\d+[_\.]\d+)", "MacOS"),
8
+ (r"Android (\d+[\.\d]*)", "Android"),
9
+ (r"iPhone OS (\d+[_\.]\d+)", "iOS"),
10
+ (r"iPad.*OS (\d+[_\.]\d+)", "iPadOS"),
11
+ (r"Linux", "Linux"),
12
+ ]
13
+ os = "Unknown OS"
14
+ # Match OS
15
+ for pattern, name in os_patterns:
16
+ match = re.search(pattern, user_agent)
17
+ if match:
18
+ os = (
19
+ f"{name} {match.group(1).replace('_', '.')}" if match.groups() else name
20
+ )
21
+ break
22
+ return os
23
+
24
+
25
+ def get_browser_from_user_agent(user_agent: str) -> str:
26
+ browser_patterns = [
27
+ (r"Chrome/([\d\.]+)", "Chrome"),
28
+ (r"Firefox/([\d\.]+)", "Firefox"),
29
+ (r"Edg/([\d\.]+)", "Edge"),
30
+ (r"Safari/([\d\.]+)", "Safari"),
31
+ ]
32
+ browser = "Unknown Browser"
33
+ # Match Browser
34
+ for pattern, name in browser_patterns:
35
+ match = re.search(pattern, user_agent)
36
+ if match:
37
+ browser = f"{name} {match.group(1)}"
38
+ break
39
+ return browser
40
+
41
+
42
+ def get_device_from_user_agent(user_agent: str):
43
+ device_patterns = [
44
+ (r"iPhone", "iPhone"),
45
+ (r"iPad", "iPad"),
46
+ (r"Android.*Mobile", "Android Phone"),
47
+ (r"Android", "Android Tablet"),
48
+ (r"Macintosh", "Mac"),
49
+ (r"Windows NT", "Windows PC"),
50
+ (r"Linux", "Linux Device"),
51
+ ]
52
+ device = "Unknown Device"
53
+ # Match Device
54
+ for pattern, name in device_patterns:
55
+ if re.search(pattern, user_agent):
56
+ device = name
57
+ break
58
+ return device
@@ -0,0 +1,37 @@
1
+ import os
2
+ from typing import Any
3
+
4
+ from fastapi.responses import HTMLResponse
5
+ from jinja2 import Environment, FileSystemLoader
6
+
7
+
8
+ def render_str(template_path: str, **data: Any) -> str:
9
+ """
10
+ Renders a Jinja2 template with the given data.
11
+
12
+ :param template_path: The absolute or relative file path of the template.
13
+ :param data: A dictionary of data to pass to the template (default is None).
14
+ :return: Rendered template as a string.
15
+ """
16
+ if data is None:
17
+ data = {}
18
+ # Get the directory and file name
19
+ directory, template_name = os.path.split(template_path)
20
+ # Set up Jinja2 environment with the specific directory
21
+ env = Environment(loader=FileSystemLoader(directory))
22
+ # Render the template
23
+ template = env.get_template(template_name)
24
+ return template.render(data)
25
+
26
+
27
+ def render_page(
28
+ template_path: str,
29
+ status_code: int = 200,
30
+ headers: dict[str, str] = None,
31
+ media_type: str | None = None,
32
+ **data: Any
33
+ ) -> HTMLResponse:
34
+ content = render_str(template_path, **data)
35
+ return HTMLResponse(
36
+ content=content, status_code=status_code, headers=headers, media_type=media_type
37
+ )
@@ -1,6 +1,30 @@
1
1
  import os
2
2
 
3
3
  APP_PATH = os.path.dirname(__file__)
4
+ APP_VERSION = "0.1.0"
5
+
6
+ APP_GATEWAY_VIEW_PATH = os.path.join(APP_PATH, "module", "gateway", "view")
7
+ APP_GATEWAY_VIEW_DEFAULT_TEMPLATE_PATH = os.getenv(
8
+ "MY_APP_GATEWAY_VIEW_DEFAULT_TEMPLATE_PATH",
9
+ os.path.join("template", "default.html"),
10
+ )
11
+ _DEFAULT_CSS_PATH = "/static/pico-css/pico.min.css"
12
+ APP_GATEWAY_CSS_PATH_LIST = [
13
+ path
14
+ for path in os.getenv("MY_APP_GATEWAY_CSS_PATH", _DEFAULT_CSS_PATH).split(":")
15
+ if path != ""
16
+ ]
17
+ APP_GATEWAY_JS_PATH_LIST = [
18
+ path for path in os.getenv("MY_APP_GATEWAY_JS_PATH", "").split(":") if path != ""
19
+ ]
20
+ APP_GATEWAY_TITLE = os.getenv("MY_APP_GATEWAY_TITLE", "My App Name")
21
+ APP_GATEWAY_SUBTITLE = os.getenv("MY_APP_GATEWAY_SUBTITLE", "Just Another App")
22
+ APP_GATEWAY_LOGO_PATH = os.getenv(
23
+ "MY_APP_GATEWAY_LOGO", "/static/images/android-chrome-192x192.png"
24
+ )
25
+ APP_GATEWAY_FAVICON_PATH = os.getenv(
26
+ "MY_APP_GATEWAY_FAVICON", "/static/images/favicon-32x32.png"
27
+ )
4
28
 
5
29
  APP_MODE = os.getenv("MY_APP_NAME_MODE", "monolith")
6
30
  APP_MODULES = [
@@ -15,7 +39,7 @@ APP_COMMUNICATION = os.getenv(
15
39
  )
16
40
  APP_REPOSITORY_TYPE = os.getenv("APP_REPOSITORY_TYPE", "db")
17
41
  APP_DB_URL = os.getenv(
18
- "APP_DB_URL",
42
+ "MY_APP_NAME_DB_URL",
19
43
  (
20
44
  f"sqlite:///{APP_PATH}/monolith.db"
21
45
  if APP_MODE == "monolith" or len(APP_MODULES) == 0
@@ -26,5 +50,17 @@ APP_AUTH_SUPER_USER = os.getenv("MY_APP_NAME_AUTH_SUPER_USER", "admin")
26
50
  APP_AUTH_SUPER_USER_PASSWORD = os.getenv(
27
51
  "MY_APP_NAME_AUTH_SUPER_USER_PASSWORD", "my-secure-password"
28
52
  )
53
+ APP_AUTH_GUEST_USER = os.getenv("MY_APP_NAME_AUTH_GUEST_USER", "user")
54
+ APP_AUTH_GUEST_USER_PERMISSIONS = (
55
+ permission_name.strip()
56
+ for permission_name in os.getenv(
57
+ "MY_APP_NAME_AUTH_GUEST_USER_PERMISSIONS", ""
58
+ ).split(",")
59
+ if permission_name.strip() != ""
60
+ )
61
+ APP_MAX_PARALLEL_SESSION = int(os.getenv("MY_APP_NAME_MAX_PARALLEL_SESSION", "1"))
62
+ APP_SESSION_EXPIRE_MINUTES = int(
63
+ os.getenv("MY_APP_NAME_SESSION_EXPIRE_MINUTES", "1440")
64
+ )
29
65
 
30
66
  APP_AUTH_BASE_URL = os.getenv("MY_APP_NAME_AUTH_BASE_URL", "http://localhost:3001")
@@ -1,4 +1,4 @@
1
- from my_app_name.common.app import app
1
+ from my_app_name.common.app_factory import app
2
2
  from my_app_name.module.auth import route as auth_route
3
3
  from my_app_name.module.gateway import route as gateway_route
4
4
 
@@ -0,0 +1,16 @@
1
+ from my_app_name.config import APP_AUTH_BASE_URL
2
+ from my_app_name.module.auth.client.auth_client import AuthClient
3
+ from my_app_name.module.auth.service.permission.permission_service_factory import (
4
+ permission_service,
5
+ )
6
+ from my_app_name.module.auth.service.role.role_service_factory import role_service
7
+ from my_app_name.module.auth.service.user.user_service_factory import user_service
8
+
9
+
10
+ class AuthAPIClient(
11
+ permission_service.as_api_client(base_url=APP_AUTH_BASE_URL),
12
+ role_service.as_api_client(base_url=APP_AUTH_BASE_URL),
13
+ user_service.as_api_client(base_url=APP_AUTH_BASE_URL),
14
+ AuthClient,
15
+ ):
16
+ pass
@@ -0,0 +1,169 @@
1
+ from abc import ABC, abstractmethod
2
+
3
+ from my_app_name.schema.permission import (
4
+ MultiplePermissionResponse,
5
+ PermissionCreateWithAudit,
6
+ PermissionResponse,
7
+ PermissionUpdateWithAudit,
8
+ )
9
+ from my_app_name.schema.role import (
10
+ MultipleRoleResponse,
11
+ RoleCreateWithPermissionsAndAudit,
12
+ RoleResponse,
13
+ RoleUpdateWithPermissionsAndAudit,
14
+ )
15
+ from my_app_name.schema.user import (
16
+ MultipleUserResponse,
17
+ UserCreateWithRolesAndAudit,
18
+ UserResponse,
19
+ UserUpdateWithRolesAndAudit,
20
+ )
21
+
22
+
23
+ class AuthClient(ABC):
24
+
25
+ # Permission related methods
26
+
27
+ @abstractmethod
28
+ async def get_permission_by_id(self, permission_id: str) -> PermissionResponse:
29
+ """Get permission by id"""
30
+
31
+ @abstractmethod
32
+ async def get_permissions(
33
+ self,
34
+ page: int = 1,
35
+ page_size: int = 10,
36
+ sort: str | None = None,
37
+ filter: str | None = None,
38
+ ) -> MultiplePermissionResponse:
39
+ """Get permissions by filter and sort"""
40
+
41
+ @abstractmethod
42
+ async def create_permission_bulk(
43
+ self, data: list[PermissionCreateWithAudit]
44
+ ) -> list[PermissionResponse]:
45
+ """Create new permissions"""
46
+
47
+ @abstractmethod
48
+ async def create_permission(
49
+ self, data: PermissionCreateWithAudit
50
+ ) -> PermissionResponse:
51
+ """Create a new permission"""
52
+
53
+ @abstractmethod
54
+ async def update_permission_bulk(
55
+ self, permission_ids: list[str], data: PermissionUpdateWithAudit
56
+ ) -> PermissionResponse:
57
+ """Update some permissions"""
58
+
59
+ @abstractmethod
60
+ async def update_permission(
61
+ self, permission_id: str, data: PermissionUpdateWithAudit
62
+ ) -> PermissionResponse:
63
+ """Update a permission"""
64
+
65
+ @abstractmethod
66
+ async def delete_permission_bulk(
67
+ self, permission_ids: str, deleted_by: str
68
+ ) -> PermissionResponse:
69
+ """Delete some permissions"""
70
+
71
+ @abstractmethod
72
+ async def delete_permission(
73
+ self, permission_id: str, deleted_by: str
74
+ ) -> PermissionResponse:
75
+ """Delete a permission"""
76
+
77
+ # Role related methods
78
+
79
+ @abstractmethod
80
+ async def get_role_by_id(self, role_id: str) -> RoleResponse:
81
+ """Get role by id"""
82
+
83
+ @abstractmethod
84
+ async def get_roles(
85
+ self,
86
+ page: int = 1,
87
+ page_size: int = 10,
88
+ sort: str | None = None,
89
+ filter: str | None = None,
90
+ ) -> MultipleRoleResponse:
91
+ """Get roles by filter and sort"""
92
+
93
+ @abstractmethod
94
+ async def create_role_bulk(
95
+ self, data: list[RoleCreateWithPermissionsAndAudit]
96
+ ) -> list[RoleResponse]:
97
+ """Create new roles"""
98
+
99
+ @abstractmethod
100
+ async def create_role(
101
+ self, data: RoleCreateWithPermissionsAndAudit
102
+ ) -> RoleResponse:
103
+ """Create a new role"""
104
+
105
+ @abstractmethod
106
+ async def update_role_bulk(
107
+ self, role_ids: list[str], data: RoleUpdateWithPermissionsAndAudit
108
+ ) -> RoleResponse:
109
+ """Update some roles"""
110
+
111
+ @abstractmethod
112
+ async def update_role(
113
+ self, role_id: str, data: RoleUpdateWithPermissionsAndAudit
114
+ ) -> RoleResponse:
115
+ """Update a role"""
116
+
117
+ @abstractmethod
118
+ async def delete_role_bulk(self, role_ids: str, deleted_by: str) -> RoleResponse:
119
+ """Delete some roles"""
120
+
121
+ @abstractmethod
122
+ async def delete_role(self, role_id: str, deleted_by: str) -> RoleResponse:
123
+ """Delete a role"""
124
+
125
+ # User related methods
126
+
127
+ @abstractmethod
128
+ async def get_user_by_id(self, user_id: str) -> UserResponse:
129
+ """Get user by id"""
130
+
131
+ @abstractmethod
132
+ async def get_users(
133
+ self,
134
+ page: int = 1,
135
+ page_size: int = 10,
136
+ sort: str | None = None,
137
+ filter: str | None = None,
138
+ ) -> MultipleUserResponse:
139
+ """Get users by filter and sort"""
140
+
141
+ @abstractmethod
142
+ async def create_user_bulk(
143
+ self, data: list[UserCreateWithRolesAndAudit]
144
+ ) -> list[UserResponse]:
145
+ """Create new users"""
146
+
147
+ @abstractmethod
148
+ async def create_user(self, data: UserCreateWithRolesAndAudit) -> UserResponse:
149
+ """Create a new user"""
150
+
151
+ @abstractmethod
152
+ async def update_user_bulk(
153
+ self, user_ids: list[str], data: UserUpdateWithRolesAndAudit
154
+ ) -> UserResponse:
155
+ """Update some users"""
156
+
157
+ @abstractmethod
158
+ async def update_user(
159
+ self, user_id: str, data: UserUpdateWithRolesAndAudit
160
+ ) -> UserResponse:
161
+ """Update a user"""
162
+
163
+ @abstractmethod
164
+ async def delete_user_bulk(self, user_ids: str, deleted_by: str) -> UserResponse:
165
+ """Delete some users"""
166
+
167
+ @abstractmethod
168
+ async def delete_user(self, user_id: str, deleted_by: str) -> UserResponse:
169
+ """Delete a user"""
@@ -0,0 +1,9 @@
1
+ from my_app_name.config import APP_COMMUNICATION
2
+ from my_app_name.module.auth.client.auth_api_client import AuthAPIClient
3
+ from my_app_name.module.auth.client.auth_client import AuthClient
4
+ from my_app_name.module.auth.client.auth_direct_client import AuthDirectClient
5
+
6
+ if APP_COMMUNICATION == "direct":
7
+ auth_client: AuthClient = AuthDirectClient()
8
+ elif APP_COMMUNICATION == "api":
9
+ auth_client: AuthClient = AuthAPIClient()
@@ -0,0 +1,15 @@
1
+ from my_app_name.module.auth.client.auth_client import AuthClient
2
+ from my_app_name.module.auth.service.permission.permission_service_factory import (
3
+ permission_service,
4
+ )
5
+ from my_app_name.module.auth.service.role.role_service_factory import role_service
6
+ from my_app_name.module.auth.service.user.user_service_factory import user_service
7
+
8
+
9
+ class AuthDirectClient(
10
+ permission_service.as_direct_client(),
11
+ role_service.as_direct_client(),
12
+ user_service.as_direct_client(),
13
+ AuthClient,
14
+ ):
15
+ pass
@@ -0,0 +1,160 @@
1
+ """Add user table
2
+
3
+ Revision ID: 3093c7336477
4
+ Revises:
5
+ Create Date: 2024-11-20 05:57:01.684118
6
+
7
+ """
8
+
9
+ from typing import Sequence, Union
10
+
11
+ import sqlalchemy as sa
12
+ import sqlmodel
13
+ from alembic import op
14
+
15
+ # revision identifiers, used by Alembic.
16
+ revision: str = "3093c7336477"
17
+ down_revision: Union[str, None] = None
18
+ branch_labels: Union[str, Sequence[str], None] = None
19
+ depends_on: Union[str, Sequence[str], None] = None
20
+
21
+
22
+ def upgrade() -> None:
23
+ # ### commands auto generated by Alembic - please adjust! ###
24
+ op.create_table(
25
+ "permission",
26
+ sa.Column("id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
27
+ sa.Column("created_at", sa.DateTime(), nullable=True),
28
+ sa.Column("created_by", sqlmodel.sql.sqltypes.AutoString(), nullable=True),
29
+ sa.Column("updated_at", sa.DateTime(), nullable=True),
30
+ sa.Column("updated_by", sqlmodel.sql.sqltypes.AutoString(), nullable=True),
31
+ sa.Column("name", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
32
+ sa.Column("description", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
33
+ sa.PrimaryKeyConstraint("id"),
34
+ )
35
+ op.create_index(op.f("ix_permission_name"), "permission", ["name"], unique=True)
36
+ op.create_index(
37
+ op.f("ix_permission_created_at"), "permission", ["created_at"], unique=False
38
+ )
39
+ op.create_index(
40
+ op.f("ix_permission_created_by"), "permission", ["created_by"], unique=False
41
+ )
42
+ op.create_index(
43
+ op.f("ix_permission_updated_at"), "permission", ["updated_at"], unique=False
44
+ )
45
+ op.create_index(
46
+ op.f("ix_permission_updated_by"), "permission", ["updated_by"], unique=False
47
+ )
48
+
49
+ op.create_table(
50
+ "role",
51
+ sa.Column("id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
52
+ sa.Column("created_at", sa.DateTime(), nullable=True),
53
+ sa.Column("created_by", sqlmodel.sql.sqltypes.AutoString(), nullable=True),
54
+ sa.Column("updated_at", sa.DateTime(), nullable=True),
55
+ sa.Column("updated_by", sqlmodel.sql.sqltypes.AutoString(), nullable=True),
56
+ sa.Column("name", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
57
+ sa.Column("description", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
58
+ sa.PrimaryKeyConstraint("id"),
59
+ )
60
+ op.create_index(op.f("ix_role_name"), "role", ["name"], unique=True)
61
+ op.create_index(op.f("ix_role_created_at"), "role", ["created_at"], unique=False)
62
+ op.create_index(op.f("ix_role_created_by"), "role", ["created_by"], unique=False)
63
+ op.create_index(op.f("ix_role_updated_at"), "role", ["updated_at"], unique=False)
64
+ op.create_index(op.f("ix_role_updated_by"), "role", ["updated_by"], unique=False)
65
+
66
+ op.create_table(
67
+ "rolepermission",
68
+ sa.Column("id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
69
+ sa.Column("role_id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
70
+ sa.Column("permission_id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
71
+ sa.Column("created_at", sa.DateTime(), nullable=True),
72
+ sa.Column("created_by", sqlmodel.sql.sqltypes.AutoString(), nullable=True),
73
+ sa.PrimaryKeyConstraint("id"),
74
+ )
75
+ op.create_index(
76
+ op.f("ix_rolepermission_permission_id"),
77
+ "rolepermission",
78
+ ["permission_id"],
79
+ unique=False,
80
+ )
81
+ op.create_index(
82
+ op.f("ix_rolepermission_role_id"), "rolepermission", ["role_id"], unique=False
83
+ )
84
+
85
+ op.create_table(
86
+ "user",
87
+ sa.Column("id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
88
+ sa.Column("username", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
89
+ sa.Column("password", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
90
+ sa.Column("created_at", sa.DateTime(), nullable=False),
91
+ sa.Column("created_by", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
92
+ sa.Column("updated_at", sa.DateTime(), nullable=True),
93
+ sa.Column("updated_by", sqlmodel.sql.sqltypes.AutoString(), nullable=True),
94
+ sa.PrimaryKeyConstraint("id"),
95
+ )
96
+ op.create_index(op.f("ix_user_username"), "user", ["username"], unique=True)
97
+ op.create_index(op.f("ix_user_created_at"), "user", ["created_at"], unique=False)
98
+ op.create_index(op.f("ix_user_created_by"), "user", ["created_by"], unique=False)
99
+ op.create_index(op.f("ix_user_updated_at"), "user", ["updated_at"], unique=False)
100
+ op.create_index(op.f("ix_user_updated_by"), "user", ["updated_by"], unique=False)
101
+
102
+ op.create_table(
103
+ "userrole",
104
+ sa.Column("id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
105
+ sa.Column("user_id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
106
+ sa.Column("role_id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
107
+ sa.Column("created_at", sa.DateTime(), nullable=True),
108
+ sa.Column("created_by", sqlmodel.sql.sqltypes.AutoString(), nullable=True),
109
+ sa.PrimaryKeyConstraint("id"),
110
+ )
111
+ op.create_index(op.f("ix_userrole_role_id"), "userrole", ["role_id"], unique=False)
112
+ op.create_index(op.f("ix_userrole_user_id"), "userrole", ["user_id"], unique=False)
113
+
114
+ op.create_table(
115
+ "session",
116
+ sa.Column("id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
117
+ sa.Column("user_id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
118
+ sa.Column("token", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
119
+ sa.PrimaryKeyConstraint("id"),
120
+ )
121
+ op.create_index(op.f("ix_session_user_id"), "session", ["user_id"], unique=False)
122
+ op.create_index(op.f("ix_session_token"), "session", ["token"], unique=True)
123
+ # ### end Alembic commands ###
124
+
125
+
126
+ def downgrade() -> None:
127
+ # ### commands auto generated by Alembic - please adjust! ###
128
+ op.drop_index(op.f("ix_session_token"), table_name="session")
129
+ op.drop_index(op.f("ix_session_user_id"), table_name="session")
130
+ op.drop_table("session")
131
+
132
+ op.drop_index(op.f("ix_userrole_user_id"), table_name="userrole")
133
+ op.drop_index(op.f("ix_userrole_role_id"), table_name="userrole")
134
+ op.drop_table("userrole")
135
+
136
+ op.drop_index(op.f("ix_user_username"), table_name="user")
137
+ op.drop_index(op.f("ix_user_updated_by"), table_name="user")
138
+ op.drop_index(op.f("ix_user_updated_at"), table_name="user")
139
+ op.drop_index(op.f("ix_user_created_by"), table_name="user")
140
+ op.drop_index(op.f("ix_user_created_at"), table_name="user")
141
+ op.drop_table("user")
142
+
143
+ op.drop_index(op.f("ix_rolepermission_role_id"), table_name="rolepermission")
144
+ op.drop_index(op.f("ix_rolepermission_permission_id"), table_name="rolepermission")
145
+ op.drop_table("rolepermission")
146
+
147
+ op.drop_index(op.f("ix_role_name"), table_name="role")
148
+ op.drop_index(op.f("ix_role_updated_by"), table_name="role")
149
+ op.drop_index(op.f("ix_role_updated_at"), table_name="role")
150
+ op.drop_index(op.f("ix_role_created_by"), table_name="role")
151
+ op.drop_index(op.f("ix_role_created_at"), table_name="role")
152
+ op.drop_table("role")
153
+
154
+ op.drop_index(op.f("ix_permission_updated_by"), table_name="permission")
155
+ op.drop_index(op.f("ix_permission_updated_at"), table_name="permission")
156
+ op.drop_index(op.f("ix_permission_created_by"), table_name="permission")
157
+ op.drop_index(op.f("ix_permission_created_at"), table_name="permission")
158
+ op.drop_index(op.f("ix_permission_name"), table_name="permission")
159
+ op.drop_table("permission")
160
+ # ### end Alembic commands ###
@@ -1,6 +1,23 @@
1
- from my_app_name.schema.user import User
1
+ from my_app_name.schema.permission import Permission
2
+ from my_app_name.schema.role import Role, RolePermission
3
+ from my_app_name.schema.session import Session
4
+ from my_app_name.schema.user import User, UserRole
2
5
  from sqlalchemy import MetaData
3
6
 
4
7
  metadata = MetaData()
8
+
9
+ Permission.metadata = metadata
10
+ Permission.__table__.tometadata(metadata)
11
+
12
+ Role.metadata = metadata
13
+ Role.__table__.tometadata(metadata)
14
+ RolePermission.metadata = metadata
15
+ RolePermission.__table__.tometadata(metadata)
16
+
5
17
  User.metadata = metadata
6
18
  User.__table__.tometadata(metadata)
19
+ UserRole.metadata = metadata
20
+ UserRole.__table__.tometadata(metadata)
21
+
22
+ Session.metadata = metadata
23
+ Session.__table__.tometadata(metadata)