nci-cidc-api-modules 1.1.10__tar.gz → 1.1.11__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.
- {nci_cidc_api_modules-1.1.10/nci_cidc_api_modules.egg-info → nci_cidc_api_modules-1.1.11}/PKG-INFO +1 -1
- {nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11}/cidc_api/models/models.py +50 -11
- {nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11/nci_cidc_api_modules.egg-info}/PKG-INFO +1 -1
- {nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11}/LICENSE +0 -0
- {nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11}/MANIFEST.in +0 -0
- {nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11}/README.md +0 -0
- {nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11}/cidc_api/config/__init__.py +0 -0
- {nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11}/cidc_api/config/db.py +0 -0
- {nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11}/cidc_api/config/logging.py +0 -0
- {nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11}/cidc_api/config/secrets.py +0 -0
- {nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11}/cidc_api/config/settings.py +0 -0
- {nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11}/cidc_api/csms/__init__.py +0 -0
- {nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11}/cidc_api/csms/auth.py +0 -0
- {nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11}/cidc_api/models/__init__.py +0 -0
- {nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11}/cidc_api/models/csms_api.py +0 -0
- {nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11}/cidc_api/models/files/__init__.py +0 -0
- {nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11}/cidc_api/models/files/details.py +0 -0
- {nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11}/cidc_api/models/files/facets.py +0 -0
- {nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11}/cidc_api/models/migrations.py +0 -0
- {nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11}/cidc_api/models/schemas.py +0 -0
- {nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11}/cidc_api/shared/__init__.py +0 -0
- {nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11}/cidc_api/shared/auth.py +0 -0
- {nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11}/cidc_api/shared/emails.py +0 -0
- {nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11}/cidc_api/shared/gcloud_client.py +0 -0
- {nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11}/cidc_api/shared/jose.py +0 -0
- {nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11}/cidc_api/shared/rest_utils.py +0 -0
- {nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11}/nci_cidc_api_modules.egg-info/SOURCES.txt +0 -0
- {nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11}/nci_cidc_api_modules.egg-info/dependency_links.txt +0 -0
- {nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11}/nci_cidc_api_modules.egg-info/not-zip-safe +0 -0
- {nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11}/nci_cidc_api_modules.egg-info/requires.txt +0 -0
- {nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11}/nci_cidc_api_modules.egg-info/top_level.txt +0 -0
- {nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11}/pyproject.toml +0 -0
- {nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11}/requirements.modules.txt +0 -0
- {nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11}/setup.cfg +0 -0
- {nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11}/setup.py +0 -0
- {nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11}/tests/test_api.py +0 -0
@@ -24,9 +24,9 @@ __all__ = [
|
|
24
24
|
"with_default_session",
|
25
25
|
]
|
26
26
|
|
27
|
-
import re
|
28
27
|
import hashlib
|
29
28
|
import os
|
29
|
+
import re
|
30
30
|
from collections import defaultdict
|
31
31
|
from datetime import datetime, timedelta
|
32
32
|
from enum import Enum as EnumBaseClass
|
@@ -46,8 +46,10 @@ from typing import (
|
|
46
46
|
)
|
47
47
|
|
48
48
|
import pandas as pd
|
49
|
+
from cidc_schemas import prism, unprism, json_validation
|
49
50
|
from flask import current_app as app
|
50
51
|
from google.cloud.storage import Blob
|
52
|
+
from jsonschema.exceptions import ValidationError
|
51
53
|
from sqlalchemy import (
|
52
54
|
and_,
|
53
55
|
Column,
|
@@ -76,11 +78,15 @@ from sqlalchemy import (
|
|
76
78
|
Table,
|
77
79
|
MetaData,
|
78
80
|
)
|
81
|
+
from sqlalchemy.dialects.postgresql import JSONB, UUID
|
82
|
+
from sqlalchemy.engine import ResultProxy
|
83
|
+
from sqlalchemy.exc import IntegrityError
|
84
|
+
from sqlalchemy.ext.hybrid import hybrid_property
|
79
85
|
from sqlalchemy.orm import relationship, validates
|
80
86
|
from sqlalchemy.orm.attributes import flag_modified
|
81
87
|
from sqlalchemy.orm.exc import NoResultFound
|
82
|
-
from sqlalchemy.orm.session import Session
|
83
88
|
from sqlalchemy.orm.query import Query
|
89
|
+
from sqlalchemy.orm.session import Session
|
84
90
|
from sqlalchemy.sql import (
|
85
91
|
# This is unfortunate but other code in this file relies on sqlalchemy.and_, or_, etc
|
86
92
|
# instead of the sqlalchemy.sql versions we are importing here. The solution is to
|
@@ -91,12 +97,7 @@ from sqlalchemy.sql import (
|
|
91
97
|
text,
|
92
98
|
)
|
93
99
|
from sqlalchemy.sql.functions import coalesce
|
94
|
-
from
|
95
|
-
from sqlalchemy.ext.hybrid import hybrid_property
|
96
|
-
from sqlalchemy.dialects.postgresql import JSONB, UUID
|
97
|
-
from sqlalchemy.engine import ResultProxy
|
98
|
-
|
99
|
-
from cidc_schemas import prism, unprism, json_validation
|
100
|
+
from werkzeug.exceptions import BadRequest
|
100
101
|
|
101
102
|
from .files import (
|
102
103
|
build_trial_facets,
|
@@ -107,8 +108,8 @@ from .files import (
|
|
107
108
|
FilePurpose,
|
108
109
|
FACET_NAME_DELIM,
|
109
110
|
)
|
110
|
-
|
111
111
|
from ..config.db import BaseModel
|
112
|
+
from ..config.logging import get_logger
|
112
113
|
from ..config.settings import (
|
113
114
|
PAGINATION_PAGE_SIZE,
|
114
115
|
MAX_PAGINATION_PAGE_SIZE,
|
@@ -121,13 +122,13 @@ from ..shared.gcloud_client import (
|
|
121
122
|
grant_lister_access,
|
122
123
|
grant_download_access,
|
123
124
|
publish_artifact_upload,
|
125
|
+
publish_patient_sample_update,
|
124
126
|
refresh_intake_access,
|
125
127
|
revoke_download_access,
|
126
128
|
revoke_intake_access,
|
127
129
|
revoke_lister_access,
|
128
130
|
revoke_bigquery_access,
|
129
131
|
)
|
130
|
-
from ..config.logging import get_logger
|
131
132
|
|
132
133
|
os.environ["TZ"] = "UTC"
|
133
134
|
logger = get_logger(__name__)
|
@@ -2184,7 +2185,7 @@ class UploadJobs(CommonColumns):
|
|
2184
2185
|
job.insert(session=session, commit=commit)
|
2185
2186
|
|
2186
2187
|
if send_email:
|
2187
|
-
trial = TrialMetadata.find_by_trial_id(trial_id)
|
2188
|
+
trial = TrialMetadata.find_by_trial_id(trial_id, session=session)
|
2188
2189
|
job.alert_upload_success(trial)
|
2189
2190
|
|
2190
2191
|
return job
|
@@ -3295,3 +3296,41 @@ def result_proxy_to_models(
|
|
3295
3296
|
) -> List[BaseModel]:
|
3296
3297
|
"""Materialize a sqlalchemy `result_proxy` iterable as a list of `model` instances"""
|
3297
3298
|
return [model(**dict(row_proxy)) for row_proxy in result_proxy.all()]
|
3299
|
+
|
3300
|
+
|
3301
|
+
@with_default_session
|
3302
|
+
def upload_manifest_json(
|
3303
|
+
uploader_email: str,
|
3304
|
+
trial_id: str,
|
3305
|
+
template_type: str,
|
3306
|
+
md_patch: dict,
|
3307
|
+
session: Session,
|
3308
|
+
):
|
3309
|
+
"""
|
3310
|
+
Ingest manifest data from JSON.
|
3311
|
+
|
3312
|
+
* Tries to load existing trial metadata blob (if fails, merge request fails; nothing saved).
|
3313
|
+
* Merges the request JSON into the trial metadata (if fails, merge request fails; nothing saved).
|
3314
|
+
* The merge request JSON is saved to `UploadJobs`.
|
3315
|
+
* The updated trial metadata object is updated in the `TrialMetadata` table.
|
3316
|
+
"""
|
3317
|
+
try:
|
3318
|
+
TrialMetadata.patch_manifest(trial_id, md_patch, session=session, commit=False)
|
3319
|
+
except ValidationError as e:
|
3320
|
+
raise BadRequest(json_validation.format_validation_error(e)) from e
|
3321
|
+
except ValidationMultiError as e:
|
3322
|
+
raise BadRequest({"errors": e.args[0]}) from e
|
3323
|
+
|
3324
|
+
manifest_upload = UploadJobs.create(
|
3325
|
+
upload_type=template_type,
|
3326
|
+
uploader_email=uploader_email,
|
3327
|
+
metadata=md_patch,
|
3328
|
+
gcs_xlsx_uri="", # not saving xlsx so we won't have phi-ish stuff in it
|
3329
|
+
gcs_file_map=None,
|
3330
|
+
session=session,
|
3331
|
+
send_email=True,
|
3332
|
+
status=UploadJobStatus.MERGE_COMPLETED.value,
|
3333
|
+
)
|
3334
|
+
# Publish that a manifest upload has been received
|
3335
|
+
publish_patient_sample_update(manifest_upload.id)
|
3336
|
+
return manifest_upload.id
|
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
|
{nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11}/cidc_api/models/files/__init__.py
RENAMED
File without changes
|
{nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11}/cidc_api/models/files/details.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{nci_cidc_api_modules-1.1.10 → nci_cidc_api_modules-1.1.11}/cidc_api/shared/gcloud_client.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
|