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.
- alembic/__init__.py +0 -0
- alembic/env.py +91 -0
- alembic/scripts/__init__.py +0 -0
- alembic/scripts/calculate_checksums.py +77 -0
- alembic/scripts/migration_f7a4949eed19.py +28 -0
- alembic/versions/0f3d2b1a7c21_add_authz_materialized_views.py +87 -0
- alembic/versions/10d2041b94d4_last_checksum_history.py +62 -0
- alembic/versions/1cf4e1ee3cb8_ext_permission_with_filter_fields_values.py +33 -0
- alembic/versions/26bfe19b49d4_rm_failedloginattempts.py +42 -0
- alembic/versions/3c8bca2219cc_add_otp_table.py +38 -0
- alembic/versions/6675fd9dfe42_remove_unique_from_sessions_table.py +36 -0
- alembic/versions/71bc1df82e6a_adding_user_last_login_at.py +43 -0
- alembic/versions/74288ccbd3b5_initial.py +264 -0
- alembic/versions/7520a89a8467_rm_activesession_table.py +39 -0
- alembic/versions/848b623755a4_make_created_nd_updated_at_required.py +138 -0
- alembic/versions/8640dcbebf85_add_notes_to_users.py +32 -0
- alembic/versions/91c94250232a_adding_fk_on_owner_shortname.py +104 -0
- alembic/versions/98ecd6f56f9a_ext_meta_with_owner_group_shortname.py +66 -0
- alembic/versions/9aae9138c4ef_indexing_created_at_updated_at.py +80 -0
- alembic/versions/__init__.py +0 -0
- alembic/versions/b53f916b3f6d_json_to_jsonb.py +492 -0
- alembic/versions/eb5f1ec65156_adding_user_locked_to_device.py +36 -0
- alembic/versions/f7a4949eed19_adding_query_policies_to_meta.py +60 -0
- api/__init__.py +0 -0
- api/info/__init__.py +0 -0
- api/info/router.py +109 -0
- api/managed/__init__.py +0 -0
- api/managed/router.py +1541 -0
- api/managed/utils.py +1850 -0
- api/public/__init__.py +0 -0
- api/public/router.py +758 -0
- api/qr/__init__.py +0 -0
- api/qr/router.py +108 -0
- api/user/__init__.py +0 -0
- api/user/model/__init__.py +0 -0
- api/user/model/errors.py +14 -0
- api/user/model/requests.py +165 -0
- api/user/model/responses.py +11 -0
- api/user/router.py +1401 -0
- api/user/service.py +270 -0
- bundler.py +44 -0
- config/__init__.py +0 -0
- config/channels.json +11 -0
- config/notification.json +17 -0
- data_adapters/__init__.py +0 -0
- data_adapters/adapter.py +16 -0
- data_adapters/base_data_adapter.py +467 -0
- data_adapters/file/__init__.py +0 -0
- data_adapters/file/adapter.py +2043 -0
- data_adapters/file/adapter_helpers.py +1013 -0
- data_adapters/file/archive.py +150 -0
- data_adapters/file/create_index.py +331 -0
- data_adapters/file/create_users_folders.py +52 -0
- data_adapters/file/custom_validations.py +68 -0
- data_adapters/file/drop_index.py +40 -0
- data_adapters/file/health_check.py +560 -0
- data_adapters/file/redis_services.py +1110 -0
- data_adapters/helpers.py +27 -0
- data_adapters/sql/__init__.py +0 -0
- data_adapters/sql/adapter.py +3210 -0
- data_adapters/sql/adapter_helpers.py +491 -0
- data_adapters/sql/create_tables.py +451 -0
- data_adapters/sql/create_users_folders.py +53 -0
- data_adapters/sql/db_to_json_migration.py +482 -0
- data_adapters/sql/health_check_sql.py +232 -0
- data_adapters/sql/json_to_db_migration.py +454 -0
- data_adapters/sql/update_query_policies.py +101 -0
- data_generator.py +81 -0
- dmart-0.1.9.dist-info/METADATA +64 -0
- dmart-0.1.9.dist-info/RECORD +149 -0
- dmart-0.1.9.dist-info/WHEEL +5 -0
- dmart-0.1.9.dist-info/entry_points.txt +2 -0
- dmart-0.1.9.dist-info/top_level.txt +23 -0
- dmart.py +513 -0
- get_settings.py +7 -0
- languages/__init__.py +0 -0
- languages/arabic.json +15 -0
- languages/english.json +16 -0
- languages/kurdish.json +14 -0
- languages/loader.py +13 -0
- main.py +506 -0
- migrate.py +24 -0
- models/__init__.py +0 -0
- models/api.py +203 -0
- models/core.py +597 -0
- models/enums.py +255 -0
- password_gen.py +8 -0
- plugins/__init__.py +0 -0
- plugins/action_log/__init__.py +0 -0
- plugins/action_log/plugin.py +121 -0
- plugins/admin_notification_sender/__init__.py +0 -0
- plugins/admin_notification_sender/plugin.py +124 -0
- plugins/ldap_manager/__init__.py +0 -0
- plugins/ldap_manager/plugin.py +100 -0
- plugins/local_notification/__init__.py +0 -0
- plugins/local_notification/plugin.py +123 -0
- plugins/realtime_updates_notifier/__init__.py +0 -0
- plugins/realtime_updates_notifier/plugin.py +58 -0
- plugins/redis_db_update/__init__.py +0 -0
- plugins/redis_db_update/plugin.py +188 -0
- plugins/resource_folders_creation/__init__.py +0 -0
- plugins/resource_folders_creation/plugin.py +81 -0
- plugins/system_notification_sender/__init__.py +0 -0
- plugins/system_notification_sender/plugin.py +188 -0
- plugins/update_access_controls/__init__.py +0 -0
- plugins/update_access_controls/plugin.py +9 -0
- pytests/__init__.py +0 -0
- pytests/api_user_models_erros_test.py +16 -0
- pytests/api_user_models_requests_test.py +98 -0
- pytests/archive_test.py +72 -0
- pytests/base_test.py +300 -0
- pytests/get_settings_test.py +14 -0
- pytests/json_to_db_migration_test.py +237 -0
- pytests/service_test.py +26 -0
- pytests/test_info.py +55 -0
- pytests/test_status.py +15 -0
- run_notification_campaign.py +98 -0
- scheduled_notification_handler.py +121 -0
- schema_migration.py +208 -0
- schema_modulate.py +192 -0
- set_admin_passwd.py +55 -0
- sync.py +202 -0
- utils/__init__.py +0 -0
- utils/access_control.py +306 -0
- utils/async_request.py +8 -0
- utils/exporter.py +309 -0
- utils/firebase_notifier.py +57 -0
- utils/generate_email.py +38 -0
- utils/helpers.py +352 -0
- utils/hypercorn_config.py +12 -0
- utils/internal_error_code.py +60 -0
- utils/jwt.py +124 -0
- utils/logger.py +167 -0
- utils/middleware.py +99 -0
- utils/notification.py +75 -0
- utils/password_hashing.py +16 -0
- utils/plugin_manager.py +215 -0
- utils/query_policies_helper.py +112 -0
- utils/regex.py +44 -0
- utils/repository.py +529 -0
- utils/router_helper.py +19 -0
- utils/settings.py +165 -0
- utils/sms_notifier.py +21 -0
- utils/social_sso.py +67 -0
- utils/templates/activation.html.j2 +26 -0
- utils/templates/reminder.html.j2 +17 -0
- utils/ticket_sys_utils.py +203 -0
- utils/web_notifier.py +29 -0
- websocket.py +231 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
#!/usr/bin/env -S BACKEND_ENV=config.env python3
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import argparse
|
|
5
|
+
import asyncio
|
|
6
|
+
from typing import Sequence
|
|
7
|
+
|
|
8
|
+
from sqlalchemy import URL, select, update as sa_update
|
|
9
|
+
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
|
|
10
|
+
# AsyncSession
|
|
11
|
+
from sqlalchemy.orm import sessionmaker
|
|
12
|
+
from sqlmodel import col
|
|
13
|
+
|
|
14
|
+
from utils.settings import settings
|
|
15
|
+
from utils.query_policies_helper import generate_query_policies
|
|
16
|
+
from data_adapters.sql.create_tables import Entries
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
async def update_all_entries(batch_size: int = 1000) -> int:
|
|
20
|
+
postgresql_url = URL.create(
|
|
21
|
+
drivername=settings.database_driver.replace('+asyncpg', '+psycopg'),
|
|
22
|
+
host=settings.database_host,
|
|
23
|
+
port=settings.database_port,
|
|
24
|
+
username=settings.database_username,
|
|
25
|
+
password=settings.database_password,
|
|
26
|
+
database=settings.database_name,
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
engine = create_async_engine(
|
|
30
|
+
postgresql_url,
|
|
31
|
+
echo=False,
|
|
32
|
+
pool_size=settings.database_pool_size,
|
|
33
|
+
max_overflow=settings.database_max_overflow,
|
|
34
|
+
pool_timeout=settings.database_pool_timeout,
|
|
35
|
+
pool_recycle=settings.database_pool_recycle,
|
|
36
|
+
)
|
|
37
|
+
async_session = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False) # type: ignore
|
|
38
|
+
|
|
39
|
+
updated = 0
|
|
40
|
+
offset = 0
|
|
41
|
+
|
|
42
|
+
async with async_session() as session: # type: ignore
|
|
43
|
+
while True:
|
|
44
|
+
result = await session.execute(
|
|
45
|
+
select(Entries).order_by(Entries.space_name, Entries.subpath, Entries.shortname).offset(offset).limit(batch_size)
|
|
46
|
+
)
|
|
47
|
+
rows: Sequence[Entries] = [row[0] if not isinstance(row, Entries) else row for row in result.fetchall()]
|
|
48
|
+
if not rows:
|
|
49
|
+
break
|
|
50
|
+
print(f"Processing {len(rows)} entries...")
|
|
51
|
+
for row in rows:
|
|
52
|
+
try:
|
|
53
|
+
new_policies = generate_query_policies(
|
|
54
|
+
space_name=row.space_name,
|
|
55
|
+
subpath=row.subpath,
|
|
56
|
+
resource_type=row.resource_type,
|
|
57
|
+
is_active=row.is_active,
|
|
58
|
+
owner_shortname=getattr(row, 'owner_shortname', 'dmart') or 'dmart',
|
|
59
|
+
owner_group_shortname=getattr(row, 'owner_group_shortname', None),
|
|
60
|
+
entry_shortname=row.shortname if row.resource_type == 'folder' else None,
|
|
61
|
+
)
|
|
62
|
+
except Exception as e:
|
|
63
|
+
print(f"Error while computing query_policies for {row.space_name}/{row.subpath}/{row.shortname}")
|
|
64
|
+
print(f"| {e}\n")
|
|
65
|
+
continue
|
|
66
|
+
|
|
67
|
+
if row.query_policies != new_policies:
|
|
68
|
+
await session.execute(
|
|
69
|
+
sa_update(Entries)
|
|
70
|
+
.where(col(Entries.space_name) == row.space_name)
|
|
71
|
+
.where(col(Entries.subpath) == row.subpath)
|
|
72
|
+
.where(col(Entries.shortname) == row.shortname)
|
|
73
|
+
.values(query_policies=new_policies)
|
|
74
|
+
)
|
|
75
|
+
updated += 1
|
|
76
|
+
try:
|
|
77
|
+
await session.commit()
|
|
78
|
+
except Exception:
|
|
79
|
+
await session.rollback()
|
|
80
|
+
raise
|
|
81
|
+
|
|
82
|
+
offset += len(rows)
|
|
83
|
+
|
|
84
|
+
await engine.dispose()
|
|
85
|
+
return updated
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
async def amain(batch_size: int) -> None:
|
|
89
|
+
updated = await update_all_entries(batch_size=batch_size)
|
|
90
|
+
print(f"Updated query_policies for {updated} entries.")
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def main():
|
|
94
|
+
parser = argparse.ArgumentParser(description="Recompute query_policies for all Entries")
|
|
95
|
+
parser.add_argument("--batch-size", type=int, default=1000, help="Batch size for processing entries")
|
|
96
|
+
args = parser.parse_args()
|
|
97
|
+
asyncio.run(amain(args.batch_size))
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
if __name__ == "__main__":
|
|
101
|
+
main()
|
data_generator.py
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import argparse
|
|
2
|
+
import asyncio
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from uuid import uuid4
|
|
5
|
+
from models.core import Content, Payload
|
|
6
|
+
from models.enums import ContentType
|
|
7
|
+
from jsf import JSF # type: ignore
|
|
8
|
+
from data_adapters.adapter import data_adapter as db
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
async def main(
|
|
12
|
+
space: str,
|
|
13
|
+
subpath: str,
|
|
14
|
+
schema_path: str,
|
|
15
|
+
num: int
|
|
16
|
+
):
|
|
17
|
+
|
|
18
|
+
if not Path(schema_path).is_file():
|
|
19
|
+
print("Invalid schema file path")
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
faker = JSF.from_json(Path(schema_path)) # type: ignore
|
|
23
|
+
for i in range(0, num):
|
|
24
|
+
payload = faker.generate()
|
|
25
|
+
uuid = uuid4()
|
|
26
|
+
shortname = str(uuid)[:8]
|
|
27
|
+
meta = Content(
|
|
28
|
+
uuid = uuid,
|
|
29
|
+
shortname = shortname,
|
|
30
|
+
is_active=True,
|
|
31
|
+
owner_shortname="generator_script",
|
|
32
|
+
payload=Payload(
|
|
33
|
+
content_type=ContentType.json,
|
|
34
|
+
schema_shortname=schema_path.split("/")[-1].split(".")[0],
|
|
35
|
+
body=f"{shortname}.json"
|
|
36
|
+
)
|
|
37
|
+
)
|
|
38
|
+
await db.internal_save_model(
|
|
39
|
+
space_name=space,
|
|
40
|
+
subpath=subpath,
|
|
41
|
+
meta=meta,
|
|
42
|
+
payload=payload
|
|
43
|
+
)
|
|
44
|
+
print(f"Generated new doc with shortname: {shortname}")
|
|
45
|
+
|
|
46
|
+
print("====================================================")
|
|
47
|
+
print(f"The generator script is finished, {num} of records generated")
|
|
48
|
+
print("====================================================")
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
if __name__ == "__main__":
|
|
54
|
+
parser = argparse.ArgumentParser(
|
|
55
|
+
description="Generate fake records based on a specific schema,\
|
|
56
|
+
it only creates resources of type Content.\
|
|
57
|
+
Stores the data in the flat-file DB and Redis",
|
|
58
|
+
formatter_class=argparse.ArgumentDefaultsHelpFormatter
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
parser.add_argument(
|
|
62
|
+
"-p", "--space", help="Store records under this space"
|
|
63
|
+
)
|
|
64
|
+
parser.add_argument(
|
|
65
|
+
"-s", "--subpath", help="Store records under this subpath"
|
|
66
|
+
)
|
|
67
|
+
parser.add_argument(
|
|
68
|
+
"-c", "--schema-path", help="Generate records according to this schema (path)"
|
|
69
|
+
)
|
|
70
|
+
parser.add_argument(
|
|
71
|
+
"-n", "--num", help="Number of records to be generated", type=int
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
args = parser.parse_args()
|
|
75
|
+
|
|
76
|
+
asyncio.run(main(
|
|
77
|
+
args.space,
|
|
78
|
+
args.subpath,
|
|
79
|
+
args.schema_path,
|
|
80
|
+
args.num
|
|
81
|
+
))
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: dmart
|
|
3
|
+
Version: 0.1.9
|
|
4
|
+
Requires-Python: >=3.10
|
|
5
|
+
Requires-Dist: fastapi
|
|
6
|
+
Requires-Dist: pydantic
|
|
7
|
+
Requires-Dist: pydantic[email]
|
|
8
|
+
Requires-Dist: concurrent-log-handler
|
|
9
|
+
Requires-Dist: hypercorn
|
|
10
|
+
Requires-Dist: pyjwt
|
|
11
|
+
Requires-Dist: redis
|
|
12
|
+
Requires-Dist: aiofiles
|
|
13
|
+
Requires-Dist: aiohttp
|
|
14
|
+
Requires-Dist: python-multipart
|
|
15
|
+
Requires-Dist: jsonschema
|
|
16
|
+
Requires-Dist: email-validator
|
|
17
|
+
Requires-Dist: asgi-correlation-id
|
|
18
|
+
Requires-Dist: pydantic-settings
|
|
19
|
+
Requires-Dist: fastapi-sso
|
|
20
|
+
Requires-Dist: sqlmodel
|
|
21
|
+
Requires-Dist: psycopg[binary]
|
|
22
|
+
Requires-Dist: asyncpg
|
|
23
|
+
Requires-Dist: greenlet
|
|
24
|
+
Requires-Dist: alembic
|
|
25
|
+
Requires-Dist: jinja2
|
|
26
|
+
Requires-Dist: pytest-cov
|
|
27
|
+
Requires-Dist: argon2-cffi
|
|
28
|
+
Requires-Dist: orjson
|
|
29
|
+
Provides-Extra: extra
|
|
30
|
+
Requires-Dist: jsf; extra == "extra"
|
|
31
|
+
Requires-Dist: types-psutil; extra == "extra"
|
|
32
|
+
Requires-Dist: types-pyinstaller; extra == "extra"
|
|
33
|
+
Requires-Dist: pyinstaller; extra == "extra"
|
|
34
|
+
Requires-Dist: jinja2; extra == "extra"
|
|
35
|
+
Requires-Dist: duckdb; extra == "extra"
|
|
36
|
+
Requires-Dist: segno; extra == "extra"
|
|
37
|
+
Requires-Dist: jq; extra == "extra"
|
|
38
|
+
Provides-Extra: plugins
|
|
39
|
+
Requires-Dist: weasyprint; extra == "plugins"
|
|
40
|
+
Requires-Dist: pypdf; extra == "plugins"
|
|
41
|
+
Requires-Dist: dicttoxml; extra == "plugins"
|
|
42
|
+
Requires-Dist: pdf2image; extra == "plugins"
|
|
43
|
+
Requires-Dist: firebase-admin; extra == "plugins"
|
|
44
|
+
Requires-Dist: pillow; extra == "plugins"
|
|
45
|
+
Requires-Dist: ldap3; extra == "plugins"
|
|
46
|
+
Provides-Extra: all
|
|
47
|
+
Requires-Dist: jsf; extra == "all"
|
|
48
|
+
Requires-Dist: types-psutil; extra == "all"
|
|
49
|
+
Requires-Dist: types-pyinstaller; extra == "all"
|
|
50
|
+
Requires-Dist: pyinstaller; extra == "all"
|
|
51
|
+
Requires-Dist: jinja2; extra == "all"
|
|
52
|
+
Requires-Dist: duckdb; extra == "all"
|
|
53
|
+
Requires-Dist: segno; extra == "all"
|
|
54
|
+
Requires-Dist: jq; extra == "all"
|
|
55
|
+
Requires-Dist: weasyprint; extra == "all"
|
|
56
|
+
Requires-Dist: pypdf; extra == "all"
|
|
57
|
+
Requires-Dist: dicttoxml; extra == "all"
|
|
58
|
+
Requires-Dist: pdf2image; extra == "all"
|
|
59
|
+
Requires-Dist: firebase-admin; extra == "all"
|
|
60
|
+
Requires-Dist: pillow; extra == "all"
|
|
61
|
+
Requires-Dist: ldap3; extra == "all"
|
|
62
|
+
Dynamic: provides-extra
|
|
63
|
+
Dynamic: requires-dist
|
|
64
|
+
Dynamic: requires-python
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
bundler.py,sha256=8gEQputdVfI8vda5Lkzw12blv7kYkmPLVbEWr_itLe0,1522
|
|
2
|
+
data_generator.py,sha256=CnE-VHEeX7-lAXtqCgbRqR9WHjTuOgeiZcviYrHAmho,2287
|
|
3
|
+
dmart.py,sha256=VgNH7vpzHBO2FcMztdwZBLq1TovzbkBFkXrZwn6dKjI,19712
|
|
4
|
+
get_settings.py,sha256=Sbe2WCoiK398E7HY4SNLfDN_GmE8knR4M-YJWF31jcg,153
|
|
5
|
+
main.py,sha256=XqKHlgFy_S_EtvbGsSxiCMSApSU33BlTpv8T4UWX0yc,17351
|
|
6
|
+
migrate.py,sha256=hn1MZoVby_Jjqhc7y3CrLcGD619QmVZv3PONNvO7VKQ,665
|
|
7
|
+
password_gen.py,sha256=xjx8wi105ZYvhLBBQj7_rugACpxifGXHse6f7YlGXWQ,196
|
|
8
|
+
run_notification_campaign.py,sha256=wKo8B79eiATOmAnxXsOJkSvb5BGwZTAQuxN6-HfA7Ws,2907
|
|
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=4U45sfMGIBMcRkwPuFPRc_M9pL2lmOn9kguWjakPAbU,1007
|
|
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=OZgqqWAKMXqhFOloBcm85KiE4BpZ8h0CNffK8O7Pc7c,72639
|
|
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=FwuxM04niGlls-V1MPzHH5A4jHJ0g5NNIFZBE6bJ9Fc,51302
|
|
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
|
+
data_adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
59
|
+
data_adapters/adapter.py,sha256=zR_yFd5ZI9vIQuUB6AUcF-LHgxOaxoREV2hogasivjQ,443
|
|
60
|
+
data_adapters/base_data_adapter.py,sha256=vG9WeHyw_c_BnH0EmudwPSNS6iMb5buQJiZS_9cm9p8,12055
|
|
61
|
+
data_adapters/helpers.py,sha256=0ySEDnQBMgFVXstFnPjXLtZ_-8IC4Q8oPXXrWokpFB8,660
|
|
62
|
+
data_adapters/file/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
63
|
+
data_adapters/file/adapter.py,sha256=SPVVfRIlyQDYfZJv4J8LmrDGtrVWddu76SvpnkXY3jM,77671
|
|
64
|
+
data_adapters/file/adapter_helpers.py,sha256=ExA_fAnRaPOLDuEY3hsLNR2BvvCscnS5Du6lWRtCvh0,34321
|
|
65
|
+
data_adapters/file/archive.py,sha256=B4VV6HNB3Bqd4tlqZ3jUQps8oqht_xOdBNOi9cLuo8Q,5423
|
|
66
|
+
data_adapters/file/create_index.py,sha256=lUcUkepo9QUIQDDDgoPAL74_n16cZ_q0NKnITGmbF6I,11888
|
|
67
|
+
data_adapters/file/create_users_folders.py,sha256=zOBgxMnqgEskYP4pgkmE6VYMca-ADLz8mXKPHJPYpys,1670
|
|
68
|
+
data_adapters/file/custom_validations.py,sha256=ziOERgTr-eY_zrN0C41B2FYmpEyoKiV4holh8an-p2c,1754
|
|
69
|
+
data_adapters/file/drop_index.py,sha256=OK3wXwaO9tUcHcJjqyLeBnkElzK35MZMi8YLGWdrXRw,1417
|
|
70
|
+
data_adapters/file/health_check.py,sha256=cMvwsXhjEykjrTyB3HtUn8QqKdtB_h5w8mGOEYPepzU,24221
|
|
71
|
+
data_adapters/file/redis_services.py,sha256=83STcca5fYFaEVLRYAxfUQXeUQZqJOT8XH-GBSbkR-E,39914
|
|
72
|
+
data_adapters/sql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
73
|
+
data_adapters/sql/adapter.py,sha256=xdd5EcZU1fF4GTBxSg4BUyKvd8o95kcf1FqtPHUN2u8,154514
|
|
74
|
+
data_adapters/sql/adapter_helpers.py,sha256=Eu22NElz2fMu6zyOsGsGrnAZcyWhHz9I__RJ9z6cwK0,15076
|
|
75
|
+
data_adapters/sql/create_tables.py,sha256=KqaXHTDOD8YaqGNc_e0iHHotd0WE3Kad_tBevtoGA20,17427
|
|
76
|
+
data_adapters/sql/create_users_folders.py,sha256=fm3P-CMcPX4b4DqXHKWMOtfX4RHdaev2nCDhYrS5cIs,1911
|
|
77
|
+
data_adapters/sql/db_to_json_migration.py,sha256=mHMaD2tTsXaNPTd6nGuMb4TQheklYNWNvgszOZKM22E,20850
|
|
78
|
+
data_adapters/sql/health_check_sql.py,sha256=2Z0mN5IMrjF72ZAiafBLkHklbXXWJzLp1K2TzjzPI1s,8569
|
|
79
|
+
data_adapters/sql/json_to_db_migration.py,sha256=KaubDrRZ3MfPLc-CNGPpsEccPELKr1V4GoBEBt1BNZo,21131
|
|
80
|
+
data_adapters/sql/update_query_policies.py,sha256=LUpkyzDAkiwwVWnXxPdVAU6atehW72ECAazj3mEYHK0,3857
|
|
81
|
+
languages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
82
|
+
languages/arabic.json,sha256=UL61rP9_M42CGfU94G5-1bXVUVnsJWXzoqhaXTXTJuM,910
|
|
83
|
+
languages/english.json,sha256=Y7eZ2X8c427_97qYrHOeGb2d725T-YlNNFVSi8FB7Kw,649
|
|
84
|
+
languages/kurdish.json,sha256=GgPLkVKyhIQjT7h3cPfDh0oyzg26znvBUe5X_Zz2TWI,864
|
|
85
|
+
languages/loader.py,sha256=yaBJHGVRxi8Z-H8x4MOQcwyhiY0zD9UY-m0AjLi4eq8,393
|
|
86
|
+
models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
87
|
+
models/api.py,sha256=f5X56dudyEysPmDuI5grM2RRCXuIQoehaAB6wMAGG28,6473
|
|
88
|
+
models/core.py,sha256=tEb7cbnC71yE9SDluynj7dE3U8Ed-EbF3uRJizy-uuU,16880
|
|
89
|
+
models/enums.py,sha256=y2G5EKIc8FusVW4JvEozGFKL2GxjtuOK7k3zSguP4dc,5395
|
|
90
|
+
plugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
91
|
+
plugins/action_log/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
92
|
+
plugins/action_log/plugin.py,sha256=-JY_iIIJJjFFofvpMoCxNJMXNr_KC6kA8TiwvvoxaWI,4434
|
|
93
|
+
plugins/admin_notification_sender/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
94
|
+
plugins/admin_notification_sender/plugin.py,sha256=sxVGW8qtRmDEQeS6QD3F3IqzZOoh_9H_y2TsRCDkXaw,4771
|
|
95
|
+
plugins/ldap_manager/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
96
|
+
plugins/ldap_manager/plugin.py,sha256=c05pKGsyLETMrheCqIw3gZOSLdTWvEDq_WCl0Q_0yXQ,3030
|
|
97
|
+
plugins/local_notification/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
98
|
+
plugins/local_notification/plugin.py,sha256=FObVxID5Bg0G_xStpJYZkg706wu_CpUqk09DmzHAyPQ,4074
|
|
99
|
+
plugins/realtime_updates_notifier/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
100
|
+
plugins/realtime_updates_notifier/plugin.py,sha256=Gcvob4ShSs2Ht1hLD2vtwhR_PSFYMv3_l_VPM2opTYs,2374
|
|
101
|
+
plugins/redis_db_update/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
102
|
+
plugins/redis_db_update/plugin.py,sha256=z05k1zNJgBnKPj-jrtMUeI9br75ZPlifbzL0HxpRnXg,7128
|
|
103
|
+
plugins/resource_folders_creation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
104
|
+
plugins/resource_folders_creation/plugin.py,sha256=OwYPtRjMt2esAAEdv1FjdZgjEz01yt2xOZQi3nB0kEQ,3327
|
|
105
|
+
plugins/system_notification_sender/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
106
|
+
plugins/system_notification_sender/plugin.py,sha256=96xzmuUGvO2WOJ5y90akDoRB7Bqy-VpOo6ht8-rLLtQ,8253
|
|
107
|
+
plugins/update_access_controls/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
108
|
+
plugins/update_access_controls/plugin.py,sha256=43UV4vg-zxBF_7Bv0AZH6gU0Bgy2ybapNK21wJTF05k,301
|
|
109
|
+
pytests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
110
|
+
pytests/api_user_models_erros_test.py,sha256=6VWLIhazYjz7avXIMIDpT6doiBO5FVzGsGJ3Cv8cXyg,583
|
|
111
|
+
pytests/api_user_models_requests_test.py,sha256=1AYZcMwa-AVeGrhTgwIkwqw3w7_CDPkbaJ0YDxLLKdY,3859
|
|
112
|
+
pytests/archive_test.py,sha256=rk6jEZf-Ud7ReyH4_xJD-9SzNRz8p2Sg0qQX04VCw9M,2347
|
|
113
|
+
pytests/base_test.py,sha256=d8prlME29tBnirW-3_HUtixcxUMPiLfJHRDiNkxOCRM,9902
|
|
114
|
+
pytests/get_settings_test.py,sha256=AEqjnHsQjkVDqwVqtn2rN6mep4sAC_apDCgiZT4YQ28,281
|
|
115
|
+
pytests/json_to_db_migration_test.py,sha256=JXO0knKPccXVIbKmyuD0yOi5fSBHmXm_NgVdO1_U7AE,9411
|
|
116
|
+
pytests/service_test.py,sha256=92lqzKQoVMkj9XliPBjkGBxXb4zXsobb2WPfW5buQfc,807
|
|
117
|
+
pytests/test_info.py,sha256=IOKtcEPM_03byhp5dSt2YbhTC5u_ORPahQLifZWBpjg,2074
|
|
118
|
+
pytests/test_status.py,sha256=YFuBTsSd5hkpHp16GAbQ_I03RL_o2_yW-92ZNgKJry0,453
|
|
119
|
+
utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
120
|
+
utils/access_control.py,sha256=8cCKr-6bL-Shl8j8xtfjEykMPGy6wkbNz-NRwLCdx-Y,11757
|
|
121
|
+
utils/async_request.py,sha256=Lm2xGXLeph7P1_fLhhNJDhPubKT2ncFn_Ueft4JVoeI,255
|
|
122
|
+
utils/exporter.py,sha256=HjcZCzcuH6N6f7Gn2hkTEeEFyo-MfrsiZUYAE-9kkVQ,9718
|
|
123
|
+
utils/firebase_notifier.py,sha256=nAeCUo5Mtwxygwj8ONlw8ZAtL_ekdJBabvU0z2dZ3NY,2391
|
|
124
|
+
utils/generate_email.py,sha256=_yHJiYp9dd1IT2lL2N2VmPrsCuKN30YTmE0votM9It8,1132
|
|
125
|
+
utils/helpers.py,sha256=gNxLg09cclRWrKNBy2pwGZsxGA0iFS5iZ_nyra3SmnI,9928
|
|
126
|
+
utils/hypercorn_config.py,sha256=q28HGRLWo9wjOVF183WwFPs3HQo4Nexc7q_7dmSVHRI,311
|
|
127
|
+
utils/internal_error_code.py,sha256=KGlXPC5YruPmb0ORVY7U3EEVpBgSLuU4lHdXgwUVN2M,1637
|
|
128
|
+
utils/jwt.py,sha256=Y7Gp3imvNwAtWOg8V0etvsEFtswmCYKK_U4ljZ15Pps,4590
|
|
129
|
+
utils/logger.py,sha256=peejQnq9B0eaHwdLynBHT7FUCq7jCX_DhkX6BcxrLkA,5274
|
|
130
|
+
utils/middleware.py,sha256=PAVwnLzs0cyT_ZIgc1slqadEOJNCPliLhOTjaYx0Waw,3399
|
|
131
|
+
utils/notification.py,sha256=O9oOeU9cRm3e9UAc-VJONWx-TzqbCMddFNaTQilE6ks,2479
|
|
132
|
+
utils/password_hashing.py,sha256=NZZsmtPG9Vkocipk3DlDKKHKUdxRKA4yOhCurD8dUhg,356
|
|
133
|
+
utils/plugin_manager.py,sha256=nIu99A8BWDhGerL880o5K9pCVQZbnjHJPNo1wQ_UbfU,7900
|
|
134
|
+
utils/query_policies_helper.py,sha256=jBcNI_15P6LqVeWz6w9UMreLuNIc50GxqAf17KzxE84,4392
|
|
135
|
+
utils/regex.py,sha256=cv9b_l_e8tz42mKckeeyDgypKqh2e71E28co2iuEVxA,2286
|
|
136
|
+
utils/repository.py,sha256=9L-IvQ0Js0SQ5OR-Rh0i2Wdu4H9H06r8eE84hfBIu7Q,18313
|
|
137
|
+
utils/router_helper.py,sha256=Tgoq3oakejdEeyeVieTNk38JsPZ8x5RuR0kw2THc1mI,604
|
|
138
|
+
utils/settings.py,sha256=jKesIr67J9RP-QwrzsUQzXRAGjqpvYGUhmPuGY_GNpI,5639
|
|
139
|
+
utils/sms_notifier.py,sha256=04D6D_ldk3S9SojI7_381pqLc8v9lligeNHAysohz7w,550
|
|
140
|
+
utils/social_sso.py,sha256=Dm1W6U9OwKbAeUwM-kwJBHFEoreeoN-s-RHdOZ1-cNg,2216
|
|
141
|
+
utils/ticket_sys_utils.py,sha256=9QAlW2iiy8KyxQRBDj_WmzS5kKb0aYJmGwd4qzmGVqo,7005
|
|
142
|
+
utils/web_notifier.py,sha256=QM87VVid2grC5lK3NdS1yzz0z1wXljr4GChJOeK86W4,843
|
|
143
|
+
utils/templates/activation.html.j2,sha256=XAMKCdoqONoc4ZQucD0yV-Pg5DlHHASZrTVItNS-iBE,640
|
|
144
|
+
utils/templates/reminder.html.j2,sha256=aoS8bTs56q4hjAZKsb0jV9c-PIURBELuBOpT_qPZNVU,639
|
|
145
|
+
dmart-0.1.9.dist-info/METADATA,sha256=Qoj8pMpyCZ9uJXFJxfuOeofT0WOWqlvGwW-vYUbql3s,2091
|
|
146
|
+
dmart-0.1.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
147
|
+
dmart-0.1.9.dist-info/entry_points.txt,sha256=GjfoGh1bpxuU9HHGJzbtCFPNptHv9TryxHMN3uBSKpg,37
|
|
148
|
+
dmart-0.1.9.dist-info/top_level.txt,sha256=JTypu1r5v9v7ru-60JSSbnSMEESHFRMacpcz-rPJx_U,262
|
|
149
|
+
dmart-0.1.9.dist-info/RECORD,,
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
alembic
|
|
2
|
+
api
|
|
3
|
+
bundler
|
|
4
|
+
config
|
|
5
|
+
data_adapters
|
|
6
|
+
data_generator
|
|
7
|
+
dmart
|
|
8
|
+
get_settings
|
|
9
|
+
languages
|
|
10
|
+
main
|
|
11
|
+
migrate
|
|
12
|
+
models
|
|
13
|
+
password_gen
|
|
14
|
+
plugins
|
|
15
|
+
pytests
|
|
16
|
+
run_notification_campaign
|
|
17
|
+
scheduled_notification_handler
|
|
18
|
+
schema_migration
|
|
19
|
+
schema_modulate
|
|
20
|
+
set_admin_passwd
|
|
21
|
+
sync
|
|
22
|
+
utils
|
|
23
|
+
websocket
|