pysodafair 0.1.62__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.
- pysoda/__init__.py +0 -0
- pysoda/constants.py +3 -0
- pysoda/core/__init__.py +10 -0
- pysoda/core/dataset_generation/__init__.py +11 -0
- pysoda/core/dataset_generation/manifestSession/__init__.py +1 -0
- pysoda/core/dataset_generation/manifestSession/manifest_session.py +146 -0
- pysoda/core/dataset_generation/upload.py +3951 -0
- pysoda/core/dataset_importing/__init__.py +1 -0
- pysoda/core/dataset_importing/import_dataset.py +662 -0
- pysoda/core/metadata/__init__.py +20 -0
- pysoda/core/metadata/code_description.py +109 -0
- pysoda/core/metadata/constants.py +32 -0
- pysoda/core/metadata/dataset_description.py +188 -0
- pysoda/core/metadata/excel_utils.py +41 -0
- pysoda/core/metadata/helpers.py +250 -0
- pysoda/core/metadata/manifest.py +112 -0
- pysoda/core/metadata/manifest_package/__init__.py +2 -0
- pysoda/core/metadata/manifest_package/manifest.py +0 -0
- pysoda/core/metadata/manifest_package/manifest_import.py +29 -0
- pysoda/core/metadata/manifest_package/manifest_writer.py +666 -0
- pysoda/core/metadata/performances.py +46 -0
- pysoda/core/metadata/resources.py +53 -0
- pysoda/core/metadata/samples.py +184 -0
- pysoda/core/metadata/sites.py +51 -0
- pysoda/core/metadata/subjects.py +172 -0
- pysoda/core/metadata/submission.py +91 -0
- pysoda/core/metadata/text_metadata.py +47 -0
- pysoda/core/metadata_templates/CHANGES +1 -0
- pysoda/core/metadata_templates/LICENSE +1 -0
- pysoda/core/metadata_templates/README.md +4 -0
- pysoda/core/metadata_templates/__init__.py +0 -0
- pysoda/core/metadata_templates/code_description.xlsx +0 -0
- pysoda/core/metadata_templates/code_parameters.xlsx +0 -0
- pysoda/core/metadata_templates/dataset_description.xlsx +0 -0
- pysoda/core/metadata_templates/manifest.xlsx +0 -0
- pysoda/core/metadata_templates/performances.xlsx +0 -0
- pysoda/core/metadata_templates/resources.xlsx +0 -0
- pysoda/core/metadata_templates/samples.xlsx +0 -0
- pysoda/core/metadata_templates/sites.xlsx +0 -0
- pysoda/core/metadata_templates/subjects.xlsx +0 -0
- pysoda/core/metadata_templates/subjects_pools_samples_structure.xlsx +0 -0
- pysoda/core/metadata_templates/subjects_pools_samples_structure_example.xlsx +0 -0
- pysoda/core/metadata_templates/submission.xlsx +0 -0
- pysoda/core/permissions/__init__.py +1 -0
- pysoda/core/permissions/permissions.py +31 -0
- pysoda/core/pysoda/__init__.py +2 -0
- pysoda/core/pysoda/soda.py +34 -0
- pysoda/core/pysoda/soda_object.py +55 -0
- pysoda/core/upload_manifests/__init__.py +1 -0
- pysoda/core/upload_manifests/upload_manifests.py +37 -0
- pysoda/schema/__init__.py +0 -0
- pysoda/schema/code_description.json +629 -0
- pysoda/schema/dataset_description.json +295 -0
- pysoda/schema/manifest.json +60 -0
- pysoda/schema/performances.json +44 -0
- pysoda/schema/resources.json +39 -0
- pysoda/schema/samples.json +97 -0
- pysoda/schema/sites.json +38 -0
- pysoda/schema/soda_schema.json +664 -0
- pysoda/schema/subjects.json +131 -0
- pysoda/schema/submission_schema.json +28 -0
- pysoda/utils/__init__.py +9 -0
- pysoda/utils/authentication.py +381 -0
- pysoda/utils/config.py +68 -0
- pysoda/utils/exceptions.py +156 -0
- pysoda/utils/logger.py +6 -0
- pysoda/utils/metadata_utils.py +74 -0
- pysoda/utils/pennsieveAgentUtils.py +11 -0
- pysoda/utils/pennsieveUtils.py +118 -0
- pysoda/utils/profile.py +28 -0
- pysoda/utils/schema_validation.py +133 -0
- pysoda/utils/time_utils.py +5 -0
- pysoda/utils/upload_utils.py +108 -0
- pysodafair-0.1.62.dist-info/METADATA +190 -0
- pysodafair-0.1.62.dist-info/RECORD +77 -0
- pysodafair-0.1.62.dist-info/WHEEL +4 -0
- pysodafair-0.1.62.dist-info/licenses/LICENSE +21 -0
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from .permissions import pennsieve_get_current_user_permissions, has_edit_permissions
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import requests
|
|
2
|
+
from ...constants import PENNSIEVE_URL
|
|
3
|
+
from ...utils import PennsieveActionNoPermission
|
|
4
|
+
|
|
5
|
+
def pennsieve_get_current_user_permissions(dataset_id, ps_or_token):
|
|
6
|
+
|
|
7
|
+
if type(ps_or_token) is str:
|
|
8
|
+
access_token = ps_or_token
|
|
9
|
+
else:
|
|
10
|
+
access_token = ps_or_token.get_user().session_token
|
|
11
|
+
|
|
12
|
+
r = requests.get(f"{PENNSIEVE_URL}/datasets/{dataset_id}/role", headers={"Authorization": f"Bearer {access_token}"})
|
|
13
|
+
r.raise_for_status()
|
|
14
|
+
|
|
15
|
+
return r.json()
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def has_edit_permissions(ps_or_token, selected_dataset_id):
|
|
19
|
+
"""
|
|
20
|
+
Checks if the current user has permission to edit the given dataset.
|
|
21
|
+
|
|
22
|
+
Input:
|
|
23
|
+
selected_dataset_id: Pennsieve dataset ID to check permissions for
|
|
24
|
+
ps: Pennsieve client object of a user that has been authenticated
|
|
25
|
+
"""
|
|
26
|
+
try:
|
|
27
|
+
role = pennsieve_get_current_user_permissions(selected_dataset_id, ps_or_token)["role"]
|
|
28
|
+
except Exception as e:
|
|
29
|
+
raise PennsieveActionNoPermission("edit on " + selected_dataset_id) from e
|
|
30
|
+
|
|
31
|
+
return role in ["owner", "manager", "editor"]
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
from soda_object import soda as soda_object
|
|
2
|
+
|
|
3
|
+
class Soda:
|
|
4
|
+
def __init__(self, standard=""):
|
|
5
|
+
self.soda_object = soda_object
|
|
6
|
+
self.soda_object["standard"] = standard
|
|
7
|
+
|
|
8
|
+
def set_standard(self, standard):
|
|
9
|
+
self.soda_object["standard"] = standard
|
|
10
|
+
|
|
11
|
+
def get_soda_object(self):
|
|
12
|
+
return self.soda_object
|
|
13
|
+
|
|
14
|
+
# Add more methods to alter the soda_object as needed
|
|
15
|
+
def update_metadata(self, key, value):
|
|
16
|
+
if key in self.soda_object["dataset-metadata"]:
|
|
17
|
+
self.soda_object["dataset-metadata"][key] = value
|
|
18
|
+
else:
|
|
19
|
+
raise KeyError(f"{key} not found in dataset-metadata")
|
|
20
|
+
|
|
21
|
+
def add_performance(self, performance):
|
|
22
|
+
self.soda_object["performances"].append(performance)
|
|
23
|
+
|
|
24
|
+
def add_subject_metadata(self, metadata):
|
|
25
|
+
self.soda_object["subject-metadata"].append(metadata)
|
|
26
|
+
|
|
27
|
+
def set_dataset_name(self, name):
|
|
28
|
+
self.soda_object["dataset-metadata"]["name"] = name
|
|
29
|
+
|
|
30
|
+
def get_dataset_name(self):
|
|
31
|
+
return self.soda_object["dataset-metadata"]["name"]
|
|
32
|
+
|
|
33
|
+
def get_submission(self):
|
|
34
|
+
return self.soda_object["dataset-metadata"]["submission-metadata"]
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
soda = {
|
|
2
|
+
"starting-point": {
|
|
3
|
+
|
|
4
|
+
},
|
|
5
|
+
"ps-dataset-selected": {
|
|
6
|
+
|
|
7
|
+
},
|
|
8
|
+
"ps-accoint-selected": {
|
|
9
|
+
|
|
10
|
+
},
|
|
11
|
+
"guided-manifest-file-data": {
|
|
12
|
+
"headers": [
|
|
13
|
+
"filename",
|
|
14
|
+
"timestamp",
|
|
15
|
+
"description",
|
|
16
|
+
"file type",
|
|
17
|
+
"entity",
|
|
18
|
+
"data modality",
|
|
19
|
+
"also in dataset",
|
|
20
|
+
"also in dataset path",
|
|
21
|
+
"data dictionary path",
|
|
22
|
+
"entity is transitive",
|
|
23
|
+
"Additional Metadata"
|
|
24
|
+
],
|
|
25
|
+
"data": []
|
|
26
|
+
},
|
|
27
|
+
"dataset-validated": False,
|
|
28
|
+
"dataset-validation-errors": {},
|
|
29
|
+
"dataset-structure": {
|
|
30
|
+
"folders": {
|
|
31
|
+
"data": {}
|
|
32
|
+
},
|
|
33
|
+
"files": {},
|
|
34
|
+
"relativePath": "/"
|
|
35
|
+
},
|
|
36
|
+
"dataset-metadata": {
|
|
37
|
+
"description-metadata": {},
|
|
38
|
+
"shared-metadata": {},
|
|
39
|
+
"protocol-data": {},
|
|
40
|
+
"subject-metadata": {},
|
|
41
|
+
"sample-metadata": {},
|
|
42
|
+
"submission-metadata": {},
|
|
43
|
+
"code-metadata": {},
|
|
44
|
+
"README.md": "",
|
|
45
|
+
"CHANGES": "",
|
|
46
|
+
"performances": {},
|
|
47
|
+
"sites": {},
|
|
48
|
+
"resources": {}
|
|
49
|
+
},
|
|
50
|
+
"digital-metadata": {},
|
|
51
|
+
"generate-dataset": {},
|
|
52
|
+
"dataset-entity-structure": {},
|
|
53
|
+
"dataset-entity-obj": {},
|
|
54
|
+
"standard": ""
|
|
55
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from .upload_manifests import get_upload_manifests, get_files_for_manifest
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import requests
|
|
2
|
+
from .. import logger
|
|
3
|
+
from ...constants import PENNSIEVE_2_URL
|
|
4
|
+
from ...utils import get_access_token, create_request_headers
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def get_files_for_manifest(manifest_id, limit, continuation_token=None):
|
|
10
|
+
"""
|
|
11
|
+
Get the number of verified files in an upload manifest. For a file to be verified its status must be
|
|
12
|
+
one of the following: VERIFIED | FAILED | FINALIZED.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
global logger
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
if continuation_token is None or continuation_token == "":
|
|
19
|
+
r = requests.get(f"{PENNSIEVE_2_URL}/manifest/files?manifest_id={manifest_id}&limit={limit}", headers=create_request_headers(get_access_token()))
|
|
20
|
+
else:
|
|
21
|
+
r = requests.get(f"{PENNSIEVE_2_URL}/manifest/files?manifest_id={manifest_id}&limit={limit}&continuation_token={continuation_token}", headers=create_request_headers(get_access_token()))
|
|
22
|
+
r.raise_for_status()
|
|
23
|
+
return r.json()
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def get_upload_manifests(dataset_id):
|
|
28
|
+
"""
|
|
29
|
+
Get the ids of all upload manifests that have been initiated by the Pennsieve Agent.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
global logger
|
|
33
|
+
|
|
34
|
+
r = requests.get(f"{PENNSIEVE_2_URL}/manifest?dataset_id={dataset_id}", headers=create_request_headers(get_access_token()))
|
|
35
|
+
r.raise_for_status()
|
|
36
|
+
|
|
37
|
+
return r.json()
|
|
File without changes
|