dmart 0.1.9__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 (149) hide show
  1. alembic/__init__.py +0 -0
  2. alembic/env.py +91 -0
  3. alembic/scripts/__init__.py +0 -0
  4. alembic/scripts/calculate_checksums.py +77 -0
  5. alembic/scripts/migration_f7a4949eed19.py +28 -0
  6. alembic/versions/0f3d2b1a7c21_add_authz_materialized_views.py +87 -0
  7. alembic/versions/10d2041b94d4_last_checksum_history.py +62 -0
  8. alembic/versions/1cf4e1ee3cb8_ext_permission_with_filter_fields_values.py +33 -0
  9. alembic/versions/26bfe19b49d4_rm_failedloginattempts.py +42 -0
  10. alembic/versions/3c8bca2219cc_add_otp_table.py +38 -0
  11. alembic/versions/6675fd9dfe42_remove_unique_from_sessions_table.py +36 -0
  12. alembic/versions/71bc1df82e6a_adding_user_last_login_at.py +43 -0
  13. alembic/versions/74288ccbd3b5_initial.py +264 -0
  14. alembic/versions/7520a89a8467_rm_activesession_table.py +39 -0
  15. alembic/versions/848b623755a4_make_created_nd_updated_at_required.py +138 -0
  16. alembic/versions/8640dcbebf85_add_notes_to_users.py +32 -0
  17. alembic/versions/91c94250232a_adding_fk_on_owner_shortname.py +104 -0
  18. alembic/versions/98ecd6f56f9a_ext_meta_with_owner_group_shortname.py +66 -0
  19. alembic/versions/9aae9138c4ef_indexing_created_at_updated_at.py +80 -0
  20. alembic/versions/__init__.py +0 -0
  21. alembic/versions/b53f916b3f6d_json_to_jsonb.py +492 -0
  22. alembic/versions/eb5f1ec65156_adding_user_locked_to_device.py +36 -0
  23. alembic/versions/f7a4949eed19_adding_query_policies_to_meta.py +60 -0
  24. api/__init__.py +0 -0
  25. api/info/__init__.py +0 -0
  26. api/info/router.py +109 -0
  27. api/managed/__init__.py +0 -0
  28. api/managed/router.py +1541 -0
  29. api/managed/utils.py +1850 -0
  30. api/public/__init__.py +0 -0
  31. api/public/router.py +758 -0
  32. api/qr/__init__.py +0 -0
  33. api/qr/router.py +108 -0
  34. api/user/__init__.py +0 -0
  35. api/user/model/__init__.py +0 -0
  36. api/user/model/errors.py +14 -0
  37. api/user/model/requests.py +165 -0
  38. api/user/model/responses.py +11 -0
  39. api/user/router.py +1401 -0
  40. api/user/service.py +270 -0
  41. bundler.py +44 -0
  42. config/__init__.py +0 -0
  43. config/channels.json +11 -0
  44. config/notification.json +17 -0
  45. data_adapters/__init__.py +0 -0
  46. data_adapters/adapter.py +16 -0
  47. data_adapters/base_data_adapter.py +467 -0
  48. data_adapters/file/__init__.py +0 -0
  49. data_adapters/file/adapter.py +2043 -0
  50. data_adapters/file/adapter_helpers.py +1013 -0
  51. data_adapters/file/archive.py +150 -0
  52. data_adapters/file/create_index.py +331 -0
  53. data_adapters/file/create_users_folders.py +52 -0
  54. data_adapters/file/custom_validations.py +68 -0
  55. data_adapters/file/drop_index.py +40 -0
  56. data_adapters/file/health_check.py +560 -0
  57. data_adapters/file/redis_services.py +1110 -0
  58. data_adapters/helpers.py +27 -0
  59. data_adapters/sql/__init__.py +0 -0
  60. data_adapters/sql/adapter.py +3210 -0
  61. data_adapters/sql/adapter_helpers.py +491 -0
  62. data_adapters/sql/create_tables.py +451 -0
  63. data_adapters/sql/create_users_folders.py +53 -0
  64. data_adapters/sql/db_to_json_migration.py +482 -0
  65. data_adapters/sql/health_check_sql.py +232 -0
  66. data_adapters/sql/json_to_db_migration.py +454 -0
  67. data_adapters/sql/update_query_policies.py +101 -0
  68. data_generator.py +81 -0
  69. dmart-0.1.9.dist-info/METADATA +64 -0
  70. dmart-0.1.9.dist-info/RECORD +149 -0
  71. dmart-0.1.9.dist-info/WHEEL +5 -0
  72. dmart-0.1.9.dist-info/entry_points.txt +2 -0
  73. dmart-0.1.9.dist-info/top_level.txt +23 -0
  74. dmart.py +513 -0
  75. get_settings.py +7 -0
  76. languages/__init__.py +0 -0
  77. languages/arabic.json +15 -0
  78. languages/english.json +16 -0
  79. languages/kurdish.json +14 -0
  80. languages/loader.py +13 -0
  81. main.py +506 -0
  82. migrate.py +24 -0
  83. models/__init__.py +0 -0
  84. models/api.py +203 -0
  85. models/core.py +597 -0
  86. models/enums.py +255 -0
  87. password_gen.py +8 -0
  88. plugins/__init__.py +0 -0
  89. plugins/action_log/__init__.py +0 -0
  90. plugins/action_log/plugin.py +121 -0
  91. plugins/admin_notification_sender/__init__.py +0 -0
  92. plugins/admin_notification_sender/plugin.py +124 -0
  93. plugins/ldap_manager/__init__.py +0 -0
  94. plugins/ldap_manager/plugin.py +100 -0
  95. plugins/local_notification/__init__.py +0 -0
  96. plugins/local_notification/plugin.py +123 -0
  97. plugins/realtime_updates_notifier/__init__.py +0 -0
  98. plugins/realtime_updates_notifier/plugin.py +58 -0
  99. plugins/redis_db_update/__init__.py +0 -0
  100. plugins/redis_db_update/plugin.py +188 -0
  101. plugins/resource_folders_creation/__init__.py +0 -0
  102. plugins/resource_folders_creation/plugin.py +81 -0
  103. plugins/system_notification_sender/__init__.py +0 -0
  104. plugins/system_notification_sender/plugin.py +188 -0
  105. plugins/update_access_controls/__init__.py +0 -0
  106. plugins/update_access_controls/plugin.py +9 -0
  107. pytests/__init__.py +0 -0
  108. pytests/api_user_models_erros_test.py +16 -0
  109. pytests/api_user_models_requests_test.py +98 -0
  110. pytests/archive_test.py +72 -0
  111. pytests/base_test.py +300 -0
  112. pytests/get_settings_test.py +14 -0
  113. pytests/json_to_db_migration_test.py +237 -0
  114. pytests/service_test.py +26 -0
  115. pytests/test_info.py +55 -0
  116. pytests/test_status.py +15 -0
  117. run_notification_campaign.py +98 -0
  118. scheduled_notification_handler.py +121 -0
  119. schema_migration.py +208 -0
  120. schema_modulate.py +192 -0
  121. set_admin_passwd.py +55 -0
  122. sync.py +202 -0
  123. utils/__init__.py +0 -0
  124. utils/access_control.py +306 -0
  125. utils/async_request.py +8 -0
  126. utils/exporter.py +309 -0
  127. utils/firebase_notifier.py +57 -0
  128. utils/generate_email.py +38 -0
  129. utils/helpers.py +352 -0
  130. utils/hypercorn_config.py +12 -0
  131. utils/internal_error_code.py +60 -0
  132. utils/jwt.py +124 -0
  133. utils/logger.py +167 -0
  134. utils/middleware.py +99 -0
  135. utils/notification.py +75 -0
  136. utils/password_hashing.py +16 -0
  137. utils/plugin_manager.py +215 -0
  138. utils/query_policies_helper.py +112 -0
  139. utils/regex.py +44 -0
  140. utils/repository.py +529 -0
  141. utils/router_helper.py +19 -0
  142. utils/settings.py +165 -0
  143. utils/sms_notifier.py +21 -0
  144. utils/social_sso.py +67 -0
  145. utils/templates/activation.html.j2 +26 -0
  146. utils/templates/reminder.html.j2 +17 -0
  147. utils/ticket_sys_utils.py +203 -0
  148. utils/web_notifier.py +29 -0
  149. websocket.py +231 -0
models/api.py ADDED
@@ -0,0 +1,203 @@
1
+ import models.core as core
2
+ from pydantic import BaseModel, Field, ValidationInfo, field_validator
3
+ from datetime import datetime
4
+ from typing import Any
5
+ from builtins import Exception as PyException
6
+ from models.enums import (
7
+ DataAssetType,
8
+ QueryType,
9
+ ResourceType,
10
+ SortType,
11
+ Status,
12
+ RequestType,
13
+ )
14
+ import utils.regex as regex
15
+ from utils.settings import settings
16
+
17
+
18
+ class Request(BaseModel):
19
+ space_name: str = Field(..., pattern=regex.SPACENAME)
20
+ request_type: RequestType
21
+ records: list[core.Record]
22
+
23
+ model_config = {
24
+ "extra": "forbid",
25
+ "json_schema_extra": {
26
+ "examples": [
27
+ {
28
+ "space_name": "data",
29
+ "request_type": "create",
30
+ "records": [
31
+ {
32
+ "resource_type": "content",
33
+ "shortname": "auto",
34
+ "subpath": "/users",
35
+ "attributes": {
36
+ "is_active": True,
37
+ "slug": None,
38
+ "displayname": {
39
+ "en": "name en",
40
+ "ar": "name ar",
41
+ "ku": "name ku",
42
+ },
43
+ "description": {
44
+ "en": "desc en",
45
+ "ar": "desc ar",
46
+ "ku": "desc ku",
47
+ },
48
+ "tags": [],
49
+ "payload": {
50
+ "content_type": "json",
51
+ "schema_shortname": "user",
52
+ "body": {
53
+ "email": "myname@gmail.com",
54
+ "first_name": "John",
55
+ "language": "en",
56
+ "last_name": "Doo",
57
+ "mobile": "7999311703",
58
+ },
59
+ },
60
+ },
61
+ }
62
+ ],
63
+ }
64
+ ]
65
+ }
66
+ }
67
+
68
+
69
+ class RedisReducer(BaseModel):
70
+ reducer_name: str
71
+ alias: str | None = None
72
+ args: list = []
73
+
74
+
75
+ class RedisAggregate(BaseModel):
76
+ group_by: list[str] = []
77
+ reducers: list[RedisReducer] = []
78
+ load: list = []
79
+
80
+
81
+ class JoinQuery(BaseModel):
82
+ join_on: str
83
+ alias: str
84
+ query: Any
85
+
86
+
87
+ class Query(BaseModel):
88
+ __pydantic_extra__ = None
89
+ type: QueryType
90
+ space_name: str = Field(..., pattern=regex.SPACENAME)
91
+ subpath: str = Field(..., pattern=regex.SUBPATH)
92
+ exact_subpath: bool = False
93
+ filter_types: list[ResourceType] | None = None
94
+ filter_schema_names: list[str] = ["meta"]
95
+ filter_shortnames: list[
96
+ str
97
+ ] | None = [] # Field( pattern=regex.SHORTNAME, default_factory=list)
98
+ filter_tags: list[str] | None = None
99
+ search: str | None = None
100
+ from_date: datetime | None = None
101
+ to_date: datetime | None = None
102
+ exclude_fields: list[str] | None = None
103
+ include_fields: list[str] | None = None
104
+ highlight_fields: dict[str, str] = {}
105
+ sort_by: str | None = None
106
+ sort_type: SortType | None = None
107
+ retrieve_json_payload: bool = False
108
+ retrieve_attachments: bool = False
109
+ retrieve_total: bool = True
110
+ validate_schema: bool = True
111
+ retrieve_lock_status: bool = False
112
+ jq_filter: str | None = None
113
+ limit: int = 10
114
+ offset: int = 0
115
+ aggregation_data: RedisAggregate | None = None
116
+ join: list[JoinQuery] | None = None
117
+
118
+ # Replace -1 limit by settings.max_query_limit
119
+ def __init__(self, **data):
120
+ BaseModel.__init__(self, **data)
121
+ if self.limit == -1:
122
+ self.limit = settings.max_query_limit
123
+
124
+ model_config = {
125
+ "extra": "forbid",
126
+ "json_schema_extra": {
127
+ "examples": [
128
+ {
129
+ "type": "search",
130
+ "space_name": "acme",
131
+ "subpath": "/users",
132
+ "filter_types": [],
133
+ "retrieve_attachments": True,
134
+ "retrieve_json_payload": True,
135
+ "validate_schema": True,
136
+ "filter_shortnames": [],
137
+ "filter_tags": [],
138
+ "filter_schema_names": ["user"],
139
+ "search": "@first_name:joh*",
140
+ "limit": 10,
141
+ "offset": 0,
142
+ "exclude_fields": [],
143
+ "include_fields": [],
144
+ "from_date": None,
145
+ "to_date": None,
146
+ "sort_type": "ascending",
147
+ "sort_by": "created_at",
148
+ }
149
+ ]
150
+ }
151
+ }
152
+
153
+ JoinQuery.model_rebuild()
154
+
155
+
156
+ class Error(BaseModel):
157
+ type: str
158
+ code: int
159
+ message: str
160
+ info: list[dict] | None = None
161
+
162
+
163
+ class Response(BaseModel):
164
+ status: Status
165
+ error: Error | None = None
166
+ records: list[core.Record] | Any | None = None
167
+ attributes: dict[str, Any] | None = None
168
+
169
+
170
+ class Exception(PyException):
171
+ status_code: int
172
+ error: Error
173
+
174
+ def __init__(self, status_code: int, error: Error):
175
+ super().__init__(status_code)
176
+ self.status_code = status_code
177
+ self.error = error
178
+
179
+
180
+ class DataAssetQuery(BaseModel):
181
+ space_name: str = Field(..., pattern=regex.SPACENAME)
182
+ subpath: str = Field(..., pattern=regex.SUBPATH)
183
+ resource_type: ResourceType
184
+ shortname: str = Field(..., pattern=regex.SHORTNAME, examples=["data_csv"])
185
+ filter_data_assets: list[str] | None = Field(default=None, examples=["csv_chunk_3"])
186
+ data_asset_type: DataAssetType
187
+ query_string: str = Field(..., examples=["SELECT * FROM file"])
188
+
189
+ @field_validator("data_asset_type")
190
+ @classmethod
191
+ def validate_sqlite(cls, v: DataAssetType, info: ValidationInfo):
192
+ if (
193
+ v == DataAssetType.sqlite
194
+ and (
195
+ not info.data.get("filter_data_assets")
196
+ or len(info.data.get("filter_data_assets", [])) != 1
197
+ )
198
+ ):
199
+ raise ValueError(
200
+ "filter_data_assets must include only one item in case of data_asset_type is sqlite"
201
+ )
202
+
203
+ return v