django-nativemojo 0.1.10__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 (194) hide show
  1. django_nativemojo-0.1.10.dist-info/LICENSE +19 -0
  2. django_nativemojo-0.1.10.dist-info/METADATA +96 -0
  3. django_nativemojo-0.1.10.dist-info/NOTICE +8 -0
  4. django_nativemojo-0.1.10.dist-info/RECORD +194 -0
  5. django_nativemojo-0.1.10.dist-info/WHEEL +4 -0
  6. mojo/__init__.py +3 -0
  7. mojo/apps/account/__init__.py +1 -0
  8. mojo/apps/account/admin.py +91 -0
  9. mojo/apps/account/apps.py +16 -0
  10. mojo/apps/account/migrations/0001_initial.py +77 -0
  11. mojo/apps/account/migrations/0002_user_is_email_verified_user_is_phone_verified.py +23 -0
  12. mojo/apps/account/migrations/0003_group_mojo_secrets_user_mojo_secrets.py +23 -0
  13. mojo/apps/account/migrations/__init__.py +0 -0
  14. mojo/apps/account/models/__init__.py +3 -0
  15. mojo/apps/account/models/group.py +98 -0
  16. mojo/apps/account/models/member.py +95 -0
  17. mojo/apps/account/models/pkey.py +18 -0
  18. mojo/apps/account/models/user.py +211 -0
  19. mojo/apps/account/rest/__init__.py +3 -0
  20. mojo/apps/account/rest/group.py +25 -0
  21. mojo/apps/account/rest/user.py +47 -0
  22. mojo/apps/account/utils/__init__.py +0 -0
  23. mojo/apps/account/utils/jwtoken.py +72 -0
  24. mojo/apps/account/utils/passkeys.py +54 -0
  25. mojo/apps/fileman/README.md +549 -0
  26. mojo/apps/fileman/__init__.py +0 -0
  27. mojo/apps/fileman/apps.py +15 -0
  28. mojo/apps/fileman/backends/__init__.py +117 -0
  29. mojo/apps/fileman/backends/base.py +319 -0
  30. mojo/apps/fileman/backends/filesystem.py +397 -0
  31. mojo/apps/fileman/backends/s3.py +398 -0
  32. mojo/apps/fileman/examples/configurations.py +378 -0
  33. mojo/apps/fileman/examples/usage_example.py +665 -0
  34. mojo/apps/fileman/management/__init__.py +1 -0
  35. mojo/apps/fileman/management/commands/__init__.py +1 -0
  36. mojo/apps/fileman/management/commands/cleanup_expired_uploads.py +222 -0
  37. mojo/apps/fileman/models/__init__.py +7 -0
  38. mojo/apps/fileman/models/file.py +292 -0
  39. mojo/apps/fileman/models/manager.py +227 -0
  40. mojo/apps/fileman/models/render.py +0 -0
  41. mojo/apps/fileman/rest/__init__ +0 -0
  42. mojo/apps/fileman/rest/__init__.py +23 -0
  43. mojo/apps/fileman/rest/fileman.py +13 -0
  44. mojo/apps/fileman/rest/upload.py +92 -0
  45. mojo/apps/fileman/utils/__init__.py +19 -0
  46. mojo/apps/fileman/utils/upload.py +616 -0
  47. mojo/apps/incident/__init__.py +1 -0
  48. mojo/apps/incident/handlers/__init__.py +3 -0
  49. mojo/apps/incident/handlers/event_handlers.py +142 -0
  50. mojo/apps/incident/migrations/0001_initial.py +83 -0
  51. mojo/apps/incident/migrations/0002_rename_bundle_ruleset_bundle_minutes_event_hostname_and_more.py +44 -0
  52. mojo/apps/incident/migrations/0003_alter_event_model_id.py +18 -0
  53. mojo/apps/incident/migrations/0004_alter_incident_model_id.py +18 -0
  54. mojo/apps/incident/migrations/__init__.py +0 -0
  55. mojo/apps/incident/models/__init__.py +3 -0
  56. mojo/apps/incident/models/event.py +135 -0
  57. mojo/apps/incident/models/incident.py +33 -0
  58. mojo/apps/incident/models/rule.py +247 -0
  59. mojo/apps/incident/parsers/__init__.py +0 -0
  60. mojo/apps/incident/parsers/ossec/__init__.py +1 -0
  61. mojo/apps/incident/parsers/ossec/core.py +82 -0
  62. mojo/apps/incident/parsers/ossec/parsed.py +23 -0
  63. mojo/apps/incident/parsers/ossec/rules.py +124 -0
  64. mojo/apps/incident/parsers/ossec/utils.py +169 -0
  65. mojo/apps/incident/reporter.py +42 -0
  66. mojo/apps/incident/rest/__init__.py +2 -0
  67. mojo/apps/incident/rest/event.py +23 -0
  68. mojo/apps/incident/rest/ossec.py +22 -0
  69. mojo/apps/logit/__init__.py +0 -0
  70. mojo/apps/logit/admin.py +37 -0
  71. mojo/apps/logit/migrations/0001_initial.py +32 -0
  72. mojo/apps/logit/migrations/0002_log_duid_log_payload_log_username.py +28 -0
  73. mojo/apps/logit/migrations/0003_log_level.py +18 -0
  74. mojo/apps/logit/migrations/__init__.py +0 -0
  75. mojo/apps/logit/models/__init__.py +1 -0
  76. mojo/apps/logit/models/log.py +57 -0
  77. mojo/apps/logit/rest.py +9 -0
  78. mojo/apps/metrics/README.md +79 -0
  79. mojo/apps/metrics/__init__.py +12 -0
  80. mojo/apps/metrics/redis_metrics.py +331 -0
  81. mojo/apps/metrics/rest/__init__.py +1 -0
  82. mojo/apps/metrics/rest/base.py +152 -0
  83. mojo/apps/metrics/rest/db.py +0 -0
  84. mojo/apps/metrics/utils.py +227 -0
  85. mojo/apps/notify/README.md +91 -0
  86. mojo/apps/notify/README_NOTIFICATIONS.md +566 -0
  87. mojo/apps/notify/__init__.py +0 -0
  88. mojo/apps/notify/admin.py +52 -0
  89. mojo/apps/notify/handlers/__init__.py +0 -0
  90. mojo/apps/notify/handlers/example_handlers.py +516 -0
  91. mojo/apps/notify/handlers/ses/__init__.py +25 -0
  92. mojo/apps/notify/handlers/ses/bounce.py +0 -0
  93. mojo/apps/notify/handlers/ses/complaint.py +25 -0
  94. mojo/apps/notify/handlers/ses/message.py +86 -0
  95. mojo/apps/notify/management/__init__.py +0 -0
  96. mojo/apps/notify/management/commands/__init__.py +1 -0
  97. mojo/apps/notify/management/commands/process_notifications.py +370 -0
  98. mojo/apps/notify/mod +0 -0
  99. mojo/apps/notify/models/__init__.py +12 -0
  100. mojo/apps/notify/models/account.py +128 -0
  101. mojo/apps/notify/models/attachment.py +24 -0
  102. mojo/apps/notify/models/bounce.py +68 -0
  103. mojo/apps/notify/models/complaint.py +40 -0
  104. mojo/apps/notify/models/inbox.py +113 -0
  105. mojo/apps/notify/models/inbox_message.py +173 -0
  106. mojo/apps/notify/models/outbox.py +129 -0
  107. mojo/apps/notify/models/outbox_message.py +288 -0
  108. mojo/apps/notify/models/template.py +30 -0
  109. mojo/apps/notify/providers/__init__.py +0 -0
  110. mojo/apps/notify/providers/aws.py +73 -0
  111. mojo/apps/notify/rest/__init__.py +0 -0
  112. mojo/apps/notify/rest/ses.py +0 -0
  113. mojo/apps/notify/utils/__init__.py +2 -0
  114. mojo/apps/notify/utils/notifications.py +404 -0
  115. mojo/apps/notify/utils/parsing.py +202 -0
  116. mojo/apps/notify/utils/render.py +144 -0
  117. mojo/apps/tasks/README.md +118 -0
  118. mojo/apps/tasks/__init__.py +11 -0
  119. mojo/apps/tasks/manager.py +489 -0
  120. mojo/apps/tasks/rest/__init__.py +2 -0
  121. mojo/apps/tasks/rest/hooks.py +0 -0
  122. mojo/apps/tasks/rest/tasks.py +62 -0
  123. mojo/apps/tasks/runner.py +174 -0
  124. mojo/apps/tasks/tq_handlers.py +14 -0
  125. mojo/decorators/__init__.py +3 -0
  126. mojo/decorators/auth.py +25 -0
  127. mojo/decorators/cron.py +31 -0
  128. mojo/decorators/http.py +132 -0
  129. mojo/decorators/validate.py +14 -0
  130. mojo/errors.py +88 -0
  131. mojo/helpers/__init__.py +0 -0
  132. mojo/helpers/aws/__init__.py +0 -0
  133. mojo/helpers/aws/client.py +8 -0
  134. mojo/helpers/aws/s3.py +268 -0
  135. mojo/helpers/aws/setup_email.py +0 -0
  136. mojo/helpers/cron.py +79 -0
  137. mojo/helpers/crypto/__init__.py +4 -0
  138. mojo/helpers/crypto/aes.py +60 -0
  139. mojo/helpers/crypto/hash.py +59 -0
  140. mojo/helpers/crypto/privpub/__init__.py +1 -0
  141. mojo/helpers/crypto/privpub/hybrid.py +97 -0
  142. mojo/helpers/crypto/privpub/rsa.py +104 -0
  143. mojo/helpers/crypto/sign.py +36 -0
  144. mojo/helpers/crypto/too.l.py +25 -0
  145. mojo/helpers/crypto/utils.py +26 -0
  146. mojo/helpers/daemon.py +94 -0
  147. mojo/helpers/dates.py +69 -0
  148. mojo/helpers/dns/__init__.py +0 -0
  149. mojo/helpers/dns/godaddy.py +62 -0
  150. mojo/helpers/filetypes.py +128 -0
  151. mojo/helpers/logit.py +310 -0
  152. mojo/helpers/modules.py +95 -0
  153. mojo/helpers/paths.py +63 -0
  154. mojo/helpers/redis.py +10 -0
  155. mojo/helpers/request.py +89 -0
  156. mojo/helpers/request_parser.py +269 -0
  157. mojo/helpers/response.py +14 -0
  158. mojo/helpers/settings.py +146 -0
  159. mojo/helpers/sysinfo.py +140 -0
  160. mojo/helpers/ua.py +0 -0
  161. mojo/middleware/__init__.py +0 -0
  162. mojo/middleware/auth.py +26 -0
  163. mojo/middleware/logging.py +55 -0
  164. mojo/middleware/mojo.py +21 -0
  165. mojo/migrations/0001_initial.py +32 -0
  166. mojo/migrations/__init__.py +0 -0
  167. mojo/models/__init__.py +2 -0
  168. mojo/models/meta.py +262 -0
  169. mojo/models/rest.py +538 -0
  170. mojo/models/secrets.py +59 -0
  171. mojo/rest/__init__.py +1 -0
  172. mojo/rest/info.py +26 -0
  173. mojo/serializers/__init__.py +0 -0
  174. mojo/serializers/models.py +165 -0
  175. mojo/serializers/openapi.py +188 -0
  176. mojo/urls.py +38 -0
  177. mojo/ws4redis/README.md +174 -0
  178. mojo/ws4redis/__init__.py +2 -0
  179. mojo/ws4redis/client.py +283 -0
  180. mojo/ws4redis/connection.py +327 -0
  181. mojo/ws4redis/exceptions.py +32 -0
  182. mojo/ws4redis/redis.py +183 -0
  183. mojo/ws4redis/servers/__init__.py +0 -0
  184. mojo/ws4redis/servers/base.py +86 -0
  185. mojo/ws4redis/servers/django.py +171 -0
  186. mojo/ws4redis/servers/uwsgi.py +63 -0
  187. mojo/ws4redis/settings.py +45 -0
  188. mojo/ws4redis/utf8validator.py +128 -0
  189. mojo/ws4redis/websocket.py +403 -0
  190. testit/__init__.py +0 -0
  191. testit/client.py +147 -0
  192. testit/faker.py +20 -0
  193. testit/helpers.py +198 -0
  194. testit/runner.py +262 -0
@@ -0,0 +1,19 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ Copyright [2025] Native Mojo
8
+
9
+ Licensed under the Apache License, Version 2.0 (the "License");
10
+ you may not use this file except in compliance with the License.
11
+ You may obtain a copy of the License at
12
+
13
+ http://www.apache.org/licenses/LICENSE-2.0
14
+
15
+ Unless required by applicable law or agreed to in writing, software
16
+ distributed under the License is distributed on an "AS IS" BASIS,
17
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
+ See the License for the specific language governing permissions and
19
+ limitations under the License.
@@ -0,0 +1,96 @@
1
+ Metadata-Version: 2.3
2
+ Name: django-nativemojo
3
+ Version: 0.1.10
4
+ Summary: A REST framework for DJANGO with some extra apps that make it easy to provide a secure robust graph like RESIT API.
5
+ License: MIT
6
+ Author: MOJO Dev Team
7
+ Author-email: gotmojo@nativemojo.com
8
+ Requires-Python: >=3.9,<4.0
9
+ Classifier: License :: OSI Approved :: MIT License
10
+ Classifier: Programming Language :: Python :: 3
11
+ Classifier: Programming Language :: Python :: 3.9
12
+ Classifier: Programming Language :: Python :: 3.10
13
+ Classifier: Programming Language :: Python :: 3.11
14
+ Classifier: Programming Language :: Python :: 3.12
15
+ Classifier: Programming Language :: Python :: 3.13
16
+ Requires-Dist: django (>=4.2.18,<6.0.0)
17
+ Requires-Dist: django-cors-headers (>=4.7.0,<5.0.0)
18
+ Requires-Dist: faker (>=35.2.0,<36.0.0)
19
+ Requires-Dist: gevent (>=25.5.1,<26.0.0)
20
+ Requires-Dist: pycryptodome (>=3.21.0,<4.0.0)
21
+ Requires-Dist: pyjwt (>=2.10.1,<3.0.0)
22
+ Requires-Dist: pyobjict (>=2.0.2,<4.0.0)
23
+ Requires-Dist: pytz (>=2025.1,<2026.0)
24
+ Requires-Dist: redis (>=3.5.3,<6.0.0)
25
+ Requires-Dist: requests (>=2.32.3,<3.0.0)
26
+ Requires-Dist: ua-parser (>=1.0.1,<2.0.0)
27
+ Requires-Dist: ujson (>=5.10.0,<6.0.0)
28
+ Description-Content-Type: text/markdown
29
+
30
+ # Django-MOJO Documentation
31
+
32
+ Django-MOJO is a streamlined set of Django applications and a lightweight REST framework designed to simplify user authentication, authorization, and efficient API testing. This documentation provides descriptions and examples to help you get started quickly.
33
+
34
+ ## Why Django-MOJO?
35
+
36
+ We built Django-MOJO to address the complexity and overhead of existing REST frameworks. Many frameworks are feature-heavy, making them cumbersome for projects that require simplicity, speed, and robust security.
37
+
38
+ ## Key Differentiators
39
+
40
+ - **Lightweight Framework:** Django-MOJO is minimalistic, providing an easy way to add REST APIs to your Django models without unnecessary complexity.
41
+ - **Built-in Security:** Security is integral to Django-MOJO. We offer an alternative to Django's built-in permissions system, automatically protecting your REST APIs and data.
42
+ - **Robust Object-Level Permission System:** Unlike Django's native model-level permissions, Django-MOJO provides a simple yet robust permission system at the object level. This allows fine-grained control, enabling permissions to be applied to individual objects and extended to both user and group levels.
43
+ - **Effortless Integration:** Adding REST endpoints to your models is straightforward, enabling rapid development without compromising security or performance.
44
+
45
+ With Django-MOJO, you get a simple, efficient framework with powerful security features designed for developers who value speed and control.
46
+
47
+ ## Table of Contents
48
+
49
+ 1. [Overview](#overview)
50
+ 2. [Installation](#installation)
51
+ 3. [MOJO.Auth - Authentication and Authorization](#mojo-auth)
52
+ - [JWT Authentication Middleware](#jwt-authentication)
53
+ - [Models](#models)
54
+ - [REST API](#mojo-auth-rest-api)
55
+ 4. [MOJO - REST Framework](#mojo)
56
+ - [URL Decorators](#url-decorators)
57
+ - [GraphSerializer](#graphserializer)
58
+ 5. [Testit - Testing Suite](#testit)
59
+ - [Writing Tests](#writing-tests)
60
+ - [Running Tests](#running-tests)
61
+ 6. [Taskit - Task Runner](#taskit)
62
+ 7. [Utilities](#utilities)
63
+ 8. [Contributing](#contributing)
64
+ 9. [License](#license)
65
+
66
+ ## Overview
67
+
68
+ Django-MOJO is a collection of Django-based applications focused on authentication, task management, and testing. These tools are built to enhance development efficiency by providing utilities for common requirements such as user management, token-based authentication, and automated testing.
69
+
70
+ ## Installation
71
+
72
+ ```bash
73
+ pip install django-nativemojo
74
+ ```
75
+
76
+ ## Detailed Documentation
77
+
78
+ For detailed information about each module and its usage, refer to the documentation within the `docs` folder:
79
+
80
+ - [MOJO Auth Documentation](docs/auth.md): Authentication and authorization management with JWT support.
81
+ - [MOJO REST Documentation](docs/rest.md): Provides RESTful API capabilities for Django models.
82
+ - [MOJO Testing Documentation](docs/testit.md): Offers tools and utilities for testing Django applications.
83
+ - [MOJO Tasks Documentation](docs/tasks.md): Handles task management and processing with Redis.
84
+ - [MOJO Decorators Documentation](docs/decorators.md): Describes decorators to enhance Django views with HTTP routing, validation, etc.
85
+ - [Helpers Documentation](docs/helpers.md): Lists various helper utilities for common tasks.
86
+ - [MOJO Metrics Documentation](docs/metrics.md): Details on recording and retrieving metrics using Redis.
87
+ - [Cron Scheduler Documentation](docs/cron.md): Explains task scheduling using a cron syntax.
88
+
89
+ ## Contributing
90
+
91
+ We welcome contributions! Please create an issue or submit a pull request on the GitHub repository.
92
+
93
+ ## License
94
+
95
+ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
96
+
@@ -0,0 +1,8 @@
1
+ Native Mojo Framework
2
+ Copyright 2025 Native Mojo
3
+
4
+ This product includes software developed by Native Mojo.
5
+ Licensed under the Apache License, Version 2.0 (the "License").
6
+
7
+ You may obtain a copy of the License at:
8
+ http://www.apache.org/licenses/LICENSE-2.0
@@ -0,0 +1,194 @@
1
+ mojo/__init__.py,sha256=xxWQdMLF2SWv7E9FsazjGtL0d7VtUbkFD-pG8dvkqwk,71
2
+ mojo/apps/account/__init__.py,sha256=RwxmQqhA0Pub7VSpEHplzPYjfPBBzioocJeQ8pCNeZ4,46
3
+ mojo/apps/account/admin.py,sha256=sE4GxFX9-g-vvNWf22LOqlbQdKK47O9sKP-ohdBpmiE,3026
4
+ mojo/apps/account/apps.py,sha256=CCK2aJu19BpDq_uDI8DIqJFbRmfudzY9KZWahcbYLbE,539
5
+ mojo/apps/account/migrations/0001_initial.py,sha256=qOwAHtdgyTI-ZGGOnC2ZUn-NSqlyp1z5c6uXvCZBbNE,4220
6
+ mojo/apps/account/migrations/0002_user_is_email_verified_user_is_phone_verified.py,sha256=tBGQ9p7ADhFGGTOXDBslXK5Q4igfpbjI3j1IXqq5064,549
7
+ mojo/apps/account/migrations/0003_group_mojo_secrets_user_mojo_secrets.py,sha256=il2zEdYBGgnUa1ybes3AGPx1RykenlnXr-1nIlhVawU,616
8
+ mojo/apps/account/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
+ mojo/apps/account/models/__init__.py,sha256=zmePIaBIvzZ2LmiqAD8i-TR1lJ5SBwRzHXP3totxffc,80
10
+ mojo/apps/account/models/group.py,sha256=TRIkMS3QlJVoz20AdSbfr6NMuJBDYTwkI_AIyThbwlI,3093
11
+ mojo/apps/account/models/member.py,sha256=fYa0HAGoZIMJHZcpfe3JKPXEJET-NefyiAtnES88YNg,3315
12
+ mojo/apps/account/models/pkey.py,sha256=sSHixJTi7HwjJ-p3CB2UePGQLb0zV4UshS01xi8uykE,687
13
+ mojo/apps/account/models/user.py,sha256=HZNqX4Th6lySXIQH0xjDUOQw7gkIk2GPBY34b8Z3ge4,7830
14
+ mojo/apps/account/rest/__init__.py,sha256=IUkkLoR8YkarNZyq_KtDj1OcNgpMu_rIXnVhBsjkMVw,55
15
+ mojo/apps/account/rest/group.py,sha256=QF6mBrvvfmhXGDG6cP_t2oz3CsfP9wHY8MUmiVwEkWQ,835
16
+ mojo/apps/account/rest/user.py,sha256=yoJKX88peUDUmgGKV5rAFTEAjH6_KNTkdx_j5wUhbvI,1805
17
+ mojo/apps/account/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
+ mojo/apps/account/utils/jwtoken.py,sha256=7EMC08oDB9oeasv_7nishUNrE-QTls-Mv2n4yAa9euk,2714
19
+ mojo/apps/account/utils/passkeys.py,sha256=vUsXroe4SYcst4L7-eRWDR21l-yVYMOKa1-yWFNKfPo,2343
20
+ mojo/apps/fileman/README.md,sha256=SHHrn_1VNHoI2ZFHwa-WKKDmQimeNoo_Qiv1MA7fJfs,14131
21
+ mojo/apps/fileman/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
+ mojo/apps/fileman/apps.py,sha256=evFaBnGp90BZWgAe00fOYjdZ--5msi_vW8zjHgVct1Y,383
23
+ mojo/apps/fileman/backends/__init__.py,sha256=BQqbsGYQvfOPlXLio2XwNGsT5eLGIbrf01PZ8OceUx8,3292
24
+ mojo/apps/fileman/backends/base.py,sha256=sWw28XLqOdivxvziDrS5yXDxhWyoIciGvox158ry_zI,9731
25
+ mojo/apps/fileman/backends/filesystem.py,sha256=qoq-tmv4mDhlOazAQez5hhQWSRZ1g7p0SjKkh1QPOJE,15755
26
+ mojo/apps/fileman/backends/s3.py,sha256=CJ0x-GeBdZwGdYXqbv0VX6P1AsvM7LJtWpw8W-QNi4k,14743
27
+ mojo/apps/fileman/examples/configurations.py,sha256=vDIMijAvF-iVrc8ZT1OzjDPKCJYsvxuvAuirXhB9FYU,13775
28
+ mojo/apps/fileman/examples/usage_example.py,sha256=ATkGuUUoNYb4xhEaWFul7Sj-gyKIa9XF5EmVUibSbMQ,22795
29
+ mojo/apps/fileman/management/__init__.py,sha256=HqDUzH9gSF7kUKGypm6LZ5cHxzYEc3I2_9fB3eI283s,36
30
+ mojo/apps/fileman/management/commands/__init__.py,sha256=XtylA46UPDJ5ZY48r5yyk7ZKpvfmnb8kYJjIRVFAMiM,45
31
+ mojo/apps/fileman/management/commands/cleanup_expired_uploads.py,sha256=818-r5w8sKPSOMa1iA7VjUSpYCnlKdjWtsv8cdHkfY8,8354
32
+ mojo/apps/fileman/models/__init__.py,sha256=yCL7DVsaVaolSaKDHswzCR0SfQhHleLLqK4luZQqP7Y,101
33
+ mojo/apps/fileman/models/file.py,sha256=Jv4IZDZfdVL0s3qTmEpoXdu_bKzt8bjPUbcihg47jUU,8469
34
+ mojo/apps/fileman/models/manager.py,sha256=NorEmFWBpCkoVTwG6pl9uApUfFKEfGP47GNApFJFcXo,6928
35
+ mojo/apps/fileman/models/render.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
+ mojo/apps/fileman/rest/__init__,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
+ mojo/apps/fileman/rest/__init__.py,sha256=bTdI15HSGfduCS5YQUdqh2aOS9iwbchF1LL1Fok8lPc,418
38
+ mojo/apps/fileman/rest/fileman.py,sha256=cQYKVm9Nzu5-Hf2tWbq8Gg_zad3RtIy2bE88NLgKlrs,346
39
+ mojo/apps/fileman/rest/upload.py,sha256=He7d3wIwEGnh4XjoJ-Q43dd5UHeZ5cCXW8C_L2f5cpM,2736
40
+ mojo/apps/fileman/utils/__init__.py,sha256=K1QDycY3cDNbYf1FGaegJAzcgJAQMBK0SKQIJWXVECM,345
41
+ mojo/apps/fileman/utils/upload.py,sha256=hcH0pUf_dZ3tlkZQw1_YBBeAqxwMEDedsBG-n310uS8,18792
42
+ mojo/apps/incident/__init__.py,sha256=G75zqcH8fatIpQ0Jfp67xg48JtpQR_A6MkN2ykxrjRU,35
43
+ mojo/apps/incident/handlers/__init__.py,sha256=gl8imRiKYCnwB2SBoAavpUfJ9ifkS7WF_DOJKMHJg9Q,128
44
+ mojo/apps/incident/handlers/event_handlers.py,sha256=UkGDYIQq73OdTWFUJlLlsCOhOYZB0cbhKwuGippdnOE,4696
45
+ mojo/apps/incident/migrations/0001_initial.py,sha256=F1qZFxGRjD9qyk_zHkn3FmdyMh94Z0bcnHIvmIEZcJI,4506
46
+ mojo/apps/incident/migrations/0002_rename_bundle_ruleset_bundle_minutes_event_hostname_and_more.py,sha256=9_C_mLwbdr1RcyrtD-pm4EuwuFKInluk5IBuW4_1UJU,1441
47
+ mojo/apps/incident/migrations/0003_alter_event_model_id.py,sha256=pFN_W8Ok46rmQOqKDFrAXYEY0iXphFE4Rh7MSJu0VGY,459
48
+ mojo/apps/incident/migrations/0004_alter_incident_model_id.py,sha256=Cv2mqjYXeHgYBi7BUb_mYw-PuPQKRXj6_uy9bqECNRI,422
49
+ mojo/apps/incident/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
+ mojo/apps/incident/models/__init__.py,sha256=vpTRJerw0lAOa31nEsxiJRRhU4CYcNHRqqPijpAtM9A,88
51
+ mojo/apps/incident/models/event.py,sha256=jDEFVzQdv7NZsgfpm2sy0QTirazXWJg7McHElFW50TI,5177
52
+ mojo/apps/incident/models/incident.py,sha256=OJVEW54VFHT7PVcZFnGqDhrCE9wRS7nO-17fqnJAQek,1210
53
+ mojo/apps/incident/models/rule.py,sha256=74tP-h5KqNRRvbmjksCj4SrKJeWi5Fu3vy18t7k6Jys,10110
54
+ mojo/apps/incident/parsers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
+ mojo/apps/incident/parsers/ossec/__init__.py,sha256=2e96VUlQj_WgmSKLaUVxKijdv-tY5juquEUebWRCrdQ,48
56
+ mojo/apps/incident/parsers/ossec/core.py,sha256=lC3DuJolsJtHOdgVCG2qYcVwi_ryM8WNpWk9tfx-Kwg,2429
57
+ mojo/apps/incident/parsers/ossec/parsed.py,sha256=1Fcw7F01lAK70aSf7ga5ka2izB_IUGeIfomEcqUY_Qk,786
58
+ mojo/apps/incident/parsers/ossec/rules.py,sha256=635TmK6uUOQZsgMKDbU5HJIGjYlXUo4I6AIBFCuY0V8,4252
59
+ mojo/apps/incident/parsers/ossec/utils.py,sha256=OkD5unXJAuqQo2_mGCO8bokY0tTOzwAAo28hz7Ux8vg,5061
60
+ mojo/apps/incident/reporter.py,sha256=38fU5T3jAZhgdZkTM1fStW8iXUUY4Lvq9f9_JbQVaIc,1535
61
+ mojo/apps/incident/rest/__init__.py,sha256=KxYajaFDgrKzBLI5fgMK4Qzj6-LFH_J7uCOhWpxNW5E,42
62
+ mojo/apps/incident/rest/event.py,sha256=zqCbMSsFJRIvXzyAP3pyUf1tfpMoEZL2A6holmY_0wY,668
63
+ mojo/apps/incident/rest/ossec.py,sha256=Rw7o1LRCZdeHL3wOry6zgT9r1MGVxUzJiwvmyT5GfbI,730
64
+ mojo/apps/logit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
65
+ mojo/apps/logit/admin.py,sha256=XLvz6CtwfW3rryp5xfvtylL_CWZ5-CbChK4DB2Hl3qM,1552
66
+ mojo/apps/logit/migrations/0001_initial.py,sha256=7vrTetfEFrUzc3cOoboyktfK_KlsfrGAoCDf4T2sJzk,1348
67
+ mojo/apps/logit/migrations/0002_log_duid_log_payload_log_username.py,sha256=s97JeIMjNmKah2b7YcGauaVg_1liTeUJfq-GCi0wP6U,696
68
+ mojo/apps/logit/migrations/0003_log_level.py,sha256=HzLwBYitzRsHxGkM9gKrgc4A8dzLt4ewl14nCnWLSnc,424
69
+ mojo/apps/logit/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
70
+ mojo/apps/logit/models/__init__.py,sha256=cOGwOYzMoshEbZiiasBGkj6wF0SBu3Jdpl-AuakDesw,19
71
+ mojo/apps/logit/models/log.py,sha256=4ZEnILbDZ-1kn-59-jPG2miTPxzRWdijS7qjDzFEy_Q,2359
72
+ mojo/apps/logit/rest.py,sha256=bPoq9Blqzr1YU43LTLf9DiSLe6DgjcH1ctDnfvidpbs,205
73
+ mojo/apps/metrics/README.md,sha256=i4dHNqTKgBLMSIxyLddD7wifxZRDTn2JqQGPmW3EWIw,2984
74
+ mojo/apps/metrics/__init__.py,sha256=1qdjIyJiY3nHkFEcW2UQ23JWkgSonhMOf6JiEY4BYRw,223
75
+ mojo/apps/metrics/redis_metrics.py,sha256=6zwXc4_QOGrFE0M4njISvoECbyuCcUXvFzYJyRynlo0,12694
76
+ mojo/apps/metrics/rest/__init__.py,sha256=ERmmOxz_9mUkIuccNbzUa5Y6gVLLVDdyc4cCxbCCUbY,20
77
+ mojo/apps/metrics/rest/base.py,sha256=1uEqxlvEQpXNOJqFpQe-HxETiYF_6bxmJ9X5eYclabg,5895
78
+ mojo/apps/metrics/rest/db.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
79
+ mojo/apps/metrics/utils.py,sha256=lVqMwReXxGE3AjjIIspHH5Cgbqe2so1vlMSbFurZ9Y4,7313
80
+ mojo/apps/notify/README.md,sha256=jsklDrzD5d94r7cwgaU6Gi1HCjBDfWq7jd92qB0JYPU,2169
81
+ mojo/apps/notify/README_NOTIFICATIONS.md,sha256=JhPpwDVHxJ9OPG7-R_aVWmlpSwFTpnv3wYDteowbPZM,14156
82
+ mojo/apps/notify/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
+ mojo/apps/notify/admin.py,sha256=SgBRpBXLaUS_7L1cvPqn6403UGnw2mGzLJ6GJS8hr8E,1930
84
+ mojo/apps/notify/handlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
85
+ mojo/apps/notify/handlers/example_handlers.py,sha256=gEPs9-JQ5oFqUhVqRjvgP2ge456K-wlMWcKqLVtZGnQ,17496
86
+ mojo/apps/notify/handlers/ses/__init__.py,sha256=Lev-YzMn5sUZaUH2C5mHmJEiAH5mIA64rZGEs5bRtvI,850
87
+ mojo/apps/notify/handlers/ses/bounce.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
88
+ mojo/apps/notify/handlers/ses/complaint.py,sha256=F5l7C7jemGBcolc8r0YEDe2H_xlbtSEbVHXCoVuVHEI,825
89
+ mojo/apps/notify/handlers/ses/message.py,sha256=lC2OiYxsA6aujaEHp7WnVvlvi_VILWZrb6YKr3bYsXc,2876
90
+ mojo/apps/notify/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
91
+ mojo/apps/notify/management/commands/__init__.py,sha256=R8BsVh1cMnNDaFJopGszkfOZju6JDSvlHw0hzEpTrm0,4
92
+ mojo/apps/notify/management/commands/process_notifications.py,sha256=wt_dNBJi7WtEFwyYIs_mcVcZCDhUmx-uFGvKgDs9SMA,12969
93
+ mojo/apps/notify/mod,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
94
+ mojo/apps/notify/models/__init__.py,sha256=m0yoT_3od01fkPXRmbC3tLaNYF8PTm-isiYdDKT4xIA,363
95
+ mojo/apps/notify/models/account.py,sha256=rOeZsCMw47wsjk1tWg1p_aDPbttfIbk5GIjFAhO9nds,3323
96
+ mojo/apps/notify/models/attachment.py,sha256=cUOWyCR2ai6GQ54KPjDfD2s89eklMJ-8U8XTi5V-YuM,914
97
+ mojo/apps/notify/models/bounce.py,sha256=v0j5B7KMJYgOSkzynAtyRiXhP4LJFoh9YWe33oI_M_A,2640
98
+ mojo/apps/notify/models/complaint.py,sha256=sbzS-gmhfKwTED5jTnNgUwuox3Wjh0ah1GiNujAm4dg,1524
99
+ mojo/apps/notify/models/inbox.py,sha256=oo2PwiOgTyf1TJ0ZkbqyPirUAL_dIfxxOWS9epoc1tw,3346
100
+ mojo/apps/notify/models/inbox_message.py,sha256=zgiRNY7o4yTRTJhPufwASl0pS3RMSAPjChAJ1DVxEj8,5256
101
+ mojo/apps/notify/models/outbox.py,sha256=hRjalXVES3p6lH4u622mX1ABxzFRTcdvGlV9VuDDHy8,3788
102
+ mojo/apps/notify/models/outbox_message.py,sha256=6Ebmcy0aqt7wvoGxIDGYpDvIzg6mQeJWZzlWl_BFtUk,8413
103
+ mojo/apps/notify/models/template.py,sha256=kAj1GfHII277Ez01MZkTlkrgyr_xsgTvDrRVAy-O6qQ,1025
104
+ mojo/apps/notify/providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
105
+ mojo/apps/notify/providers/aws.py,sha256=w3L7jvEtLcIu9V8IN8BNKNoRtxxangGzGzFTQ8-5pE0,2701
106
+ mojo/apps/notify/rest/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
107
+ mojo/apps/notify/rest/ses.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
108
+ mojo/apps/notify/utils/__init__.py,sha256=G4oWPVgLaz3QXXTF_lEa1GRmU8C15b6wn78A6YjSNSA,87
109
+ mojo/apps/notify/utils/notifications.py,sha256=XY3P-BHrnA2vFSKrRPjFDClfTR7uRFJfJf17oIWn3D8,13167
110
+ mojo/apps/notify/utils/parsing.py,sha256=GN-9h_nnutB7w1Ebg8emeF6j_gyX-BWRYOKwGWLVjrI,6557
111
+ mojo/apps/notify/utils/render.py,sha256=PN-KH9C3SUV8E78B91pIC06dd2Ak7hVqqxQbImrbp_4,5270
112
+ mojo/apps/tasks/README.md,sha256=PGBo7P-8FMbWcvhvNyJGx8ayd4MOl1l9D0QNZ4w2IW4,3700
113
+ mojo/apps/tasks/__init__.py,sha256=052U1fvSHzU_pGbbPB5KuOL_-KSHh_qxF6RIHuUGKhA,301
114
+ mojo/apps/tasks/manager.py,sha256=UvCvGxvcbvXTqBhcOP0lflAhuXfse4A3v_txqWKFx6w,16869
115
+ mojo/apps/tasks/rest/__init__.py,sha256=xDdCeGCNnN5vq3PObWsqslrSZ4CqdzzFVpdrDasmqqs,42
116
+ mojo/apps/tasks/rest/hooks.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
117
+ mojo/apps/tasks/rest/tasks.py,sha256=18fxIWNCqcl0kQfsoJVPSCGL4ZbJTtUTY56CB5-s_BE,1420
118
+ mojo/apps/tasks/runner.py,sha256=jd9MFOM1lvLuDmfmdo5_LrE3lu62gCYb7kKoS3o_0HY,6842
119
+ mojo/apps/tasks/tq_handlers.py,sha256=rT4Bg8mEUucNPShKw9w6srHhyeKJpgRID4DOV28J-No,369
120
+ mojo/decorators/__init__.py,sha256=XzKewkbEeLd0M1ciA6Qf1kbawOd2VV-FbAT1nMLBoQ0,64
121
+ mojo/decorators/auth.py,sha256=K3sJnVJRCgKlVgj2RB4plauA4NyfbMxfVWbwuT2uJ6E,832
122
+ mojo/decorators/cron.py,sha256=8Qc4XJU9wUSxfepRALZbeFmgOOVWikhGMnrcOk5wbIw,1199
123
+ mojo/decorators/http.py,sha256=SMDURloKk8HNY0DCerGMZnjvioO-DdXrZfdsGiJuDsg,5325
124
+ mojo/decorators/validate.py,sha256=MEaIR8yvsM2nloOVbqjvvnrrA0wZn6OLkov2tJ1qdIw,550
125
+ mojo/errors.py,sha256=MPJ5_B-RQNK69-fQ-Hs1oddjupjfwWNakieVPee9hU4,3281
126
+ mojo/helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
127
+ mojo/helpers/aws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
128
+ mojo/helpers/aws/client.py,sha256=JoHStXSar6myZuObgteh06ZvFrKGp5Tv7lme0BFcAPw,203
129
+ mojo/helpers/aws/s3.py,sha256=Qdic9K0Teun86Mnf0fMq7ChzRwHe5GDxuGaP3cjSKUs,7595
130
+ mojo/helpers/aws/setup_email.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
131
+ mojo/helpers/cron.py,sha256=_hoKgYYc7m4oU_eU4uUOIXOhJA0A9Lw0f9GPm5TCcs4,2411
132
+ mojo/helpers/crypto/__init__.py,sha256=sEa199m84nvPZoLcHow3ZxWGZuDxJZDBQlfXu-uFUpM,177
133
+ mojo/helpers/crypto/aes.py,sha256=8VTAsykOxiSBbdKVK0DxJ_1Y2wGkY0CDRjhXSiMvF8o,1830
134
+ mojo/helpers/crypto/hash.py,sha256=HVgfzmpMO5K5stiiateB1y16SAHS7qOP0nGRGyVW0FU,2078
135
+ mojo/helpers/crypto/privpub/__init__.py,sha256=Om2Iw0r1tV4_W3OwWazLveQFTs4bwnYc35JxRBf9nm4,44
136
+ mojo/helpers/crypto/privpub/hybrid.py,sha256=APkqjHLPg4oGRBrji9e1YYKzr_v10yn5IV18ar04GIk,3422
137
+ mojo/helpers/crypto/privpub/rsa.py,sha256=ZrvHMsPv52t1ctuaAX2I7qwqnR1Yh5wLLCaveekMDsI,3420
138
+ mojo/helpers/crypto/sign.py,sha256=jC_QKm7WcxQix0DuxSk5SGD8L-6mBSl1ZHobPnpsR48,1204
139
+ mojo/helpers/crypto/too.l.py,sha256=6ypxFDOkHylcVfdGRlTtS-Jtig8JHkfVHi5N2w0i-_s,821
140
+ mojo/helpers/crypto/utils.py,sha256=eLnEL92TvBFzl07XtVGLprJQ2BTCsQqXDDuKaw9sIt4,771
141
+ mojo/helpers/daemon.py,sha256=6cC2XWIUZH59YdrV2dglPqNtJ8UUPbsKSatGsDp44m8,3276
142
+ mojo/helpers/dates.py,sha256=XbXbH9kvd8riIWUZA2PXl7hx2in7F8uSWX3DzNiO-kM,2064
143
+ mojo/helpers/dns/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
144
+ mojo/helpers/dns/godaddy.py,sha256=l8AboiEeGQ34p2t-i5Z6XDkf3siUgRsqIg1mVciPZnU,2334
145
+ mojo/helpers/filetypes.py,sha256=4BJpH8jQ_bZk-86yy2ZasVgVnxHNLIi96d2umQz_dXI,4163
146
+ mojo/helpers/logit.py,sha256=sOqWWRmcxHEInVE_wTsZIflSvZep2d8E92vcUws_zd0,9879
147
+ mojo/helpers/modules.py,sha256=Tq9agvdqLOMWsvyRYLwyyF-g28Y6zSCdJhfhT8iraj4,3180
148
+ mojo/helpers/paths.py,sha256=dIAGF0MOr9faE72fwne2-BEaarXCvJBsU8yJSjB15hA,2053
149
+ mojo/helpers/redis.py,sha256=ZQkw1vSVdDMAtybUOVM_XCyZ_38YhY1NTfofwihJqSg,288
150
+ mojo/helpers/request.py,sha256=9qPg6FyfwBzGDD1X390pdALzeKLRkYvSj0jBg0IssVA,2357
151
+ mojo/helpers/request_parser.py,sha256=OHsoBaZJ07OEWMDxVTnwElTEpd-zMtwpNdAKL_4KFzc,8862
152
+ mojo/helpers/response.py,sha256=YnCvfn3pvO4YW5Hym3nLe6D6GlTTjm4IMMkchCX53t8,521
153
+ mojo/helpers/settings.py,sha256=rIFxl8-z8XeW6RMI2IvR-WSxQ2u1j0MAqmXVEAVPSyE,5114
154
+ mojo/helpers/sysinfo.py,sha256=CHflsP26GZYTWU3LZpUtZ98l66x5QFXllfQJlv3MvRw,4517
155
+ mojo/helpers/ua.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
156
+ mojo/middleware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
157
+ mojo/middleware/auth.py,sha256=RrApAXvlK5Llj75xPbVE_6RJJF_ubAFxUt3m9h1u-8I,941
158
+ mojo/middleware/logging.py,sha256=V2N0kx4AYoQbfKXk0vcgcMe9fL9zaPV7VfW2RwMvaSY,2283
159
+ mojo/middleware/mojo.py,sha256=EcTjSjwQgnyEmIpndxYQcwRY0C2SodgTubOr9dOEACI,679
160
+ mojo/migrations/0001_initial.py,sha256=ir1h2kZZ6WnAChhcCejCVd5C0kWhGsXKozNhZeWvUTs,1337
161
+ mojo/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
162
+ mojo/models/__init__.py,sha256=1A4nsKq1ZDt85pFrqLUTVqi-DTKojulrSa6rTJK65-Q,61
163
+ mojo/models/meta.py,sha256=XHSjwcWUwsGEuI2rbenQv4aXo0IPN8oJu5mk8I5vgWQ,10232
164
+ mojo/models/rest.py,sha256=TJQYDo96mdB1Ew-JuglQ_byurhxgrZazgZJK4-IO_ac,19645
165
+ mojo/models/secrets.py,sha256=GMxLDQ1XMor1AnMjxD4Dy_3aHEPcHwtI25bxPYOo64U,1906
166
+ mojo/rest/__init__.py,sha256=KjRXymi2g5qLVJ-KOOCFwqDocB2RxeGY6-T5HQU7np4,20
167
+ mojo/rest/info.py,sha256=ftL5NZjswWzIfRsxistZrPN8jbIAyHhygYzcb2M7UMQ,699
168
+ mojo/serializers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
169
+ mojo/serializers/models.py,sha256=8Xk_TwTJfMiRjqlYNNauc3pBv3nUikJi3xElkflv8KE,7031
170
+ mojo/serializers/openapi.py,sha256=sRc9GQh6tbNIV-MnJN7Fn_4NeT0QF37tro8G88MMbck,6448
171
+ mojo/urls.py,sha256=lkB5Dxz7zaSQI2YC5nHvLgt32rcPeaj-YfknlUw_xzQ,1201
172
+ mojo/ws4redis/README.md,sha256=QvwdsauPKxx4qQqnJ991xeU8DgFQCj3CeQt-nCE4s-w,3624
173
+ mojo/ws4redis/__init__.py,sha256=ij80KRdl8a5pvMiYrZlseMtNPGApc9rwdvXxoUdDFBY,46
174
+ mojo/ws4redis/client.py,sha256=eT6e7Q6Rbqsv5R9BhTXkuJKkjKspewJGzDbi56ecL50,7070
175
+ mojo/ws4redis/connection.py,sha256=9ZrIyL78_T9n71s_gIlrZMgBAf6h51vr_c7a3HDM230,13532
176
+ mojo/ws4redis/exceptions.py,sha256=EGLoRTdqJVwz900pwhciqPuSjBBd08hhLgFu6umHrI4,636
177
+ mojo/ws4redis/redis.py,sha256=bcrIJ9laE9S55bMzmMlZLOYq-kQS9egrZ0aww64WWfQ,6713
178
+ mojo/ws4redis/servers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
179
+ mojo/ws4redis/servers/base.py,sha256=S8Dtiv-Af5spiI4Bdtz0iwFs26dOyXiIsHLOVG0Bk88,3765
180
+ mojo/ws4redis/servers/django.py,sha256=iuS16OxRcxIaOBaxfxxHxwwGC1TAmPykDhBYVeV4_ak,5902
181
+ mojo/ws4redis/servers/uwsgi.py,sha256=BftTWjKU_upZWRw1ONO5jPOL0VP6of7cuySyd866yHk,1733
182
+ mojo/ws4redis/settings.py,sha256=KKq00EwoGnz1yLwCZr5Dfoq2izivmAdsNEEM4EhZwN4,1610
183
+ mojo/ws4redis/utf8validator.py,sha256=S0OlfjeGRP75aO6CzZsF4oTjRQAgR17OWE9rgZdMBZA,5122
184
+ mojo/ws4redis/websocket.py,sha256=hfrZBM_fWukgEhwDZFLS4N4Q_jt-FsOu4m0mE1bWfeo,14207
185
+ testit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
186
+ testit/client.py,sha256=uG0_R1FJ36NaAPsCX4wJh07B4Tl54I4IqsUCCxpynto,5355
187
+ testit/faker.py,sha256=fdrgVkgdgypiGZGigBb9uyWHopflulaHrLOmzBdfCFA,393
188
+ testit/helpers.py,sha256=obLNW_wDhsJ_JQM0h6_-EhDT6END8jDShPtNDo-EeFs,5499
189
+ testit/runner.py,sha256=u_Tx1x144vOBXW737THyA6KqWJu1gSwWyBYn6JYNiBI,10302
190
+ django_nativemojo-0.1.10.dist-info/LICENSE,sha256=K2Ly2mJoqzHPrWcXQFXWbvDtphQ51huB2RbfGW7WmUM,774
191
+ django_nativemojo-0.1.10.dist-info/METADATA,sha256=bdBST6Z1gbaG4bmrUkoa4IiUHeqT4i4YfH9eNTFrqp4,4838
192
+ django_nativemojo-0.1.10.dist-info/NOTICE,sha256=FqvhpeIbbnXn4wqLHA6Ap2VhQfU2e7QVFFyRW8L_6ys,256
193
+ django_nativemojo-0.1.10.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
194
+ django_nativemojo-0.1.10.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: poetry-core 2.0.1
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
mojo/__init__.py ADDED
@@ -0,0 +1,3 @@
1
+ __version__ = "0.1.10"
2
+
3
+ from mojo.helpers.response import JsonResponse
@@ -0,0 +1 @@
1
+ default_app_config = 'account.apps.AppConfig'
@@ -0,0 +1,91 @@
1
+ from django.contrib import admin
2
+ from django.utils.translation import gettext_lazy as _
3
+ from .models import User, Group, GroupMember
4
+
5
+
6
+ class UserAdmin(admin.ModelAdmin):
7
+ """Custom Admin for the User model"""
8
+
9
+ # Fields displayed in the User list in Django Admin
10
+ list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff', 'is_active', 'last_login', 'id')
11
+ list_filter = ('is_staff', 'is_active')
12
+
13
+ # Fields displayed when viewing/editing a user
14
+ fieldsets = (
15
+ (None, {'fields': ('username', 'password')}),
16
+ (_('Personal Info'), {'fields': ('first_name', 'last_name', 'email', 'phone_number', 'display_name')}),
17
+ (_('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser')}),
18
+ (_('Important Dates'), {'fields': ('last_login', 'date_joined', 'last_activity')}),
19
+ (_('Metadata'), {'fields': ('permissions', 'metadata')}),
20
+ )
21
+
22
+ # Fields displayed when adding a new user
23
+ add_fieldsets = (
24
+ (None, {
25
+ 'classes': ('wide',),
26
+ 'fields': ('username', 'email', 'password'),
27
+ }),
28
+ )
29
+
30
+ # Searchable fields in the admin panel
31
+ search_fields = ('username', 'email', 'first_name', 'last_name')
32
+ ordering = ('username',)
33
+
34
+ # Read-only fields for security
35
+ readonly_fields = ('last_login', 'date_joined', 'last_activity')
36
+
37
+ admin.site.register(User, UserAdmin)
38
+
39
+
40
+
41
+ class GroupAdmin(admin.ModelAdmin):
42
+ """Custom Admin for the Group model"""
43
+
44
+ # Fields displayed in the Group list in Django Admin
45
+ list_display = ('name', 'uuid', 'kind', 'is_active', 'created', 'modified', 'parent', 'id')
46
+ list_filter = ('is_active', 'kind')
47
+
48
+ # Searchable fields
49
+ search_fields = ('name', 'uuid', 'kind')
50
+
51
+ # Read-only fields for security
52
+ readonly_fields = ('created', 'modified')
53
+
54
+ # Fields displayed when viewing/editing a group
55
+ fieldsets = (
56
+ (None, {'fields': ('name', 'uuid', 'kind', 'is_active', 'parent')}),
57
+ ('Metadata', {'fields': ('metadata',)}),
58
+ ('Timestamps', {'fields': ('created', 'modified')}),
59
+ )
60
+
61
+ autocomplete_fields = ('parent',)
62
+
63
+
64
+ admin.site.register(Group, GroupAdmin)
65
+
66
+
67
+
68
+ class GroupMemberAdmin(admin.ModelAdmin):
69
+ """Custom Admin for the GroupMember model"""
70
+
71
+ # Fields displayed in the GroupMember list in Django Admin
72
+ list_display = ('user', 'group', 'is_active', 'created', 'modified', 'id')
73
+ list_filter = ('is_active', 'group')
74
+
75
+ # Searchable fields
76
+ search_fields = ('user__username', 'user__email', 'group__name')
77
+
78
+ # Read-only fields for security
79
+ readonly_fields = ('created', 'modified')
80
+
81
+ # Fields displayed when viewing/editing a group member
82
+ fieldsets = (
83
+ (None, {'fields': ('user', 'group', 'is_active')}),
84
+ ('Permissions', {'fields': ('permissions',)}),
85
+ ('Metadata', {'fields': ('metadata',)}),
86
+ ('Timestamps', {'fields': ('created', 'modified')}),
87
+ )
88
+
89
+ autocomplete_fields = ('group', 'user', )
90
+
91
+ admin.site.register(GroupMember, GroupMemberAdmin)
@@ -0,0 +1,16 @@
1
+ from django.apps import AppConfig as BaseAppConfig
2
+
3
+ class AppConfig(BaseAppConfig):
4
+ default_auto_field = 'django.db.models.BigAutoField'
5
+ name = 'mojo.apps.account'
6
+
7
+ def ready(self):
8
+ from mojo.helpers.settings import settings
9
+ if settings.is_app_installed("django.contrib.admin"):
10
+ self.unregister_apps()
11
+
12
+ def unregister_apps(self):
13
+ from django.contrib import admin
14
+ from django.contrib.auth.models import Group
15
+ for model in [Group]:
16
+ admin.site.unregister(model)
@@ -0,0 +1,77 @@
1
+ # Generated by Django 4.2.21 on 2025-05-29 21:29
2
+
3
+ from django.conf import settings
4
+ from django.db import migrations, models
5
+ import django.db.models.deletion
6
+ import mojo.models.rest
7
+ import uuid
8
+
9
+
10
+ class Migration(migrations.Migration):
11
+
12
+ initial = True
13
+
14
+ dependencies = [
15
+ ]
16
+
17
+ operations = [
18
+ migrations.CreateModel(
19
+ name='User',
20
+ fields=[
21
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
22
+ ('password', models.CharField(max_length=128, verbose_name='password')),
23
+ ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
24
+ ('created', models.DateTimeField(auto_now_add=True)),
25
+ ('modified', models.DateTimeField(auto_now_add=True)),
26
+ ('last_activity', models.DateTimeField(db_index=True, default=None, null=True)),
27
+ ('uuid', models.UUIDField(db_index=True, default=uuid.uuid4, editable=False)),
28
+ ('username', models.TextField(unique=True)),
29
+ ('email', models.EmailField(max_length=254, unique=True)),
30
+ ('phone_number', models.CharField(blank=True, default=None, max_length=32, null=True)),
31
+ ('display_name', models.CharField(blank=True, default=None, max_length=80, null=True)),
32
+ ('auth_key', models.TextField(default=None, null=True)),
33
+ ('onetime_code', models.TextField(default=None, null=True)),
34
+ ('permissions', models.JSONField(blank=True, default=dict)),
35
+ ('metadata', models.JSONField(blank=True, default=dict)),
36
+ ('first_name', models.CharField(default='', max_length=80)),
37
+ ('last_name', models.CharField(default='', max_length=80)),
38
+ ('is_active', models.BooleanField(default=True)),
39
+ ('is_staff', models.BooleanField(default=False)),
40
+ ('is_superuser', models.BooleanField(default=False)),
41
+ ('date_joined', models.DateTimeField(auto_now_add=True)),
42
+ ],
43
+ options={
44
+ 'abstract': False,
45
+ },
46
+ bases=(models.Model, mojo.models.rest.MojoModel),
47
+ ),
48
+ migrations.CreateModel(
49
+ name='Group',
50
+ fields=[
51
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
52
+ ('created', models.DateTimeField(auto_now_add=True)),
53
+ ('modified', models.DateTimeField(auto_now=True, db_index=True)),
54
+ ('name', models.CharField(max_length=200)),
55
+ ('uuid', models.CharField(db_index=True, default=None, max_length=200, null=True)),
56
+ ('is_active', models.BooleanField(db_index=True, default=True)),
57
+ ('kind', models.CharField(db_index=True, default='group', max_length=80)),
58
+ ('metadata', models.JSONField(blank=True, default=dict)),
59
+ ('parent', models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='groups', to='account.group')),
60
+ ],
61
+ bases=(models.Model, mojo.models.rest.MojoModel),
62
+ ),
63
+ migrations.CreateModel(
64
+ name='GroupMember',
65
+ fields=[
66
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
67
+ ('created', models.DateTimeField(auto_now_add=True)),
68
+ ('modified', models.DateTimeField(auto_now=True, db_index=True)),
69
+ ('is_active', models.BooleanField(db_index=True, default=True)),
70
+ ('permissions', models.JSONField(blank=True, default=dict)),
71
+ ('metadata', models.JSONField(blank=True, default=dict)),
72
+ ('group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='members', to='account.group')),
73
+ ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='members', to=settings.AUTH_USER_MODEL)),
74
+ ],
75
+ bases=(models.Model, mojo.models.rest.MojoModel),
76
+ ),
77
+ ]
@@ -0,0 +1,23 @@
1
+ # Generated by Django 4.2.21 on 2025-06-04 02:13
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('account', '0001_initial'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name='user',
15
+ name='is_email_verified',
16
+ field=models.BooleanField(default=False),
17
+ ),
18
+ migrations.AddField(
19
+ model_name='user',
20
+ name='is_phone_verified',
21
+ field=models.BooleanField(default=False),
22
+ ),
23
+ ]
@@ -0,0 +1,23 @@
1
+ # Generated by Django 4.2.21 on 2025-06-04 19:19
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('account', '0002_user_is_email_verified_user_is_phone_verified'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name='group',
15
+ name='mojo_secrets',
16
+ field=models.TextField(blank=True, default=None, null=True),
17
+ ),
18
+ migrations.AddField(
19
+ model_name='user',
20
+ name='mojo_secrets',
21
+ field=models.TextField(blank=True, default=None, null=True),
22
+ ),
23
+ ]
File without changes
@@ -0,0 +1,3 @@
1
+ from .group import Group
2
+ from .user import User
3
+ from .member import GroupMember