maleo-identity 0.0.77__py3-none-any.whl → 0.0.78__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.
Potentially problematic release.
This version of maleo-identity might be problematic. Click here for more details.
- maleo/identity/client/manager.py +154 -154
- maleo/identity/client/services/organization.py +1944 -1944
- maleo/identity/client/services/organization_registration_code.py +470 -470
- maleo/identity/client/services/organization_role.py +254 -254
- maleo/identity/client/services/user.py +1559 -1559
- maleo/identity/client/services/user_organization.py +254 -254
- maleo/identity/client/services/user_organization_role.py +256 -256
- maleo/identity/client/services/user_profile.py +254 -254
- maleo/identity/client/services/user_system_role.py +254 -254
- {maleo_identity-0.0.77.dist-info → maleo_identity-0.0.78.dist-info}/METADATA +3 -3
- {maleo_identity-0.0.77.dist-info → maleo_identity-0.0.78.dist-info}/RECORD +13 -13
- {maleo_identity-0.0.77.dist-info → maleo_identity-0.0.78.dist-info}/WHEEL +0 -0
- {maleo_identity-0.0.77.dist-info → maleo_identity-0.0.78.dist-info}/top_level.txt +0 -0
|
@@ -1,276 +1,276 @@
|
|
|
1
|
-
import json
|
|
2
|
-
from copy import deepcopy
|
|
3
|
-
from Crypto.PublicKey.RSA import RsaKey
|
|
4
|
-
from datetime import datetime, timezone
|
|
5
|
-
from redis.asyncio.client import Redis
|
|
6
|
-
from typing import Dict, List, Optional
|
|
7
|
-
from uuid import UUID
|
|
8
|
-
from maleo.soma.authorization import BearerAuth
|
|
9
|
-
from maleo.soma.dtos.configurations.cache.redis import RedisCacheNamespaces
|
|
10
|
-
from maleo.soma.enums.environment import Environment
|
|
11
|
-
from maleo.soma.enums.expiration import Expiration
|
|
12
|
-
from maleo.soma.enums.logging import LogLevel
|
|
13
|
-
from maleo.soma.enums.operation import OperationTarget
|
|
14
|
-
from maleo.soma.managers.client.maleo import MaleoClientService
|
|
15
|
-
from maleo.soma.managers.client.http import HTTPClientManager
|
|
16
|
-
from maleo.soma.managers.credential import CredentialManager
|
|
17
|
-
from maleo.soma.schemas.authentication import Authentication
|
|
18
|
-
from maleo.soma.schemas.authorization import Authorization
|
|
19
|
-
from maleo.soma.schemas.data import DataPair
|
|
20
|
-
from maleo.soma.schemas.operation.context import (
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
)
|
|
26
|
-
from maleo.soma.schemas.operation.resource import (
|
|
27
|
-
|
|
28
|
-
)
|
|
29
|
-
from maleo.soma.schemas.operation.resource.action import ReadResourceOperationAction
|
|
30
|
-
from maleo.soma.schemas.operation.resource.result import (
|
|
31
|
-
|
|
32
|
-
)
|
|
33
|
-
from maleo.soma.schemas.operation.timestamp import OperationTimestamp
|
|
34
|
-
from maleo.soma.schemas.pagination import StrictPagination
|
|
35
|
-
from maleo.soma.schemas.request import RequestContext
|
|
36
|
-
from maleo.soma.schemas.response import (
|
|
37
|
-
|
|
38
|
-
)
|
|
39
|
-
from maleo.soma.schemas.service import ServiceContext
|
|
40
|
-
from maleo.soma.utils.cache import build_key
|
|
41
|
-
from maleo.soma.utils.logging import ClientLogger
|
|
42
|
-
from maleo.soma.utils.merger import merge_dicts
|
|
43
|
-
from maleo.soma.utils.token import reencode
|
|
44
|
-
from maleo.identity.constants.user_organization import RESOURCE
|
|
45
|
-
from maleo.identity.schemas.data.user_organization import UserOrganizationDataSchema
|
|
46
|
-
from maleo.identity.schemas.parameter.client.user_organization import (
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
)
|
|
1
|
+
# import json
|
|
2
|
+
# from copy import deepcopy
|
|
3
|
+
# from Crypto.PublicKey.RSA import RsaKey
|
|
4
|
+
# from datetime import datetime, timezone
|
|
5
|
+
# from redis.asyncio.client import Redis
|
|
6
|
+
# from typing import Dict, List, Optional
|
|
7
|
+
# from uuid import UUID
|
|
8
|
+
# from maleo.soma.authorization import BearerAuth
|
|
9
|
+
# from maleo.soma.dtos.configurations.cache.redis import RedisCacheNamespaces
|
|
10
|
+
# from maleo.soma.enums.environment import Environment
|
|
11
|
+
# from maleo.soma.enums.expiration import Expiration
|
|
12
|
+
# from maleo.soma.enums.logging import LogLevel
|
|
13
|
+
# from maleo.soma.enums.operation import OperationTarget
|
|
14
|
+
# from maleo.soma.managers.client.maleo import MaleoClientService
|
|
15
|
+
# from maleo.soma.managers.client.http import HTTPClientManager
|
|
16
|
+
# from maleo.soma.managers.credential import CredentialManager
|
|
17
|
+
# from maleo.soma.schemas.authentication import Authentication
|
|
18
|
+
# from maleo.soma.schemas.authorization import Authorization
|
|
19
|
+
# from maleo.soma.schemas.data import DataPair
|
|
20
|
+
# from maleo.soma.schemas.operation.context import (
|
|
21
|
+
# OperationContextSchema,
|
|
22
|
+
# OperationOriginSchema,
|
|
23
|
+
# OperationLayerSchema,
|
|
24
|
+
# OperationTargetSchema,
|
|
25
|
+
# )
|
|
26
|
+
# from maleo.soma.schemas.operation.resource import (
|
|
27
|
+
# ReadMultipleResourceOperationSchema,
|
|
28
|
+
# )
|
|
29
|
+
# from maleo.soma.schemas.operation.resource.action import ReadResourceOperationAction
|
|
30
|
+
# from maleo.soma.schemas.operation.resource.result import (
|
|
31
|
+
# ReadMultipleResourceOperationResult,
|
|
32
|
+
# )
|
|
33
|
+
# from maleo.soma.schemas.operation.timestamp import OperationTimestamp
|
|
34
|
+
# from maleo.soma.schemas.pagination import StrictPagination
|
|
35
|
+
# from maleo.soma.schemas.request import RequestContext
|
|
36
|
+
# from maleo.soma.schemas.response import (
|
|
37
|
+
# MultipleDataResponseSchema,
|
|
38
|
+
# )
|
|
39
|
+
# from maleo.soma.schemas.service import ServiceContext
|
|
40
|
+
# from maleo.soma.utils.cache import build_key
|
|
41
|
+
# from maleo.soma.utils.logging import ClientLogger
|
|
42
|
+
# from maleo.soma.utils.merger import merge_dicts
|
|
43
|
+
# from maleo.soma.utils.token import reencode
|
|
44
|
+
# from maleo.identity.constants.user_organization import RESOURCE
|
|
45
|
+
# from maleo.identity.schemas.data.user_organization import UserOrganizationDataSchema
|
|
46
|
+
# from maleo.identity.schemas.parameter.client.user_organization import (
|
|
47
|
+
# ReadMultipleParameter,
|
|
48
|
+
# ReadMultipleQueryParameter,
|
|
49
|
+
# )
|
|
50
50
|
|
|
51
51
|
|
|
52
|
-
class UserOrganizationClientService(MaleoClientService):
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
52
|
+
# class UserOrganizationClientService(MaleoClientService):
|
|
53
|
+
# def __init__(
|
|
54
|
+
# self,
|
|
55
|
+
# environment: Environment,
|
|
56
|
+
# key: str,
|
|
57
|
+
# url: str,
|
|
58
|
+
# operation_origin: OperationOriginSchema,
|
|
59
|
+
# logger: ClientLogger,
|
|
60
|
+
# credential_manager: CredentialManager,
|
|
61
|
+
# http_client_manager: HTTPClientManager,
|
|
62
|
+
# private_key: RsaKey,
|
|
63
|
+
# redis: Redis,
|
|
64
|
+
# redis_namespaces: RedisCacheNamespaces,
|
|
65
|
+
# service_context: ServiceContext,
|
|
66
|
+
# ):
|
|
67
|
+
# super().__init__(
|
|
68
|
+
# environment,
|
|
69
|
+
# key,
|
|
70
|
+
# url,
|
|
71
|
+
# operation_origin,
|
|
72
|
+
# logger,
|
|
73
|
+
# credential_manager,
|
|
74
|
+
# http_client_manager,
|
|
75
|
+
# private_key,
|
|
76
|
+
# redis,
|
|
77
|
+
# redis_namespaces,
|
|
78
|
+
# service_context,
|
|
79
|
+
# )
|
|
80
|
+
# # self._controllers = controllers
|
|
81
|
+
# self._namespace = self._redis_namespaces.create(
|
|
82
|
+
# self._key,
|
|
83
|
+
# RESOURCE.aggregate(),
|
|
84
|
+
# origin=self._CACHE_ORIGIN,
|
|
85
|
+
# layer=self._CACHE_LAYER,
|
|
86
|
+
# )
|
|
87
|
+
# self._default_operation_context = OperationContextSchema(
|
|
88
|
+
# origin=self._operation_origin,
|
|
89
|
+
# layer=OperationLayerSchema(type=self._OPERATION_LAYER_TYPE, details=None),
|
|
90
|
+
# target=OperationTargetSchema(
|
|
91
|
+
# type=self._OPERATION_TARGET_TYPE, details=None
|
|
92
|
+
# ),
|
|
93
|
+
# )
|
|
94
94
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
95
|
+
# async def read_user_organizations(
|
|
96
|
+
# self,
|
|
97
|
+
# operation_id: UUID,
|
|
98
|
+
# request_context: RequestContext,
|
|
99
|
+
# authentication: Authentication,
|
|
100
|
+
# parameters: ReadMultipleParameter,
|
|
101
|
+
# authorization: Optional[Authorization] = None,
|
|
102
|
+
# headers: Optional[Dict[str, str]] = None,
|
|
103
|
+
# ) -> ReadMultipleResourceOperationResult[
|
|
104
|
+
# UserOrganizationDataSchema, StrictPagination, None
|
|
105
|
+
# ]:
|
|
106
|
+
# """Retrieve user organizations from MaleoIdentity"""
|
|
107
|
+
# operation_action = ReadResourceOperationAction()
|
|
108
|
+
# executed_at = datetime.now(tz=timezone.utc)
|
|
109
109
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
110
|
+
# # Get function identifier
|
|
111
|
+
# func = self.__class__
|
|
112
|
+
# module, qualname = func.__module__, func.__qualname__
|
|
113
113
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
114
|
+
# # Define arguments being used in this function
|
|
115
|
+
# positional_arguments = []
|
|
116
|
+
# keyword_arguments = {
|
|
117
|
+
# "authentication": authentication.model_dump(
|
|
118
|
+
# mode="json",
|
|
119
|
+
# exclude={
|
|
120
|
+
# "credentials": {
|
|
121
|
+
# "token": {
|
|
122
|
+
# "payload": {
|
|
123
|
+
# "iat_dt",
|
|
124
|
+
# "iat",
|
|
125
|
+
# "exp_dt",
|
|
126
|
+
# "exp",
|
|
127
|
+
# }
|
|
128
|
+
# }
|
|
129
|
+
# }
|
|
130
|
+
# },
|
|
131
|
+
# ),
|
|
132
|
+
# "parameters": parameters.model_dump(mode="json"),
|
|
133
|
+
# }
|
|
134
134
|
|
|
135
|
-
|
|
136
|
-
|
|
135
|
+
# # Define full function string
|
|
136
|
+
# function = f"{qualname}({json.dumps(positional_arguments)}|{json.dumps(keyword_arguments)})"
|
|
137
137
|
|
|
138
|
-
|
|
139
|
-
|
|
138
|
+
# # Define full cache key
|
|
139
|
+
# cache_key = build_key(module, function, namespace=self._namespace)
|
|
140
140
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
141
|
+
# if parameters.use_cache:
|
|
142
|
+
# operation_context = deepcopy(self._default_operation_context)
|
|
143
|
+
# operation_context.target.type = OperationTarget.CACHE
|
|
144
144
|
|
|
145
|
-
|
|
146
|
-
|
|
145
|
+
# # Check redis for data
|
|
146
|
+
# result_str = await self._redis.get(cache_key)
|
|
147
147
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
148
|
+
# if result_str is not None:
|
|
149
|
+
# completed_at = datetime.now(tz=timezone.utc)
|
|
150
|
+
# result = ReadMultipleResourceOperationResult[
|
|
151
|
+
# UserOrganizationDataSchema, StrictPagination, None
|
|
152
|
+
# ].model_validate(json.loads(result_str))
|
|
153
|
+
# ReadMultipleResourceOperationSchema[
|
|
154
|
+
# UserOrganizationDataSchema, StrictPagination, None
|
|
155
|
+
# ](
|
|
156
|
+
# service_context=self._service_context,
|
|
157
|
+
# id=operation_id,
|
|
158
|
+
# context=operation_context,
|
|
159
|
+
# timestamp=OperationTimestamp(
|
|
160
|
+
# executed_at=executed_at,
|
|
161
|
+
# completed_at=completed_at,
|
|
162
|
+
# duration=(completed_at - executed_at).total_seconds(),
|
|
163
|
+
# ),
|
|
164
|
+
# summary="Successfully retrieved multiple user organizations from cache",
|
|
165
|
+
# request_context=request_context,
|
|
166
|
+
# authentication=authentication,
|
|
167
|
+
# action=operation_action,
|
|
168
|
+
# resource=RESOURCE,
|
|
169
|
+
# result=result,
|
|
170
|
+
# ).log(
|
|
171
|
+
# self._logger, level=LogLevel.INFO
|
|
172
|
+
# )
|
|
173
|
+
# return result
|
|
174
174
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
175
|
+
# operation_context = deepcopy(self._default_operation_context)
|
|
176
|
+
# async with self._http_client_manager.get() as http_client:
|
|
177
|
+
# url = f"{self._url}/v1/{RESOURCE.identifiers[0].url_slug}/"
|
|
178
178
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
179
|
+
# # Parse parameters to query params
|
|
180
|
+
# params = ReadMultipleQueryParameter.model_validate(
|
|
181
|
+
# parameters.model_dump()
|
|
182
|
+
# ).model_dump(exclude={"sort_columns", "date_filters"}, exclude_none=True)
|
|
183
183
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
184
|
+
# # Create headers
|
|
185
|
+
# base_headers = {
|
|
186
|
+
# "Content-Type": "application/json",
|
|
187
|
+
# "X-Operation_Id": str(operation_id),
|
|
188
|
+
# }
|
|
189
|
+
# if headers is not None:
|
|
190
|
+
# headers = merge_dicts(base_headers, headers)
|
|
191
|
+
# else:
|
|
192
|
+
# headers = base_headers
|
|
193
193
|
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
194
|
+
# # Create auth
|
|
195
|
+
# token = None
|
|
196
|
+
# if authentication.credentials.token is not None:
|
|
197
|
+
# try:
|
|
198
|
+
# token = reencode(
|
|
199
|
+
# payload=authentication.credentials.token.payload,
|
|
200
|
+
# key=self._private_key,
|
|
201
|
+
# )
|
|
202
|
+
# except Exception:
|
|
203
|
+
# pass
|
|
204
204
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
205
|
+
# if (
|
|
206
|
+
# token is None
|
|
207
|
+
# and authorization is not None
|
|
208
|
+
# and authorization.scheme == "Bearer"
|
|
209
|
+
# ):
|
|
210
|
+
# token = authorization.credentials
|
|
211
211
|
|
|
212
|
-
|
|
213
|
-
|
|
212
|
+
# if token is None:
|
|
213
|
+
# token = self._credential_manager.token
|
|
214
214
|
|
|
215
|
-
|
|
215
|
+
# auth = BearerAuth(token) if token is not None else None
|
|
216
216
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
217
|
+
# # Send request and wait for response
|
|
218
|
+
# response = await http_client.get(
|
|
219
|
+
# url=url, params=params, headers=headers, auth=auth
|
|
220
|
+
# )
|
|
221
221
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
222
|
+
# if response.is_success:
|
|
223
|
+
# completed_at = datetime.now(tz=timezone.utc)
|
|
224
|
+
# validated_response = MultipleDataResponseSchema[
|
|
225
|
+
# UserOrganizationDataSchema, StrictPagination, None
|
|
226
|
+
# ].model_validate(response.json())
|
|
227
|
+
# data = DataPair[List[UserOrganizationDataSchema], None](
|
|
228
|
+
# old=validated_response.data,
|
|
229
|
+
# new=None,
|
|
230
|
+
# )
|
|
231
|
+
# result = ReadMultipleResourceOperationResult[
|
|
232
|
+
# UserOrganizationDataSchema, StrictPagination, None
|
|
233
|
+
# ](
|
|
234
|
+
# data=data,
|
|
235
|
+
# pagination=validated_response.pagination,
|
|
236
|
+
# metadata=None,
|
|
237
|
+
# other=None,
|
|
238
|
+
# )
|
|
239
|
+
# ReadMultipleResourceOperationSchema[
|
|
240
|
+
# UserOrganizationDataSchema, StrictPagination, None
|
|
241
|
+
# ](
|
|
242
|
+
# service_context=self._service_context,
|
|
243
|
+
# id=operation_id,
|
|
244
|
+
# context=operation_context,
|
|
245
|
+
# timestamp=OperationTimestamp(
|
|
246
|
+
# executed_at=executed_at,
|
|
247
|
+
# completed_at=completed_at,
|
|
248
|
+
# duration=(completed_at - executed_at).total_seconds(),
|
|
249
|
+
# ),
|
|
250
|
+
# summary="Successfully retrieved multiple user organizations from http request",
|
|
251
|
+
# request_context=request_context,
|
|
252
|
+
# authentication=authentication,
|
|
253
|
+
# action=operation_action,
|
|
254
|
+
# resource=RESOURCE,
|
|
255
|
+
# result=result,
|
|
256
|
+
# ).log(
|
|
257
|
+
# self._logger, level=LogLevel.INFO
|
|
258
|
+
# )
|
|
259
259
|
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
260
|
+
# if parameters.use_cache:
|
|
261
|
+
# await self._redis.set(
|
|
262
|
+
# cache_key, result.model_dump_json(), Expiration.EXP_1WK
|
|
263
|
+
# )
|
|
264
264
|
|
|
265
|
-
|
|
265
|
+
# return result
|
|
266
266
|
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
267
|
+
# self._raise_resource_http_request_error(
|
|
268
|
+
# response=response,
|
|
269
|
+
# operation_id=operation_id,
|
|
270
|
+
# operation_context=operation_context,
|
|
271
|
+
# executed_at=executed_at,
|
|
272
|
+
# operation_action=operation_action,
|
|
273
|
+
# request_context=request_context,
|
|
274
|
+
# authentication=authentication,
|
|
275
|
+
# resource=RESOURCE,
|
|
276
|
+
# )
|