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
api/info/router.py ADDED
@@ -0,0 +1,109 @@
1
+ # import asyncio
2
+ import json
3
+ from pathlib import Path
4
+ from fastapi import APIRouter, Depends, status
5
+ from utils.internal_error_code import InternalErrorCode
6
+ from utils.settings import settings
7
+ import models.api as api
8
+ from datetime import datetime
9
+ import subprocess
10
+ from os import getpid
11
+ import socket
12
+ from utils.jwt import JWTBearer
13
+ from fastapi.responses import ORJSONResponse
14
+
15
+ router = APIRouter(default_response_class=ORJSONResponse)
16
+
17
+ git_info: dict[str,str|None] = {}
18
+ service_start_time: datetime = datetime.now()
19
+
20
+ info_json_path = Path(__file__).resolve().parent.parent.parent / "info.json"
21
+ if info_json_path.exists():
22
+ with open(info_json_path) as info:
23
+ git_info = json.load(info)
24
+ else:
25
+ branch_cmd = "git rev-parse --abbrev-ref HEAD"
26
+ result, _ = subprocess.Popen(branch_cmd.split(" "), stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
27
+ branch = None if result is None or len(result) == 0 else result.decode().strip()
28
+
29
+ version_cmd = "git rev-parse --short HEAD"
30
+ result, _ = subprocess.Popen(version_cmd.split(" "), stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
31
+ version = None if result is None or len(result) == 0 else result.decode().strip()
32
+
33
+ tag_cmd = "git describe --tags"
34
+ result, _ = subprocess.Popen(tag_cmd.split(" "), stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
35
+ tag = None if result is None or len(result) == 0 else result.decode().strip()
36
+
37
+ version_date_cmd = "git show --pretty=format:'%ad'"
38
+ result, _ = subprocess.Popen(version_date_cmd.split(" "), stdout=subprocess.PIPE,
39
+ stderr=subprocess.PIPE).communicate()
40
+ version_date = None if result is None or len(result) == 0 else result.decode().split("\n")[0]
41
+
42
+ git_info = {
43
+ "commit_hash": version,
44
+ "date": version_date,
45
+ "branch": branch,
46
+ "tag": tag
47
+ }
48
+
49
+ server = socket.gethostname()
50
+
51
+
52
+ @router.get("/me", response_model=api.Response, response_model_exclude_none=True)
53
+ async def get_me(shortname=Depends(JWTBearer())) -> api.Response:
54
+ return api.Response(status=api.Status.success, attributes={"shortname": shortname})
55
+
56
+
57
+ @router.get("/settings", response_model=api.Response, response_model_exclude_none=True)
58
+ async def get_settings(shortname=Depends(JWTBearer())) -> api.Response:
59
+ if shortname != 'dmart':
60
+ raise api.Exception(
61
+ status_code=status.HTTP_401_UNAUTHORIZED,
62
+ error=api.Error(
63
+ type="access",
64
+ code=InternalErrorCode.NOT_ALLOWED,
65
+ message="You don't have permission to this action [21]"
66
+ )
67
+ )
68
+ return api.Response(status=api.Status.success, attributes=settings.model_dump())
69
+
70
+
71
+ @router.get("/manifest", response_model=api.Response, response_model_exclude_none=True)
72
+ async def get_manifest(_=Depends(JWTBearer())) -> api.Response:
73
+ now = datetime.now()
74
+ manifest = {
75
+ "name": "DMART",
76
+ "type": "microservice",
77
+ "description": "Structured CMS/IMS",
78
+ "service_details": {
79
+ "server": server,
80
+ "process_id": getpid(),
81
+ "start_time": service_start_time.isoformat(),
82
+ "current_time": now.isoformat(),
83
+ "running_for": str(now - service_start_time)
84
+ },
85
+ "git": git_info,
86
+ }
87
+ return api.Response(status=api.Status.success, attributes=manifest)
88
+
89
+ """
90
+ @router.get("/in-loop-tasks")
91
+ async def get_in_loop_tasks(_=Depends(JWTBearer())) -> api.Response:
92
+ tasks = asyncio.all_tasks()
93
+
94
+ tasks_data: list[dict[str, str]] = []
95
+ for task in tasks:
96
+ tasks_data.append({
97
+ "name": task.get_name(),
98
+ "coroutine": str(task.get_coro()),
99
+ "stack": str(task.get_stack())
100
+ })
101
+
102
+ return api.Response(
103
+ status=api.Status.success,
104
+ attributes={
105
+ "tasks_count": len(tasks_data),
106
+ "tasks": tasks_data
107
+ },
108
+ )
109
+ """
File without changes