dmart 1.4.32__py3-none-any.whl → 1.4.35__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 (179) hide show
  1. {dmart_migrations → alembic}/env.py +3 -12
  2. bundler.py +0 -3
  3. {dmart-1.4.32.dist-info → dmart-1.4.35.dist-info}/METADATA +2 -4
  4. dmart-1.4.35.dist-info/RECORD +264 -0
  5. {dmart-1.4.32.dist-info → dmart-1.4.35.dist-info}/top_level.txt +2 -1
  6. dmart.py +47 -102
  7. main.py +4 -1
  8. pytests/api_user_models_erros_test.py +16 -0
  9. pytests/api_user_models_requests_test.py +98 -0
  10. pytests/archive_test.py +72 -0
  11. pytests/base_test.py +300 -0
  12. pytests/get_settings_test.py +14 -0
  13. pytests/json_to_db_migration_test.py +237 -0
  14. pytests/service_test.py +26 -0
  15. pytests/test_info.py +55 -0
  16. pytests/test_status.py +15 -0
  17. dmart-1.4.32.dist-info/RECORD +0 -278
  18. dmart_migrations/README +0 -1
  19. dmart_migrations/__pycache__/__init__.cpython-314.pyc +0 -0
  20. dmart_migrations/__pycache__/env.cpython-314.pyc +0 -0
  21. dmart_migrations/alembic.ini +0 -117
  22. dmart_migrations/notes.txt +0 -11
  23. dmart_migrations/script.py.mako +0 -28
  24. dmart_migrations/versions/__pycache__/0f3d2b1a7c21_add_authz_materialized_views.cpython-314.pyc +0 -0
  25. dmart_migrations/versions/__pycache__/10d2041b94d4_last_checksum_history.cpython-314.pyc +0 -0
  26. dmart_migrations/versions/__pycache__/1cf4e1ee3cb8_ext_permission_with_filter_fields_values.cpython-314.pyc +0 -0
  27. dmart_migrations/versions/__pycache__/26bfe19b49d4_rm_failedloginattempts.cpython-314.pyc +0 -0
  28. dmart_migrations/versions/__pycache__/3c8bca2219cc_add_otp_table.cpython-314.pyc +0 -0
  29. dmart_migrations/versions/__pycache__/6675fd9dfe42_remove_unique_from_sessions_table.cpython-314.pyc +0 -0
  30. dmart_migrations/versions/__pycache__/71bc1df82e6a_adding_user_last_login_at.cpython-314.pyc +0 -0
  31. dmart_migrations/versions/__pycache__/74288ccbd3b5_initial.cpython-314.pyc +0 -0
  32. dmart_migrations/versions/__pycache__/7520a89a8467_rm_activesession_table.cpython-314.pyc +0 -0
  33. dmart_migrations/versions/__pycache__/848b623755a4_make_created_nd_updated_at_required.cpython-314.pyc +0 -0
  34. dmart_migrations/versions/__pycache__/8640dcbebf85_add_notes_to_users.cpython-314.pyc +0 -0
  35. dmart_migrations/versions/__pycache__/91c94250232a_adding_fk_on_owner_shortname.cpython-314.pyc +0 -0
  36. dmart_migrations/versions/__pycache__/98ecd6f56f9a_ext_meta_with_owner_group_shortname.cpython-314.pyc +0 -0
  37. dmart_migrations/versions/__pycache__/9aae9138c4ef_indexing_created_at_updated_at.cpython-314.pyc +0 -0
  38. dmart_migrations/versions/__pycache__/b53f916b3f6d_json_to_jsonb.cpython-314.pyc +0 -0
  39. dmart_migrations/versions/__pycache__/eb5f1ec65156_adding_user_locked_to_device.cpython-314.pyc +0 -0
  40. dmart_migrations/versions/__pycache__/f7a4949eed19_adding_query_policies_to_meta.cpython-314.pyc +0 -0
  41. {cxb/client → alembic}/__init__.py +0 -0
  42. {dmart_migrations → alembic/scripts}/__init__.py +0 -0
  43. {dmart_migrations → alembic}/scripts/calculate_checksums.py +0 -0
  44. {dmart_migrations → alembic}/scripts/migration_f7a4949eed19.py +0 -0
  45. {dmart_migrations → alembic}/versions/0f3d2b1a7c21_add_authz_materialized_views.py +0 -0
  46. {dmart_migrations → alembic}/versions/10d2041b94d4_last_checksum_history.py +0 -0
  47. {dmart_migrations → alembic}/versions/1cf4e1ee3cb8_ext_permission_with_filter_fields_values.py +0 -0
  48. {dmart_migrations → alembic}/versions/26bfe19b49d4_rm_failedloginattempts.py +0 -0
  49. {dmart_migrations → alembic}/versions/3c8bca2219cc_add_otp_table.py +0 -0
  50. {dmart_migrations → alembic}/versions/6675fd9dfe42_remove_unique_from_sessions_table.py +0 -0
  51. {dmart_migrations → alembic}/versions/71bc1df82e6a_adding_user_last_login_at.py +0 -0
  52. {dmart_migrations → alembic}/versions/74288ccbd3b5_initial.py +0 -0
  53. {dmart_migrations → alembic}/versions/7520a89a8467_rm_activesession_table.py +0 -0
  54. {dmart_migrations → alembic}/versions/848b623755a4_make_created_nd_updated_at_required.py +0 -0
  55. {dmart_migrations → alembic}/versions/8640dcbebf85_add_notes_to_users.py +0 -0
  56. {dmart_migrations → alembic}/versions/91c94250232a_adding_fk_on_owner_shortname.py +0 -0
  57. {dmart_migrations → alembic}/versions/98ecd6f56f9a_ext_meta_with_owner_group_shortname.py +0 -0
  58. {dmart_migrations → alembic}/versions/9aae9138c4ef_indexing_created_at_updated_at.py +0 -0
  59. {dmart_migrations/scripts → alembic/versions}/__init__.py +0 -0
  60. {dmart_migrations → alembic}/versions/b53f916b3f6d_json_to_jsonb.py +0 -0
  61. {dmart_migrations → alembic}/versions/eb5f1ec65156_adding_user_locked_to_device.py +0 -0
  62. {dmart_migrations → alembic}/versions/f7a4949eed19_adding_query_policies_to_meta.py +0 -0
  63. /cxb/{client/assets → assets}/@codemirror-Rn7_6DkE.js +0 -0
  64. /cxb/{client/assets → assets}/@edraj-CS4NwVbD.js +0 -0
  65. /cxb/{client/assets → assets}/@floating-ui-BwwcF-xh.js +0 -0
  66. /cxb/{client/assets → assets}/@formatjs-yKEsAtjs.js +0 -0
  67. /cxb/{client/assets → assets}/@fortawesome-DRW1UCdr.js +0 -0
  68. /cxb/{client/assets → assets}/@jsonquerylang-laKNoFFq.js +0 -0
  69. /cxb/{client/assets → assets}/@lezer-za4Q-8Ew.js +0 -0
  70. /cxb/{client/assets → assets}/@marijn-DXwl3gUT.js +0 -0
  71. /cxb/{client/assets → assets}/@popperjs-l0sNRNKZ.js +0 -0
  72. /cxb/{client/assets → assets}/@replit--ERk53eB.js +0 -0
  73. /cxb/{client/assets → assets}/@roxi-CGMFK4i8.js +0 -0
  74. /cxb/{client/assets → assets}/@typewriter-cCzskkIv.js +0 -0
  75. /cxb/{client/assets → assets}/@zerodevx-BlBZjKxu.js +0 -0
  76. /cxb/{client/assets → assets}/@zerodevx-CVEpe6WZ.css +0 -0
  77. /cxb/{client/assets → assets}/BreadCrumbLite-DAhOx38v.js +0 -0
  78. /cxb/{client/assets → assets}/EntryRenderer-25YDhRen.js +0 -0
  79. /cxb/{client/assets → assets}/EntryRenderer-DXytdFp9.css +0 -0
  80. /cxb/{client/assets → assets}/ListView-BpAycA2h.js +0 -0
  81. /cxb/{client/assets → assets}/ListView-U8of-_c-.css +0 -0
  82. /cxb/{client/assets → assets}/Prism--hMplq-p.js +0 -0
  83. /cxb/{client/assets → assets}/Prism-Uh6uStUw.css +0 -0
  84. /cxb/{client/assets → assets}/Table2Cols-BsbwicQm.js +0 -0
  85. /cxb/{client/assets → assets}/_..-BvT6vdHa.css +0 -0
  86. /cxb/{client/assets → assets}/_...404_-fuLH_rX9.js +0 -0
  87. /cxb/{client/assets → assets}/_...fallback_-Ba_NLmAE.js +0 -0
  88. /cxb/{client/assets → assets}/_module-Bfk8MiCs.js +0 -0
  89. /cxb/{client/assets → assets}/_module-CEW0D5oI.js +0 -0
  90. /cxb/{client/assets → assets}/_module-Dgq0ZVtz.js +0 -0
  91. /cxb/{client/assets → assets}/ajv-Cpj98o6Y.js +0 -0
  92. /cxb/{client/assets → assets}/axios-CG2WSiiR.js +0 -0
  93. /cxb/{client/assets → assets}/clsx-B-dksMZM.js +0 -0
  94. /cxb/{client/assets → assets}/codemirror-wrapped-line-indent-DPhKvljI.js +0 -0
  95. /cxb/{client/assets → assets}/compare-C3AjiGFR.js +0 -0
  96. /cxb/{client/assets → assets}/compute-scroll-into-view-Bl8rNFhg.js +0 -0
  97. /cxb/{client/assets → assets}/consolite-DlCuI0F9.js +0 -0
  98. /cxb/{client/assets → assets}/crelt-C8TCjufn.js +0 -0
  99. /cxb/{client/assets → assets}/date-fns-l0sNRNKZ.js +0 -0
  100. /cxb/{client/assets → assets}/deepmerge-rn4rBaHU.js +0 -0
  101. /cxb/{client/assets → assets}/dmart_services-AL6-IdDE.js +0 -0
  102. /cxb/{client/assets → assets}/downloadFile-D08i0YDh.js +0 -0
  103. /cxb/{client/assets → assets}/easy-signal-BiPFIK3O.js +0 -0
  104. /cxb/{client/assets → assets}/esm-env-rsSWfq8L.js +0 -0
  105. /cxb/{client/assets → assets}/export-OF_rTiXu.js +0 -0
  106. /cxb/{client/assets → assets}/fast-deep-equal-l0sNRNKZ.js +0 -0
  107. /cxb/{client/assets → assets}/fast-diff-C-IidNf4.js +0 -0
  108. /cxb/{client/assets → assets}/fast-uri-l0sNRNKZ.js +0 -0
  109. /cxb/{client/assets → assets}/flowbite-svelte-BLvjb-sa.js +0 -0
  110. /cxb/{client/assets → assets}/flowbite-svelte-CD54FDqW.css +0 -0
  111. /cxb/{client/assets → assets}/flowbite-svelte-icons-BI8GVhw_.js +0 -0
  112. /cxb/{client/assets → assets}/github-slugger-CQ4oX9Ud.js +0 -0
  113. /cxb/{client/assets → assets}/global-igKv-1g9.js +0 -0
  114. /cxb/{client/assets → assets}/hookar-BMRD9G9H.js +0 -0
  115. /cxb/{client/assets → assets}/immutable-json-patch-DtRO2E_S.js +0 -0
  116. /cxb/{client/assets → assets}/import-1vE3gBat.js +0 -0
  117. /cxb/{client/assets → assets}/index-B-eTh-ZX.js +0 -0
  118. /cxb/{client/assets → assets}/index-BVyxzKtH.js +0 -0
  119. /cxb/{client/assets → assets}/index-BdeNM69f.js +0 -0
  120. /cxb/{client/assets → assets}/index-C6cPO4op.js +0 -0
  121. /cxb/{client/assets → assets}/index-CC-A1ipE.js +0 -0
  122. /cxb/{client/assets → assets}/index-CTxJ-lDp.js +0 -0
  123. /cxb/{client/assets → assets}/index-Cd-F5j_k.js +0 -0
  124. /cxb/{client/assets → assets}/index-D742rwaM.js +0 -0
  125. /cxb/{client/assets → assets}/index-DTfhnhwd.js +0 -0
  126. /cxb/{client/assets → assets}/index-DdXRK7n9.js +0 -0
  127. /cxb/{client/assets → assets}/index-DtiCmB4o.js +0 -0
  128. /cxb/{client/assets → assets}/index-NBrXBlLA.css +0 -0
  129. /cxb/{client/assets → assets}/index-ac-Buu_H.js +0 -0
  130. /cxb/{client/assets → assets}/index-iYkH7C67.js +0 -0
  131. /cxb/{client/assets → assets}/info-B986lRiM.js +0 -0
  132. /cxb/{client/assets → assets}/intl-messageformat-Dc5UU-HB.js +0 -0
  133. /cxb/{client/assets → assets}/jmespath-l0sNRNKZ.js +0 -0
  134. /cxb/{client/assets → assets}/json-schema-traverse-l0sNRNKZ.js +0 -0
  135. /cxb/{client/assets → assets}/json-source-map-DRgZidqy.js +0 -0
  136. /cxb/{client/assets → assets}/jsonpath-plus-l0sNRNKZ.js +0 -0
  137. /cxb/{client/assets → assets}/jsonrepair-B30Dx381.js +0 -0
  138. /cxb/{client/assets → assets}/lodash-es-DZVAA2ox.js +0 -0
  139. /cxb/{client/assets → assets}/marked-DKjyhwJX.js +0 -0
  140. /cxb/{client/assets → assets}/marked-gfm-heading-id-U5zO829x.js +0 -0
  141. /cxb/{client/assets → assets}/marked-mangle-CDMeiHC6.js +0 -0
  142. /cxb/{client/assets → assets}/memoize-one-BdPwpGay.js +0 -0
  143. /cxb/{client/assets → assets}/natural-compare-lite-Bg2Xcf-o.js +0 -0
  144. /cxb/{client/assets → assets}/pagination-svelte-D5CyoiE_.js +0 -0
  145. /cxb/{client/assets → assets}/pagination-svelte-v10nAbbM.css +0 -0
  146. /cxb/{client/assets → assets}/plantuml-encoder-C47mzt9T.js +0 -0
  147. /cxb/{client/assets → assets}/prismjs-DTUiLGJu.js +0 -0
  148. /cxb/{client/assets → assets}/profile-BUf-tKMe.js +0 -0
  149. /cxb/{client/assets → assets}/query-CNmXTsgf.js +0 -0
  150. /cxb/{client/assets → assets}/queryHelpers-C9iBWwqe.js +0 -0
  151. /cxb/{client/assets → assets}/scroll-into-view-if-needed-KR58zyjF.js +0 -0
  152. /cxb/{client/assets → assets}/spaces-0oyGvpii.js +0 -0
  153. /cxb/{client/assets → assets}/style-mod-Bs6eFhZE.js +0 -0
  154. /cxb/{client/assets → assets}/svelte-B2XmcTi_.js +0 -0
  155. /cxb/{client/assets → assets}/svelte-awesome-COLlx0DN.css +0 -0
  156. /cxb/{client/assets → assets}/svelte-awesome-DhnMA6Q_.js +0 -0
  157. /cxb/{client/assets → assets}/svelte-datatables-net-CY7LBj6I.js +0 -0
  158. /cxb/{client/assets → assets}/svelte-floating-ui-BlS3sOAQ.js +0 -0
  159. /cxb/{client/assets → assets}/svelte-i18n-CT2KkQaN.js +0 -0
  160. /cxb/{client/assets → assets}/svelte-jsoneditor-BzfX6Usi.css +0 -0
  161. /cxb/{client/assets → assets}/svelte-jsoneditor-CUGSvWId.js +0 -0
  162. /cxb/{client/assets → assets}/svelte-select-CegQKzqH.css +0 -0
  163. /cxb/{client/assets → assets}/svelte-select-CjHAt_85.js +0 -0
  164. /cxb/{client/assets → assets}/tailwind-merge-CJvxXMcu.js +0 -0
  165. /cxb/{client/assets → assets}/tailwind-variants-Cj20BoQ3.js +0 -0
  166. /cxb/{client/assets → assets}/toast-B9WDyfyI.js +0 -0
  167. /cxb/{client/assets → assets}/tslib-pJfR_DrR.js +0 -0
  168. /cxb/{client/assets → assets}/typewriter-editor-DkTVIJdm.js +0 -0
  169. /cxb/{client/assets → assets}/user-DeK_NB5v.js +0 -0
  170. /cxb/{client/assets → assets}/vanilla-picker-l5rcX3cq.js +0 -0
  171. /cxb/{client/assets → assets}/w3c-keyname-Vcq4gwWv.js +0 -0
  172. /cxb/{client/config.json → config.json} +0 -0
  173. /cxb/{client/config.sample.json → config.sample.json} +0 -0
  174. /cxb/{client/favicon.ico → favicon.ico} +0 -0
  175. /cxb/{client/favicon.png → favicon.png} +0 -0
  176. /cxb/{client/index.html → index.html} +0 -0
  177. {dmart-1.4.32.dist-info → dmart-1.4.35.dist-info}/WHEEL +0 -0
  178. {dmart-1.4.32.dist-info → dmart-1.4.35.dist-info}/entry_points.txt +0 -0
  179. {dmart_migrations/versions → pytests}/__init__.py +0 -0
@@ -1,9 +1,3 @@
1
- import sys
2
- import os
3
- # Add the parent directory (backend) to sys.path to allow importing modules from it
4
- # This is done here to avoid adding it to PYTHONPATH globally which causes shadowing of 'alembic' library
5
- sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
6
-
7
1
  from logging.config import fileConfig
8
2
 
9
3
  from sqlalchemy import engine_from_config
@@ -25,12 +19,9 @@ config = context.config
25
19
  if config.config_file_name is not None:
26
20
  fileConfig(config.config_file_name)
27
21
 
28
- if "sqlite" in settings.database_driver:
29
- connection_string = f"sqlite:///{settings.database_name}"
30
- else:
31
- driver = settings.database_driver.replace('+asyncpg', '+psycopg')
32
- database_connection_string = f"{driver}://{settings.database_username}:{settings.database_password}@{settings.database_host}:{settings.database_port}"
33
- connection_string = f"{database_connection_string}/{settings.database_name}"
22
+ driver = settings.database_driver.replace('+asyncpg', '+psycopg')
23
+ database_connection_string = f"{driver}://{settings.database_username}:{settings.database_password}@{settings.database_host}:{settings.database_port}"
24
+ connection_string = f"{database_connection_string}/{settings.database_name}"
34
25
  config.set_main_option('sqlalchemy.url', connection_string)
35
26
 
36
27
  # add your model's MetaData object here
bundler.py CHANGED
@@ -36,12 +36,9 @@ args = [
36
36
  '--runtime-tmpdir=.',
37
37
  '--distpath=.',
38
38
  '--add-data=./info.json:.',
39
- '--add-data=dmart_migrations:dmart_migrations',
40
- '--add-data=alembic.ini:.',
41
39
  '--noconfirm',
42
40
  '--collect-submodules=concurrent_log_handler',
43
41
  '--collect-submodules=pythonjsonlogger',
44
- '--collect-all=alembic',
45
42
  '--clean',
46
43
  ]
47
44
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dmart
3
- Version: 1.4.32
3
+ Version: 1.4.35
4
4
  Requires-Python: >=3.11
5
5
  Requires-Dist: fastapi
6
6
  Requires-Dist: pydantic
@@ -18,9 +18,9 @@ Requires-Dist: asgi-correlation-id
18
18
  Requires-Dist: pydantic-settings
19
19
  Requires-Dist: fastapi-sso
20
20
  Requires-Dist: sqlmodel
21
- Requires-Dist: alembic
22
21
  Requires-Dist: psycopg[binary]
23
22
  Requires-Dist: greenlet
23
+ Requires-Dist: alembic
24
24
  Requires-Dist: jinja2
25
25
  Requires-Dist: pytest-cov
26
26
  Requires-Dist: argon2-cffi
@@ -34,7 +34,6 @@ Requires-Dist: jinja2; extra == "extra"
34
34
  Requires-Dist: duckdb; extra == "extra"
35
35
  Requires-Dist: segno; extra == "extra"
36
36
  Requires-Dist: jq; extra == "extra"
37
- Requires-Dist: alembic; extra == "extra"
38
37
  Provides-Extra: plugins
39
38
  Requires-Dist: weasyprint; extra == "plugins"
40
39
  Requires-Dist: pypdf; extra == "plugins"
@@ -52,7 +51,6 @@ Requires-Dist: jinja2; extra == "all"
52
51
  Requires-Dist: duckdb; extra == "all"
53
52
  Requires-Dist: segno; extra == "all"
54
53
  Requires-Dist: jq; extra == "all"
55
- Requires-Dist: alembic; extra == "all"
56
54
  Requires-Dist: weasyprint; extra == "all"
57
55
  Requires-Dist: pypdf; extra == "all"
58
56
  Requires-Dist: dicttoxml; extra == "all"
@@ -0,0 +1,264 @@
1
+ bundler.py,sha256=so8ZJResb1PcOH5vboa_mpFAdYr_T8u8DbbFXd570Lg,1704
2
+ data_generator.py,sha256=CnE-VHEeX7-lAXtqCgbRqR9WHjTuOgeiZcviYrHAmho,2287
3
+ dmart.py,sha256=Lho5lhQN_xmLeoR5_lXpavCNHGvt2ktazjEk056JkFE,22028
4
+ get_settings.py,sha256=Sbe2WCoiK398E7HY4SNLfDN_GmE8knR4M-YJWF31jcg,153
5
+ main.py,sha256=b7rsovH-OM9ZwzSEi6uycZuAz-UwcY_0fekqj5_NkGQ,19805
6
+ migrate.py,sha256=hn1MZoVby_Jjqhc7y3CrLcGD619QmVZv3PONNvO7VKQ,665
7
+ password_gen.py,sha256=xjx8wi105ZYvhLBBQj7_rugACpxifGXHse6f7YlGXWQ,196
8
+ run_notification_campaign.py,sha256=ZCvHfaimK4W6q4XuHs2r6wavMGipYYw4aUkNlxmGUd8,2652
9
+ scheduled_notification_handler.py,sha256=m26TryqHuvXR5PUPvzY9nFnpJpfbsuRjc_Q6wHdxvE8,4643
10
+ schema_migration.py,sha256=a1w3c-fSm95MVWFzobgy0AxIbhbzMDSfD46easTmwKE,6132
11
+ schema_modulate.py,sha256=vB7NxvqghqNpFe__p0ll03WsvNftzxBbQ6UXB2UfxNU,6454
12
+ set_admin_passwd.py,sha256=Ei8wnoJ_UDHIXmMb-E_dd_NqyM6Gt5AgJPJ4fAxARXI,1950
13
+ sync.py,sha256=FlmubtlnFaxtZkbRV1-eyS_Sx5KBRvWyIZjvd0Tiar4,7339
14
+ websocket.py,sha256=Q8WUTvOTBHKP5xy5wim8yn0t-BfjrPwx7J_6vbzAm1A,7576
15
+ alembic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
+ alembic/env.py,sha256=z12UKhorKSOKEovOCQOwRjfR_tup4VeRlhcB1UPk3Xw,2700
17
+ alembic/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
+ alembic/scripts/calculate_checksums.py,sha256=v2NLEvReA9V3noJE-BWANgKDdhc8Mqg1ZmJJ8nc8sGI,3443
19
+ alembic/scripts/migration_f7a4949eed19.py,sha256=oUXuxjU4MbVafm4S-xu5J_4apHqW6hQZ8ftpJtCtM28,1462
20
+ alembic/versions/0f3d2b1a7c21_add_authz_materialized_views.py,sha256=70vrPfhMHVHhw1l7KNQpvCUU76XZfvGcPlrXOeU4FHU,2599
21
+ alembic/versions/10d2041b94d4_last_checksum_history.py,sha256=FYjyzE5Xi6bn9LUtxLKFnQOKhg4GZOrTkpqtmlCnY6Y,2860
22
+ alembic/versions/1cf4e1ee3cb8_ext_permission_with_filter_fields_values.py,sha256=taaFTkTaFfLfj7QUUfIdcojvbOdjut_dWtrIvQUN7-4,921
23
+ alembic/versions/26bfe19b49d4_rm_failedloginattempts.py,sha256=-Roftn8OSUz7kfR3yMI02rulyvnH46W0WpJfDQ5xAdk,1471
24
+ alembic/versions/3c8bca2219cc_add_otp_table.py,sha256=f-YSxx1iLA0iHWukq1VnngFmiiYQyEzowicox0-wtbY,1125
25
+ alembic/versions/6675fd9dfe42_remove_unique_from_sessions_table.py,sha256=yP40IHwtzFAAUid_VeeCkt_9F2RszMYBjNKx2mDTKNw,1037
26
+ alembic/versions/71bc1df82e6a_adding_user_last_login_at.py,sha256=LINO2hWUEFmsTspupd8AxgUS6tNJFNgGC5do1QPMQ1E,1486
27
+ alembic/versions/74288ccbd3b5_initial.py,sha256=hZ1w5mqVKSO13J1O4zcTccDJBk2c-cmIB0AUx1KLlLI,13988
28
+ alembic/versions/7520a89a8467_rm_activesession_table.py,sha256=4VYv9tCXkTQNaXPVvjdsKTiw093KkBBUHNSiWdZtqtA,1305
29
+ alembic/versions/848b623755a4_make_created_nd_updated_at_required.py,sha256=o106xd-apT8ZAXdVCjX76o7VuqRQNkIl0V4f41m5j2E,5375
30
+ alembic/versions/8640dcbebf85_add_notes_to_users.py,sha256=XjfW2Lc0-xoRGB2qfdzDstw7Caaev6JhqRNYV_sIqgc,813
31
+ alembic/versions/91c94250232a_adding_fk_on_owner_shortname.py,sha256=F9FDF2qyeqvOx1gkYq5HQMkVCH1QrXciYSHVxijsSSU,4024
32
+ alembic/versions/98ecd6f56f9a_ext_meta_with_owner_group_shortname.py,sha256=S466VE3jsxXDEpTKyhIN06uutM0jI7zYHTWIYvU_pJw,2579
33
+ alembic/versions/9aae9138c4ef_indexing_created_at_updated_at.py,sha256=xrqfJB5cER0PYi1torwkgsbBBjDeeM6dyj4pu-quphk,3662
34
+ alembic/versions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
+ alembic/versions/b53f916b3f6d_json_to_jsonb.py,sha256=LPnevQjbjs0KrwqxYHtGUC6mSBBsUpiCBnwD-FN2x50,24840
36
+ alembic/versions/eb5f1ec65156_adding_user_locked_to_device.py,sha256=Z9skCus52jg_xV5a7JVYK3IenNlvsdMKIFf1H5POst0,1030
37
+ alembic/versions/f7a4949eed19_adding_query_policies_to_meta.py,sha256=LA4rx3u0Ei5m4OcSsVYHBsGMeKOJdx8G88yK1kBLFys,2307
38
+ api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
+ api/info/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
+ api/info/router.py,sha256=sQZZor7A-uDzsJX39aqEA7bMZOJ-WTitYeFvVNWfaHw,3938
41
+ api/managed/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
+ api/managed/router.py,sha256=0xfJ3NXV3XHyG8yWLEECBJt-XppymOxYuMDvQJdO1MI,50865
43
+ api/managed/utils.py,sha256=IqgFVHVfNubYOx5i9YoQjVqbUbaveIrqfOfTFvV42BA,74227
44
+ api/public/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
+ api/public/router.py,sha256=TrraWs2LGL_c_JRDbvS8OHm3fJ-ZKF7o4El7wvjV4Mk,24753
46
+ api/qr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
47
+ api/qr/router.py,sha256=Ru7UT_iQS6mFwE1bCPPrusSQfFgoV_u6pjZJ0gArE7g,3870
48
+ api/user/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
49
+ api/user/router.py,sha256=B59HQPwmwgEfYIlF3_XBNaVBlT4PWqMJiUlUvEN69Vo,51719
50
+ api/user/service.py,sha256=-iQpcBVPTDiLE_xOf87Ni0oSQDtmALAXEwU4IgSvnJk,8463
51
+ api/user/model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
+ api/user/model/errors.py,sha256=rhcIcbAIk_7rs5lxdgcsf7SWFGmC9QLsgc67x7S6CKA,299
53
+ api/user/model/requests.py,sha256=MazMirg7wQoUm4qvnm_EAB_gJIy3YxvYYqNyU3fZJc0,5025
54
+ api/user/model/responses.py,sha256=0vbigspq_aBd1JS6hEm13BnG7Hm7EIiWBZ6xz3d5hmE,202
55
+ config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
56
+ config/channels.json,sha256=GepystGi0h_1fuakC_gdIc-YYxyy-a4TI619ygIpyyM,156
57
+ config/notification.json,sha256=esrOaMUIqfcCHB0Tawp3t4cu7DQAA15X12OS-Gyenb0,361
58
+ cxb/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
59
+ cxb/config.json,sha256=WvhCcnJ9-uQ2raPuRBRSGO3iD7Hcaf8Cy49EXUu3KQw,358
60
+ cxb/config.sample.json,sha256=fTYLbnTiUdbT_F7rcwI7CLSZ_KoX8EflfuyswRGW2x0,355
61
+ cxb/favicon.ico,sha256=CD2FYyYYFNAbH7lGPnM5-2asMmhf-kwitAp99Kh0Wmc,4286
62
+ cxb/favicon.png,sha256=gbSWS2UiKrUcy5Jt4gcncDrE5yvfAS00OgYzdNxPxlk,4164
63
+ cxb/index.html,sha256=J_7uaGXP02rNLSvJ4Poyr5G7TZt8W0Br-EWQlYEeXi0,1622
64
+ cxb/assets/@codemirror-Rn7_6DkE.js,sha256=lE9KsREWfszCrh0SBu7CKi3k1OiDzBrIeNO_S5PYRcM,342674
65
+ cxb/assets/@edraj-CS4NwVbD.js,sha256=zndm--w-VH0vIAjb2K_MHp5oSC-khzxT8Evj1Dl_2-c,9293
66
+ cxb/assets/@floating-ui-BwwcF-xh.js,sha256=K4lsJw_hrkV0vq1uguBTS_GxONRbsFtlBjX4pagaOwg,17129
67
+ cxb/assets/@formatjs-yKEsAtjs.js,sha256=bwa2AS3AZNFoUsMafb6wKHA15W9GldY3Kt61ZObX02U,33632
68
+ cxb/assets/@fortawesome-DRW1UCdr.js,sha256=XxmEJ7SxFU5lm4fFq2B0t6oAFpvInLfZbwrds7T9kM8,18810
69
+ cxb/assets/@jsonquerylang-laKNoFFq.js,sha256=z3m86cWxHoliU-BL-mn-U7ob8B1cV1lzyC-Q7DITo2w,8464
70
+ cxb/assets/@lezer-za4Q-8Ew.js,sha256=6kTYHAkwA6DYI_m9taUHq0iqetL5AbmBt43KB0s2Pxg,54631
71
+ cxb/assets/@marijn-DXwl3gUT.js,sha256=ONjPnhK4okY91E_qSZTqZuKrYU97xaqPdt5Vde2cgcI,2312
72
+ cxb/assets/@popperjs-l0sNRNKZ.js,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
73
+ cxb/assets/@replit--ERk53eB.js,sha256=w2wSGTctSSsvB0PLKCbBVJUc4LRqyXbAFfApDw8DrPI,4586
74
+ cxb/assets/@roxi-CGMFK4i8.js,sha256=a9e-nCrgDd2UQieodqFb8O1oMsoJ9GGg9pZ2pFG7vSE,49989
75
+ cxb/assets/@typewriter-cCzskkIv.js,sha256=kyXdd1BwqHKx7CIB8Up_1AblBsI5ViLxkwjWN-bzcfw,21047
76
+ cxb/assets/@zerodevx-BlBZjKxu.js,sha256=u3olMch61ywj4FnmXTSswD1myRH_rHI0dQMCNogCAH0,3883
77
+ cxb/assets/@zerodevx-CVEpe6WZ.css,sha256=BkcVDS4u4ljfIXhn6xv4h5Pld01evCI_ebMKCxpK8i4,1976
78
+ cxb/assets/BreadCrumbLite-DAhOx38v.js,sha256=_zhm_Sls-tayWdYobXeXCA6uxNSrVsLnAhfyPCTyHH8,1949
79
+ cxb/assets/EntryRenderer-25YDhRen.js,sha256=iUbBmlD02BkiMNjS68jt8sHtzVnwAsuvadVDXBwVBS8,64047
80
+ cxb/assets/EntryRenderer-DXytdFp9.css,sha256=8J5fh7_foC06CVV6Qk7UYvxXKqTrFOqQ4isbyJ-gABY,496
81
+ cxb/assets/ListView-BpAycA2h.js,sha256=MKEI90xQ07Cmyo6KuJLR7yxOi5CQt0cpU7kCwTMxtVM,134226
82
+ cxb/assets/ListView-U8of-_c-.css,sha256=sPIUBfAsMEwhNqvGgGf_oD09XUR5hT8PWk_OtVEwMgI,1288
83
+ cxb/assets/Prism--hMplq-p.js,sha256=wzk_GRGPAnTHIenvdCuh_qqHFCeCKco2OCoFinBUesw,587
84
+ cxb/assets/Prism-Uh6uStUw.css,sha256=_wHCkOjMWX__hXLr6MjadiXCj2dBxIQFAhkSLAhHwSA,6165
85
+ cxb/assets/Table2Cols-BsbwicQm.js,sha256=w6w37qzrdh3f-8waIUDnwPk0MDa8dJBrrG0Z3A8uAAk,1410
86
+ cxb/assets/_..-BvT6vdHa.css,sha256=u-3Pj3A2tQeUNBIItE_qki2Lk4GBISmHRs7957cGP30,275
87
+ cxb/assets/_...404_-fuLH_rX9.js,sha256=9oGBvAECq9eMcTAZG-cznYAXcM2WaBu4G5wPoTt53uY,684
88
+ cxb/assets/_...fallback_-Ba_NLmAE.js,sha256=leHVZijlVjIaqzYUCCTIFDFrFsVcS2NsxgVTW58OhBg,123
89
+ cxb/assets/_module-Bfk8MiCs.js,sha256=Zh6tAXTmBj4kvrs5ojFFC6N45pasJviz6lHz5TEy3as,3793
90
+ cxb/assets/_module-CEW0D5oI.js,sha256=B2uyRT7DxaK10V58YhhQNZtV-8bkmV9EbAK6WZhHwgw,7899
91
+ cxb/assets/_module-Dgq0ZVtz.js,sha256=-_CkmFKVsif9U2B0uVLfmXuDp3GJS2iY4sAP1y_2rvQ,11226
92
+ cxb/assets/ajv-Cpj98o6Y.js,sha256=liU3m63UhJYQ3-bBVFPN8MAHEmTJDu8Xcwf6wJTSqmw,236
93
+ cxb/assets/axios-CG2WSiiR.js,sha256=URKIJZfepkPrQwK1aPXLhg4f5cGLhk6c0tVUS5eFFB0,36287
94
+ cxb/assets/clsx-B-dksMZM.js,sha256=x7hDvCu6RhEQ5d35FtnEAYCjg4BM5zZYcw7EblGW0v0,374
95
+ cxb/assets/codemirror-wrapped-line-indent-DPhKvljI.js,sha256=kn9kuXsyPkjimYpjkc3KyXSOral3p4v3gbQw5SbNMMY,1591
96
+ cxb/assets/compare-C3AjiGFR.js,sha256=L2wU3DxEeQq-gheMWChs4IX2Las1HLWxAF4HWcpvSZo,8744
97
+ cxb/assets/compute-scroll-into-view-Bl8rNFhg.js,sha256=5DonV_EZ7Iwbtu8sT17P3aoourk-WRBAdlAsaNh_mDA,2943
98
+ cxb/assets/consolite-DlCuI0F9.js,sha256=oSh3Gbte0Iogkiczrf8Ei0pWKu75WAakY33Z9Kix7GA,3079
99
+ cxb/assets/crelt-C8TCjufn.js,sha256=v5UZ6-BdG7hN-EZniG3z0-gaMx1rOdzsjqIiNrRUp8s,623
100
+ cxb/assets/date-fns-l0sNRNKZ.js,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
101
+ cxb/assets/deepmerge-rn4rBaHU.js,sha256=mq9vJj-3sJY_n_VL9dyNkcgD9eD-F7d0vuka-mPJUnY,1675
102
+ cxb/assets/dmart_services-AL6-IdDE.js,sha256=RyyNwg7hpN4eTONXb4NOoQ9QTDx5meSSuSMprYkk7m8,1783
103
+ cxb/assets/downloadFile-D08i0YDh.js,sha256=pdNEGMBhyU01Y_vVX1OEzxWC7Ktg0T2vwW6VfdYjf0Q,247
104
+ cxb/assets/easy-signal-BiPFIK3O.js,sha256=2J65d_BBehKW7Hb64qwX3iCZDes2LsAjYlsRHuJTEHc,108
105
+ cxb/assets/esm-env-rsSWfq8L.js,sha256=scv4WZ555272218bU3lLaHkEQ7dl-wFrvbn0MlQAqKA,27
106
+ cxb/assets/export-OF_rTiXu.js,sha256=VjmlbOOhE2eGtbPQSbaz395EFtoMJLThpTtFze7Hcf8,4146
107
+ cxb/assets/fast-deep-equal-l0sNRNKZ.js,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
108
+ cxb/assets/fast-diff-C-IidNf4.js,sha256=3QejtPCU1VzP2FM7RY5yFvp4QseK438MIrhUa33u7ko,7785
109
+ cxb/assets/fast-uri-l0sNRNKZ.js,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
110
+ cxb/assets/flowbite-svelte-BLvjb-sa.js,sha256=vRreerVWabyzTubQPDBuxDvgV7M8RlDWIKocxzMQiQ0,245889
111
+ cxb/assets/flowbite-svelte-CD54FDqW.css,sha256=n1HDAUq6e-IogOmdk3gYW4E8TK-yE3Gh8wgp5FdOn90,63
112
+ cxb/assets/flowbite-svelte-icons-BI8GVhw_.js,sha256=cp8Lg64HqWR8_4XS3q4xOAV3hztu4BsJPBhgysMRTtU,80766
113
+ cxb/assets/github-slugger-CQ4oX9Ud.js,sha256=1sye3A-ozGOvdFYnerReUKpwwAeCjBilw-ZMIbxgRAI,8573
114
+ cxb/assets/global-igKv-1g9.js,sha256=9AnwcOz6vUYKXcaBuqOCag8rxRCSVDwmIHG8irKBIUM,347
115
+ cxb/assets/hookar-BMRD9G9H.js,sha256=_Dzjp-0cmaseuT5CcILxOLX5a4QsMWHgS3bcAC5oH64,519
116
+ cxb/assets/immutable-json-patch-DtRO2E_S.js,sha256=I1LmEOX8J21wFhrrAtIV6svx32i-j5TJpso1CpzEEik,5600
117
+ cxb/assets/import-1vE3gBat.js,sha256=9T_SMx38Y7DXPtMi72n0LBsPbMPvlkQquZ3zOEp7zQk,3106
118
+ cxb/assets/index-B-eTh-ZX.js,sha256=SoqSuq7zLpebuTstKO5Tfwz3fNEnbgzdMHJnLV8RCHQ,9824
119
+ cxb/assets/index-BVyxzKtH.js,sha256=BoEJccSRRZecpdEomQSlNGAVVp6CEEkuz1xUVWXKORk,6015
120
+ cxb/assets/index-BdeNM69f.js,sha256=gkNccueAx5s9vUKp3ZE31Xg2wL4xfipeQ73y27N-61c,2035
121
+ cxb/assets/index-C6cPO4op.js,sha256=o_KVUiHGFlCJN96xkRu9orzLdrYUVTn_nJy9M0SQKrM,3621
122
+ cxb/assets/index-CC-A1ipE.js,sha256=dfVwbYUl2GzaPaRcm9bvcm3c0bi8WQj9RsSYaZneH2w,412
123
+ cxb/assets/index-CTxJ-lDp.js,sha256=CMXV0Oe3QRi4ITetl3tspH_h_4Wv8cG17-3V0PSN-2s,2821
124
+ cxb/assets/index-Cd-F5j_k.js,sha256=3a3gWjjYVTv16DAeDvUZPwFIqSXU13aVefFTWGLUx7E,3250
125
+ cxb/assets/index-D742rwaM.js,sha256=ivvY4EhQ0-ADpy1fu8TQtZuS6Qe707-SWWRWY-FWYJg,3381
126
+ cxb/assets/index-DTfhnhwd.js,sha256=YKLsTYhS7k2f1QwXRCyYdRn2vB_mwzsqinT1of7dcnc,354
127
+ cxb/assets/index-DdXRK7n9.js,sha256=UkW9YuMZ0_hZ3q9llWmO0UpkP4qNmXYMl1lLqmmZwQE,4047
128
+ cxb/assets/index-DtiCmB4o.js,sha256=nv7dVMmo1vex5ih5mMC9MNLLMGuCmy_ktOa1j4rXQ0M,1976
129
+ cxb/assets/index-NBrXBlLA.css,sha256=2mHbGZHluiEeZiiiubPFD2dGd6eL59WUa2qV8eSQqXs,376846
130
+ cxb/assets/index-ac-Buu_H.js,sha256=3tSelUaTXqOQbjivh39F9R8AoTY-PvFD4uGbFU_eEeQ,33755
131
+ cxb/assets/index-iYkH7C67.js,sha256=BFI8j9CqWYj8gKyfGZZp7dIrqoA7-Bnd9Za1-mTiLG0,3498
132
+ cxb/assets/info-B986lRiM.js,sha256=28efQ_ywUNQ5Od__oXFskmVy9ZWR48DgnuNs1bvoqlg,2226
133
+ cxb/assets/intl-messageformat-Dc5UU-HB.js,sha256=-5X21qzJD7TmWO2-DWDdxF8tql-Xdcq2QoUkBY54G00,6630
134
+ cxb/assets/jmespath-l0sNRNKZ.js,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
135
+ cxb/assets/json-schema-traverse-l0sNRNKZ.js,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
136
+ cxb/assets/json-source-map-DRgZidqy.js,sha256=2MWN6aGupPEd3Uk0Nki7JeURX8opsBCdC36BuxJRakI,4281
137
+ cxb/assets/jsonpath-plus-l0sNRNKZ.js,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
138
+ cxb/assets/jsonrepair-B30Dx381.js,sha256=HddBNX0dIMqRHTFT0VtfF33a4JgvMp9iCDYFWs9YGZs,6639
139
+ cxb/assets/lodash-es-DZVAA2ox.js,sha256=BvwNIFkh9lENGWunPRiHX9XxWJXVp17TiHEkaLLRpn0,25088
140
+ cxb/assets/marked-DKjyhwJX.js,sha256=qbydVfDQQTzCnxUXxgsroNwJZCzaf9QONfBPKmyOeEA,39673
141
+ cxb/assets/marked-gfm-heading-id-U5zO829x.js,sha256=237Q2hAeDNj3MAUeB3oQUy8Ov7oOYvvYprp2mt-HOU4,725
142
+ cxb/assets/marked-mangle-CDMeiHC6.js,sha256=WGaJNWouxQQExqwUZC5Dw3XvdVWQYHvEWXBtKXDDFHY,420
143
+ cxb/assets/memoize-one-BdPwpGay.js,sha256=jk5sfhm07ZMGDqLT1jqe27nsey2DIPbINp8U4bgP_QI,522
144
+ cxb/assets/natural-compare-lite-Bg2Xcf-o.js,sha256=9R5eHr3vTw4igb95odBTQ39r5ae-JGESqt0JQ27a1xc,808
145
+ cxb/assets/pagination-svelte-D5CyoiE_.js,sha256=-ppq9Dg-3wFdxmloAwaxmU4jU1HaypcXHo4OS6Dkk4s,4380
146
+ cxb/assets/pagination-svelte-v10nAbbM.css,sha256=7FtgdLOx-Wq4-TyF8CDDro2NF6jJwaNxbP3VI4g5uYI,3585
147
+ cxb/assets/plantuml-encoder-C47mzt9T.js,sha256=dpoe9r1lJmN-rbN-TAv2JnFgdWrFqExHUKs4JspxM7M,53041
148
+ cxb/assets/prismjs-DTUiLGJu.js,sha256=Nd_QmO8yEdbvZkliAEJjqktd3pFsLRRwJQt-Sd_pqXo,25847
149
+ cxb/assets/profile-BUf-tKMe.js,sha256=Ye_7fF8wYm6hR5u6KYRV1hMdweqW2q6_ZGpsNhrF1Y8,6527
150
+ cxb/assets/query-CNmXTsgf.js,sha256=iUE9_KIbABOdzswc4e8mcUs_PbDTo9V8nOmil0K7JSA,11363
151
+ cxb/assets/queryHelpers-C9iBWwqe.js,sha256=SkgdFEtjdTaD1cMVvKsdf5IQaMNUz74nTcj-pVDhQuw,501
152
+ cxb/assets/scroll-into-view-if-needed-KR58zyjF.js,sha256=Dw5KNhvWXAltb_qIh3e_f5ud5CQSxqHGHGlMf7BFGXc,897
153
+ cxb/assets/spaces-0oyGvpii.js,sha256=l9GvTbt-jiMyG8RGsCe3zAaYad0vQAhPjSBtdEp6htg,73
154
+ cxb/assets/style-mod-Bs6eFhZE.js,sha256=2P-Jrkn335imR7dWZ-lR1mVAhef16p050Fb80pVApVA,2194
155
+ cxb/assets/svelte-B2XmcTi_.js,sha256=bQk6kPr592D2TiwuMX7a6lt9YJB8UYeQMzvAtsxaP_s,61082
156
+ cxb/assets/svelte-awesome-COLlx0DN.css,sha256=5T3C0hIplhoXaGU3PJ-KPpPgB0uJTXN4n4eA21ChO3Y,448
157
+ cxb/assets/svelte-awesome-DhnMA6Q_.js,sha256=FEokMqwJ5WAhy_a2QNscieYkpS4mhAtR_NOPYzd7lD0,3858
158
+ cxb/assets/svelte-datatables-net-CY7LBj6I.js,sha256=PQZwUZsx3JjhI2W2Mwvsr4abTvEkbVl3osr3VpO-enk,4715
159
+ cxb/assets/svelte-floating-ui-BlS3sOAQ.js,sha256=lboSaEhc2oCTFSD5fkUaHSlxwtH8SGd4w3iLajcEySU,733
160
+ cxb/assets/svelte-i18n-CT2KkQaN.js,sha256=_LIkJDtwxRXQXVUvWxdc5z2BLNb4SwzSNyDE6lKWT3Q,7437
161
+ cxb/assets/svelte-jsoneditor-BzfX6Usi.css,sha256=5nvNv27PvUKYYgbHA1QpynYgdEoPCMoRzUlN8Ni2Fko,95514
162
+ cxb/assets/svelte-jsoneditor-CUGSvWId.js,sha256=IwxIH_L_eG1NdCYCtrkcEysxGflo66lL-SBa1cCYGMA,238060
163
+ cxb/assets/svelte-select-CegQKzqH.css,sha256=RW2XmPXMyUSPG672lEcT7Nhz1gaLfzTqoQjFG6Jb4zI,10652
164
+ cxb/assets/svelte-select-CjHAt_85.js,sha256=17YwjNfrW5d9x6GmOaHibTPVB_PZ7WBu9V_27MGcLrw,17176
165
+ cxb/assets/tailwind-merge-CJvxXMcu.js,sha256=PhlMjcf4Fs_9tgXtY97DfhD4crCI-S_zuZJACPZ4Q2E,25988
166
+ cxb/assets/tailwind-variants-Cj20BoQ3.js,sha256=Eofe15eg2u8pkjxy3tDaXMpq2etBq0Yzc15kSig_xEk,5489
167
+ cxb/assets/toast-B9WDyfyI.js,sha256=eJ0gQdgl4vAsHpcBUlXOPUrbNbk9Ii9Va5CdG0GRDGA,248
168
+ cxb/assets/tslib-pJfR_DrR.js,sha256=Kke-aujRqfYw2Ld4KusSVmRen6Lw2l8VKoYr2OW79mY,1231
169
+ cxb/assets/typewriter-editor-DkTVIJdm.js,sha256=YlETGGigYqnJdwnP4VkV7YAIoblWivupZuAHxu0KeDQ,52323
170
+ cxb/assets/user-DeK_NB5v.js,sha256=6VYTgmWgl7pVRgW6dD0gGKPKvvKnCEqpKy3ZlLOrQwQ,1253
171
+ cxb/assets/vanilla-picker-l5rcX3cq.js,sha256=B8KWTpJINp3oIXirDlwC683EYHZUPW76lAnHmeUPqEY,18814
172
+ cxb/assets/w3c-keyname-Vcq4gwWv.js,sha256=7NTN0-UTH-BpoJQqdC43Ec4Cdwj4Wv8viGg4W3EBqx8,1494
173
+ data_adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
174
+ data_adapters/adapter.py,sha256=zR_yFd5ZI9vIQuUB6AUcF-LHgxOaxoREV2hogasivjQ,443
175
+ data_adapters/base_data_adapter.py,sha256=vG9WeHyw_c_BnH0EmudwPSNS6iMb5buQJiZS_9cm9p8,12055
176
+ data_adapters/helpers.py,sha256=0ySEDnQBMgFVXstFnPjXLtZ_-8IC4Q8oPXXrWokpFB8,660
177
+ data_adapters/file/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
178
+ data_adapters/file/adapter.py,sha256=SPVVfRIlyQDYfZJv4J8LmrDGtrVWddu76SvpnkXY3jM,77671
179
+ data_adapters/file/adapter_helpers.py,sha256=ExA_fAnRaPOLDuEY3hsLNR2BvvCscnS5Du6lWRtCvh0,34321
180
+ data_adapters/file/archive.py,sha256=B4VV6HNB3Bqd4tlqZ3jUQps8oqht_xOdBNOi9cLuo8Q,5423
181
+ data_adapters/file/create_index.py,sha256=lUcUkepo9QUIQDDDgoPAL74_n16cZ_q0NKnITGmbF6I,11888
182
+ data_adapters/file/create_users_folders.py,sha256=zOBgxMnqgEskYP4pgkmE6VYMca-ADLz8mXKPHJPYpys,1670
183
+ data_adapters/file/custom_validations.py,sha256=ziOERgTr-eY_zrN0C41B2FYmpEyoKiV4holh8an-p2c,1754
184
+ data_adapters/file/drop_index.py,sha256=OK3wXwaO9tUcHcJjqyLeBnkElzK35MZMi8YLGWdrXRw,1417
185
+ data_adapters/file/health_check.py,sha256=cMvwsXhjEykjrTyB3HtUn8QqKdtB_h5w8mGOEYPepzU,24221
186
+ data_adapters/file/redis_services.py,sha256=83STcca5fYFaEVLRYAxfUQXeUQZqJOT8XH-GBSbkR-E,39914
187
+ data_adapters/sql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
188
+ data_adapters/sql/adapter.py,sha256=QXEJDtatIap18mrTWSqa9D7RnNZdjerkVJEGAv3i6FE,154825
189
+ data_adapters/sql/adapter_helpers.py,sha256=Eu22NElz2fMu6zyOsGsGrnAZcyWhHz9I__RJ9z6cwK0,15076
190
+ data_adapters/sql/create_tables.py,sha256=KqaXHTDOD8YaqGNc_e0iHHotd0WE3Kad_tBevtoGA20,17427
191
+ data_adapters/sql/create_users_folders.py,sha256=fm3P-CMcPX4b4DqXHKWMOtfX4RHdaev2nCDhYrS5cIs,1911
192
+ data_adapters/sql/db_to_json_migration.py,sha256=GTPO6-HblgD60qruhhVpWbKOke5xz9w_xwIr5NKK764,21009
193
+ data_adapters/sql/health_check_sql.py,sha256=2Z0mN5IMrjF72ZAiafBLkHklbXXWJzLp1K2TzjzPI1s,8569
194
+ data_adapters/sql/json_to_db_migration.py,sha256=KaubDrRZ3MfPLc-CNGPpsEccPELKr1V4GoBEBt1BNZo,21131
195
+ data_adapters/sql/update_query_policies.py,sha256=LUpkyzDAkiwwVWnXxPdVAU6atehW72ECAazj3mEYHK0,3857
196
+ languages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
197
+ languages/arabic.json,sha256=UL61rP9_M42CGfU94G5-1bXVUVnsJWXzoqhaXTXTJuM,910
198
+ languages/english.json,sha256=Y7eZ2X8c427_97qYrHOeGb2d725T-YlNNFVSi8FB7Kw,649
199
+ languages/kurdish.json,sha256=GgPLkVKyhIQjT7h3cPfDh0oyzg26znvBUe5X_Zz2TWI,864
200
+ languages/loader.py,sha256=3gf2WmfSQ-AVIpyLAm_5J5NcQlWqBxQHMjcUd04Pijs,381
201
+ models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
202
+ models/api.py,sha256=f5X56dudyEysPmDuI5grM2RRCXuIQoehaAB6wMAGG28,6473
203
+ models/core.py,sha256=tEb7cbnC71yE9SDluynj7dE3U8Ed-EbF3uRJizy-uuU,16880
204
+ models/enums.py,sha256=y2G5EKIc8FusVW4JvEozGFKL2GxjtuOK7k3zSguP4dc,5395
205
+ plugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
206
+ plugins/action_log/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
207
+ plugins/action_log/plugin.py,sha256=-JY_iIIJJjFFofvpMoCxNJMXNr_KC6kA8TiwvvoxaWI,4434
208
+ plugins/admin_notification_sender/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
209
+ plugins/admin_notification_sender/plugin.py,sha256=sxVGW8qtRmDEQeS6QD3F3IqzZOoh_9H_y2TsRCDkXaw,4771
210
+ plugins/ldap_manager/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
211
+ plugins/ldap_manager/plugin.py,sha256=c05pKGsyLETMrheCqIw3gZOSLdTWvEDq_WCl0Q_0yXQ,3030
212
+ plugins/local_notification/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
213
+ plugins/local_notification/plugin.py,sha256=FObVxID5Bg0G_xStpJYZkg706wu_CpUqk09DmzHAyPQ,4074
214
+ plugins/realtime_updates_notifier/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
215
+ plugins/realtime_updates_notifier/plugin.py,sha256=Gcvob4ShSs2Ht1hLD2vtwhR_PSFYMv3_l_VPM2opTYs,2374
216
+ plugins/redis_db_update/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
217
+ plugins/redis_db_update/plugin.py,sha256=z05k1zNJgBnKPj-jrtMUeI9br75ZPlifbzL0HxpRnXg,7128
218
+ plugins/resource_folders_creation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
219
+ plugins/resource_folders_creation/plugin.py,sha256=OwYPtRjMt2esAAEdv1FjdZgjEz01yt2xOZQi3nB0kEQ,3327
220
+ plugins/system_notification_sender/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
221
+ plugins/system_notification_sender/plugin.py,sha256=MUOujwyRJ3yQrXwZ-X4qSdx0ZNU2c-sYy0d0-U8twoA,8253
222
+ plugins/update_access_controls/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
223
+ plugins/update_access_controls/plugin.py,sha256=43UV4vg-zxBF_7Bv0AZH6gU0Bgy2ybapNK21wJTF05k,301
224
+ pytests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
225
+ pytests/api_user_models_erros_test.py,sha256=6VWLIhazYjz7avXIMIDpT6doiBO5FVzGsGJ3Cv8cXyg,583
226
+ pytests/api_user_models_requests_test.py,sha256=1AYZcMwa-AVeGrhTgwIkwqw3w7_CDPkbaJ0YDxLLKdY,3859
227
+ pytests/archive_test.py,sha256=rk6jEZf-Ud7ReyH4_xJD-9SzNRz8p2Sg0qQX04VCw9M,2347
228
+ pytests/base_test.py,sha256=d8prlME29tBnirW-3_HUtixcxUMPiLfJHRDiNkxOCRM,9902
229
+ pytests/get_settings_test.py,sha256=AEqjnHsQjkVDqwVqtn2rN6mep4sAC_apDCgiZT4YQ28,281
230
+ pytests/json_to_db_migration_test.py,sha256=JXO0knKPccXVIbKmyuD0yOi5fSBHmXm_NgVdO1_U7AE,9411
231
+ pytests/service_test.py,sha256=92lqzKQoVMkj9XliPBjkGBxXb4zXsobb2WPfW5buQfc,807
232
+ pytests/test_info.py,sha256=IOKtcEPM_03byhp5dSt2YbhTC5u_ORPahQLifZWBpjg,2074
233
+ pytests/test_status.py,sha256=YFuBTsSd5hkpHp16GAbQ_I03RL_o2_yW-92ZNgKJry0,453
234
+ utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
235
+ utils/access_control.py,sha256=8cCKr-6bL-Shl8j8xtfjEykMPGy6wkbNz-NRwLCdx-Y,11757
236
+ utils/async_request.py,sha256=Lm2xGXLeph7P1_fLhhNJDhPubKT2ncFn_Ueft4JVoeI,255
237
+ utils/exporter.py,sha256=HjcZCzcuH6N6f7Gn2hkTEeEFyo-MfrsiZUYAE-9kkVQ,9718
238
+ utils/firebase_notifier.py,sha256=nAeCUo5Mtwxygwj8ONlw8ZAtL_ekdJBabvU0z2dZ3NY,2391
239
+ utils/generate_email.py,sha256=25i1iNVDfyRDq7vvZVFkaTYfMZFkAg1ZVQO2GdK7yRQ,1122
240
+ utils/helpers.py,sha256=gNxLg09cclRWrKNBy2pwGZsxGA0iFS5iZ_nyra3SmnI,9928
241
+ utils/hypercorn_config.py,sha256=q28HGRLWo9wjOVF183WwFPs3HQo4Nexc7q_7dmSVHRI,311
242
+ utils/internal_error_code.py,sha256=KGlXPC5YruPmb0ORVY7U3EEVpBgSLuU4lHdXgwUVN2M,1637
243
+ utils/jwt.py,sha256=Y7Gp3imvNwAtWOg8V0etvsEFtswmCYKK_U4ljZ15Pps,4590
244
+ utils/logger.py,sha256=peejQnq9B0eaHwdLynBHT7FUCq7jCX_DhkX6BcxrLkA,5274
245
+ utils/middleware.py,sha256=PAVwnLzs0cyT_ZIgc1slqadEOJNCPliLhOTjaYx0Waw,3399
246
+ utils/notification.py,sha256=O9oOeU9cRm3e9UAc-VJONWx-TzqbCMddFNaTQilE6ks,2479
247
+ utils/password_hashing.py,sha256=NZZsmtPG9Vkocipk3DlDKKHKUdxRKA4yOhCurD8dUhg,356
248
+ utils/plugin_manager.py,sha256=brQoE4u2WxH6EMvUOYQlnOnSUbKwha92-UfAgWUaHRU,7645
249
+ utils/query_policies_helper.py,sha256=Bf5qriQJ8CpUqPaQg5cdvNrn-92l_jKxHwsvXdegAZo,4796
250
+ utils/regex.py,sha256=cv9b_l_e8tz42mKckeeyDgypKqh2e71E28co2iuEVxA,2286
251
+ utils/repository.py,sha256=9L-IvQ0Js0SQ5OR-Rh0i2Wdu4H9H06r8eE84hfBIu7Q,18313
252
+ utils/router_helper.py,sha256=Tgoq3oakejdEeyeVieTNk38JsPZ8x5RuR0kw2THc1mI,604
253
+ utils/settings.py,sha256=yjiudcgLVSIvKLQo9JtukmeLSU-6YTdggzWfZxiFoO8,5720
254
+ utils/sms_notifier.py,sha256=04D6D_ldk3S9SojI7_381pqLc8v9lligeNHAysohz7w,550
255
+ utils/social_sso.py,sha256=Dm1W6U9OwKbAeUwM-kwJBHFEoreeoN-s-RHdOZ1-cNg,2216
256
+ utils/ticket_sys_utils.py,sha256=9QAlW2iiy8KyxQRBDj_WmzS5kKb0aYJmGwd4qzmGVqo,7005
257
+ utils/web_notifier.py,sha256=QM87VVid2grC5lK3NdS1yzz0z1wXljr4GChJOeK86W4,843
258
+ utils/templates/activation.html.j2,sha256=XAMKCdoqONoc4ZQucD0yV-Pg5DlHHASZrTVItNS-iBE,640
259
+ utils/templates/reminder.html.j2,sha256=aoS8bTs56q4hjAZKsb0jV9c-PIURBELuBOpT_qPZNVU,639
260
+ dmart-1.4.35.dist-info/METADATA,sha256=9Cwlt25CGZJ8JBgryvLlaAUXThe2-tFELMJ4y7cHlF4,2069
261
+ dmart-1.4.35.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
262
+ dmart-1.4.35.dist-info/entry_points.txt,sha256=GjfoGh1bpxuU9HHGJzbtCFPNptHv9TryxHMN3uBSKpg,37
263
+ dmart-1.4.35.dist-info/top_level.txt,sha256=iPbBisVNr4KDWyZhxMl2x3oJSgf71knWXMh21_xutrE,266
264
+ dmart-1.4.35.dist-info/RECORD,,
@@ -1,3 +1,4 @@
1
+ alembic
1
2
  api
2
3
  bundler
3
4
  config
@@ -5,7 +6,6 @@ cxb
5
6
  data_adapters
6
7
  data_generator
7
8
  dmart
8
- dmart_migrations
9
9
  get_settings
10
10
  languages
11
11
  main
@@ -13,6 +13,7 @@ migrate
13
13
  models
14
14
  password_gen
15
15
  plugins
16
+ pytests
16
17
  run_notification_campaign
17
18
  scheduled_notification_handler
18
19
  schema_migration
dmart.py CHANGED
@@ -3,14 +3,12 @@ from __future__ import annotations
3
3
 
4
4
  import argparse
5
5
  import asyncio
6
- import configparser
7
6
  import json
8
7
  import os
9
8
  import shutil
10
9
  import ssl
11
10
  import subprocess
12
11
  import sys
13
- import tempfile
14
12
  import time
15
13
  import warnings
16
14
  import webbrowser
@@ -20,21 +18,6 @@ from pathlib import Path
20
18
  from hypercorn.config import Config
21
19
  from hypercorn.run import run
22
20
 
23
- # Try to import alembic
24
- # Global variable for alembic status
25
- ALEMBIC_ERROR = None
26
-
27
- def get_alembic():
28
- global ALEMBIC_ERROR
29
- try:
30
- from alembic import command as alembic_command
31
- from alembic.config import Config as AlembicConfig
32
- return alembic_command, AlembicConfig
33
- except ImportError as e:
34
- import sys
35
- ALEMBIC_ERROR = f"{e}\nDebug info: sys.path={sys.path}"
36
- return None, None
37
-
38
21
  from data_adapters.file.archive import archive
39
22
  from data_adapters.file.create_index import main as create_index
40
23
  from data_adapters.file.health_check import main as health_check
@@ -57,7 +40,6 @@ commands = """ server
57
40
  archive
58
41
  json_to_db
59
42
  db_to_json
60
- migrate
61
43
  help
62
44
  version
63
45
  info
@@ -274,15 +256,13 @@ def hypercorn_main() -> int:
274
256
  )
275
257
  args = parser.parse_args(sys.argv[1:])
276
258
 
277
- # Set defaults if config file is not found
278
- config = Config()
279
- if args.config and os.path.exists(args.config):
280
- config = Config.from_toml(args.config)
281
- else:
282
- # Default Hypercorn configuration
259
+ if args.config == "hypercorn_config.toml" and not os.path.exists(args.config):
260
+ config = Config()
283
261
  config.backlog = 2000
284
262
  config.workers = 1
285
263
  config.bind = ["localhost:8282"]
264
+ else:
265
+ config = Config.from_toml(args.config)
286
266
 
287
267
  config.application_path = args.application
288
268
 
@@ -375,9 +355,9 @@ def hypercorn_main() -> int:
375
355
  port = 8282
376
356
  host = "127.0.0.1"
377
357
 
378
- if len(config.bind) > 0:
358
+ if len(args.binds) > 0:
379
359
  try:
380
- bind_parts = config.bind[0].split(":")
360
+ bind_parts = args.binds[0].split(":")
381
361
  if len(bind_parts) == 2:
382
362
  host = bind_parts[0]
383
363
  port = int(bind_parts[1])
@@ -387,7 +367,10 @@ def hypercorn_main() -> int:
387
367
  print(e)
388
368
  pass
389
369
 
390
- url = f"http://{host}:{port}/cxb/"
370
+ if host == "0.0.0.0":
371
+ host = "127.0.0.1"
372
+
373
+ url = f"http://{host}:{port}{settings.cxb_url}/"
391
374
 
392
375
  def open_browser():
393
376
  time.sleep(2)
@@ -400,38 +383,43 @@ def hypercorn_main() -> int:
400
383
 
401
384
 
402
385
  def main():
403
- args = sys.argv[1:]
404
- if len(args) == 0:
386
+ if not os.path.exists("config.env"):
387
+ print("Notice: config.env not found, using default settings from settings.py")
388
+
389
+ sys.argv = sys.argv[1:]
390
+ if len(sys.argv) == 0:
405
391
  print("You must provide a command to run:")
406
392
  print(commands)
407
393
  sys.exit(1)
408
394
 
409
- match args[0]:
395
+ match sys.argv[0]:
410
396
  case "hyper":
411
397
  hypercorn_main()
412
398
  case "server" | "serve":
413
399
  open_cxb = False
414
- if "--open-cxb" in args:
400
+ if "--open-cxb" in sys.argv:
415
401
  open_cxb = True
416
- args.remove("--open-cxb")
402
+ sys.argv.remove("--open-cxb")
417
403
 
418
- if "--cxb-config" in args:
419
- idx = args.index("--cxb-config")
420
- if idx + 1 < len(args):
421
- os.environ["DMART_CXB_CONFIG"] = args[idx + 1]
422
- args.pop(idx + 1)
423
- args.pop(idx)
404
+ if "--cxb-config" in sys.argv:
405
+ idx = sys.argv.index("--cxb-config")
406
+ if idx + 1 < len(sys.argv):
407
+ os.environ["DMART_CXB_CONFIG"] = sys.argv[idx + 1]
408
+ sys.argv.pop(idx + 1)
409
+ sys.argv.pop(idx)
424
410
 
425
411
  if open_cxb:
426
- url = f"http://{settings.listening_host}:{settings.listening_port}/cxb/"
412
+ host = settings.listening_host
413
+ if host == "0.0.0.0":
414
+ host = "127.0.0.1"
415
+ url = f"http://{host}:{settings.listening_port}{settings.cxb_url}/"
427
416
  def open_browser():
428
- time.sleep(1)
417
+ time.sleep(2)
429
418
  webbrowser.open(url)
430
419
 
431
420
  import threading
432
421
  threading.Thread(target=open_browser, daemon=True).start()
433
422
 
434
- sys.argv = [sys.argv[0]] + args
435
423
  asyncio.run(server())
436
424
  case "health-check":
437
425
  parser = argparse.ArgumentParser(
@@ -442,9 +430,9 @@ def main():
442
430
  parser.add_argument("-s", "--space", help="hit the target space or pass (all) to make the full health check")
443
431
  parser.add_argument("-m", "--schemas", nargs="*", help="hit the target schema inside the space")
444
432
 
445
- args_parsed = parser.parse_args(args[1:])
433
+ args = parser.parse_args()
446
434
  before_time = time.time()
447
- asyncio.run(health_check(args_parsed.type, args_parsed.space, args_parsed.schemas))
435
+ asyncio.run(health_check(args.type, args.space, args.schemas))
448
436
  print(f'total time: {"{:.2f}".format(time.time() - before_time)} sec')
449
437
  case "create-index":
450
438
  parser = argparse.ArgumentParser(
@@ -462,9 +450,9 @@ def main():
462
450
  "--flushall", action='store_true', help="FLUSHALL data on Redis"
463
451
  )
464
452
 
465
- args_parsed = parser.parse_args(args[1:])
453
+ args = parser.parse_args()
466
454
 
467
- asyncio.run(create_index(args_parsed.space, args_parsed.schemas, args_parsed.subpaths, args_parsed.flushall))
455
+ asyncio.run(create_index(args.space, args.schemas, args.subpaths, args.flushall))
468
456
  case "export":
469
457
  parser = argparse.ArgumentParser()
470
458
  parser.add_argument(
@@ -481,24 +469,24 @@ def main():
481
469
  "--since",
482
470
  help="Export entries created/updated since the provided timestamp",
483
471
  )
484
- args_parsed = parser.parse_args(args[1:])
472
+ args = parser.parse_args()
485
473
  since = None
486
474
  output_path = ""
487
- if args_parsed.output:
488
- output_path = args_parsed.output
475
+ if args.output:
476
+ output_path = args.output
489
477
 
490
- if args_parsed.since:
491
- since = int(round(float(args_parsed.since) * 1000))
478
+ if args.since:
479
+ since = int(round(float(args.since) * 1000))
492
480
 
493
- if not os.path.isdir(args_parsed.spaces):
494
- exit_with_error(f"The spaces folder {args_parsed.spaces} is not found.")
481
+ if not os.path.isdir(args.spaces):
482
+ exit_with_error(f"The spaces folder {args.spaces} is not found.")
495
483
 
496
484
  out_path = os.path.join(output_path, OUTPUT_FOLDER_NAME)
497
485
  if os.path.isdir(out_path):
498
486
  shutil.rmtree(out_path)
499
487
 
500
488
  tasks = []
501
- with open(args_parsed.config, "r") as f:
489
+ with open(args.config, "r") as f:
502
490
  config_objs = json.load(f)
503
491
 
504
492
  for config_obj in config_objs:
@@ -510,7 +498,7 @@ def main():
510
498
  config_obj.get("schema_shortname", ""),
511
499
  config_obj.get("included_meta_fields", {}),
512
500
  config_obj.get("excluded_payload_fields", {}),
513
- args_parsed.spaces, output_path, since))
501
+ args.spaces, output_path, since))
514
502
 
515
503
  asyncio.run(exporter(tasks))
516
504
 
@@ -539,11 +527,11 @@ def main():
539
527
  help="The number of day, older than which, the entries will be archived (based on updated_at)",
540
528
  )
541
529
 
542
- args_parsed = parser.parse_args(args[1:])
543
- space = args_parsed.space
544
- subpath = args_parsed.subpath
545
- olderthan = args_parsed.olderthan
546
- schema = args_parsed.schema or "meta"
530
+ args = parser.parse_args()
531
+ space = args.space
532
+ subpath = args.subpath
533
+ olderthan = args.olderthan
534
+ schema = args.schema or "meta"
547
535
 
548
536
  asyncio.run(archive(space, subpath, schema, olderthan))
549
537
  print("Done.")
@@ -551,49 +539,6 @@ def main():
551
539
  asyncio.run(json_to_db_migration())
552
540
  case "db_to_json":
553
541
  db_to_json_migration()
554
- case "migrate":
555
- pkg_dir = Path(__file__).resolve().parent
556
-
557
- # Try to find migrations directory
558
- alembic_dir = pkg_dir / "dmart_migrations"
559
- if not (alembic_dir / "env.py").exists():
560
- # Fallback to alembic for backward compatibility
561
- # only if it contains env.py (to avoid picking up the alembic library itself)
562
- fallback_dir = pkg_dir / "alembic"
563
- if (fallback_dir / "env.py").exists():
564
- alembic_dir = fallback_dir
565
-
566
- if not alembic_dir.exists() or not (alembic_dir / "env.py").exists():
567
- print(f"Error: Migration directory not found in {pkg_dir}")
568
- print(f"Looked for 'dmart_migrations' or 'alembic' folder containing 'env.py'")
569
- sys.exit(1)
570
-
571
- # Look for alembic.ini in the package directory or migrations directory
572
- ini_path = pkg_dir / "alembic.ini"
573
- if not ini_path.exists():
574
- ini_path = alembic_dir / "alembic.ini"
575
-
576
- if not ini_path.exists():
577
- print(f"Error: 'alembic.ini' not found in {pkg_dir} or {alembic_dir}")
578
- sys.exit(1)
579
-
580
- try:
581
- # Check if alembic library is installed
582
- alembic_command, AlembicConfig = get_alembic()
583
- if not alembic_command:
584
- print(f"Error: 'alembic' library not found. {ALEMBIC_ERROR}")
585
- print("Please install 'alembic' library with 'pip install alembic'.")
586
- sys.exit(1)
587
-
588
- alembic_cfg = AlembicConfig(str(ini_path))
589
- alembic_cfg.set_main_option("script_location", alembic_dir.as_posix())
590
-
591
- # Run alembic upgrade head
592
- alembic_command.upgrade(alembic_cfg, "head")
593
-
594
- except Exception as e:
595
- print(f"Error running migration: {e}")
596
- sys.exit(1)
597
542
  case "help":
598
543
  print("Available commands:")
599
544
  print(commands)
main.py CHANGED
@@ -480,7 +480,10 @@ asyncio.run(plugin_manager.load_plugins(app, capture_body))
480
480
 
481
481
 
482
482
  cxb_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "cxb")
483
- if not os.path.exists(cxb_path):
483
+ if os.path.isdir(os.path.join(cxb_path, "client")):
484
+ cxb_path = os.path.join(cxb_path, "client")
485
+
486
+ if not os.path.exists(os.path.join(cxb_path, "index.html")):
484
487
  project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
485
488
  cxb_dist_path = os.path.join(project_root, "cxb", "dist", "client")
486
489
  if os.path.isdir(cxb_dist_path):