elody 0.0.215__tar.gz → 0.0.217__tar.gz
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.
- {elody-0.0.215 → elody-0.0.217}/PKG-INFO +1 -1
- {elody-0.0.215 → elody-0.0.217}/pyproject.toml +1 -1
- {elody-0.0.215 → elody-0.0.217}/src/elody/job.py +3 -40
- {elody-0.0.215 → elody-0.0.217}/src/elody/object_configurations/job_configuration.py +0 -14
- {elody-0.0.215 → elody-0.0.217}/src/elody/policies/authentication/base_user_tenant_validation_policy.py +34 -23
- {elody-0.0.215 → elody-0.0.217}/src/elody/policies/permission_handler.py +1 -1
- {elody-0.0.215 → elody-0.0.217}/src/elody.egg-info/PKG-INFO +1 -1
- {elody-0.0.215 → elody-0.0.217}/LICENSE +0 -0
- {elody-0.0.215 → elody-0.0.217}/README.md +0 -0
- {elody-0.0.215 → elody-0.0.217}/setup.cfg +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/__init__.py +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/elody/__init__.py +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/elody/client.py +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/elody/csv.py +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/elody/error_codes.py +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/elody/exceptions.py +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/elody/loader.py +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/elody/migration/__init__.py +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/elody/migration/base_object_migrator.py +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/elody/object_configurations/__init__.py +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/elody/object_configurations/base_object_configuration.py +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/elody/object_configurations/elody_configuration.py +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/elody/object_configurations/saved_search_configuration.py +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/elody/policies/__init__.py +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/elody/policies/authentication/__init__.py +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/elody/policies/authentication/multi_tenant_policy.py +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/elody/policies/authorization/__init__.py +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/elody/policies/authorization/filter_generic_objects_policy.py +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/elody/policies/authorization/filter_generic_objects_policy_v2.py +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/elody/policies/authorization/generic_object_detail_policy.py +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/elody/policies/authorization/generic_object_mediafiles_policy.py +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/elody/policies/authorization/generic_object_metadata_policy.py +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/elody/policies/authorization/generic_object_relations_policy.py +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/elody/policies/authorization/generic_object_request_policy.py +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/elody/policies/authorization/generic_object_request_policy_v2.py +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/elody/policies/authorization/mediafile_derivatives_policy.py +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/elody/policies/authorization/mediafile_download_policy.py +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/elody/policies/authorization/multi_tenant_policy.py +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/elody/policies/authorization/tenant_request_policy.py +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/elody/policies/helpers.py +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/elody/schemas.py +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/elody/util.py +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/elody/validator.py +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/elody.egg-info/SOURCES.txt +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/elody.egg-info/dependency_links.txt +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/elody.egg-info/requires.txt +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/elody.egg-info/top_level.txt +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/tests/__init_.py +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/tests/data.py +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/tests/unit/__init__.py +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/tests/unit/test_csv.py +0 -0
- {elody-0.0.215 → elody-0.0.217}/src/tests/unit/test_utils.py +0 -0
|
@@ -9,12 +9,11 @@ _post_crud_hook = _config.crud()["post_crud_hook"]
|
|
|
9
9
|
def add_document_to_job(
|
|
10
10
|
id,
|
|
11
11
|
id_of_document_job_was_initiated_for,
|
|
12
|
-
type_of_document_job_was_initiated_for,
|
|
13
12
|
*,
|
|
14
13
|
get_rabbit,
|
|
15
14
|
):
|
|
16
15
|
relations = []
|
|
17
|
-
if id_of_document_job_was_initiated_for
|
|
16
|
+
if id_of_document_job_was_initiated_for:
|
|
18
17
|
relations.append(
|
|
19
18
|
{"key": id_of_document_job_was_initiated_for, "type": "isJobFor"}
|
|
20
19
|
)
|
|
@@ -25,12 +24,6 @@ def add_document_to_job(
|
|
|
25
24
|
},
|
|
26
25
|
}
|
|
27
26
|
_post_crud_hook(crud="update", document=document, get_rabbit=get_rabbit)
|
|
28
|
-
__patch_document_job_was_initiated_for(
|
|
29
|
-
id,
|
|
30
|
-
id_of_document_job_was_initiated_for,
|
|
31
|
-
type_of_document_job_was_initiated_for,
|
|
32
|
-
get_rabbit,
|
|
33
|
-
)
|
|
34
27
|
|
|
35
28
|
|
|
36
29
|
def init_job(
|
|
@@ -42,14 +35,13 @@ def init_job(
|
|
|
42
35
|
user_email=None,
|
|
43
36
|
parent_id=None,
|
|
44
37
|
id_of_document_job_was_initiated_for=None,
|
|
45
|
-
type_of_document_job_was_initiated_for=None,
|
|
46
38
|
) -> str:
|
|
47
39
|
relations = []
|
|
48
40
|
if parent_id:
|
|
49
41
|
relations.append({"key": parent_id, "type": "hasParentJob"})
|
|
50
|
-
if id_of_document_job_was_initiated_for
|
|
42
|
+
if id_of_document_job_was_initiated_for:
|
|
51
43
|
relations.append(
|
|
52
|
-
{"key": id_of_document_job_was_initiated_for, "type": "
|
|
44
|
+
{"key": id_of_document_job_was_initiated_for, "type": "isJobFor"}
|
|
53
45
|
)
|
|
54
46
|
|
|
55
47
|
job = _create(
|
|
@@ -69,19 +61,12 @@ def init_job(
|
|
|
69
61
|
_post_crud_hook(
|
|
70
62
|
crud="create", document=job, parent_id=parent_id, get_rabbit=get_rabbit
|
|
71
63
|
)
|
|
72
|
-
__patch_document_job_was_initiated_for(
|
|
73
|
-
job["_id"],
|
|
74
|
-
id_of_document_job_was_initiated_for,
|
|
75
|
-
type_of_document_job_was_initiated_for,
|
|
76
|
-
get_rabbit,
|
|
77
|
-
)
|
|
78
64
|
return job["_id"]
|
|
79
65
|
|
|
80
66
|
|
|
81
67
|
def start_job(
|
|
82
68
|
id,
|
|
83
69
|
id_of_document_job_was_initiated_for=None,
|
|
84
|
-
type_of_document_job_was_initiated_for=None,
|
|
85
70
|
*,
|
|
86
71
|
get_rabbit,
|
|
87
72
|
):
|
|
@@ -94,18 +79,11 @@ def start_job(
|
|
|
94
79
|
},
|
|
95
80
|
}
|
|
96
81
|
_post_crud_hook(crud="update", document=document, get_rabbit=get_rabbit)
|
|
97
|
-
__patch_document_job_was_initiated_for(
|
|
98
|
-
id,
|
|
99
|
-
id_of_document_job_was_initiated_for,
|
|
100
|
-
type_of_document_job_was_initiated_for,
|
|
101
|
-
get_rabbit,
|
|
102
|
-
)
|
|
103
82
|
|
|
104
83
|
|
|
105
84
|
def finish_job(
|
|
106
85
|
id,
|
|
107
86
|
id_of_document_job_was_initiated_for=None,
|
|
108
|
-
type_of_document_job_was_initiated_for=None,
|
|
109
87
|
*,
|
|
110
88
|
get_rabbit,
|
|
111
89
|
):
|
|
@@ -117,12 +95,6 @@ def finish_job(
|
|
|
117
95
|
},
|
|
118
96
|
}
|
|
119
97
|
_post_crud_hook(crud="update", document=document, get_rabbit=get_rabbit)
|
|
120
|
-
__patch_document_job_was_initiated_for(
|
|
121
|
-
id,
|
|
122
|
-
id_of_document_job_was_initiated_for,
|
|
123
|
-
type_of_document_job_was_initiated_for,
|
|
124
|
-
get_rabbit,
|
|
125
|
-
)
|
|
126
98
|
|
|
127
99
|
|
|
128
100
|
def fail_job(id, exception_message, *, get_rabbit):
|
|
@@ -136,12 +108,3 @@ def fail_job(id, exception_message, *, get_rabbit):
|
|
|
136
108
|
},
|
|
137
109
|
}
|
|
138
110
|
_post_crud_hook(crud="update", document=document, get_rabbit=get_rabbit)
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
def __patch_document_job_was_initiated_for(job_id, document_id, type, get_rabbit):
|
|
142
|
-
if id and type:
|
|
143
|
-
document = {
|
|
144
|
-
"document_info_job_was_initiated_for": {"id": document_id, "type": type},
|
|
145
|
-
"patch": {"relations": [{"key": job_id, "type": "hasJob"}]},
|
|
146
|
-
}
|
|
147
|
-
_post_crud_hook(crud="update", document=document, get_rabbit=get_rabbit)
|
|
@@ -42,20 +42,6 @@ class JobConfiguration(ElodyConfiguration):
|
|
|
42
42
|
"dams.job_created",
|
|
43
43
|
document,
|
|
44
44
|
)
|
|
45
|
-
if parent_id := kwargs.get("parent_id"):
|
|
46
|
-
send_cloudevent(
|
|
47
|
-
get_rabbit(),
|
|
48
|
-
getenv("MQ_EXCHANGE", "dams"),
|
|
49
|
-
"dams.job_changed",
|
|
50
|
-
{
|
|
51
|
-
"id": parent_id,
|
|
52
|
-
"patch": {
|
|
53
|
-
"relations": [
|
|
54
|
-
{"key": document["_id"], "type": "isParentJobOf"}
|
|
55
|
-
]
|
|
56
|
-
},
|
|
57
|
-
},
|
|
58
|
-
)
|
|
59
45
|
elif crud == "update":
|
|
60
46
|
send_cloudevent(
|
|
61
47
|
get_rabbit(),
|
|
@@ -35,6 +35,10 @@ class BaseUserTenantValidationPolicy(ABC):
|
|
|
35
35
|
|
|
36
36
|
return self.user
|
|
37
37
|
|
|
38
|
+
@abstractmethod
|
|
39
|
+
def promote_role(self, user_context: UserContext):
|
|
40
|
+
pass
|
|
41
|
+
|
|
38
42
|
@abstractmethod
|
|
39
43
|
def build_user_context_for_anonymous_user(
|
|
40
44
|
self, request, user_context: UserContext
|
|
@@ -86,30 +90,37 @@ class BaseUserTenantValidationPolicy(ABC):
|
|
|
86
90
|
"""
|
|
87
91
|
|
|
88
92
|
roles = []
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
+
try:
|
|
94
|
+
for metadata in self.user.get("metadata", []):
|
|
95
|
+
if (
|
|
96
|
+
metadata["key"]
|
|
97
|
+
== user_context.bag["user_metadata_key_for_global_roles"]
|
|
98
|
+
):
|
|
99
|
+
roles.extend(metadata["value"])
|
|
100
|
+
|
|
101
|
+
if user_context.x_tenant.id:
|
|
102
|
+
tenant_ids = user_context.x_tenant.id.split(",")
|
|
103
|
+
for tenant_id in tenant_ids:
|
|
104
|
+
try:
|
|
105
|
+
user_tenant_relation = self.__get_user_tenant_relation(
|
|
106
|
+
tenant_id, user_context.bag["user_tenant_relation_type"]
|
|
107
|
+
)
|
|
108
|
+
except Forbidden as error:
|
|
109
|
+
user_tenant_relation = {}
|
|
110
|
+
if len(roles) == 0:
|
|
111
|
+
raise Forbidden(error.description)
|
|
112
|
+
roles.extend(user_tenant_relation.get("roles", []))
|
|
113
|
+
|
|
114
|
+
if len(roles) == 0 and not regex.match(
|
|
115
|
+
"(/[^/]+/v[0-9]+)?/tenants$", request.path
|
|
93
116
|
):
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
tenant_id, user_context.bag["user_tenant_relation_type"]
|
|
102
|
-
)
|
|
103
|
-
except Forbidden as error:
|
|
104
|
-
user_tenant_relation = {}
|
|
105
|
-
if len(roles) == 0:
|
|
106
|
-
raise Forbidden(error.description)
|
|
107
|
-
roles.extend(user_tenant_relation.get("roles", []))
|
|
108
|
-
|
|
109
|
-
if len(roles) == 0 and not regex.match(
|
|
110
|
-
"(/[^/]+/v[0-9]+)?/tenants$", request.path
|
|
111
|
-
):
|
|
112
|
-
raise Forbidden("User has no global roles, switch to a specific tenant.")
|
|
117
|
+
raise Forbidden(
|
|
118
|
+
"User has no global roles, switch to a specific tenant."
|
|
119
|
+
)
|
|
120
|
+
except Forbidden as exception:
|
|
121
|
+
if not (promoted_role := self.promote_role(user_context)):
|
|
122
|
+
raise exception
|
|
123
|
+
roles.append(promoted_role)
|
|
113
124
|
|
|
114
125
|
return list(set(roles))
|
|
115
126
|
|
|
@@ -222,7 +222,7 @@ def __is_allowed_to_crud_item_keys(
|
|
|
222
222
|
if key_to_check and key_to_check == restricted_key:
|
|
223
223
|
user_context.bag["restricted_keys"].append(restricted_key)
|
|
224
224
|
else:
|
|
225
|
-
if flat_request_body.get(restricted_key):
|
|
225
|
+
if flat_request_body.get(restricted_key) is not None:
|
|
226
226
|
user_context.bag["restricted_keys"].append(restricted_key)
|
|
227
227
|
|
|
228
228
|
user_context.bag["requested_item"] = item
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{elody-0.0.215 → elody-0.0.217}/src/elody/object_configurations/base_object_configuration.py
RENAMED
|
File without changes
|
|
File without changes
|
{elody-0.0.215 → elody-0.0.217}/src/elody/object_configurations/saved_search_configuration.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{elody-0.0.215 → elody-0.0.217}/src/elody/policies/authorization/filter_generic_objects_policy.py
RENAMED
|
File without changes
|
{elody-0.0.215 → elody-0.0.217}/src/elody/policies/authorization/filter_generic_objects_policy_v2.py
RENAMED
|
File without changes
|
{elody-0.0.215 → elody-0.0.217}/src/elody/policies/authorization/generic_object_detail_policy.py
RENAMED
|
File without changes
|
{elody-0.0.215 → elody-0.0.217}/src/elody/policies/authorization/generic_object_mediafiles_policy.py
RENAMED
|
File without changes
|
{elody-0.0.215 → elody-0.0.217}/src/elody/policies/authorization/generic_object_metadata_policy.py
RENAMED
|
File without changes
|
{elody-0.0.215 → elody-0.0.217}/src/elody/policies/authorization/generic_object_relations_policy.py
RENAMED
|
File without changes
|
{elody-0.0.215 → elody-0.0.217}/src/elody/policies/authorization/generic_object_request_policy.py
RENAMED
|
File without changes
|
{elody-0.0.215 → elody-0.0.217}/src/elody/policies/authorization/generic_object_request_policy_v2.py
RENAMED
|
File without changes
|
{elody-0.0.215 → elody-0.0.217}/src/elody/policies/authorization/mediafile_derivatives_policy.py
RENAMED
|
File without changes
|
{elody-0.0.215 → elody-0.0.217}/src/elody/policies/authorization/mediafile_download_policy.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|