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
@@ -0,0 +1,237 @@
1
+ import time
2
+ from uuid import uuid4
3
+ import pytest
4
+ import os
5
+ import json
6
+ from pathlib import Path
7
+ from sqlmodel import Session, create_engine, text, SQLModel
8
+ from data_adapters.sql.create_tables import Attachments, Entries, Spaces, Histories
9
+ from sqlalchemy.exc import OperationalError
10
+ from utils.settings import settings
11
+
12
+
13
+ def subpath_checker(subpath: str):
14
+ if subpath.endswith("/"):
15
+ subpath = subpath[:-1]
16
+ if not subpath.startswith("/"):
17
+ subpath = '/' + subpath
18
+ return subpath
19
+
20
+
21
+ def connect_with_retry(engine, retries=5, delay=2):
22
+ """
23
+ Try to connect to the database with retries.
24
+ """
25
+ for attempt in range(retries):
26
+ try:
27
+ with engine.connect() as _:
28
+ print(f"Connected to the database on attempt {attempt + 1}")
29
+ return
30
+ except OperationalError as e:
31
+ print(f"Connection attempt {attempt + 1} failed: {e}")
32
+ time.sleep(delay)
33
+ raise Exception("Could not connect to the database after multiple attempts")
34
+
35
+
36
+ @pytest.fixture(scope="module")
37
+ def setup_database():
38
+ if settings.active_data_db == "file":
39
+ pytest.skip("Skipping test for file-based database")
40
+ return
41
+
42
+ # Use the settings to connect with the main `postgres` user
43
+ postgresql_url = f"{settings.database_driver.replace('+asyncpg','+psycopg')}://{settings.database_username}:{settings.database_password}@{settings.database_host}:{settings.database_port}"
44
+ engine = create_engine(f"{postgresql_url}/postgres", echo=False, isolation_level="AUTOCOMMIT")
45
+
46
+ # Create the database
47
+ with Session(engine) as session:
48
+ try:
49
+ session.exec(text(f"DROP DATABASE IF EXISTS {settings.database_name}"))
50
+ session.commit()
51
+ session.exec(text(f"CREATE DATABASE {settings.database_name}"))
52
+ session.commit() # Ensure the transaction is fully committed
53
+ print(f"Database {settings.database_name} created successfully")
54
+ except Exception as e:
55
+ print(f"Database creation failed: {e}")
56
+
57
+ # Add a small delay to ensure the database is fully ready
58
+ time.sleep(2)
59
+
60
+ yield
61
+
62
+ # Drop the database after tests
63
+ with Session(engine) as session:
64
+ try:
65
+ session.exec(text(f"DROP DATABASE IF EXISTS {settings.database_name}"))
66
+ session.commit()
67
+ print(f"Database {settings.database_name} dropped successfully")
68
+ except Exception as e:
69
+ print(f"Database deletion failed: {e}")
70
+
71
+ engine.dispose()
72
+
73
+
74
+ @pytest.fixture(scope="module")
75
+ def setup_environment(setup_database):
76
+ if settings.active_data_db == "file":
77
+ pytest.skip("Skipping test for file-based database")
78
+ return
79
+
80
+ # Set the database name from settings
81
+ driver = settings.database_driver.replace('+asyncpg', '+psycopg')
82
+ postgresql_url = f"{driver}://{settings.database_username}:{settings.database_password}@{settings.database_host}:{settings.database_port}"
83
+ engine = create_engine(f"{postgresql_url}/{settings.database_name}", echo=False)
84
+
85
+ # Retry connecting to the newly created database
86
+ connect_with_retry(engine)
87
+
88
+ # Generate tables after ensuring connection
89
+ postgresql_url = f"{driver}://{settings.database_username}:{settings.database_password}@{settings.database_host}:{settings.database_port}/{settings.database_name}"
90
+ engine = create_engine(postgresql_url, echo=False)
91
+ SQLModel.metadata.create_all(engine)
92
+
93
+ yield engine
94
+
95
+ engine.dispose()
96
+
97
+
98
+ def test_json_to_db_migration(setup_environment):
99
+ if settings.active_data_db == "file":
100
+ pytest.skip("Skipping test for file-based database")
101
+ return
102
+
103
+ engine = setup_environment
104
+
105
+ # Create a complex mock directory structure and files for different entry types
106
+ os.makedirs('/tmp/test_space/.dm', exist_ok=True)
107
+ with open('/tmp/test_space/.dm/meta.space.json', 'w') as f:
108
+ json.dump({"key": "value"}, f)
109
+
110
+ # Create more directories and files for the migration
111
+ os.makedirs('/tmp/test_space/dir1', exist_ok=True)
112
+ with open('/tmp/test_space/dir1/history.jsonl', 'w') as f:
113
+ f.write(json.dumps({"key": "history"}) + '\n')
114
+
115
+ # Create attachments folder and files
116
+ os.makedirs('/tmp/test_space/dir1/attachments', exist_ok=True)
117
+ with open('/tmp/test_space/dir1/attachments/meta.attachments.json', 'w') as f:
118
+ json.dump({
119
+ "uuid": str(uuid4()),
120
+ "space_name": "test_space",
121
+ "subpath": "/dir1",
122
+ "acl": [],
123
+ "relationships": [],
124
+ "payload": {"body": "attachment content"}
125
+ }, f)
126
+
127
+ # Create ticket-related file
128
+ with open('/tmp/test_space/dir1/meta.ticket.json', 'w') as f:
129
+ json.dump({
130
+ "state": "open",
131
+ "is_open": True,
132
+ "reporter": "user1",
133
+ "subpath": "/dir1/ticket"
134
+ }, f)
135
+
136
+ # Create user meta file
137
+ with open('/tmp/test_space/.dm/meta.user.json', 'w') as f:
138
+ json.dump({
139
+ "resource_type": "user",
140
+ "firebase_token": "firebase_token",
141
+ "language": "en"
142
+ }, f)
143
+
144
+ # Create role meta file
145
+ with open('/tmp/test_space/.dm/meta.role.json', 'w') as f:
146
+ json.dump({
147
+ "resource_type": "role",
148
+ "permissions": ["read", "write"]
149
+ }, f)
150
+
151
+ # Create permission meta file
152
+ with open('/tmp/test_space/.dm/meta.permission.json', 'w') as f:
153
+ json.dump({
154
+ "resource_type": "permission",
155
+ "subpaths": {"read": "/read", "write": "/write"},
156
+ "resource_types": ["user", "role"]
157
+ }, f)
158
+
159
+ # Run the migration script
160
+ try:
161
+ with Session(engine) as session:
162
+ for root, dirs, _ in os.walk('/tmp/test_space'):
163
+ tmp = root.replace('/tmp/test_space', '')
164
+ if tmp == '':
165
+ continue
166
+ if tmp[0] == '/':
167
+ tmp = tmp[1:]
168
+ space_name = tmp.split('/')[0]
169
+ subpath = '/'.join(tmp.split('/')[1:])
170
+ if space_name == '..':
171
+ continue
172
+
173
+ if space_name.startswith('.git'):
174
+ continue
175
+
176
+ if subpath == '' or subpath == '/':
177
+ subpath = '/'
178
+ p = os.path.join(root, '.dm', 'meta.space.json')
179
+ entry = {}
180
+ if Path(p).is_file():
181
+ entry = json.load(open(p))
182
+ entry['space_name'] = space_name
183
+ entry['subpath'] = '/'
184
+ session.add(Spaces.model_validate(entry))
185
+ continue
186
+
187
+ subpath = subpath.replace('.dm', '')
188
+ if subpath != '/' and subpath.endswith('/'):
189
+ subpath = subpath[:-1]
190
+
191
+ if subpath == '':
192
+ subpath = '/'
193
+
194
+ for dir in dirs:
195
+ for file in os.listdir(os.path.join(root, dir)):
196
+ if not file.startswith('meta'):
197
+ if file == 'history.jsonl':
198
+ lines = open(os.path.join(root, dir, file), 'r').readlines()
199
+ for line in lines:
200
+ history = json.loads(line)
201
+ history['shortname'] = dir
202
+ history['space_name'] = space_name
203
+ history['subpath'] = subpath_checker(subpath)
204
+ session.add(Histories.model_validate(history))
205
+ continue
206
+
207
+ p = os.path.join(root, dir, file)
208
+ if Path(p).is_file():
209
+ if 'attachments' in p:
210
+ _attachment = json.load(open(os.path.join(root, dir, file)))
211
+ _attachment['space_name'] = space_name
212
+ _attachment['uuid'] = _attachment.get('uuid', uuid4())
213
+ _attachment['subpath'] = subpath_checker(_attachment['subpath'])
214
+ session.add(Attachments.model_validate(_attachment))
215
+ elif file.endswith('.json'):
216
+ entry = json.load(open(p))
217
+ entry['space_name'] = space_name
218
+ entry['subpath'] = subpath_checker(subpath)
219
+ session.add(Entries.model_validate(entry))
220
+ session.commit()
221
+ assert True # Assert that the migration completes without error
222
+ except Exception as e:
223
+ print(f"Migration failed: {e}")
224
+ assert False # Fail the test if there is any exception
225
+
226
+ # Clean up the mock directory structure
227
+ os.remove('/tmp/test_space/.dm/meta.space.json')
228
+ os.remove('/tmp/test_space/dir1/history.jsonl')
229
+ os.remove('/tmp/test_space/dir1/attachments/meta.attachments.json')
230
+ os.remove('/tmp/test_space/dir1/meta.ticket.json')
231
+ os.remove('/tmp/test_space/.dm/meta.user.json')
232
+ os.remove('/tmp/test_space/.dm/meta.role.json')
233
+ os.remove('/tmp/test_space/.dm/meta.permission.json')
234
+ os.rmdir('/tmp/test_space/dir1/attachments')
235
+ os.rmdir('/tmp/test_space/.dm')
236
+ os.rmdir('/tmp/test_space/dir1')
237
+ os.rmdir('/tmp/test_space')
@@ -0,0 +1,26 @@
1
+ from api.user.service import gen_alphanumeric
2
+ import pytest
3
+
4
+ @pytest.mark.run(order=9)
5
+ def test_gen_alphanumeric_length():
6
+ # Test default length
7
+ result = gen_alphanumeric()
8
+ assert len(result) == 16, "Default length should be 16"
9
+
10
+ # Test custom length
11
+ length = 32
12
+ result = gen_alphanumeric(length)
13
+ assert len(result) == length, f"Length should be {length}"
14
+
15
+
16
+ @pytest.mark.run(order=9)
17
+ def test_gen_alphanumeric_characters():
18
+ result = gen_alphanumeric()
19
+ assert all(c.isalnum() for c in result), "Result should only contain alphanumeric characters"
20
+
21
+
22
+ @pytest.mark.run(order=9)
23
+ def test_gen_alphanumeric_unique():
24
+ num_samples = 100
25
+ samples = {gen_alphanumeric() for _ in range(num_samples)}
26
+ assert len(samples) == num_samples, "Generated strings should be unique"
pytests/test_info.py ADDED
@@ -0,0 +1,55 @@
1
+ from httpx import AsyncClient
2
+ from pytests.base_test import get_superman_cookie
3
+ from fastapi import status
4
+ import pytest
5
+ from utils.internal_error_code import InternalErrorCode
6
+ from utils.jwt import sign_jwt
7
+ from utils.settings import settings
8
+
9
+
10
+
11
+ @pytest.mark.run(order=6)
12
+ @pytest.mark.anyio
13
+ async def test_info_me(client: AsyncClient) -> None:
14
+
15
+ client.cookies.set("auth_token", await get_superman_cookie(client))
16
+ response = await client.get("/info/me")
17
+ assert response.status_code == status.HTTP_200_OK
18
+ json_response = response.json()
19
+ assert json_response["status"] == "success"
20
+
21
+ @pytest.mark.run(order=6)
22
+ @pytest.mark.anyio
23
+ async def test_info_manifest(client: AsyncClient) -> None:
24
+
25
+ client.cookies.set("auth_token", await get_superman_cookie(client))
26
+ response = await client.get("/info/manifest")
27
+ assert response.status_code == status.HTTP_200_OK
28
+ json_response = response.json()
29
+ assert json_response["status"] == "success"
30
+
31
+
32
+ @pytest.mark.run(order=6)
33
+ @pytest.mark.anyio
34
+ async def test_get_settings_should_pass(client: AsyncClient) -> None:
35
+ client.cookies.set("auth_token", await get_superman_cookie(client))
36
+ response = await client.get("/info/settings")
37
+ assert response.status_code == status.HTTP_200_OK
38
+
39
+
40
+ # @pytest.mark.run(order=6)
41
+ # @pytest.mark.anyio
42
+ # async def test_in_loop_tasks(client: AsyncClient) -> None:
43
+ # client.cookies.set("auth_token", await get_superman_cookie(client))
44
+ # response = await client.get("/info/in-loop-tasks")
45
+ # assert response.status_code == status.HTTP_200_OK
46
+ # json_response = response.json()
47
+ # assert json_response["status"] == "success"
48
+ # assert "tasks_count" in json_response["attributes"]
49
+ # assert isinstance(json_response["attributes"]["tasks_count"], int)
50
+ # assert "tasks" in json_response["attributes"]
51
+ # assert isinstance(json_response["attributes"]["tasks"], list)
52
+ # for task in json_response["attributes"]["tasks"]:
53
+ # assert "name" in task
54
+ # assert "coroutine" in task
55
+ # assert "stack" in task
pytests/test_status.py ADDED
@@ -0,0 +1,15 @@
1
+
2
+ # from pytests.base_test import client
3
+ from fastapi import status
4
+ from httpx import AsyncClient
5
+ import pytest
6
+
7
+ # @pytest.mark.asyncio(scope="session")
8
+ @pytest.mark.anyio
9
+ async def test_sanity(client: AsyncClient) -> None:
10
+ # async with my_client as client:
11
+ response = await client.get("/")
12
+ assert response.status_code == status.HTTP_200_OK
13
+ json_response = response.json()
14
+ assert json_response["status"] == "success"
15
+
@@ -1,278 +0,0 @@
1
- bundler.py,sha256=MDTUTVS0WL7gb-i1rDcS4i37KTqaW88TluL4L3rwjRw,1817
2
- data_generator.py,sha256=CnE-VHEeX7-lAXtqCgbRqR9WHjTuOgeiZcviYrHAmho,2287
3
- dmart.py,sha256=9tM6DmJUzkngTYWdnG96-yuuqMmMmqxVrEYmvsFYLOE,24445
4
- get_settings.py,sha256=Sbe2WCoiK398E7HY4SNLfDN_GmE8knR4M-YJWF31jcg,153
5
- main.py,sha256=KZGhIL6AnEm5ZAPy4IvhBDpzSTjuodilV7NafNOyhzM,19676
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
- api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
- api/info/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
- api/info/router.py,sha256=sQZZor7A-uDzsJX39aqEA7bMZOJ-WTitYeFvVNWfaHw,3938
18
- api/managed/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
- api/managed/router.py,sha256=0xfJ3NXV3XHyG8yWLEECBJt-XppymOxYuMDvQJdO1MI,50865
20
- api/managed/utils.py,sha256=IqgFVHVfNubYOx5i9YoQjVqbUbaveIrqfOfTFvV42BA,74227
21
- api/public/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
- api/public/router.py,sha256=TrraWs2LGL_c_JRDbvS8OHm3fJ-ZKF7o4El7wvjV4Mk,24753
23
- api/qr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
- api/qr/router.py,sha256=Ru7UT_iQS6mFwE1bCPPrusSQfFgoV_u6pjZJ0gArE7g,3870
25
- api/user/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
- api/user/router.py,sha256=B59HQPwmwgEfYIlF3_XBNaVBlT4PWqMJiUlUvEN69Vo,51719
27
- api/user/service.py,sha256=-iQpcBVPTDiLE_xOf87Ni0oSQDtmALAXEwU4IgSvnJk,8463
28
- api/user/model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
- api/user/model/errors.py,sha256=rhcIcbAIk_7rs5lxdgcsf7SWFGmC9QLsgc67x7S6CKA,299
30
- api/user/model/requests.py,sha256=MazMirg7wQoUm4qvnm_EAB_gJIy3YxvYYqNyU3fZJc0,5025
31
- api/user/model/responses.py,sha256=0vbigspq_aBd1JS6hEm13BnG7Hm7EIiWBZ6xz3d5hmE,202
32
- config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
- config/channels.json,sha256=GepystGi0h_1fuakC_gdIc-YYxyy-a4TI619ygIpyyM,156
34
- config/notification.json,sha256=esrOaMUIqfcCHB0Tawp3t4cu7DQAA15X12OS-Gyenb0,361
35
- cxb/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
- cxb/client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
- cxb/client/config.json,sha256=WvhCcnJ9-uQ2raPuRBRSGO3iD7Hcaf8Cy49EXUu3KQw,358
38
- cxb/client/config.sample.json,sha256=fTYLbnTiUdbT_F7rcwI7CLSZ_KoX8EflfuyswRGW2x0,355
39
- cxb/client/favicon.ico,sha256=CD2FYyYYFNAbH7lGPnM5-2asMmhf-kwitAp99Kh0Wmc,4286
40
- cxb/client/favicon.png,sha256=gbSWS2UiKrUcy5Jt4gcncDrE5yvfAS00OgYzdNxPxlk,4164
41
- cxb/client/index.html,sha256=J_7uaGXP02rNLSvJ4Poyr5G7TZt8W0Br-EWQlYEeXi0,1622
42
- cxb/client/assets/@codemirror-Rn7_6DkE.js,sha256=lE9KsREWfszCrh0SBu7CKi3k1OiDzBrIeNO_S5PYRcM,342674
43
- cxb/client/assets/@edraj-CS4NwVbD.js,sha256=zndm--w-VH0vIAjb2K_MHp5oSC-khzxT8Evj1Dl_2-c,9293
44
- cxb/client/assets/@floating-ui-BwwcF-xh.js,sha256=K4lsJw_hrkV0vq1uguBTS_GxONRbsFtlBjX4pagaOwg,17129
45
- cxb/client/assets/@formatjs-yKEsAtjs.js,sha256=bwa2AS3AZNFoUsMafb6wKHA15W9GldY3Kt61ZObX02U,33632
46
- cxb/client/assets/@fortawesome-DRW1UCdr.js,sha256=XxmEJ7SxFU5lm4fFq2B0t6oAFpvInLfZbwrds7T9kM8,18810
47
- cxb/client/assets/@jsonquerylang-laKNoFFq.js,sha256=z3m86cWxHoliU-BL-mn-U7ob8B1cV1lzyC-Q7DITo2w,8464
48
- cxb/client/assets/@lezer-za4Q-8Ew.js,sha256=6kTYHAkwA6DYI_m9taUHq0iqetL5AbmBt43KB0s2Pxg,54631
49
- cxb/client/assets/@marijn-DXwl3gUT.js,sha256=ONjPnhK4okY91E_qSZTqZuKrYU97xaqPdt5Vde2cgcI,2312
50
- cxb/client/assets/@popperjs-l0sNRNKZ.js,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
51
- cxb/client/assets/@replit--ERk53eB.js,sha256=w2wSGTctSSsvB0PLKCbBVJUc4LRqyXbAFfApDw8DrPI,4586
52
- cxb/client/assets/@roxi-CGMFK4i8.js,sha256=a9e-nCrgDd2UQieodqFb8O1oMsoJ9GGg9pZ2pFG7vSE,49989
53
- cxb/client/assets/@typewriter-cCzskkIv.js,sha256=kyXdd1BwqHKx7CIB8Up_1AblBsI5ViLxkwjWN-bzcfw,21047
54
- cxb/client/assets/@zerodevx-BlBZjKxu.js,sha256=u3olMch61ywj4FnmXTSswD1myRH_rHI0dQMCNogCAH0,3883
55
- cxb/client/assets/@zerodevx-CVEpe6WZ.css,sha256=BkcVDS4u4ljfIXhn6xv4h5Pld01evCI_ebMKCxpK8i4,1976
56
- cxb/client/assets/BreadCrumbLite-DAhOx38v.js,sha256=_zhm_Sls-tayWdYobXeXCA6uxNSrVsLnAhfyPCTyHH8,1949
57
- cxb/client/assets/EntryRenderer-25YDhRen.js,sha256=iUbBmlD02BkiMNjS68jt8sHtzVnwAsuvadVDXBwVBS8,64047
58
- cxb/client/assets/EntryRenderer-DXytdFp9.css,sha256=8J5fh7_foC06CVV6Qk7UYvxXKqTrFOqQ4isbyJ-gABY,496
59
- cxb/client/assets/ListView-BpAycA2h.js,sha256=MKEI90xQ07Cmyo6KuJLR7yxOi5CQt0cpU7kCwTMxtVM,134226
60
- cxb/client/assets/ListView-U8of-_c-.css,sha256=sPIUBfAsMEwhNqvGgGf_oD09XUR5hT8PWk_OtVEwMgI,1288
61
- cxb/client/assets/Prism--hMplq-p.js,sha256=wzk_GRGPAnTHIenvdCuh_qqHFCeCKco2OCoFinBUesw,587
62
- cxb/client/assets/Prism-Uh6uStUw.css,sha256=_wHCkOjMWX__hXLr6MjadiXCj2dBxIQFAhkSLAhHwSA,6165
63
- cxb/client/assets/Table2Cols-BsbwicQm.js,sha256=w6w37qzrdh3f-8waIUDnwPk0MDa8dJBrrG0Z3A8uAAk,1410
64
- cxb/client/assets/_..-BvT6vdHa.css,sha256=u-3Pj3A2tQeUNBIItE_qki2Lk4GBISmHRs7957cGP30,275
65
- cxb/client/assets/_...404_-fuLH_rX9.js,sha256=9oGBvAECq9eMcTAZG-cznYAXcM2WaBu4G5wPoTt53uY,684
66
- cxb/client/assets/_...fallback_-Ba_NLmAE.js,sha256=leHVZijlVjIaqzYUCCTIFDFrFsVcS2NsxgVTW58OhBg,123
67
- cxb/client/assets/_module-Bfk8MiCs.js,sha256=Zh6tAXTmBj4kvrs5ojFFC6N45pasJviz6lHz5TEy3as,3793
68
- cxb/client/assets/_module-CEW0D5oI.js,sha256=B2uyRT7DxaK10V58YhhQNZtV-8bkmV9EbAK6WZhHwgw,7899
69
- cxb/client/assets/_module-Dgq0ZVtz.js,sha256=-_CkmFKVsif9U2B0uVLfmXuDp3GJS2iY4sAP1y_2rvQ,11226
70
- cxb/client/assets/ajv-Cpj98o6Y.js,sha256=liU3m63UhJYQ3-bBVFPN8MAHEmTJDu8Xcwf6wJTSqmw,236
71
- cxb/client/assets/axios-CG2WSiiR.js,sha256=URKIJZfepkPrQwK1aPXLhg4f5cGLhk6c0tVUS5eFFB0,36287
72
- cxb/client/assets/clsx-B-dksMZM.js,sha256=x7hDvCu6RhEQ5d35FtnEAYCjg4BM5zZYcw7EblGW0v0,374
73
- cxb/client/assets/codemirror-wrapped-line-indent-DPhKvljI.js,sha256=kn9kuXsyPkjimYpjkc3KyXSOral3p4v3gbQw5SbNMMY,1591
74
- cxb/client/assets/compare-C3AjiGFR.js,sha256=L2wU3DxEeQq-gheMWChs4IX2Las1HLWxAF4HWcpvSZo,8744
75
- cxb/client/assets/compute-scroll-into-view-Bl8rNFhg.js,sha256=5DonV_EZ7Iwbtu8sT17P3aoourk-WRBAdlAsaNh_mDA,2943
76
- cxb/client/assets/consolite-DlCuI0F9.js,sha256=oSh3Gbte0Iogkiczrf8Ei0pWKu75WAakY33Z9Kix7GA,3079
77
- cxb/client/assets/crelt-C8TCjufn.js,sha256=v5UZ6-BdG7hN-EZniG3z0-gaMx1rOdzsjqIiNrRUp8s,623
78
- cxb/client/assets/date-fns-l0sNRNKZ.js,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
79
- cxb/client/assets/deepmerge-rn4rBaHU.js,sha256=mq9vJj-3sJY_n_VL9dyNkcgD9eD-F7d0vuka-mPJUnY,1675
80
- cxb/client/assets/dmart_services-AL6-IdDE.js,sha256=RyyNwg7hpN4eTONXb4NOoQ9QTDx5meSSuSMprYkk7m8,1783
81
- cxb/client/assets/downloadFile-D08i0YDh.js,sha256=pdNEGMBhyU01Y_vVX1OEzxWC7Ktg0T2vwW6VfdYjf0Q,247
82
- cxb/client/assets/easy-signal-BiPFIK3O.js,sha256=2J65d_BBehKW7Hb64qwX3iCZDes2LsAjYlsRHuJTEHc,108
83
- cxb/client/assets/esm-env-rsSWfq8L.js,sha256=scv4WZ555272218bU3lLaHkEQ7dl-wFrvbn0MlQAqKA,27
84
- cxb/client/assets/export-OF_rTiXu.js,sha256=VjmlbOOhE2eGtbPQSbaz395EFtoMJLThpTtFze7Hcf8,4146
85
- cxb/client/assets/fast-deep-equal-l0sNRNKZ.js,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
86
- cxb/client/assets/fast-diff-C-IidNf4.js,sha256=3QejtPCU1VzP2FM7RY5yFvp4QseK438MIrhUa33u7ko,7785
87
- cxb/client/assets/fast-uri-l0sNRNKZ.js,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
88
- cxb/client/assets/flowbite-svelte-BLvjb-sa.js,sha256=vRreerVWabyzTubQPDBuxDvgV7M8RlDWIKocxzMQiQ0,245889
89
- cxb/client/assets/flowbite-svelte-CD54FDqW.css,sha256=n1HDAUq6e-IogOmdk3gYW4E8TK-yE3Gh8wgp5FdOn90,63
90
- cxb/client/assets/flowbite-svelte-icons-BI8GVhw_.js,sha256=cp8Lg64HqWR8_4XS3q4xOAV3hztu4BsJPBhgysMRTtU,80766
91
- cxb/client/assets/github-slugger-CQ4oX9Ud.js,sha256=1sye3A-ozGOvdFYnerReUKpwwAeCjBilw-ZMIbxgRAI,8573
92
- cxb/client/assets/global-igKv-1g9.js,sha256=9AnwcOz6vUYKXcaBuqOCag8rxRCSVDwmIHG8irKBIUM,347
93
- cxb/client/assets/hookar-BMRD9G9H.js,sha256=_Dzjp-0cmaseuT5CcILxOLX5a4QsMWHgS3bcAC5oH64,519
94
- cxb/client/assets/immutable-json-patch-DtRO2E_S.js,sha256=I1LmEOX8J21wFhrrAtIV6svx32i-j5TJpso1CpzEEik,5600
95
- cxb/client/assets/import-1vE3gBat.js,sha256=9T_SMx38Y7DXPtMi72n0LBsPbMPvlkQquZ3zOEp7zQk,3106
96
- cxb/client/assets/index-B-eTh-ZX.js,sha256=SoqSuq7zLpebuTstKO5Tfwz3fNEnbgzdMHJnLV8RCHQ,9824
97
- cxb/client/assets/index-BVyxzKtH.js,sha256=BoEJccSRRZecpdEomQSlNGAVVp6CEEkuz1xUVWXKORk,6015
98
- cxb/client/assets/index-BdeNM69f.js,sha256=gkNccueAx5s9vUKp3ZE31Xg2wL4xfipeQ73y27N-61c,2035
99
- cxb/client/assets/index-C6cPO4op.js,sha256=o_KVUiHGFlCJN96xkRu9orzLdrYUVTn_nJy9M0SQKrM,3621
100
- cxb/client/assets/index-CC-A1ipE.js,sha256=dfVwbYUl2GzaPaRcm9bvcm3c0bi8WQj9RsSYaZneH2w,412
101
- cxb/client/assets/index-CTxJ-lDp.js,sha256=CMXV0Oe3QRi4ITetl3tspH_h_4Wv8cG17-3V0PSN-2s,2821
102
- cxb/client/assets/index-Cd-F5j_k.js,sha256=3a3gWjjYVTv16DAeDvUZPwFIqSXU13aVefFTWGLUx7E,3250
103
- cxb/client/assets/index-D742rwaM.js,sha256=ivvY4EhQ0-ADpy1fu8TQtZuS6Qe707-SWWRWY-FWYJg,3381
104
- cxb/client/assets/index-DTfhnhwd.js,sha256=YKLsTYhS7k2f1QwXRCyYdRn2vB_mwzsqinT1of7dcnc,354
105
- cxb/client/assets/index-DdXRK7n9.js,sha256=UkW9YuMZ0_hZ3q9llWmO0UpkP4qNmXYMl1lLqmmZwQE,4047
106
- cxb/client/assets/index-DtiCmB4o.js,sha256=nv7dVMmo1vex5ih5mMC9MNLLMGuCmy_ktOa1j4rXQ0M,1976
107
- cxb/client/assets/index-NBrXBlLA.css,sha256=2mHbGZHluiEeZiiiubPFD2dGd6eL59WUa2qV8eSQqXs,376846
108
- cxb/client/assets/index-ac-Buu_H.js,sha256=3tSelUaTXqOQbjivh39F9R8AoTY-PvFD4uGbFU_eEeQ,33755
109
- cxb/client/assets/index-iYkH7C67.js,sha256=BFI8j9CqWYj8gKyfGZZp7dIrqoA7-Bnd9Za1-mTiLG0,3498
110
- cxb/client/assets/info-B986lRiM.js,sha256=28efQ_ywUNQ5Od__oXFskmVy9ZWR48DgnuNs1bvoqlg,2226
111
- cxb/client/assets/intl-messageformat-Dc5UU-HB.js,sha256=-5X21qzJD7TmWO2-DWDdxF8tql-Xdcq2QoUkBY54G00,6630
112
- cxb/client/assets/jmespath-l0sNRNKZ.js,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
113
- cxb/client/assets/json-schema-traverse-l0sNRNKZ.js,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
114
- cxb/client/assets/json-source-map-DRgZidqy.js,sha256=2MWN6aGupPEd3Uk0Nki7JeURX8opsBCdC36BuxJRakI,4281
115
- cxb/client/assets/jsonpath-plus-l0sNRNKZ.js,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
116
- cxb/client/assets/jsonrepair-B30Dx381.js,sha256=HddBNX0dIMqRHTFT0VtfF33a4JgvMp9iCDYFWs9YGZs,6639
117
- cxb/client/assets/lodash-es-DZVAA2ox.js,sha256=BvwNIFkh9lENGWunPRiHX9XxWJXVp17TiHEkaLLRpn0,25088
118
- cxb/client/assets/marked-DKjyhwJX.js,sha256=qbydVfDQQTzCnxUXxgsroNwJZCzaf9QONfBPKmyOeEA,39673
119
- cxb/client/assets/marked-gfm-heading-id-U5zO829x.js,sha256=237Q2hAeDNj3MAUeB3oQUy8Ov7oOYvvYprp2mt-HOU4,725
120
- cxb/client/assets/marked-mangle-CDMeiHC6.js,sha256=WGaJNWouxQQExqwUZC5Dw3XvdVWQYHvEWXBtKXDDFHY,420
121
- cxb/client/assets/memoize-one-BdPwpGay.js,sha256=jk5sfhm07ZMGDqLT1jqe27nsey2DIPbINp8U4bgP_QI,522
122
- cxb/client/assets/natural-compare-lite-Bg2Xcf-o.js,sha256=9R5eHr3vTw4igb95odBTQ39r5ae-JGESqt0JQ27a1xc,808
123
- cxb/client/assets/pagination-svelte-D5CyoiE_.js,sha256=-ppq9Dg-3wFdxmloAwaxmU4jU1HaypcXHo4OS6Dkk4s,4380
124
- cxb/client/assets/pagination-svelte-v10nAbbM.css,sha256=7FtgdLOx-Wq4-TyF8CDDro2NF6jJwaNxbP3VI4g5uYI,3585
125
- cxb/client/assets/plantuml-encoder-C47mzt9T.js,sha256=dpoe9r1lJmN-rbN-TAv2JnFgdWrFqExHUKs4JspxM7M,53041
126
- cxb/client/assets/prismjs-DTUiLGJu.js,sha256=Nd_QmO8yEdbvZkliAEJjqktd3pFsLRRwJQt-Sd_pqXo,25847
127
- cxb/client/assets/profile-BUf-tKMe.js,sha256=Ye_7fF8wYm6hR5u6KYRV1hMdweqW2q6_ZGpsNhrF1Y8,6527
128
- cxb/client/assets/query-CNmXTsgf.js,sha256=iUE9_KIbABOdzswc4e8mcUs_PbDTo9V8nOmil0K7JSA,11363
129
- cxb/client/assets/queryHelpers-C9iBWwqe.js,sha256=SkgdFEtjdTaD1cMVvKsdf5IQaMNUz74nTcj-pVDhQuw,501
130
- cxb/client/assets/scroll-into-view-if-needed-KR58zyjF.js,sha256=Dw5KNhvWXAltb_qIh3e_f5ud5CQSxqHGHGlMf7BFGXc,897
131
- cxb/client/assets/spaces-0oyGvpii.js,sha256=l9GvTbt-jiMyG8RGsCe3zAaYad0vQAhPjSBtdEp6htg,73
132
- cxb/client/assets/style-mod-Bs6eFhZE.js,sha256=2P-Jrkn335imR7dWZ-lR1mVAhef16p050Fb80pVApVA,2194
133
- cxb/client/assets/svelte-B2XmcTi_.js,sha256=bQk6kPr592D2TiwuMX7a6lt9YJB8UYeQMzvAtsxaP_s,61082
134
- cxb/client/assets/svelte-awesome-COLlx0DN.css,sha256=5T3C0hIplhoXaGU3PJ-KPpPgB0uJTXN4n4eA21ChO3Y,448
135
- cxb/client/assets/svelte-awesome-DhnMA6Q_.js,sha256=FEokMqwJ5WAhy_a2QNscieYkpS4mhAtR_NOPYzd7lD0,3858
136
- cxb/client/assets/svelte-datatables-net-CY7LBj6I.js,sha256=PQZwUZsx3JjhI2W2Mwvsr4abTvEkbVl3osr3VpO-enk,4715
137
- cxb/client/assets/svelte-floating-ui-BlS3sOAQ.js,sha256=lboSaEhc2oCTFSD5fkUaHSlxwtH8SGd4w3iLajcEySU,733
138
- cxb/client/assets/svelte-i18n-CT2KkQaN.js,sha256=_LIkJDtwxRXQXVUvWxdc5z2BLNb4SwzSNyDE6lKWT3Q,7437
139
- cxb/client/assets/svelte-jsoneditor-BzfX6Usi.css,sha256=5nvNv27PvUKYYgbHA1QpynYgdEoPCMoRzUlN8Ni2Fko,95514
140
- cxb/client/assets/svelte-jsoneditor-CUGSvWId.js,sha256=IwxIH_L_eG1NdCYCtrkcEysxGflo66lL-SBa1cCYGMA,238060
141
- cxb/client/assets/svelte-select-CegQKzqH.css,sha256=RW2XmPXMyUSPG672lEcT7Nhz1gaLfzTqoQjFG6Jb4zI,10652
142
- cxb/client/assets/svelte-select-CjHAt_85.js,sha256=17YwjNfrW5d9x6GmOaHibTPVB_PZ7WBu9V_27MGcLrw,17176
143
- cxb/client/assets/tailwind-merge-CJvxXMcu.js,sha256=PhlMjcf4Fs_9tgXtY97DfhD4crCI-S_zuZJACPZ4Q2E,25988
144
- cxb/client/assets/tailwind-variants-Cj20BoQ3.js,sha256=Eofe15eg2u8pkjxy3tDaXMpq2etBq0Yzc15kSig_xEk,5489
145
- cxb/client/assets/toast-B9WDyfyI.js,sha256=eJ0gQdgl4vAsHpcBUlXOPUrbNbk9Ii9Va5CdG0GRDGA,248
146
- cxb/client/assets/tslib-pJfR_DrR.js,sha256=Kke-aujRqfYw2Ld4KusSVmRen6Lw2l8VKoYr2OW79mY,1231
147
- cxb/client/assets/typewriter-editor-DkTVIJdm.js,sha256=YlETGGigYqnJdwnP4VkV7YAIoblWivupZuAHxu0KeDQ,52323
148
- cxb/client/assets/user-DeK_NB5v.js,sha256=6VYTgmWgl7pVRgW6dD0gGKPKvvKnCEqpKy3ZlLOrQwQ,1253
149
- cxb/client/assets/vanilla-picker-l5rcX3cq.js,sha256=B8KWTpJINp3oIXirDlwC683EYHZUPW76lAnHmeUPqEY,18814
150
- cxb/client/assets/w3c-keyname-Vcq4gwWv.js,sha256=7NTN0-UTH-BpoJQqdC43Ec4Cdwj4Wv8viGg4W3EBqx8,1494
151
- data_adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
152
- data_adapters/adapter.py,sha256=zR_yFd5ZI9vIQuUB6AUcF-LHgxOaxoREV2hogasivjQ,443
153
- data_adapters/base_data_adapter.py,sha256=vG9WeHyw_c_BnH0EmudwPSNS6iMb5buQJiZS_9cm9p8,12055
154
- data_adapters/helpers.py,sha256=0ySEDnQBMgFVXstFnPjXLtZ_-8IC4Q8oPXXrWokpFB8,660
155
- data_adapters/file/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
156
- data_adapters/file/adapter.py,sha256=SPVVfRIlyQDYfZJv4J8LmrDGtrVWddu76SvpnkXY3jM,77671
157
- data_adapters/file/adapter_helpers.py,sha256=ExA_fAnRaPOLDuEY3hsLNR2BvvCscnS5Du6lWRtCvh0,34321
158
- data_adapters/file/archive.py,sha256=B4VV6HNB3Bqd4tlqZ3jUQps8oqht_xOdBNOi9cLuo8Q,5423
159
- data_adapters/file/create_index.py,sha256=lUcUkepo9QUIQDDDgoPAL74_n16cZ_q0NKnITGmbF6I,11888
160
- data_adapters/file/create_users_folders.py,sha256=zOBgxMnqgEskYP4pgkmE6VYMca-ADLz8mXKPHJPYpys,1670
161
- data_adapters/file/custom_validations.py,sha256=ziOERgTr-eY_zrN0C41B2FYmpEyoKiV4holh8an-p2c,1754
162
- data_adapters/file/drop_index.py,sha256=OK3wXwaO9tUcHcJjqyLeBnkElzK35MZMi8YLGWdrXRw,1417
163
- data_adapters/file/health_check.py,sha256=cMvwsXhjEykjrTyB3HtUn8QqKdtB_h5w8mGOEYPepzU,24221
164
- data_adapters/file/redis_services.py,sha256=83STcca5fYFaEVLRYAxfUQXeUQZqJOT8XH-GBSbkR-E,39914
165
- data_adapters/sql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
166
- data_adapters/sql/adapter.py,sha256=QXEJDtatIap18mrTWSqa9D7RnNZdjerkVJEGAv3i6FE,154825
167
- data_adapters/sql/adapter_helpers.py,sha256=Eu22NElz2fMu6zyOsGsGrnAZcyWhHz9I__RJ9z6cwK0,15076
168
- data_adapters/sql/create_tables.py,sha256=KqaXHTDOD8YaqGNc_e0iHHotd0WE3Kad_tBevtoGA20,17427
169
- data_adapters/sql/create_users_folders.py,sha256=fm3P-CMcPX4b4DqXHKWMOtfX4RHdaev2nCDhYrS5cIs,1911
170
- data_adapters/sql/db_to_json_migration.py,sha256=GTPO6-HblgD60qruhhVpWbKOke5xz9w_xwIr5NKK764,21009
171
- data_adapters/sql/health_check_sql.py,sha256=2Z0mN5IMrjF72ZAiafBLkHklbXXWJzLp1K2TzjzPI1s,8569
172
- data_adapters/sql/json_to_db_migration.py,sha256=KaubDrRZ3MfPLc-CNGPpsEccPELKr1V4GoBEBt1BNZo,21131
173
- data_adapters/sql/update_query_policies.py,sha256=LUpkyzDAkiwwVWnXxPdVAU6atehW72ECAazj3mEYHK0,3857
174
- dmart_migrations/README,sha256=MVlc9TYmr57RbhXET6QxgyCcwWP7w-vLkEsirENqiIQ,38
175
- dmart_migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
176
- dmart_migrations/alembic.ini,sha256=zs8d8VhH9TRwZrPK697EZPBCfaKvI4SqTuGuG0FAm2Y,3747
177
- dmart_migrations/env.py,sha256=P1gnJRIUrP2jLHZ7HDbfkzkpuZJ_LMWqw05HIqOUJHo,3110
178
- dmart_migrations/notes.txt,sha256=X7LYSNmulLRiAUXvw07Z85bSGRTnx4NUpoNC9D2DfO8,395
179
- dmart_migrations/script.py.mako,sha256=u-ABdYW1tcIILgJFJdQZYLxoAI8Awd6wZbx30rY6fxU,680
180
- dmart_migrations/__pycache__/__init__.cpython-314.pyc,sha256=BB6R74YhUmoPWg2dYz2gTIM0CE7sMcOt0dsgqEEPza4,174
181
- dmart_migrations/__pycache__/env.cpython-314.pyc,sha256=27dvi9nRTOIogSJ7ytGX2i1CbTEw4rwPaZV_OGS175g,4278
182
- dmart_migrations/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
183
- dmart_migrations/scripts/calculate_checksums.py,sha256=v2NLEvReA9V3noJE-BWANgKDdhc8Mqg1ZmJJ8nc8sGI,3443
184
- dmart_migrations/scripts/migration_f7a4949eed19.py,sha256=oUXuxjU4MbVafm4S-xu5J_4apHqW6hQZ8ftpJtCtM28,1462
185
- dmart_migrations/versions/0f3d2b1a7c21_add_authz_materialized_views.py,sha256=70vrPfhMHVHhw1l7KNQpvCUU76XZfvGcPlrXOeU4FHU,2599
186
- dmart_migrations/versions/10d2041b94d4_last_checksum_history.py,sha256=FYjyzE5Xi6bn9LUtxLKFnQOKhg4GZOrTkpqtmlCnY6Y,2860
187
- dmart_migrations/versions/1cf4e1ee3cb8_ext_permission_with_filter_fields_values.py,sha256=taaFTkTaFfLfj7QUUfIdcojvbOdjut_dWtrIvQUN7-4,921
188
- dmart_migrations/versions/26bfe19b49d4_rm_failedloginattempts.py,sha256=-Roftn8OSUz7kfR3yMI02rulyvnH46W0WpJfDQ5xAdk,1471
189
- dmart_migrations/versions/3c8bca2219cc_add_otp_table.py,sha256=f-YSxx1iLA0iHWukq1VnngFmiiYQyEzowicox0-wtbY,1125
190
- dmart_migrations/versions/6675fd9dfe42_remove_unique_from_sessions_table.py,sha256=yP40IHwtzFAAUid_VeeCkt_9F2RszMYBjNKx2mDTKNw,1037
191
- dmart_migrations/versions/71bc1df82e6a_adding_user_last_login_at.py,sha256=LINO2hWUEFmsTspupd8AxgUS6tNJFNgGC5do1QPMQ1E,1486
192
- dmart_migrations/versions/74288ccbd3b5_initial.py,sha256=hZ1w5mqVKSO13J1O4zcTccDJBk2c-cmIB0AUx1KLlLI,13988
193
- dmart_migrations/versions/7520a89a8467_rm_activesession_table.py,sha256=4VYv9tCXkTQNaXPVvjdsKTiw093KkBBUHNSiWdZtqtA,1305
194
- dmart_migrations/versions/848b623755a4_make_created_nd_updated_at_required.py,sha256=o106xd-apT8ZAXdVCjX76o7VuqRQNkIl0V4f41m5j2E,5375
195
- dmart_migrations/versions/8640dcbebf85_add_notes_to_users.py,sha256=XjfW2Lc0-xoRGB2qfdzDstw7Caaev6JhqRNYV_sIqgc,813
196
- dmart_migrations/versions/91c94250232a_adding_fk_on_owner_shortname.py,sha256=F9FDF2qyeqvOx1gkYq5HQMkVCH1QrXciYSHVxijsSSU,4024
197
- dmart_migrations/versions/98ecd6f56f9a_ext_meta_with_owner_group_shortname.py,sha256=S466VE3jsxXDEpTKyhIN06uutM0jI7zYHTWIYvU_pJw,2579
198
- dmart_migrations/versions/9aae9138c4ef_indexing_created_at_updated_at.py,sha256=xrqfJB5cER0PYi1torwkgsbBBjDeeM6dyj4pu-quphk,3662
199
- dmart_migrations/versions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
200
- dmart_migrations/versions/b53f916b3f6d_json_to_jsonb.py,sha256=LPnevQjbjs0KrwqxYHtGUC6mSBBsUpiCBnwD-FN2x50,24840
201
- dmart_migrations/versions/eb5f1ec65156_adding_user_locked_to_device.py,sha256=Z9skCus52jg_xV5a7JVYK3IenNlvsdMKIFf1H5POst0,1030
202
- dmart_migrations/versions/f7a4949eed19_adding_query_policies_to_meta.py,sha256=LA4rx3u0Ei5m4OcSsVYHBsGMeKOJdx8G88yK1kBLFys,2307
203
- dmart_migrations/versions/__pycache__/0f3d2b1a7c21_add_authz_materialized_views.cpython-314.pyc,sha256=mevU12_Y6RzGxc8Xg1bkFIVaNu7uvx7zCQ2j6bn_Pqo,3955
204
- dmart_migrations/versions/__pycache__/10d2041b94d4_last_checksum_history.cpython-314.pyc,sha256=n3eMeDeLN8WXXzoKA-8b4t9k-WQF4FPVYIRReNm-uN4,6199
205
- dmart_migrations/versions/__pycache__/1cf4e1ee3cb8_ext_permission_with_filter_fields_values.cpython-314.pyc,sha256=_8yowo72FtcMsYQOp2vpy_hWJ5QlDOPsDsEt6NOr9cY,2649
206
- dmart_migrations/versions/__pycache__/26bfe19b49d4_rm_failedloginattempts.cpython-314.pyc,sha256=1PYF87QiiSXEmHUM6wnq9Ck_ktq981W3TgS-_7QqG4M,3309
207
- dmart_migrations/versions/__pycache__/3c8bca2219cc_add_otp_table.cpython-314.pyc,sha256=HD6h3iYtGyhDcOjRK4xWa9Hl6YzdIszmyO95wPZvFOM,2710
208
- dmart_migrations/versions/__pycache__/6675fd9dfe42_remove_unique_from_sessions_table.cpython-314.pyc,sha256=k71q5tLr6x2cDoHw4pDNeBem136qz2XFjUg11a6DDpM,2422
209
- dmart_migrations/versions/__pycache__/71bc1df82e6a_adding_user_last_login_at.cpython-314.pyc,sha256=35cwhVRGhtvREO4j3pBDtGoSD8sZd0MdZ0SRZKLsK5s,3399
210
- dmart_migrations/versions/__pycache__/74288ccbd3b5_initial.cpython-314.pyc,sha256=BDS6zx-enw-oWeAIju5plp4lB10q8BeFwBnaUDEgtKY,28589
211
- dmart_migrations/versions/__pycache__/7520a89a8467_rm_activesession_table.cpython-314.pyc,sha256=x5m_sxYMDP6myKKlVTivP-VM-2EH6d0D21pv9URFyXU,2791
212
- dmart_migrations/versions/__pycache__/848b623755a4_make_created_nd_updated_at_required.cpython-314.pyc,sha256=A4E0A4eJliMs-uNeVZfGo2j8UrXhdRrtBB1Ky-OA_O0,7917
213
- dmart_migrations/versions/__pycache__/8640dcbebf85_add_notes_to_users.cpython-314.pyc,sha256=94zNRuU2L3ra43Z3eDa4duVMXMsKTLiNUUj7lUxeZzY,2526
214
- dmart_migrations/versions/__pycache__/91c94250232a_adding_fk_on_owner_shortname.cpython-314.pyc,sha256=IIEupLleN5nEUUpTCXWGV-LXsdzGJrcnrolJmpi8WMo,6383
215
- dmart_migrations/versions/__pycache__/98ecd6f56f9a_ext_meta_with_owner_group_shortname.cpython-314.pyc,sha256=tPXDQ_TCEK9sv3ZinAk9vUJcwuqE75ymoT_0O_0qLss,5657
216
- dmart_migrations/versions/__pycache__/9aae9138c4ef_indexing_created_at_updated_at.cpython-314.pyc,sha256=D3m2fuhNbUUNZi21p45UDy8uUmAOio1RZzqoPnKD6G4,6990
217
- dmart_migrations/versions/__pycache__/b53f916b3f6d_json_to_jsonb.cpython-314.pyc,sha256=eBvU5VFctw1AqklCtprJJhvGXZVYpvxBcuZiI6bOBGY,34035
218
- dmart_migrations/versions/__pycache__/eb5f1ec65156_adding_user_locked_to_device.cpython-314.pyc,sha256=v47hBAxgbjkSAsEn8O2EUTUOPR0D9bVD8fJl9erlpzM,2514
219
- dmart_migrations/versions/__pycache__/f7a4949eed19_adding_query_policies_to_meta.cpython-314.pyc,sha256=jCW56_bq_qQM6H9CjPu2qOm8gywSO7TEHHywlyv1qcI,5099
220
- languages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
221
- languages/arabic.json,sha256=UL61rP9_M42CGfU94G5-1bXVUVnsJWXzoqhaXTXTJuM,910
222
- languages/english.json,sha256=Y7eZ2X8c427_97qYrHOeGb2d725T-YlNNFVSi8FB7Kw,649
223
- languages/kurdish.json,sha256=GgPLkVKyhIQjT7h3cPfDh0oyzg26znvBUe5X_Zz2TWI,864
224
- languages/loader.py,sha256=3gf2WmfSQ-AVIpyLAm_5J5NcQlWqBxQHMjcUd04Pijs,381
225
- models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
226
- models/api.py,sha256=f5X56dudyEysPmDuI5grM2RRCXuIQoehaAB6wMAGG28,6473
227
- models/core.py,sha256=tEb7cbnC71yE9SDluynj7dE3U8Ed-EbF3uRJizy-uuU,16880
228
- models/enums.py,sha256=y2G5EKIc8FusVW4JvEozGFKL2GxjtuOK7k3zSguP4dc,5395
229
- plugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
230
- plugins/action_log/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
231
- plugins/action_log/plugin.py,sha256=-JY_iIIJJjFFofvpMoCxNJMXNr_KC6kA8TiwvvoxaWI,4434
232
- plugins/admin_notification_sender/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
233
- plugins/admin_notification_sender/plugin.py,sha256=sxVGW8qtRmDEQeS6QD3F3IqzZOoh_9H_y2TsRCDkXaw,4771
234
- plugins/ldap_manager/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
235
- plugins/ldap_manager/plugin.py,sha256=c05pKGsyLETMrheCqIw3gZOSLdTWvEDq_WCl0Q_0yXQ,3030
236
- plugins/local_notification/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
237
- plugins/local_notification/plugin.py,sha256=FObVxID5Bg0G_xStpJYZkg706wu_CpUqk09DmzHAyPQ,4074
238
- plugins/realtime_updates_notifier/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
239
- plugins/realtime_updates_notifier/plugin.py,sha256=Gcvob4ShSs2Ht1hLD2vtwhR_PSFYMv3_l_VPM2opTYs,2374
240
- plugins/redis_db_update/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
241
- plugins/redis_db_update/plugin.py,sha256=z05k1zNJgBnKPj-jrtMUeI9br75ZPlifbzL0HxpRnXg,7128
242
- plugins/resource_folders_creation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
243
- plugins/resource_folders_creation/plugin.py,sha256=OwYPtRjMt2esAAEdv1FjdZgjEz01yt2xOZQi3nB0kEQ,3327
244
- plugins/system_notification_sender/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
245
- plugins/system_notification_sender/plugin.py,sha256=MUOujwyRJ3yQrXwZ-X4qSdx0ZNU2c-sYy0d0-U8twoA,8253
246
- plugins/update_access_controls/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
247
- plugins/update_access_controls/plugin.py,sha256=43UV4vg-zxBF_7Bv0AZH6gU0Bgy2ybapNK21wJTF05k,301
248
- utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
249
- utils/access_control.py,sha256=8cCKr-6bL-Shl8j8xtfjEykMPGy6wkbNz-NRwLCdx-Y,11757
250
- utils/async_request.py,sha256=Lm2xGXLeph7P1_fLhhNJDhPubKT2ncFn_Ueft4JVoeI,255
251
- utils/exporter.py,sha256=HjcZCzcuH6N6f7Gn2hkTEeEFyo-MfrsiZUYAE-9kkVQ,9718
252
- utils/firebase_notifier.py,sha256=nAeCUo5Mtwxygwj8ONlw8ZAtL_ekdJBabvU0z2dZ3NY,2391
253
- utils/generate_email.py,sha256=25i1iNVDfyRDq7vvZVFkaTYfMZFkAg1ZVQO2GdK7yRQ,1122
254
- utils/helpers.py,sha256=gNxLg09cclRWrKNBy2pwGZsxGA0iFS5iZ_nyra3SmnI,9928
255
- utils/hypercorn_config.py,sha256=q28HGRLWo9wjOVF183WwFPs3HQo4Nexc7q_7dmSVHRI,311
256
- utils/internal_error_code.py,sha256=KGlXPC5YruPmb0ORVY7U3EEVpBgSLuU4lHdXgwUVN2M,1637
257
- utils/jwt.py,sha256=Y7Gp3imvNwAtWOg8V0etvsEFtswmCYKK_U4ljZ15Pps,4590
258
- utils/logger.py,sha256=peejQnq9B0eaHwdLynBHT7FUCq7jCX_DhkX6BcxrLkA,5274
259
- utils/middleware.py,sha256=PAVwnLzs0cyT_ZIgc1slqadEOJNCPliLhOTjaYx0Waw,3399
260
- utils/notification.py,sha256=O9oOeU9cRm3e9UAc-VJONWx-TzqbCMddFNaTQilE6ks,2479
261
- utils/password_hashing.py,sha256=NZZsmtPG9Vkocipk3DlDKKHKUdxRKA4yOhCurD8dUhg,356
262
- utils/plugin_manager.py,sha256=brQoE4u2WxH6EMvUOYQlnOnSUbKwha92-UfAgWUaHRU,7645
263
- utils/query_policies_helper.py,sha256=Bf5qriQJ8CpUqPaQg5cdvNrn-92l_jKxHwsvXdegAZo,4796
264
- utils/regex.py,sha256=cv9b_l_e8tz42mKckeeyDgypKqh2e71E28co2iuEVxA,2286
265
- utils/repository.py,sha256=9L-IvQ0Js0SQ5OR-Rh0i2Wdu4H9H06r8eE84hfBIu7Q,18313
266
- utils/router_helper.py,sha256=Tgoq3oakejdEeyeVieTNk38JsPZ8x5RuR0kw2THc1mI,604
267
- utils/settings.py,sha256=yjiudcgLVSIvKLQo9JtukmeLSU-6YTdggzWfZxiFoO8,5720
268
- utils/sms_notifier.py,sha256=04D6D_ldk3S9SojI7_381pqLc8v9lligeNHAysohz7w,550
269
- utils/social_sso.py,sha256=Dm1W6U9OwKbAeUwM-kwJBHFEoreeoN-s-RHdOZ1-cNg,2216
270
- utils/ticket_sys_utils.py,sha256=9QAlW2iiy8KyxQRBDj_WmzS5kKb0aYJmGwd4qzmGVqo,7005
271
- utils/web_notifier.py,sha256=QM87VVid2grC5lK3NdS1yzz0z1wXljr4GChJOeK86W4,843
272
- utils/templates/activation.html.j2,sha256=XAMKCdoqONoc4ZQucD0yV-Pg5DlHHASZrTVItNS-iBE,640
273
- utils/templates/reminder.html.j2,sha256=aoS8bTs56q4hjAZKsb0jV9c-PIURBELuBOpT_qPZNVU,639
274
- dmart-1.4.32.dist-info/METADATA,sha256=OsIWme8HRVz7FSh3qJ1M7SDkqX6XYcfmr-p_7PkoFFk,2149
275
- dmart-1.4.32.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
276
- dmart-1.4.32.dist-info/entry_points.txt,sha256=GjfoGh1bpxuU9HHGJzbtCFPNptHv9TryxHMN3uBSKpg,37
277
- dmart-1.4.32.dist-info/top_level.txt,sha256=S-gfX1pLerapNXiHZ8lvPYoV7sgwSX2_NCZ6xfzDUHM,267
278
- dmart-1.4.32.dist-info/RECORD,,
dmart_migrations/README DELETED
@@ -1 +0,0 @@
1
- Generic single-database configuration.