amsdal 0.3.3__cp311-cp311-macosx_10_9_universal2.whl → 0.5.29__cp311-cp311-macosx_10_9_universal2.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 (244) hide show
  1. amsdal/Third-Party Materials - AMSDAL Dependencies - License Notices.md +56 -2
  2. amsdal/__about__.py +1 -1
  3. amsdal/__init__.py +20 -0
  4. amsdal/__init__.pyi +9 -0
  5. amsdal/__migrations__/0000_initial.py +23 -190
  6. amsdal/__migrations__/0001_create_class_file.py +61 -0
  7. amsdal/__migrations__/0002_create_class_file.py +109 -0
  8. amsdal/__migrations__/0003_update_class_file.py +91 -0
  9. amsdal/__migrations__/0004_update_class_file.py +45 -0
  10. amsdal/cloud/__init__.cpython-311-darwin.so +0 -0
  11. amsdal/cloud/client.cpython-311-darwin.so +0 -0
  12. amsdal/cloud/constants.cpython-311-darwin.so +0 -0
  13. amsdal/cloud/enums.cpython-311-darwin.so +0 -0
  14. amsdal/cloud/models/__init__.cpython-311-darwin.so +0 -0
  15. amsdal/cloud/models/base.cpython-311-darwin.so +0 -0
  16. amsdal/cloud/services/__init__.cpython-311-darwin.so +0 -0
  17. amsdal/cloud/services/actions/__init__.cpython-311-darwin.so +0 -0
  18. amsdal/cloud/services/actions/add_allowlist_ip.cpython-311-darwin.so +0 -0
  19. amsdal/cloud/services/actions/add_basic_auth.cpython-311-darwin.so +0 -0
  20. amsdal/cloud/services/actions/add_dependency.cpython-311-darwin.so +0 -0
  21. amsdal/cloud/services/actions/add_secret.cpython-311-darwin.so +0 -0
  22. amsdal/cloud/services/actions/base.cpython-311-darwin.so +0 -0
  23. amsdal/cloud/services/actions/create_deploy.cpython-311-darwin.so +0 -0
  24. amsdal/cloud/services/actions/create_env.cpython-311-darwin.so +0 -0
  25. amsdal/cloud/services/actions/create_session.cpython-311-darwin.so +0 -0
  26. amsdal/cloud/services/actions/delete_allowlist_ip.cpython-311-darwin.so +0 -0
  27. amsdal/cloud/services/actions/delete_basic_auth.cpython-311-darwin.so +0 -0
  28. amsdal/cloud/services/actions/delete_dependency.cpython-311-darwin.so +0 -0
  29. amsdal/cloud/services/actions/delete_env.cpython-311-darwin.so +0 -0
  30. amsdal/cloud/services/actions/delete_secret.cpython-311-darwin.so +0 -0
  31. amsdal/cloud/services/actions/destroy_deploy.cpython-311-darwin.so +0 -0
  32. amsdal/cloud/services/actions/expose_db.cpython-311-darwin.so +0 -0
  33. amsdal/cloud/services/actions/get_basic_auth_credentials.cpython-311-darwin.so +0 -0
  34. amsdal/cloud/services/actions/get_monitoring_info.cpython-311-darwin.so +0 -0
  35. amsdal/cloud/services/actions/list_dependencies.cpython-311-darwin.so +0 -0
  36. amsdal/cloud/services/actions/list_deploys.cpython-311-darwin.so +0 -0
  37. amsdal/cloud/services/actions/list_envs.cpython-311-darwin.so +0 -0
  38. amsdal/cloud/services/actions/list_secrets.cpython-311-darwin.so +0 -0
  39. amsdal/cloud/services/actions/manager.cpython-311-darwin.so +0 -0
  40. amsdal/cloud/services/actions/signup_action.cpython-311-darwin.so +0 -0
  41. amsdal/cloud/services/actions/update_deploy.cpython-311-darwin.so +0 -0
  42. amsdal/cloud/services/auth/__init__.cpython-311-darwin.so +0 -0
  43. amsdal/cloud/services/auth/base.cpython-311-darwin.so +0 -0
  44. amsdal/cloud/services/auth/credentials.cpython-311-darwin.so +0 -0
  45. amsdal/cloud/services/auth/credentials.pyi +0 -1
  46. amsdal/cloud/services/auth/manager.cpython-311-darwin.so +0 -0
  47. amsdal/cloud/services/auth/signup_service.cpython-311-darwin.so +0 -0
  48. amsdal/cloud/services/auth/token.cpython-311-darwin.so +0 -0
  49. amsdal/cloud/services/auth/token.pyi +0 -1
  50. amsdal/configs/main.py +40 -20
  51. amsdal/configs/main.pyi +19 -18
  52. amsdal/contrib/__init__.cpython-311-darwin.so +0 -0
  53. amsdal/contrib/auth/errors.py +36 -0
  54. amsdal/contrib/auth/errors.pyi +12 -0
  55. amsdal/contrib/auth/fixtures/basic_permissions.json +64 -0
  56. amsdal/contrib/auth/lifecycle/consumer.py +13 -13
  57. amsdal/contrib/auth/lifecycle/consumer.pyi +3 -0
  58. amsdal/contrib/auth/migrations/0000_initial.py +69 -31
  59. amsdal/contrib/auth/migrations/0001_add_mfa_support.py +188 -0
  60. amsdal/contrib/auth/models/__init__.py +1 -0
  61. amsdal/contrib/auth/models/backup_code.py +85 -0
  62. amsdal/contrib/auth/models/email_mfa_device.py +108 -0
  63. amsdal/contrib/auth/models/login_session.py +235 -0
  64. amsdal/contrib/auth/models/mfa_device.py +86 -0
  65. amsdal/contrib/auth/models/permission.py +23 -0
  66. amsdal/contrib/auth/models/sms_device.py +113 -0
  67. amsdal/contrib/auth/models/totp_device.py +58 -0
  68. amsdal/contrib/auth/models/user.py +156 -0
  69. amsdal/contrib/auth/services/__init__.py +1 -0
  70. amsdal/contrib/auth/services/mfa_device_service.py +544 -0
  71. amsdal/contrib/auth/services/mfa_device_service.pyi +216 -0
  72. amsdal/contrib/auth/services/totp_service.py +358 -0
  73. amsdal/contrib/auth/services/totp_service.pyi +158 -0
  74. amsdal/contrib/auth/settings.py +8 -0
  75. amsdal/contrib/auth/settings.pyi +8 -0
  76. amsdal/contrib/auth/transactions/__init__.py +1 -0
  77. amsdal/contrib/auth/transactions/mfa_device_transactions.py +463 -0
  78. amsdal/contrib/auth/transactions/mfa_device_transactions.pyi +226 -0
  79. amsdal/contrib/auth/transactions/totp_transactions.py +206 -0
  80. amsdal/contrib/auth/transactions/totp_transactions.pyi +113 -0
  81. amsdal/contrib/auth/utils/__init__.py +0 -0
  82. amsdal/contrib/auth/utils/__init__.pyi +0 -0
  83. amsdal/contrib/auth/utils/mfa.py +257 -0
  84. amsdal/contrib/auth/utils/mfa.pyi +119 -0
  85. amsdal/contrib/frontend_configs/conversion/convert.py +85 -25
  86. amsdal/contrib/frontend_configs/conversion/convert.pyi +0 -1
  87. amsdal/contrib/frontend_configs/lifecycle/consumer.py +32 -13
  88. amsdal/contrib/frontend_configs/lifecycle/consumer.pyi +1 -1
  89. amsdal/contrib/frontend_configs/migrations/0000_initial.py +167 -195
  90. amsdal/contrib/frontend_configs/migrations/0001_update_frontend_control_config.py +245 -0
  91. amsdal/contrib/frontend_configs/migrations/0002_add_button_and_invoke_actions.py +352 -0
  92. amsdal/contrib/frontend_configs/migrations/0003_create_class_frontendconfigdashboardelement.py +145 -0
  93. amsdal/contrib/frontend_configs/models/__init__.py +0 -0
  94. amsdal/contrib/frontend_configs/models/frontend_activator_config.py +22 -0
  95. amsdal/contrib/frontend_configs/models/frontend_config_async_validator.py +11 -0
  96. amsdal/contrib/frontend_configs/models/frontend_config_control_action.py +110 -0
  97. amsdal/contrib/frontend_configs/models/frontend_config_dashboard.py +51 -0
  98. amsdal/contrib/frontend_configs/models/frontend_config_group_validator.py +21 -0
  99. amsdal/contrib/frontend_configs/models/frontend_config_option.py +12 -0
  100. amsdal/contrib/frontend_configs/models/frontend_config_skip_none_base.py +17 -0
  101. amsdal/contrib/frontend_configs/models/frontend_config_slider_option.py +13 -0
  102. amsdal/contrib/frontend_configs/models/frontend_config_text_mask.py +14 -0
  103. amsdal/contrib/frontend_configs/models/frontend_config_validator.py +28 -0
  104. amsdal/contrib/frontend_configs/models/frontend_control_config.py +110 -0
  105. amsdal/contrib/frontend_configs/models/frontend_model_config.py +14 -0
  106. amsdal/errors.py +0 -3
  107. amsdal/errors.pyi +0 -1
  108. amsdal/fixtures/__init__.cpython-311-darwin.so +0 -0
  109. amsdal/fixtures/manager.cpython-311-darwin.so +0 -0
  110. amsdal/fixtures/manager.pyi +73 -123
  111. amsdal/fixtures/utils.cpython-311-darwin.so +0 -0
  112. amsdal/fixtures/utils.pyi +9 -0
  113. amsdal/manager.cpython-311-darwin.so +0 -0
  114. amsdal/manager.pyi +9 -96
  115. amsdal/mixins/__init__.cpython-311-darwin.so +0 -0
  116. amsdal/mixins/class_versions_mixin.cpython-311-darwin.so +0 -0
  117. amsdal/models/__init__.py +19 -0
  118. amsdal/models/core/__init__.py +0 -0
  119. amsdal/models/core/class_object.py +38 -0
  120. amsdal/models/core/class_property.py +26 -0
  121. amsdal/models/core/file.py +243 -0
  122. amsdal/models/core/fixture.py +25 -0
  123. amsdal/models/core/option.py +11 -0
  124. amsdal/models/core/storage_metadata.py +15 -0
  125. amsdal/models/core/validator.py +12 -0
  126. amsdal/models/mixins.py +31 -0
  127. amsdal/models/types/__init__.py +0 -0
  128. amsdal/models/types/object.py +26 -0
  129. amsdal/queryset/__init__.py +21 -0
  130. amsdal/queryset/__init__.pyi +6 -0
  131. amsdal/schemas/core/class_object/model.json +20 -0
  132. amsdal/schemas/core/class_property/model.json +19 -0
  133. amsdal/schemas/core/file/properties/from_file.py +1 -1
  134. amsdal/schemas/core/file/properties/validate_data.py +3 -4
  135. amsdal/schemas/core/storage_metadata/model.json +52 -0
  136. amsdal/schemas/interfaces.py +25 -0
  137. amsdal/schemas/interfaces.pyi +20 -0
  138. amsdal/schemas/manager.cpython-311-darwin.so +0 -0
  139. amsdal/schemas/manager.py +0 -116
  140. amsdal/schemas/manager.pyi +0 -65
  141. amsdal/schemas/mixins/__init__.py +0 -0
  142. amsdal/schemas/mixins/__init__.pyi +0 -0
  143. amsdal/schemas/mixins/check_dependencies_mixin.py +130 -0
  144. amsdal/schemas/mixins/check_dependencies_mixin.pyi +45 -0
  145. amsdal/schemas/mixins/verify_schemas_mixin.py +96 -0
  146. amsdal/schemas/mixins/verify_schemas_mixin.pyi +33 -0
  147. amsdal/schemas/repository.py +84 -0
  148. amsdal/schemas/repository.pyi +22 -0
  149. amsdal/schemas/utils.py +16 -0
  150. amsdal/schemas/utils.pyi +10 -0
  151. amsdal/services/__init__.py +11 -0
  152. amsdal/services/__init__.pyi +4 -0
  153. amsdal/services/external_connections.py +262 -0
  154. amsdal/services/external_connections.pyi +190 -0
  155. amsdal/services/external_model_generator.py +350 -0
  156. amsdal/services/external_model_generator.pyi +134 -0
  157. amsdal/services/transaction_execution.cpython-311-darwin.so +0 -0
  158. amsdal/services/transaction_execution.pyi +2 -1
  159. amsdal/storages/__init__.py +20 -0
  160. amsdal/storages/__init__.pyi +8 -0
  161. amsdal/storages/file_system.py +214 -0
  162. amsdal/storages/file_system.pyi +36 -0
  163. amsdal/transactions/__init__.py +13 -0
  164. amsdal/transactions/__init__.pyi +4 -0
  165. amsdal/utils/rollback/__init__.py +99 -54
  166. amsdal/utils/rollback/__init__.pyi +6 -0
  167. amsdal/utils/tests/enums.py +0 -2
  168. amsdal/utils/tests/helpers.py +253 -231
  169. amsdal/utils/tests/migrations.py +157 -0
  170. {amsdal-0.3.3.dist-info → amsdal-0.5.29.dist-info}/METADATA +17 -10
  171. amsdal-0.5.29.dist-info/RECORD +276 -0
  172. {amsdal-0.3.3.dist-info → amsdal-0.5.29.dist-info}/WHEEL +1 -1
  173. amsdal/__migrations__/0001_datetime_type.py +0 -18
  174. amsdal/__migrations__/0002_fixture_order.py +0 -40
  175. amsdal/__migrations__/0003_schema_type_in_class_meta.py +0 -56
  176. amsdal/contrib/auth/models/login_session/hooks/pre_init.py +0 -68
  177. amsdal/contrib/auth/models/login_session/model.json +0 -23
  178. amsdal/contrib/auth/models/login_session/modifiers/display_name.py +0 -11
  179. amsdal/contrib/auth/models/permission/fixtures/basic_permissions.json +0 -62
  180. amsdal/contrib/auth/models/permission/model.json +0 -18
  181. amsdal/contrib/auth/models/permission/modifiers/display_name.py +0 -11
  182. amsdal/contrib/auth/models/user/hooks/post_init.py +0 -76
  183. amsdal/contrib/auth/models/user/hooks/pre_create.py +0 -8
  184. amsdal/contrib/auth/models/user/model.json +0 -25
  185. amsdal/contrib/auth/models/user/modifiers/display_name.py +0 -19
  186. amsdal/contrib/frontend_configs/models/frontend_activator_config/model.json +0 -11
  187. amsdal/contrib/frontend_configs/models/frontend_config_async_validator/model.json +0 -11
  188. amsdal/contrib/frontend_configs/models/frontend_config_group_validator/model.json +0 -52
  189. amsdal/contrib/frontend_configs/models/frontend_config_option/model.json +0 -15
  190. amsdal/contrib/frontend_configs/models/frontend_config_skip_none_base/model.json +0 -6
  191. amsdal/contrib/frontend_configs/models/frontend_config_skip_none_base/properties/model_dump.py +0 -13
  192. amsdal/contrib/frontend_configs/models/frontend_config_slider_option/model.json +0 -19
  193. amsdal/contrib/frontend_configs/models/frontend_config_text_mask/model.json +0 -26
  194. amsdal/contrib/frontend_configs/models/frontend_config_validator/model.json +0 -41
  195. amsdal/contrib/frontend_configs/models/frontend_control_config/model.json +0 -250
  196. amsdal/contrib/frontend_configs/models/frontend_model_config/fixtures/permissions.json +0 -24
  197. amsdal/contrib/frontend_configs/models/frontend_model_config/model.json +0 -17
  198. amsdal/contrib/frontend_configs/models/frontent_config_control_action/model.json +0 -54
  199. amsdal/contrib/frontend_configs/models/frontent_config_control_action/properties/action_validate.py +0 -33
  200. amsdal/migration/__init__.cpython-311-darwin.so +0 -0
  201. amsdal/migration/base_migration_schemas.cpython-311-darwin.so +0 -0
  202. amsdal/migration/base_migration_schemas.pyi +0 -120
  203. amsdal/migration/data_classes.cpython-311-darwin.so +0 -0
  204. amsdal/migration/data_classes.pyi +0 -172
  205. amsdal/migration/executors/__init__.cpython-311-darwin.so +0 -0
  206. amsdal/migration/executors/base.cpython-311-darwin.so +0 -0
  207. amsdal/migration/executors/base.pyi +0 -118
  208. amsdal/migration/executors/default_executor.cpython-311-darwin.so +0 -0
  209. amsdal/migration/executors/default_executor.pyi +0 -184
  210. amsdal/migration/executors/state_executor.cpython-311-darwin.so +0 -0
  211. amsdal/migration/executors/state_executor.pyi +0 -78
  212. amsdal/migration/file_migration_executor.cpython-311-darwin.so +0 -0
  213. amsdal/migration/file_migration_executor.pyi +0 -68
  214. amsdal/migration/file_migration_generator.cpython-311-darwin.so +0 -0
  215. amsdal/migration/file_migration_generator.pyi +0 -139
  216. amsdal/migration/file_migration_store.cpython-311-darwin.so +0 -0
  217. amsdal/migration/file_migration_store.pyi +0 -61
  218. amsdal/migration/file_migration_writer.cpython-311-darwin.so +0 -0
  219. amsdal/migration/file_migration_writer.pyi +0 -73
  220. amsdal/migration/migrations.cpython-311-darwin.so +0 -0
  221. amsdal/migration/migrations.pyi +0 -166
  222. amsdal/migration/migrations_loader.cpython-311-darwin.so +0 -0
  223. amsdal/migration/migrations_loader.pyi +0 -32
  224. amsdal/migration/schemas_loaders.cpython-311-darwin.so +0 -0
  225. amsdal/migration/schemas_loaders.pyi +0 -37
  226. amsdal/migration/templates/data_migration.tmpl +0 -18
  227. amsdal/migration/templates/dict_validator.tmpl +0 -4
  228. amsdal/migration/templates/migration.tmpl +0 -6
  229. amsdal/migration/templates/model_class.tmpl +0 -8
  230. amsdal/migration/templates/model_class_layout.tmpl +0 -24
  231. amsdal/migration/templates/options_validator.tmpl +0 -4
  232. amsdal/migration/utils.cpython-311-darwin.so +0 -0
  233. amsdal/migration/utils.pyi +0 -58
  234. amsdal/mixins/build_mixin.cpython-311-darwin.so +0 -0
  235. amsdal/mixins/build_mixin.pyi +0 -78
  236. amsdal/schemas/core/class_object_meta/model.json +0 -59
  237. amsdal/schemas/core/class_property_meta/model.json +0 -23
  238. amsdal/services/__init__.cpython-311-darwin.so +0 -0
  239. amsdal-0.3.3.dist-info/RECORD +0 -257
  240. amsdal-0.3.3.dist-info/licenses/LICENSE.txt +0 -107
  241. /amsdal/{migration → contrib/auth/services}/__init__.pyi +0 -0
  242. /amsdal/{migration/executors → contrib/auth/transactions}/__init__.pyi +0 -0
  243. {amsdal-0.3.3.dist-info → amsdal-0.5.29.dist-info/licenses}/LICENSE.txt +0 -0
  244. {amsdal-0.3.3.dist-info → amsdal-0.5.29.dist-info}/top_level.txt +0 -0
@@ -1,68 +0,0 @@
1
- from datetime import datetime
2
- from datetime import timedelta
3
- from datetime import timezone
4
- from typing import Any
5
-
6
- # import bcrypt
7
- import jwt
8
-
9
- # from amsdal_utils.models.enums import Versions
10
-
11
-
12
- def pre_init(self, *, is_new_object: bool, kwargs: dict[str, Any]) -> None: # type: ignore[no-untyped-def] # noqa: ARG001
13
- """
14
- Pre-initializes a user object by validating email and password, and generating a JWT token.
15
-
16
- This method checks if the object is new and validates the provided email and password.
17
- If the email and password are valid, it generates a JWT token and adds it to the kwargs.
18
-
19
- Args:
20
- is_new_object (bool): Indicates if the object is new.
21
- kwargs (dict[str, Any]): The keyword arguments containing user details.
22
-
23
- Raises:
24
- AuthenticationError: If the email or password is invalid.
25
- """
26
- if not is_new_object or '_metadata' in kwargs:
27
- return
28
-
29
- from amsdal.contrib.auth.errors import AuthenticationError
30
- from amsdal.contrib.auth.settings import auth_settings
31
-
32
- email = kwargs.get('email', None)
33
- password = kwargs.get('password', None)
34
-
35
- if not email:
36
- msg = "Email can't be empty"
37
- raise AuthenticationError(msg)
38
-
39
- if not password:
40
- msg = "Password can't be empty"
41
- raise AuthenticationError(msg)
42
-
43
- lowercased_email = email.lower()
44
-
45
- # from models.contrib.user import User # type: ignore[import-not-found]
46
-
47
- # user = User.objects.filter(
48
- # email=lowercased_email,
49
- # _address__object_version=Versions.LATEST
50
- # ).get_or_none().execute()
51
-
52
- # if not user:
53
- # msg = 'Invalid email / password'
54
- # raise AuthenticationError(msg)
55
-
56
- # if not bcrypt.checkpw(password.encode('utf-8') if isinstance(password, str) else password, user.password):
57
- # msg = 'Invalid email / password'
58
- # raise AuthenticationError(msg)
59
-
60
- kwargs['password'] = 'validated'
61
- expiration_time = datetime.now(tz=timezone.utc) + timedelta(seconds=auth_settings.AUTH_TOKEN_EXPIRATION)
62
- token = jwt.encode(
63
- {'email': lowercased_email, 'exp': expiration_time},
64
- key=auth_settings.AUTH_JWT_KEY, # type: ignore[arg-type]
65
- algorithm='HS256',
66
- )
67
-
68
- kwargs['token'] = token
@@ -1,23 +0,0 @@
1
- {
2
- "title": "LoginSession",
3
- "type": "object",
4
- "properties": {
5
- "email": {
6
- "title": "Email",
7
- "type": "string"
8
- },
9
- "password": {
10
- "title": "Password (hash)",
11
- "type": "string"
12
- },
13
- "token": {
14
- "title": "Token",
15
- "type": "string",
16
- "mark_as_read_only": true
17
- }
18
- },
19
- "required": [
20
- "email",
21
- "password"
22
- ]
23
- }
@@ -1,11 +0,0 @@
1
- @property # type: ignore[misc]
2
- def display_name(self) -> str: # type: ignore[no-untyped-def]
3
- """
4
- Returns the display name of the user.
5
-
6
- This method returns the email of the user as their display name.
7
-
8
- Returns:
9
- str: The email of the user.
10
- """
11
- return self.email
@@ -1,62 +0,0 @@
1
- [
2
- {
3
- "external_id": "user_delete",
4
- "model": "User",
5
- "action": "delete"
6
- },
7
- {
8
- "external_id": "user_read",
9
- "model": "User",
10
- "action": "read"
11
- },
12
- {
13
- "external_id": "user_update",
14
- "model": "User",
15
- "action": "update"
16
- },
17
- {
18
- "external_id": "user_all_actions",
19
- "model": "User",
20
- "action": "*"
21
- },
22
- {
23
- "external_id": "all_models_all_actions",
24
- "model": "*",
25
- "action": "*"
26
- },
27
- {
28
- "external_id": "login_session_delete",
29
- "model": "LoginSession",
30
- "action": "delete"
31
- },
32
- {
33
- "external_id": "login_session_read",
34
- "model": "LoginSession",
35
- "action": "read"
36
- },
37
- {
38
- "external_id": "login_session_update",
39
- "model": "LoginSession",
40
- "action": "update"
41
- },
42
- {
43
- "external_id": "permission_delete",
44
- "model": "Permission",
45
- "action": "delete"
46
- },
47
- {
48
- "external_id": "permission_read",
49
- "model": "Permission",
50
- "action": "read"
51
- },
52
- {
53
- "external_id": "permission_update",
54
- "model": "Permission",
55
- "action": "update"
56
- },
57
- {
58
- "external_id": "permission_create",
59
- "model": "Permission",
60
- "action": "create"
61
- }
62
- ]
@@ -1,18 +0,0 @@
1
- {
2
- "title": "Permission",
3
- "type": "object",
4
- "properties": {
5
- "model": {
6
- "title": "Model",
7
- "type": "string"
8
- },
9
- "action": {
10
- "title": "Action",
11
- "type": "string"
12
- }
13
- },
14
- "required": [
15
- "model",
16
- "action"
17
- ]
18
- }
@@ -1,11 +0,0 @@
1
- @property # type: ignore[misc]
2
- def display_name(self) -> str: # type: ignore[no-untyped-def]
3
- """
4
- Returns the display name of the user.
5
-
6
- This method returns a formatted string combining the model and action of the user.
7
-
8
- Returns:
9
- str: The formatted display name in the format 'model:action'.
10
- """
11
- return f'{self.model}:{self.action}'
@@ -1,76 +0,0 @@
1
- from typing import Any
2
-
3
-
4
- def post_init(self, *, is_new_object: bool, kwargs: dict[str, Any]) -> None: # type: ignore[no-untyped-def]
5
- """
6
- Post-initializes a user object by validating email and password, and hashing the password.
7
-
8
- This method checks if the email and password are provided and valid. If the object is new,
9
- it hashes the password and sets the object ID to the lowercased email.
10
-
11
- Args:
12
- is_new_object (bool): Indicates if the object is new.
13
- kwargs (dict[str, Any]): The keyword arguments containing user details.
14
-
15
- Raises:
16
- UserCreationError: If the email or password is invalid.
17
- """
18
- import bcrypt
19
-
20
- from amsdal.contrib.auth.errors import UserCreationError
21
-
22
- email = kwargs.get('email', None)
23
- password = kwargs.get('password', None)
24
-
25
- if email is None or email == '':
26
- msg = "Email can't be empty"
27
- raise UserCreationError(msg)
28
-
29
- if password is None or password == '':
30
- msg = "Password can't be empty"
31
- raise UserCreationError(msg)
32
-
33
- kwargs['email'] = email.lower()
34
-
35
- if is_new_object and '_metadata' not in kwargs:
36
- hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
37
- self.password = hashed_password
38
- self._object_id = email.lower()
39
-
40
-
41
- def pre_update(self) -> None: # type: ignore[no-untyped-def]
42
- import bcrypt
43
-
44
- original_object = self.refetch_from_db()
45
-
46
- password = self.password
47
-
48
- if original_object.password and password is not None:
49
- if isinstance(password, str):
50
- password = password.encode('utf-8')
51
-
52
- try:
53
- if not bcrypt.checkpw(password, original_object.password):
54
- self.password = password
55
- except ValueError:
56
- hashed_password = bcrypt.hashpw(password, bcrypt.gensalt())
57
- self.password = hashed_password
58
-
59
-
60
- async def apre_update(self) -> None: # type: ignore[no-untyped-def]
61
- import bcrypt
62
-
63
- original_object = await self.arefetch_from_db()
64
-
65
- password = self.password
66
-
67
- if original_object.password and password is not None:
68
- if isinstance(password, str):
69
- password = password.encode('utf-8')
70
-
71
- try:
72
- if not bcrypt.checkpw(password, original_object.password):
73
- self.password = password
74
- except ValueError:
75
- hashed_password = bcrypt.hashpw(password, bcrypt.gensalt())
76
- self.password = hashed_password
@@ -1,8 +0,0 @@
1
- def pre_create(self) -> None: # type: ignore[no-untyped-def]
2
- """
3
- Pre-creates a user object.
4
-
5
- This method is a placeholder for any pre-creation logic that needs to be executed
6
- before a user object is created.
7
- """
8
- pass
@@ -1,25 +0,0 @@
1
- {
2
- "title": "User",
3
- "type": "object",
4
- "properties": {
5
- "email": {
6
- "title": "Email",
7
- "type": "string"
8
- },
9
- "password": {
10
- "title": "Password (hash)",
11
- "type": "binary"
12
- },
13
- "permissions": {
14
- "title": "Permissions",
15
- "type": "array",
16
- "items": {
17
- "type": "Permission"
18
- }
19
- }
20
- },
21
- "required": [
22
- "email",
23
- "password"
24
- ]
25
- }
@@ -1,19 +0,0 @@
1
- @property # type: ignore[misc]
2
- def display_name(self) -> str: # type: ignore[no-untyped-def]
3
- """
4
- Returns the display name of the user.
5
-
6
- This method returns the email of the user as their display name.
7
-
8
- Returns:
9
- str: The email of the user.
10
- """
11
- return self.email
12
-
13
-
14
- def __str__(self) -> str: # type: ignore[no-untyped-def] # noqa: N807
15
- return f'User(email={self.email})'
16
-
17
-
18
- def __repr__(self) -> str: # type: ignore[no-untyped-def] # noqa: N807
19
- return str(self)
@@ -1,11 +0,0 @@
1
- {
2
- "title": "FrontendActivatorConfig",
3
- "type": "FrontendConfigGroupValidator",
4
- "properties": {
5
- "value": {
6
- "title": "Value",
7
- "type": "anything"
8
- }
9
- },
10
- "meta_class": "TypeMeta"
11
- }
@@ -1,11 +0,0 @@
1
- {
2
- "title": "FrontendConfigAsyncValidator",
3
- "type": "FrontendConfigSkipNoneBase",
4
- "properties": {
5
- "endpoint": {
6
- "title": "Endpoint",
7
- "type": "string"
8
- }
9
- },
10
- "meta_class": "TypeMeta"
11
- }
@@ -1,52 +0,0 @@
1
- {
2
- "title": "FrontendConfigGroupValidator",
3
- "type": "FrontendConfigSkipNoneBase",
4
- "properties": {
5
- "mainControl": {
6
- "title": "Main Control",
7
- "type": "string"
8
- },
9
- "dependentControls": {
10
- "title": "Dependent Controls",
11
- "type": "array",
12
- "items": {
13
- "type": "string"
14
- }
15
- },
16
- "condition": {
17
- "title": "Condition",
18
- "type": "string",
19
- "options": [
20
- {
21
- "key": "Less Than",
22
- "value": "lt"
23
- },
24
- {
25
- "key": "Less Than or Equal",
26
- "value": "lte"
27
- },
28
- {
29
- "key": "Greater Than",
30
- "value": "gt"
31
- },
32
- {
33
- "key": "Greater Than or Equal",
34
- "value": "gte"
35
- },
36
- {
37
- "key": "Equal",
38
- "value": "eq"
39
- },
40
- {
41
- "key": "Not Equal",
42
- "value": "neq"
43
- },
44
- {
45
- "key": "Exist",
46
- "value": "exist"
47
- }
48
- ]
49
- }
50
- },
51
- "meta_class": "TypeMeta"
52
- }
@@ -1,15 +0,0 @@
1
- {
2
- "title": "FrontendConfigOption",
3
- "type": "FrontendConfigSkipNoneBase",
4
- "properties": {
5
- "label": {
6
- "title": "Label",
7
- "type": "string"
8
- },
9
- "value": {
10
- "title": "Value",
11
- "type": "string"
12
- }
13
- },
14
- "meta_class": "TypeMeta"
15
- }
@@ -1,6 +0,0 @@
1
- {
2
- "title": "FrontendConfigSkipNoneBase",
3
- "type": "object",
4
- "properties": {},
5
- "meta_class": "TypeMeta"
6
- }
@@ -1,13 +0,0 @@
1
- from typing import Any
2
-
3
-
4
- def model_dump(self, **kwargs: Any) -> dict[str, Any]: # type: ignore[no-untyped-def] # noqa: ARG001
5
- kwargs['exclude_none'] = True
6
-
7
- return super().model_dump(**kwargs) # type: ignore[misc]
8
-
9
-
10
- def model_dump_json(self, **kwargs: Any) -> str: # type: ignore[no-untyped-def] # noqa: ARG001
11
- kwargs['exclude_none'] = True
12
-
13
- return super().model_dump_json(**kwargs) # type: ignore[misc]
@@ -1,19 +0,0 @@
1
- {
2
- "title": "FrontendConfigSliderOption",
3
- "type": "FrontendConfigSkipNoneBase",
4
- "properties": {
5
- "min": {
6
- "title": "Minimum",
7
- "type": "number"
8
- },
9
- "max": {
10
- "title": "Maximum",
11
- "type": "number"
12
- },
13
- "range": {
14
- "title": "Range",
15
- "type": "boolean"
16
- }
17
- },
18
- "meta_class": "TypeMeta"
19
- }
@@ -1,26 +0,0 @@
1
- {
2
- "title": "FrontendConfigTextMask",
3
- "type": "FrontendConfigSkipNoneBase",
4
- "properties": {
5
- "mask_string": {
6
- "title": "Mask String",
7
- "type": "string"
8
- },
9
- "prefix": {
10
- "title": "Prefix",
11
- "type": "string"
12
- },
13
- "suffix": {
14
- "title": "Suffix",
15
- "type": "string"
16
- },
17
- "thousands_separator": {
18
- "title": "Thousands Separator",
19
- "type": "string"
20
- }
21
- },
22
- "required": [
23
- "mask_string"
24
- ],
25
- "meta_class": "TypeMeta"
26
- }
@@ -1,41 +0,0 @@
1
- {
2
- "title": "FrontendConfigValidator",
3
- "type": "FrontendConfigGroupValidator",
4
- "properties": {
5
- "function": {
6
- "title": "Function",
7
- "type": "string",
8
- "options": [
9
- {
10
- "key": "Minimum",
11
- "value": "min"
12
- },
13
- {
14
- "key": "Maximum",
15
- "value": "max"
16
- },
17
- {
18
- "key": "Minimum Length",
19
- "value": "minLength"
20
- },
21
- {
22
- "key": "Maximum Length",
23
- "value": "maxLength"
24
- },
25
- {
26
- "key": "Required",
27
- "value": "required"
28
- },
29
- {
30
- "key": "Pattern",
31
- "value": "pattern"
32
- }
33
- ]
34
- },
35
- "value": {
36
- "title": "Value",
37
- "type": "string"
38
- }
39
- },
40
- "meta_class": "TypeMeta"
41
- }