nci-cidc-api-modules 1.2.33__tar.gz → 1.2.35__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.2.33/nci_cidc_api_modules.egg-info → nci_cidc_api_modules-1.2.35}/PKG-INFO +5 -4
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/models.py +127 -7
- nci_cidc_api_modules-1.2.35/cidc_api/shared/assay_handling.py +68 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/shared/gcloud_client.py +23 -3
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35/nci_cidc_api_modules.egg-info}/PKG-INFO +5 -4
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/nci_cidc_api_modules.egg-info/SOURCES.txt +1 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/nci_cidc_api_modules.egg-info/requires.txt +4 -3
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/requirements.modules.txt +5 -4
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/LICENSE +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/MANIFEST.in +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/README.md +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/config/__init__.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/config/db.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/config/logging.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/config/secrets.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/config/settings.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/__init__.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/data.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/base_orm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/__init__.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/additional_treatment_orm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/administrative_person_orm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/administrative_role_assignment_orm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/adverse_event_orm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/arm_orm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/baseline_clinical_assessment_orm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/cohort_orm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/comorbidity_orm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/consent_group_orm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/contact_orm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/demographic_orm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/disease_orm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/exposure_orm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/file_orm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/gvhd_diagnosis_acute_orm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/gvhd_diagnosis_chronic_orm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/gvhd_organ_acute_orm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/gvhd_organ_chronic_orm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/institution_orm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/medical_history_orm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/other_clinical_endpoint_orm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/other_malignancy_orm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/participant_orm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/prior_treatment_orm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/publication_orm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/radiotherapy_dose_orm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/response_by_system_orm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/response_orm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/shipment_orm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/shipment_specimen_orm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/specimen_orm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/stem_cell_transplant_orm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/surgery_orm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/therapy_agent_dose_orm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/treatment_orm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/trial_orm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/files/__init__.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/files/details.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/files/facets.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/migrations.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/__init__.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/additional_treatment.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/administrative_person.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/administrative_role_assignment.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/adverse_event.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/arm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/base.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/baseline_clinical_assessment.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/cohort.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/comorbidity.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/consent_group.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/contact.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/demographic.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/disease.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/exposure.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/file.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/gvhd_diagnosis_acute.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/gvhd_diagnosis_chronic.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/gvhd_organ_acute.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/gvhd_organ_chronic.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/institution.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/medical_history.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/other_clinical_endpoint.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/other_malignancy.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/participant.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/prior_treatment.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/publication.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/radiotherapy_dose.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/response.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/response_by_system.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/shipment.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/shipment_specimen.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/specimen.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/stem_cell_transplant.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/surgery.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/therapy_agent_dose.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/treatment.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/trial.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/schemas.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/types.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/reference/ctcae.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/reference/gvhd.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/reference/icd10cm.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/reference/icdo3.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/reference/uberon.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/shared/__init__.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/shared/auth.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/shared/email_layout.html +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/shared/emails.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/shared/file_handling.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/shared/jose.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/shared/rest_utils.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/shared/utils.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/nci_cidc_api_modules.egg-info/dependency_links.txt +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/nci_cidc_api_modules.egg-info/not-zip-safe +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/nci_cidc_api_modules.egg-info/top_level.txt +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/pyproject.toml +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/setup.cfg +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/setup.py +0 -0
- {nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/tests/test_api.py +0 -0
{nci_cidc_api_modules-1.2.33/nci_cidc_api_modules.egg-info → nci_cidc_api_modules-1.2.35}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: nci_cidc_api_modules
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.35
|
|
4
4
|
Summary: SQLAlchemy data models and configuration tools used in the NCI CIDC API
|
|
5
5
|
Home-page: https://github.com/NCI-CIDC/cidc-api-gae
|
|
6
6
|
License: MIT license
|
|
@@ -14,24 +14,25 @@ Requires-Dist: flask-migrate>=4.1.0
|
|
|
14
14
|
Requires-Dist: flask-sqlalchemy>=3.1.1
|
|
15
15
|
Requires-Dist: flask-talisman>=0.7.0
|
|
16
16
|
Requires-Dist: google-auth==2.43.0
|
|
17
|
-
Requires-Dist: google-api-python-client>=2.
|
|
17
|
+
Requires-Dist: google-api-python-client>=2.187.0
|
|
18
18
|
Requires-Dist: google-cloud-bigquery>=3.38.0
|
|
19
19
|
Requires-Dist: google-cloud-pubsub>=2.33.0
|
|
20
20
|
Requires-Dist: google-cloud-secret-manager>=2.25.0
|
|
21
21
|
Requires-Dist: google-cloud-storage>=3.6.0
|
|
22
22
|
Requires-Dist: jinja2>=3.1.6
|
|
23
|
+
Requires-Dist: joserfc>=1.5.0
|
|
23
24
|
Requires-Dist: marshmallow>=4.1.0
|
|
24
25
|
Requires-Dist: marshmallow-sqlalchemy>=1.4.2
|
|
25
26
|
Requires-Dist: numpy>=2.3.5
|
|
26
27
|
Requires-Dist: packaging>=25.0
|
|
27
28
|
Requires-Dist: pandas>=2.3.3
|
|
28
29
|
Requires-Dist: pyarrow>=22.0.0
|
|
29
|
-
Requires-Dist: pydantic~=2.12.
|
|
30
|
+
Requires-Dist: pydantic~=2.12.5
|
|
30
31
|
Requires-Dist: python-dotenv>=1.2.1
|
|
31
32
|
Requires-Dist: requests>=2.32.5
|
|
32
33
|
Requires-Dist: sqlalchemy>=2.0.44
|
|
33
34
|
Requires-Dist: sqlalchemy-mixins~=2.0.5
|
|
34
|
-
Requires-Dist: werkzeug>=3.1.
|
|
35
|
+
Requires-Dist: werkzeug>=3.1.4
|
|
35
36
|
Requires-Dist: nci-cidc-schemas==0.28.10
|
|
36
37
|
Dynamic: description
|
|
37
38
|
Dynamic: description-content-type
|
|
@@ -3465,11 +3465,41 @@ class IngestionJobs(CommonColumns):
|
|
|
3465
3465
|
pending = Column(Boolean, nullable=False, default=False)
|
|
3466
3466
|
start_date = Column(DateTime, nullable=True)
|
|
3467
3467
|
error_status = Column(String, nullable=True)
|
|
3468
|
+
job_type = Column(String, nullable=False, default="clinical")
|
|
3469
|
+
assay_type = Column(String, nullable=True)
|
|
3470
|
+
batch_id = Column(String, nullable=True)
|
|
3471
|
+
submission_id = Column(String, nullable=True)
|
|
3472
|
+
intake_path = Column(String, nullable=True)
|
|
3468
3473
|
|
|
3469
3474
|
@staticmethod
|
|
3470
3475
|
@with_default_session
|
|
3471
|
-
def create(
|
|
3472
|
-
|
|
3476
|
+
def create(
|
|
3477
|
+
trial_id: str,
|
|
3478
|
+
status: str,
|
|
3479
|
+
version: int,
|
|
3480
|
+
error_status: str = None,
|
|
3481
|
+
pending: Boolean = False,
|
|
3482
|
+
job_type: str = "clinical",
|
|
3483
|
+
assay_type: str = None,
|
|
3484
|
+
batch_id: str = None,
|
|
3485
|
+
submission_id: str = None,
|
|
3486
|
+
intake_path: str = None,
|
|
3487
|
+
start_date: datetime = None,
|
|
3488
|
+
session: Session = None,
|
|
3489
|
+
):
|
|
3490
|
+
new_job = IngestionJobs(
|
|
3491
|
+
trial_id=trial_id,
|
|
3492
|
+
status=status,
|
|
3493
|
+
error_status=error_status,
|
|
3494
|
+
version=version,
|
|
3495
|
+
pending=pending,
|
|
3496
|
+
job_type=job_type,
|
|
3497
|
+
assay_type=assay_type,
|
|
3498
|
+
batch_id=batch_id,
|
|
3499
|
+
submission_id=submission_id,
|
|
3500
|
+
intake_path=intake_path,
|
|
3501
|
+
start_date=start_date,
|
|
3502
|
+
)
|
|
3473
3503
|
new_job.insert(session=session)
|
|
3474
3504
|
return new_job
|
|
3475
3505
|
|
|
@@ -3494,29 +3524,43 @@ class IngestionJobs(CommonColumns):
|
|
|
3494
3524
|
|
|
3495
3525
|
@classmethod
|
|
3496
3526
|
@with_default_session
|
|
3497
|
-
def get_jobs_by_trial(
|
|
3498
|
-
|
|
3527
|
+
def get_jobs_by_trial(
|
|
3528
|
+
cls, trial_id: str, job_type: str = "clinical", session: Session = None
|
|
3529
|
+
) -> list["IngestionJobs"]:
|
|
3530
|
+
return (
|
|
3531
|
+
session.query(cls)
|
|
3532
|
+
.filter(cls.trial_id == trial_id, cls.job_type == job_type)
|
|
3533
|
+
.order_by(cls.version.desc())
|
|
3534
|
+
.all()
|
|
3535
|
+
)
|
|
3499
3536
|
|
|
3500
3537
|
@classmethod
|
|
3501
3538
|
@with_default_session
|
|
3502
|
-
def get_open_job_by_trial(
|
|
3539
|
+
def get_open_job_by_trial(
|
|
3540
|
+
cls, trial_id: str, job_type: str = "clinical", session: Session = None
|
|
3541
|
+
) -> Optional["IngestionJobs"]:
|
|
3503
3542
|
"""Return the open job for a given trial if it exists."""
|
|
3504
3543
|
return (
|
|
3505
3544
|
session.query(cls)
|
|
3506
3545
|
.filter(
|
|
3507
3546
|
cls.trial_id == trial_id,
|
|
3547
|
+
cls.job_type == job_type,
|
|
3508
3548
|
cls.status.notin_(FINAL_JOB_STATUS),
|
|
3509
3549
|
)
|
|
3510
3550
|
.order_by(cls._created.desc())
|
|
3511
3551
|
.first()
|
|
3512
3552
|
)
|
|
3513
3553
|
|
|
3554
|
+
@classmethod
|
|
3555
|
+
def get_jobs_for_user(cls, user: Users, job_type: str = None) -> list["IngestionJobs"]:
|
|
3556
|
+
return cls.get_assay_jobs_for_user(user) if job_type == "assay" else cls.get_clinical_jobs_for_user(user)
|
|
3557
|
+
|
|
3514
3558
|
@classmethod
|
|
3515
3559
|
@with_default_session
|
|
3516
|
-
def
|
|
3560
|
+
def get_clinical_jobs_for_user(cls, user: Users, session: Session = None) -> list["IngestionJobs"]:
|
|
3517
3561
|
if user.role not in [CIDCRole.ADMIN.value, CIDCRole.CLINICAL_TRIAL_USER.value]:
|
|
3518
3562
|
return []
|
|
3519
|
-
job_query = session.query(cls).filter(cls.status.notin_(["DRAFT"]))
|
|
3563
|
+
job_query = session.query(cls).filter(cls.status.notin_(["DRAFT"]), cls.job_type == "clinical")
|
|
3520
3564
|
if (
|
|
3521
3565
|
user.role != CIDCRole.ADMIN.value
|
|
3522
3566
|
and not session.query(Permissions)
|
|
@@ -3539,6 +3583,81 @@ class IngestionJobs(CommonColumns):
|
|
|
3539
3583
|
job_query = job_query.filter(cls.trial_id.in_(map(lambda x: x.trial_id, authorized_trials)))
|
|
3540
3584
|
return job_query.order_by(cls._created.desc()).all()
|
|
3541
3585
|
|
|
3586
|
+
@classmethod
|
|
3587
|
+
@with_default_session
|
|
3588
|
+
def get_assay_jobs_for_user(cls, user: Users, session: Session = None) -> list["IngestionJobs"]:
|
|
3589
|
+
# TODO allow more than just Admin role and get authorized trials based on permissions
|
|
3590
|
+
if user.role not in [CIDCRole.ADMIN.value]:
|
|
3591
|
+
return []
|
|
3592
|
+
return session.query(cls).filter(cls.job_type == "assay").order_by(cls._created.desc()).all()
|
|
3593
|
+
|
|
3594
|
+
@classmethod
|
|
3595
|
+
@with_default_session
|
|
3596
|
+
def get_unique_assay_job(
|
|
3597
|
+
cls,
|
|
3598
|
+
trial_id: str,
|
|
3599
|
+
assay_type: str,
|
|
3600
|
+
batch_id: str,
|
|
3601
|
+
session: Session = None,
|
|
3602
|
+
) -> Optional["IngestionJobs"]:
|
|
3603
|
+
"""Look for unique assay job with matching trial_id/assay_type/batch_id combination."""
|
|
3604
|
+
return (
|
|
3605
|
+
session.query(cls)
|
|
3606
|
+
.filter(
|
|
3607
|
+
cls.job_type == "assay",
|
|
3608
|
+
cls.trial_id == trial_id,
|
|
3609
|
+
cls.assay_type == assay_type,
|
|
3610
|
+
cls.batch_id == batch_id,
|
|
3611
|
+
)
|
|
3612
|
+
.first()
|
|
3613
|
+
)
|
|
3614
|
+
|
|
3615
|
+
@classmethod
|
|
3616
|
+
@with_default_session
|
|
3617
|
+
def next_assay_submission_id(cls, trial_id: str, assay_type: str, session: Session = None) -> str:
|
|
3618
|
+
"""
|
|
3619
|
+
Generate the next CIDC Submission ID for an assay job.
|
|
3620
|
+
|
|
3621
|
+
Format:
|
|
3622
|
+
<trial_id>-<assay_type>-<yyyymmdd> (first submission of the day)
|
|
3623
|
+
<trial_id>-<assay_type>-<yyyymmdd>-<#> (subsequent submissions on same day)
|
|
3624
|
+
|
|
3625
|
+
Uses only the most recent matching submission_id to determine the next suffix.
|
|
3626
|
+
"""
|
|
3627
|
+
today_str = datetime.now().strftime("%Y%m%d")
|
|
3628
|
+
base_submission_id = f"{trial_id}-{assay_type}-{today_str}"
|
|
3629
|
+
|
|
3630
|
+
# Get the most recent submission_id matching this prefix
|
|
3631
|
+
latest = (
|
|
3632
|
+
session.query(cls.submission_id)
|
|
3633
|
+
.filter(
|
|
3634
|
+
cls.trial_id == trial_id,
|
|
3635
|
+
cls.assay_type == assay_type,
|
|
3636
|
+
cls.submission_id.like(f"{base_submission_id}%"),
|
|
3637
|
+
)
|
|
3638
|
+
.order_by(cls._created.desc())
|
|
3639
|
+
.first()
|
|
3640
|
+
)
|
|
3641
|
+
|
|
3642
|
+
# No existing submission for this prefix -> start at 1
|
|
3643
|
+
if not latest or not latest[0]:
|
|
3644
|
+
return base_submission_id
|
|
3645
|
+
|
|
3646
|
+
last_id = latest[0]
|
|
3647
|
+
# Case 1: the latest is exactly the prefix (i.e., first submission today)
|
|
3648
|
+
if last_id == base_submission_id:
|
|
3649
|
+
return f"{base_submission_id}-2"
|
|
3650
|
+
|
|
3651
|
+
# Case 2: latest already has a suffix
|
|
3652
|
+
try:
|
|
3653
|
+
_, last_suffix = last_id.rsplit("-", 1)
|
|
3654
|
+
n = int(last_suffix)
|
|
3655
|
+
return f"{base_submission_id}-{n + 1}"
|
|
3656
|
+
except Exception as e:
|
|
3657
|
+
# If malformed, restart numbering for safety
|
|
3658
|
+
logger.error("Unexpected error parsing Submission ID in next_assay_submission_id: %s", e)
|
|
3659
|
+
return f"{base_submission_id}-2"
|
|
3660
|
+
|
|
3542
3661
|
|
|
3543
3662
|
class JobFileCategories(CommonColumns):
|
|
3544
3663
|
__tablename__ = "job_file_categories"
|
|
@@ -3613,6 +3732,7 @@ class CategoryDataElements(CommonColumns):
|
|
|
3613
3732
|
name = Column(String, nullable=False)
|
|
3614
3733
|
is_custom = Column(Boolean, nullable=False, default=False, server_default="false")
|
|
3615
3734
|
element_type = Column(String, nullable=False)
|
|
3735
|
+
data_type = Column(String, nullable=True)
|
|
3616
3736
|
cardinality = Column(String, nullable=True)
|
|
3617
3737
|
|
|
3618
3738
|
@classmethod
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
from urllib.parse import quote
|
|
3
|
+
|
|
4
|
+
from werkzeug.exceptions import BadRequest
|
|
5
|
+
|
|
6
|
+
from cidc_api.models import IngestionJobs
|
|
7
|
+
from . import gcloud_client
|
|
8
|
+
from ..shared.auth import get_current_user
|
|
9
|
+
|
|
10
|
+
JOB_TYPE_ASSAY = "assay"
|
|
11
|
+
JOB_TYPE_CLINICAL = "clinical"
|
|
12
|
+
ALLOWED_JOB_TYPES = {JOB_TYPE_CLINICAL, JOB_TYPE_ASSAY}
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def resolve_job_type_and_assay_fields(data: dict) -> tuple[str, str | None, str | None]:
|
|
16
|
+
"""Decide job_type and gather assay_type/batch_id from request JSON."""
|
|
17
|
+
assay_type = data.get("assay_type")
|
|
18
|
+
# If job_type is assay or assay_type is present, treat this as an assay job.
|
|
19
|
+
job_type = data.get("job_type") or (JOB_TYPE_ASSAY if assay_type else JOB_TYPE_CLINICAL)
|
|
20
|
+
|
|
21
|
+
if job_type not in ALLOWED_JOB_TYPES:
|
|
22
|
+
raise BadRequest("Invalid job_type. Allowed values are 'clinical' or 'assay'.")
|
|
23
|
+
|
|
24
|
+
if job_type == JOB_TYPE_ASSAY and (not assay_type or not isinstance(assay_type, str)):
|
|
25
|
+
raise BadRequest("assay_type must be provided for job_type='assay'.")
|
|
26
|
+
|
|
27
|
+
assay_type = assay_type.strip() if assay_type else None
|
|
28
|
+
batch_id = data.get("batch_id").strip() if isinstance(data.get("batch_id"), str) else None
|
|
29
|
+
|
|
30
|
+
return job_type, assay_type, batch_id
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def prepare_assay_job(trial_id: str, assay_type: str, batch_id: str) -> tuple[str, str, str, datetime, int, str]:
|
|
34
|
+
"""
|
|
35
|
+
Validate assay job uniqueness and generate submission_id, start_date, version, and the trial’s GCS intake path.
|
|
36
|
+
"""
|
|
37
|
+
if not assay_type:
|
|
38
|
+
raise BadRequest("assay_type must be provided for job_type='assay'.")
|
|
39
|
+
|
|
40
|
+
# Enforce uniqueness of (trial_id, assay_type, batch_id) when batch_id is present.
|
|
41
|
+
if batch_id:
|
|
42
|
+
existing_job = IngestionJobs.get_unique_assay_job(trial_id, assay_type, batch_id)
|
|
43
|
+
if existing_job:
|
|
44
|
+
raise BadRequest(
|
|
45
|
+
f"Assay job {existing_job.id} already exists for this exact trial_id/assay_type/batch_id combination."
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
submission_id = IngestionJobs.next_assay_submission_id(trial_id, assay_type)
|
|
49
|
+
job_status = "INITIAL SUBMISSION"
|
|
50
|
+
error_status = "Upload Incomplete" # job starts with 'Incomplete' notifier
|
|
51
|
+
start_date = datetime.now()
|
|
52
|
+
version = 1
|
|
53
|
+
|
|
54
|
+
# Create or retrieve intake bucket corresponding to the trial
|
|
55
|
+
intake_bucket = gcloud_client.create_intake_bucket(get_current_user().email, trial_id=trial_id)
|
|
56
|
+
gcs_path = f"{intake_bucket.name}/{trial_id}/{assay_type}"
|
|
57
|
+
|
|
58
|
+
return submission_id, job_status, error_status, start_date, version, gcs_path
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def get_google_links(intake_path: str) -> tuple[str, str]:
|
|
62
|
+
"""Build the GCS URI and GCS Console URL corresponding to the intake path."""
|
|
63
|
+
gcs_uri = f"gs://{intake_path}"
|
|
64
|
+
# Encode path to ensure link opens correctly
|
|
65
|
+
encoded_path = quote(intake_path)
|
|
66
|
+
console_url = f"https://console.cloud.google.com/storage/browser/{encoded_path}"
|
|
67
|
+
|
|
68
|
+
return gcs_uri, console_url
|
{nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/shared/gcloud_client.py
RENAMED
|
@@ -8,6 +8,7 @@ import hashlib
|
|
|
8
8
|
import io
|
|
9
9
|
import json
|
|
10
10
|
import os
|
|
11
|
+
import re
|
|
11
12
|
import warnings
|
|
12
13
|
from collections import namedtuple
|
|
13
14
|
from concurrent.futures import Future
|
|
@@ -361,15 +362,34 @@ def get_intake_bucket_name(user_email: str) -> str:
|
|
|
361
362
|
return bucket_name
|
|
362
363
|
|
|
363
364
|
|
|
364
|
-
def
|
|
365
|
+
def get_trial_intake_bucket_name(trial_id: str) -> str:
|
|
365
366
|
"""
|
|
366
|
-
|
|
367
|
+
Return a sanitized GCS bucket name for a given trial_id.
|
|
368
|
+
|
|
369
|
+
Produces: <GOOGLE_INTAKE_BUCKET>-<sanitized_trial_id>
|
|
370
|
+
where the trial_id segment is lowercased and restricted to [a-z0-9-].
|
|
371
|
+
"""
|
|
372
|
+
# Replace non-allowed bucket chars with "-"
|
|
373
|
+
sanitized_id = re.sub(r"[^a-z0-9-]", "-", trial_id.lower())
|
|
374
|
+
# Collapse repeated "-" and trim from both ends
|
|
375
|
+
sanitized_id = re.sub(r"-+", "-", sanitized_id).strip("-")
|
|
376
|
+
|
|
377
|
+
return f"{GOOGLE_INTAKE_BUCKET}-{sanitized_id}"
|
|
378
|
+
|
|
379
|
+
|
|
380
|
+
def create_intake_bucket(user_email: str, trial_id: str = None) -> storage.Bucket:
|
|
381
|
+
"""
|
|
382
|
+
Create (or retrieve) the appropriate data intake bucket.
|
|
383
|
+
If a trial_id is provided, a trial-specific bucket is used;
|
|
384
|
+
otherwise a user-specific intake bucket is used.
|
|
385
|
+
|
|
367
386
|
Grant the user GCS object admin permissions on the bucket, or refresh those
|
|
368
387
|
permissions if they've already been granted.
|
|
369
388
|
Created with uniform bucket-level IAM access, so expiring permission.
|
|
370
389
|
"""
|
|
371
390
|
storage_client = _get_storage_client()
|
|
372
|
-
|
|
391
|
+
# Get trial-specific bucket name if trial_id is given, otherwise a user-specific bucket name.
|
|
392
|
+
bucket_name = get_trial_intake_bucket_name(trial_id) if trial_id else get_intake_bucket_name(user_email)
|
|
373
393
|
bucket = storage_client.bucket(bucket_name)
|
|
374
394
|
|
|
375
395
|
if not bucket.exists():
|
{nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35/nci_cidc_api_modules.egg-info}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: nci_cidc_api_modules
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.35
|
|
4
4
|
Summary: SQLAlchemy data models and configuration tools used in the NCI CIDC API
|
|
5
5
|
Home-page: https://github.com/NCI-CIDC/cidc-api-gae
|
|
6
6
|
License: MIT license
|
|
@@ -14,24 +14,25 @@ Requires-Dist: flask-migrate>=4.1.0
|
|
|
14
14
|
Requires-Dist: flask-sqlalchemy>=3.1.1
|
|
15
15
|
Requires-Dist: flask-talisman>=0.7.0
|
|
16
16
|
Requires-Dist: google-auth==2.43.0
|
|
17
|
-
Requires-Dist: google-api-python-client>=2.
|
|
17
|
+
Requires-Dist: google-api-python-client>=2.187.0
|
|
18
18
|
Requires-Dist: google-cloud-bigquery>=3.38.0
|
|
19
19
|
Requires-Dist: google-cloud-pubsub>=2.33.0
|
|
20
20
|
Requires-Dist: google-cloud-secret-manager>=2.25.0
|
|
21
21
|
Requires-Dist: google-cloud-storage>=3.6.0
|
|
22
22
|
Requires-Dist: jinja2>=3.1.6
|
|
23
|
+
Requires-Dist: joserfc>=1.5.0
|
|
23
24
|
Requires-Dist: marshmallow>=4.1.0
|
|
24
25
|
Requires-Dist: marshmallow-sqlalchemy>=1.4.2
|
|
25
26
|
Requires-Dist: numpy>=2.3.5
|
|
26
27
|
Requires-Dist: packaging>=25.0
|
|
27
28
|
Requires-Dist: pandas>=2.3.3
|
|
28
29
|
Requires-Dist: pyarrow>=22.0.0
|
|
29
|
-
Requires-Dist: pydantic~=2.12.
|
|
30
|
+
Requires-Dist: pydantic~=2.12.5
|
|
30
31
|
Requires-Dist: python-dotenv>=1.2.1
|
|
31
32
|
Requires-Dist: requests>=2.32.5
|
|
32
33
|
Requires-Dist: sqlalchemy>=2.0.44
|
|
33
34
|
Requires-Dist: sqlalchemy-mixins~=2.0.5
|
|
34
|
-
Requires-Dist: werkzeug>=3.1.
|
|
35
|
+
Requires-Dist: werkzeug>=3.1.4
|
|
35
36
|
Requires-Dist: nci-cidc-schemas==0.28.10
|
|
36
37
|
Dynamic: description
|
|
37
38
|
Dynamic: description-content-type
|
|
@@ -100,6 +100,7 @@ cidc_api/reference/icd10cm.py
|
|
|
100
100
|
cidc_api/reference/icdo3.py
|
|
101
101
|
cidc_api/reference/uberon.py
|
|
102
102
|
cidc_api/shared/__init__.py
|
|
103
|
+
cidc_api/shared/assay_handling.py
|
|
103
104
|
cidc_api/shared/auth.py
|
|
104
105
|
cidc_api/shared/email_layout.html
|
|
105
106
|
cidc_api/shared/emails.py
|
|
@@ -5,22 +5,23 @@ flask-migrate>=4.1.0
|
|
|
5
5
|
flask-sqlalchemy>=3.1.1
|
|
6
6
|
flask-talisman>=0.7.0
|
|
7
7
|
google-auth==2.43.0
|
|
8
|
-
google-api-python-client>=2.
|
|
8
|
+
google-api-python-client>=2.187.0
|
|
9
9
|
google-cloud-bigquery>=3.38.0
|
|
10
10
|
google-cloud-pubsub>=2.33.0
|
|
11
11
|
google-cloud-secret-manager>=2.25.0
|
|
12
12
|
google-cloud-storage>=3.6.0
|
|
13
13
|
jinja2>=3.1.6
|
|
14
|
+
joserfc>=1.5.0
|
|
14
15
|
marshmallow>=4.1.0
|
|
15
16
|
marshmallow-sqlalchemy>=1.4.2
|
|
16
17
|
numpy>=2.3.5
|
|
17
18
|
packaging>=25.0
|
|
18
19
|
pandas>=2.3.3
|
|
19
20
|
pyarrow>=22.0.0
|
|
20
|
-
pydantic~=2.12.
|
|
21
|
+
pydantic~=2.12.5
|
|
21
22
|
python-dotenv>=1.2.1
|
|
22
23
|
requests>=2.32.5
|
|
23
24
|
sqlalchemy>=2.0.44
|
|
24
25
|
sqlalchemy-mixins~=2.0.5
|
|
25
|
-
werkzeug>=3.1.
|
|
26
|
+
werkzeug>=3.1.4
|
|
26
27
|
nci-cidc-schemas==0.28.10
|
|
@@ -4,25 +4,26 @@ flask>=3.1.2
|
|
|
4
4
|
flask-migrate>=4.1.0
|
|
5
5
|
flask-sqlalchemy>=3.1.1
|
|
6
6
|
flask-talisman>=0.7.0
|
|
7
|
-
google-auth==2.43.0
|
|
8
|
-
google-api-python-client>=2.
|
|
7
|
+
google-auth==2.43.0
|
|
8
|
+
google-api-python-client>=2.187.0
|
|
9
9
|
google-cloud-bigquery>=3.38.0
|
|
10
10
|
google-cloud-pubsub>=2.33.0
|
|
11
11
|
google-cloud-secret-manager>=2.25.0
|
|
12
12
|
google-cloud-storage>=3.6.0
|
|
13
13
|
jinja2>=3.1.6
|
|
14
|
+
joserfc>=1.5.0
|
|
14
15
|
marshmallow>=4.1.0
|
|
15
16
|
marshmallow-sqlalchemy>=1.4.2
|
|
16
17
|
numpy>=2.3.5
|
|
17
18
|
packaging>=25.0
|
|
18
19
|
pandas>=2.3.3
|
|
19
20
|
pyarrow>=22.0.0
|
|
20
|
-
pydantic~=2.12.
|
|
21
|
+
pydantic~=2.12.5
|
|
21
22
|
python-dotenv>=1.2.1
|
|
22
23
|
requests>=2.32.5
|
|
23
24
|
sqlalchemy>=2.0.44
|
|
24
25
|
sqlalchemy-mixins~=2.0.5
|
|
25
|
-
werkzeug>=3.1.
|
|
26
|
+
werkzeug>=3.1.4
|
|
26
27
|
|
|
27
28
|
# cidc deps
|
|
28
29
|
nci-cidc-schemas==0.28.10
|
|
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.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/arm_orm.py
RENAMED
|
File without changes
|
|
File without changes
|
{nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/cohort_orm.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/contact_orm.py
RENAMED
|
File without changes
|
|
File without changes
|
{nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/disease_orm.py
RENAMED
|
File without changes
|
|
File without changes
|
{nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/file_orm.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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/surgery_orm.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/db/stage2/trial_orm.py
RENAMED
|
File without changes
|
{nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/files/__init__.py
RENAMED
|
File without changes
|
{nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/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
|
|
File without changes
|
{nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/arm.py
RENAMED
|
File without changes
|
{nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/base.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
|
{nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/file.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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/models/pydantic/stage2/trial.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
|
{nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/shared/email_layout.html
RENAMED
|
File without changes
|
|
File without changes
|
{nci_cidc_api_modules-1.2.33 → nci_cidc_api_modules-1.2.35}/cidc_api/shared/file_handling.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
|