nci-cidc-api-modules 1.2.18__py3-none-any.whl → 1.2.25__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.
Files changed (89) hide show
  1. cidc_api/models/__init__.py +2 -0
  2. cidc_api/models/data.py +15 -0
  3. cidc_api/models/db/base_orm.py +25 -0
  4. cidc_api/models/db/stage2/__init__.py +78 -0
  5. cidc_api/models/db/stage2/additional_treatment_orm.py +22 -0
  6. cidc_api/models/db/stage2/administrative_person_orm.py +25 -0
  7. cidc_api/models/db/stage2/administrative_role_assignment_orm.py +28 -0
  8. cidc_api/models/db/stage2/adverse_event_orm.py +47 -0
  9. cidc_api/models/db/stage2/arm_orm.py +23 -0
  10. cidc_api/models/db/stage2/baseline_clinical_assessment_orm.py +23 -0
  11. cidc_api/models/db/stage2/cohort_orm.py +23 -0
  12. cidc_api/models/db/stage2/comorbidity_orm.py +24 -0
  13. cidc_api/models/db/stage2/consent_group_orm.py +31 -0
  14. cidc_api/models/db/stage2/contact_orm.py +32 -0
  15. cidc_api/models/db/stage2/demographic_orm.py +44 -0
  16. cidc_api/models/db/stage2/disease_orm.py +53 -0
  17. cidc_api/models/db/stage2/exposure_orm.py +21 -0
  18. cidc_api/models/db/stage2/file_orm.py +38 -0
  19. cidc_api/models/db/stage2/gvhd_diagnosis_acute_orm.py +33 -0
  20. cidc_api/models/db/stage2/gvhd_diagnosis_chronic_orm.py +37 -0
  21. cidc_api/models/db/stage2/gvhd_organ_acute_orm.py +20 -0
  22. cidc_api/models/db/stage2/gvhd_organ_chronic_orm.py +20 -0
  23. cidc_api/models/db/stage2/institution_orm.py +33 -0
  24. cidc_api/models/db/stage2/medical_history_orm.py +29 -0
  25. cidc_api/models/db/stage2/other_clinical_endpoint_orm.py +28 -0
  26. cidc_api/models/db/stage2/other_malignancy_orm.py +30 -0
  27. cidc_api/models/db/stage2/participant_orm.py +79 -0
  28. cidc_api/models/db/stage2/prior_treatment_orm.py +28 -0
  29. cidc_api/models/db/stage2/publication_orm.py +31 -0
  30. cidc_api/models/db/stage2/radiotherapy_dose_orm.py +39 -0
  31. cidc_api/models/db/stage2/response_by_system_orm.py +28 -0
  32. cidc_api/models/db/stage2/response_orm.py +27 -0
  33. cidc_api/models/db/stage2/shipment_orm.py +47 -0
  34. cidc_api/models/db/stage2/shipment_specimen_orm.py +24 -0
  35. cidc_api/models/db/stage2/specimen_orm.py +100 -0
  36. cidc_api/models/db/stage2/stem_cell_transplant_orm.py +25 -0
  37. cidc_api/models/db/stage2/surgery_orm.py +27 -0
  38. cidc_api/models/db/stage2/therapy_agent_dose_orm.py +31 -0
  39. cidc_api/models/db/stage2/treatment_orm.py +39 -0
  40. cidc_api/models/db/stage2/trial_orm.py +60 -0
  41. cidc_api/models/files/facets.py +5 -0
  42. cidc_api/models/migrations.py +12 -39
  43. cidc_api/models/models.py +12 -0
  44. cidc_api/models/pydantic/stage2/__init__.py +78 -0
  45. cidc_api/models/pydantic/stage2/additional_treatment.py +23 -0
  46. cidc_api/models/pydantic/stage2/administrative_person.py +30 -0
  47. cidc_api/models/pydantic/stage2/administrative_role_assignment.py +16 -0
  48. cidc_api/models/pydantic/stage2/adverse_event.py +100 -0
  49. cidc_api/models/pydantic/stage2/arm.py +16 -0
  50. cidc_api/models/pydantic/stage2/base.py +30 -0
  51. cidc_api/models/pydantic/stage2/baseline_clinical_assessment.py +23 -0
  52. cidc_api/models/pydantic/stage2/cohort.py +16 -0
  53. cidc_api/models/pydantic/stage2/comorbidity.py +36 -0
  54. cidc_api/models/pydantic/stage2/consent_group.py +30 -0
  55. cidc_api/models/pydantic/stage2/contact.py +35 -0
  56. cidc_api/models/pydantic/stage2/demographic.py +114 -0
  57. cidc_api/models/pydantic/stage2/disease.py +144 -0
  58. cidc_api/models/pydantic/stage2/exposure.py +32 -0
  59. cidc_api/models/pydantic/stage2/file.py +44 -0
  60. cidc_api/models/pydantic/stage2/gvhd_diagnosis_acute.py +33 -0
  61. cidc_api/models/pydantic/stage2/gvhd_diagnosis_chronic.py +32 -0
  62. cidc_api/models/pydantic/stage2/gvhd_organ_acute.py +22 -0
  63. cidc_api/models/pydantic/stage2/gvhd_organ_chronic.py +23 -0
  64. cidc_api/models/pydantic/stage2/institution.py +10 -0
  65. cidc_api/models/pydantic/stage2/medical_history.py +36 -0
  66. cidc_api/models/pydantic/stage2/other_clinical_endpoint.py +32 -0
  67. cidc_api/models/pydantic/stage2/other_malignancy.py +45 -0
  68. cidc_api/models/pydantic/stage2/participant.py +47 -0
  69. cidc_api/models/pydantic/stage2/prior_treatment.py +52 -0
  70. cidc_api/models/pydantic/stage2/publication.py +37 -0
  71. cidc_api/models/pydantic/stage2/radiotherapy_dose.py +79 -0
  72. cidc_api/models/pydantic/stage2/response.py +71 -0
  73. cidc_api/models/pydantic/stage2/response_by_system.py +109 -0
  74. cidc_api/models/pydantic/stage2/shipment.py +48 -0
  75. cidc_api/models/pydantic/stage2/shipment_specimen.py +15 -0
  76. cidc_api/models/pydantic/stage2/specimen.py +211 -0
  77. cidc_api/models/pydantic/stage2/stem_cell_transplant.py +35 -0
  78. cidc_api/models/pydantic/stage2/surgery.py +49 -0
  79. cidc_api/models/pydantic/stage2/therapy_agent_dose.py +67 -0
  80. cidc_api/models/pydantic/stage2/treatment.py +50 -0
  81. cidc_api/models/pydantic/stage2/trial.py +85 -0
  82. cidc_api/models/types.py +1439 -0
  83. cidc_api/shared/utils.py +4 -1
  84. {nci_cidc_api_modules-1.2.18.dist-info → nci_cidc_api_modules-1.2.25.dist-info}/METADATA +6 -4
  85. nci_cidc_api_modules-1.2.25.dist-info/RECORD +104 -0
  86. nci_cidc_api_modules-1.2.18.dist-info/RECORD +0 -26
  87. {nci_cidc_api_modules-1.2.18.dist-info → nci_cidc_api_modules-1.2.25.dist-info}/WHEEL +0 -0
  88. {nci_cidc_api_modules-1.2.18.dist-info → nci_cidc_api_modules-1.2.25.dist-info}/licenses/LICENSE +0 -0
  89. {nci_cidc_api_modules-1.2.18.dist-info → nci_cidc_api_modules-1.2.25.dist-info}/top_level.txt +0 -0
@@ -1,3 +1,5 @@
1
1
  from .models import *
2
2
  from .files import *
3
3
  from .schemas import *
4
+
5
+ from cidc_api.models.db.base_orm import BaseORM
@@ -0,0 +1,15 @@
1
+ from cidc_api.models.pydantic.stage2 import all_models
2
+
3
+ standard_data_categories = [model.__data_category__ for model in all_models if hasattr(model, "__data_category__")]
4
+
5
+
6
+ # A class to hold the representation of a trial's dataset all at once
7
+ class Dataset(dict):
8
+ def __init__(self, *args, **kwargs):
9
+ super().__init__(*args, **kwargs)
10
+ for data_category in standard_data_categories:
11
+ self[data_category] = []
12
+
13
+
14
+ # Maps data categories like "treatment" to their associated pydantic model
15
+ data_category_to_model = {model.__data_category__: model for model in all_models if hasattr(model, "__data_category__")}
@@ -0,0 +1,25 @@
1
+ from typing import Self
2
+
3
+ from sqlalchemy_mixins import SerializeMixin, ReprMixin
4
+
5
+ from cidc_api.config.db import db
6
+
7
+
8
+ class BaseORM(db.Model, ReprMixin, SerializeMixin):
9
+ __abstract__ = True
10
+ __repr__ = ReprMixin.__repr__
11
+
12
+ def merge(self, d: dict) -> Self:
13
+ """Merge keys and values from dict d into this model, overwriting as necessary."""
14
+ for key, value in d.items():
15
+ setattr(self, key, value)
16
+ return self
17
+
18
+ def clone(self) -> "BaseORM":
19
+ """Clones a SQLAlchemy ORM object, excluding primary keys."""
20
+ mapper = self.__mapper__
21
+ new_instance = self.__class__()
22
+ for column in mapper.columns:
23
+ if not column.primary_key:
24
+ setattr(new_instance, column.key, getattr(self, column.key))
25
+ return new_instance
@@ -0,0 +1,78 @@
1
+ from .additional_treatment_orm import AdditionalTreatmentORM
2
+ from .administrative_person_orm import AdministrativePersonORM
3
+ from .administrative_role_assignment_orm import AdministrativeRoleAssignmentORM
4
+ from .adverse_event_orm import AdverseEventORM
5
+ from .arm_orm import ArmORM
6
+ from .baseline_clinical_assessment_orm import BaselineClinicalAssessmentORM
7
+ from .cohort_orm import CohortORM
8
+ from .comorbidity_orm import ComorbidityORM
9
+ from .consent_group_orm import ConsentGroupORM
10
+ from .contact_orm import ContactORM
11
+ from .demographic_orm import DemographicORM
12
+ from .disease_orm import DiseaseORM
13
+ from .exposure_orm import ExposureORM
14
+ from .file_orm import FileORM
15
+ from .gvhd_diagnosis_acute_orm import GVHDDiagnosisAcuteORM
16
+ from .gvhd_diagnosis_chronic_orm import GVHDDiagnosisChronicORM
17
+ from .gvhd_organ_acute_orm import GVHDOrganAcuteORM
18
+ from .gvhd_organ_chronic_orm import GVHDOrganChronicORM
19
+ from .institution_orm import InstitutionORM
20
+ from .medical_history_orm import MedicalHistoryORM
21
+ from .other_clinical_endpoint_orm import OtherClinicalEndpointORM
22
+ from .other_malignancy_orm import OtherMalignancyORM
23
+ from .participant_orm import ParticipantORM
24
+ from .prior_treatment_orm import PriorTreatmentORM
25
+ from .publication_orm import PublicationORM
26
+ from .radiotherapy_dose_orm import RadiotherapyDoseORM
27
+ from .response_by_system_orm import ResponseBySystemORM
28
+ from .response_orm import ResponseORM
29
+ from .shipment_orm import ShipmentORM
30
+ from .shipment_specimen_orm import ShipmentSpecimenORM
31
+ from .specimen_orm import SpecimenORM
32
+ from .stem_cell_transplant_orm import StemCellTransplantORM
33
+ from .surgery_orm import SurgeryORM
34
+ from .therapy_agent_dose_orm import TherapyAgentDoseORM
35
+ from .treatment_orm import TreatmentORM
36
+ from .trial_orm import TrialORM
37
+
38
+
39
+ __all__ = [
40
+ "AdditionalTreatmentORM",
41
+ "AdministrativePersonORM",
42
+ "AdministrativeRoleAssignmentORM",
43
+ "AdverseEventORM",
44
+ "ArmORM",
45
+ "BaselineClinicalAssessmentORM",
46
+ "CohortORM",
47
+ "ComorbidityORM",
48
+ "ConsentGroupORM",
49
+ "ContactORM",
50
+ "DemographicORM",
51
+ "DiseaseORM",
52
+ "ExposureORM",
53
+ "FileORM",
54
+ "GVHDDiagnosisAcuteORM",
55
+ "GVHDDiagnosisChronicORM",
56
+ "GVHDOrganAcuteORM",
57
+ "GVHDOrganChronicORM",
58
+ "InstitutionORM",
59
+ "MedicalHistoryORM",
60
+ "OtherClinicalEndpointORM",
61
+ "OtherMalignancyORM",
62
+ "ParticipantORM",
63
+ "PriorTreatmentORM",
64
+ "PublicationORM",
65
+ "RadiotherapyDoseORM",
66
+ "ResponseBySystemORM",
67
+ "ResponseORM",
68
+ "ShipmentORM",
69
+ "ShipmentSpecimenORM",
70
+ "SpecimenORM",
71
+ "StemCellTransplantORM",
72
+ "SurgeryORM",
73
+ "TherapyAgentDoseORM",
74
+ "TreatmentORM",
75
+ "TrialORM",
76
+ ]
77
+
78
+ all_models = [globals()[cls_name] for cls_name in __all__]
@@ -0,0 +1,22 @@
1
+ from pydantic import NonNegativeInt
2
+ from typing import Optional
3
+
4
+ from sqlalchemy import ForeignKey
5
+ from sqlalchemy.orm import Mapped, mapped_column, relationship
6
+
7
+ from cidc_api.models.db.base_orm import BaseORM
8
+
9
+
10
+ class AdditionalTreatmentORM(BaseORM):
11
+ __tablename__ = "additional_treatment"
12
+ __repr_attrs__ = ["additional_treatment_id", "participant_id", "description"]
13
+ __table_args__ = {"schema": "stage2"}
14
+
15
+ additional_treatment_id: Mapped[int] = mapped_column(primary_key=True)
16
+ participant_id: Mapped[int] = mapped_column(ForeignKey("stage2.participant.participant_id", ondelete="CASCADE"))
17
+
18
+ days_to_start: Mapped[Optional[NonNegativeInt]]
19
+ days_to_end: Mapped[Optional[NonNegativeInt]]
20
+ description: Mapped[str]
21
+
22
+ participant: Mapped["ParticipantORM"] = relationship(back_populates="additional_treatments", cascade="all, delete")
@@ -0,0 +1,25 @@
1
+ from typing import List
2
+
3
+ from sqlalchemy import ForeignKey
4
+ from sqlalchemy.orm import Mapped, mapped_column, relationship
5
+
6
+ from cidc_api.models.db.base_orm import BaseORM
7
+
8
+
9
+ class AdministrativePersonORM(BaseORM):
10
+ __tablename__ = "administrative_person"
11
+ __repr_attrs__ = ["first_name", "last_name"]
12
+ __table_args__ = {"schema": "stage2"}
13
+
14
+ administrative_person_id: Mapped[int] = mapped_column(primary_key=True)
15
+ institution_id: Mapped[int] = mapped_column(ForeignKey("stage2.institution.institution_id", ondelete="CASCADE"))
16
+ first_name: Mapped[str]
17
+ middle_name: Mapped[str | None]
18
+ last_name: Mapped[str]
19
+ email: Mapped[str | None]
20
+ phone_number: Mapped[str | None]
21
+
22
+ institution: Mapped["InstitutionORM"] = relationship(back_populates="administrative_people", cascade="all, delete")
23
+ administrative_role_assignments: Mapped[List["AdministrativeRoleAssignmentORM"]] = relationship(
24
+ back_populates="administrative_person", cascade="all, delete", passive_deletes=True
25
+ )
@@ -0,0 +1,28 @@
1
+ from sqlalchemy import ForeignKeyConstraint, ForeignKey
2
+ from sqlalchemy.orm import Mapped, mapped_column, relationship
3
+
4
+ from cidc_api.models.db.base_orm import BaseORM
5
+ from cidc_api.models.types import AdministrativeRole
6
+
7
+
8
+ class AdministrativeRoleAssignmentORM(BaseORM):
9
+ __tablename__ = "administrative_role_assignment"
10
+ __repr_attrs__ = ["trial_id", "administrative_person_id", "administrative_role"]
11
+ __table_args__ = (
12
+ ForeignKeyConstraint(
13
+ ["trial_id", "version"], ["stage2.trial.trial_id", "stage2.trial.version"], ondelete="CASCADE"
14
+ ),
15
+ {"schema": "stage2"},
16
+ )
17
+
18
+ trial_id: Mapped[str] = mapped_column(primary_key=True)
19
+ version: Mapped[str] = mapped_column(primary_key=True)
20
+ administrative_person_id: Mapped[int] = mapped_column(
21
+ ForeignKey("stage2.administrative_person.administrative_person_id", ondelete="CASCADE"), primary_key=True
22
+ )
23
+ administrative_role: Mapped[AdministrativeRole] = mapped_column(primary_key=True)
24
+
25
+ trial: Mapped["TrialORM"] = relationship(back_populates="administrative_role_assignments", cascade="all, delete")
26
+ administrative_person: Mapped["AdministrativePersonORM"] = relationship(
27
+ back_populates="administrative_role_assignments", cascade="all, delete"
28
+ )
@@ -0,0 +1,47 @@
1
+ from typing import Optional
2
+
3
+ from pydantic import NonNegativeInt
4
+ from sqlalchemy import ForeignKey
5
+ from sqlalchemy.orm import Mapped, mapped_column, relationship
6
+
7
+ from cidc_api.models.db.base_orm import BaseORM
8
+ from cidc_api.models.types import (
9
+ CTCAEEventTerm,
10
+ CTCAEEventCode,
11
+ SeverityGradeSystem,
12
+ SeverityGradeSystemVersion,
13
+ SeverityGrade,
14
+ SystemOrganClass,
15
+ AttributionCause,
16
+ AttributionLikelihood,
17
+ YNU,
18
+ )
19
+
20
+
21
+ class AdverseEventORM(BaseORM):
22
+ __tablename__ = "adverse_event"
23
+ __repr_attrs__ = ["adverse_event_id", "participant_id", "event_term"]
24
+ __table_args__ = {"schema": "stage2"}
25
+
26
+ adverse_event_id: Mapped[int] = mapped_column(primary_key=True)
27
+ participant_id: Mapped[int] = mapped_column(ForeignKey("stage2.participant.participant_id", ondelete="CASCADE"))
28
+ treatment_id: Mapped[Optional[int]] = mapped_column(ForeignKey("stage2.treatment.treatment_id", ondelete="CASCADE"))
29
+
30
+ event_term: Mapped[Optional[CTCAEEventTerm]]
31
+ event_code: Mapped[Optional[CTCAEEventCode]]
32
+ severity_grade_system: Mapped[SeverityGradeSystem]
33
+ severity_grade_system_version: Mapped[SeverityGradeSystemVersion]
34
+ severity_grade: Mapped[SeverityGrade]
35
+ event_other_specify: Mapped[Optional[str]]
36
+ system_organ_class: Mapped[Optional[SystemOrganClass]]
37
+ discontinuation_due_to_event: Mapped[bool]
38
+ days_to_onset_of_event: Mapped[NonNegativeInt]
39
+ days_to_resolution_of_event: Mapped[Optional[NonNegativeInt]]
40
+ serious_adverse_event: Mapped[YNU]
41
+ dose_limiting_toxicity: Mapped[YNU]
42
+ attribution_cause: Mapped[AttributionCause]
43
+ attribution_likelihood: Mapped[AttributionLikelihood]
44
+ individual_therapy: Mapped[Optional[str]]
45
+
46
+ participant: Mapped["ParticipantORM"] = relationship(back_populates="adverse_events", cascade="all, delete")
47
+ treatment: Mapped["TreatmentORM"] = relationship(back_populates="adverse_events", cascade="all, delete")
@@ -0,0 +1,23 @@
1
+ from sqlalchemy import ForeignKey, ForeignKeyConstraint
2
+ from sqlalchemy.orm import Mapped, mapped_column, relationship
3
+
4
+ from cidc_api.models.db.base_orm import BaseORM
5
+
6
+
7
+ class ArmORM(BaseORM):
8
+ __tablename__ = "arm"
9
+ __repr_attrs__ = ["trial_id", "arm_name"]
10
+ __table_args__ = (
11
+ ForeignKeyConstraint(
12
+ ["trial_id", "version"], ["stage2.trial.trial_id", "stage2.trial.version"], ondelete="CASCADE"
13
+ ),
14
+ {"schema": "stage2"},
15
+ )
16
+
17
+ arm_id: Mapped[int] = mapped_column(primary_key=True)
18
+ trial_id: Mapped[str]
19
+ version: Mapped[str]
20
+
21
+ name: Mapped[str]
22
+
23
+ trial: Mapped["TrialORM"] = relationship(back_populates="arms", cascade="all, delete")
@@ -0,0 +1,23 @@
1
+ from typing import Optional
2
+
3
+ from sqlalchemy import ForeignKey
4
+ from sqlalchemy.orm import Mapped, mapped_column, relationship
5
+
6
+ from cidc_api.models.db.base_orm import BaseORM
7
+ from cidc_api.models.types import ECOGScore, KarnofskyScore
8
+
9
+
10
+ class BaselineClinicalAssessmentORM(BaseORM):
11
+ __tablename__ = "baseline_clinical_assessment"
12
+ __repr_attrs__ = ["baseline_clinical_assessment_id", "participant_id"]
13
+ __table_args__ = {"schema": "stage2"}
14
+
15
+ baseline_clinical_assessment_id: Mapped[int] = mapped_column(primary_key=True)
16
+ participant_id: Mapped[int] = mapped_column(ForeignKey("stage2.participant.participant_id", ondelete="CASCADE"))
17
+
18
+ ecog_score: Mapped[Optional[ECOGScore]]
19
+ karnofsky_score: Mapped[Optional[KarnofskyScore]]
20
+
21
+ participant: Mapped["ParticipantORM"] = relationship(
22
+ back_populates="baseline_clinical_assessment", cascade="all, delete"
23
+ )
@@ -0,0 +1,23 @@
1
+ from sqlalchemy import ForeignKeyConstraint
2
+ from sqlalchemy.orm import Mapped, mapped_column, relationship
3
+
4
+ from cidc_api.models.db.base_orm import BaseORM
5
+
6
+
7
+ class CohortORM(BaseORM):
8
+ __tablename__ = "cohort"
9
+ __repr_attrs__ = ["trial_id", "cohort_name"]
10
+ __table_args__ = (
11
+ ForeignKeyConstraint(
12
+ ["trial_id", "version"], ["stage2.trial.trial_id", "stage2.trial.version"], ondelete="CASCADE"
13
+ ),
14
+ {"schema": "stage2"},
15
+ )
16
+
17
+ cohort_id: Mapped[int] = mapped_column(primary_key=True)
18
+ trial_id: Mapped[str]
19
+ version: Mapped[str]
20
+
21
+ name: Mapped[str]
22
+
23
+ trial: Mapped["TrialORM"] = relationship(back_populates="cohorts", cascade="all, delete")
@@ -0,0 +1,24 @@
1
+ from typing import Optional
2
+
3
+ from sqlalchemy import ForeignKey
4
+ from sqlalchemy.orm import Mapped, mapped_column, relationship
5
+
6
+ from cidc_api.models.db.base_orm import BaseORM
7
+ from cidc_api.models.types import ICD10CMCode, ICD10CMTerm
8
+
9
+
10
+ class ComorbidityORM(BaseORM):
11
+ __tablename__ = "comorbidity"
12
+ __repr_attrs__ = ["comorbidity_id", "comorbidity_term"]
13
+ __table_args__ = {"schema": "stage2"}
14
+
15
+ comorbidity_id: Mapped[int] = mapped_column(primary_key=True)
16
+ medical_history_id: Mapped[int] = mapped_column(
17
+ ForeignKey("stage2.medical_history.medical_history_id", ondelete="CASCADE")
18
+ )
19
+
20
+ comorbidity_code: Mapped[Optional[ICD10CMCode]]
21
+ comorbidity_term: Mapped[Optional[ICD10CMTerm]]
22
+ comorbidity_other: Mapped[Optional[str]]
23
+
24
+ medical_history: Mapped["MedicalHistoryORM"] = relationship(back_populates="comorbidities", cascade="all, delete")
@@ -0,0 +1,31 @@
1
+ from typing import List
2
+
3
+ from pydantic import NonNegativeInt
4
+ from sqlalchemy import ForeignKeyConstraint
5
+ from sqlalchemy.orm import Mapped, mapped_column, relationship
6
+
7
+ from cidc_api.models.db.base_orm import BaseORM
8
+
9
+
10
+ class ConsentGroupORM(BaseORM):
11
+ __tablename__ = "consent_group"
12
+ __repr_attrs__ = ["consent_group_id", "consent_group_name"]
13
+ __table_args__ = (
14
+ ForeignKeyConstraint(
15
+ ["trial_id", "version"], ["stage2.trial.trial_id", "stage2.trial.version"], ondelete="CASCADE"
16
+ ),
17
+ {"schema": "stage2"},
18
+ )
19
+
20
+ consent_group_id: Mapped[int] = mapped_column(primary_key=True)
21
+ trial_id: Mapped[str]
22
+ version: Mapped[str]
23
+
24
+ consent_group_short_name: Mapped[str]
25
+ consent_group_name: Mapped[str]
26
+ consent_group_number: Mapped[NonNegativeInt]
27
+
28
+ trial: Mapped["TrialORM"] = relationship(back_populates="consent_groups", cascade="all, delete")
29
+ participants: Mapped[List["ParticipantORM"]] = relationship(
30
+ back_populates="consent_group", cascade="all, delete", passive_deletes=True
31
+ )
@@ -0,0 +1,32 @@
1
+ from typing import Optional
2
+
3
+ from sqlalchemy import ForeignKey
4
+ from sqlalchemy.orm import Mapped, mapped_column, relationship
5
+
6
+ from cidc_api.models.db.base_orm import BaseORM
7
+
8
+
9
+ class ContactORM(BaseORM):
10
+ __tablename__ = "contact"
11
+ __table_args__ = {"schema": "stage2"}
12
+
13
+ contact_id: Mapped[int] = mapped_column(primary_key=True)
14
+ institution_id: Mapped[int] = mapped_column(ForeignKey("stage2.institution.institution_id", ondelete="CASCADE"))
15
+ shipment_from_id: Mapped[Optional[int]] = mapped_column(
16
+ ForeignKey("stage2.shipment.shipment_id", ondelete="CASCADE")
17
+ )
18
+ shipment_to_id: Mapped[Optional[int]] = mapped_column(ForeignKey("stage2.shipment.shipment_id", ondelete="CASCADE"))
19
+
20
+ name: Mapped[Optional[str]]
21
+ email: Mapped[Optional[str]]
22
+ phone: Mapped[Optional[str]]
23
+ street1: Mapped[Optional[str]]
24
+ street2: Mapped[Optional[str]]
25
+ city: Mapped[Optional[str]]
26
+ state: Mapped[Optional[str]]
27
+ zip: Mapped[Optional[str]]
28
+ country: Mapped[Optional[str]]
29
+
30
+ institution: Mapped[Optional["InstitutionORM"]] = relationship(back_populates="contacts", cascade="all, delete")
31
+ shipment_from: Mapped["ShipmentORM"] = relationship(cascade="all, delete", foreign_keys=[shipment_from_id])
32
+ shipment_to: Mapped["ShipmentORM"] = relationship(cascade="all, delete", foreign_keys=[shipment_to_id])
@@ -0,0 +1,44 @@
1
+ from pydantic import NonNegativeFloat, PositiveFloat, PositiveInt
2
+
3
+ from sqlalchemy import ForeignKey
4
+ from sqlalchemy.orm import Mapped, mapped_column, relationship
5
+
6
+ from cidc_api.models.db.base_orm import BaseORM
7
+ from cidc_api.models.types import (
8
+ Sex,
9
+ Race,
10
+ Ethnicity,
11
+ HeightUnits,
12
+ WeightUnits,
13
+ BodySurfaceAreaUnits,
14
+ Occupation,
15
+ Education,
16
+ AgeAtEnrollmentUnits,
17
+ )
18
+
19
+
20
+ class DemographicORM(BaseORM):
21
+ __tablename__ = "demographic"
22
+ __repr_attrs__ = ["demographic_id", "participant_id", "age_at_enrollment", "sex"]
23
+ __table_args__ = {"schema": "stage2"}
24
+
25
+ demographic_id: Mapped[int] = mapped_column(primary_key=True)
26
+ participant_id: Mapped[int] = mapped_column(ForeignKey("stage2.participant.participant_id", ondelete="CASCADE"))
27
+ age_at_enrollment: Mapped[PositiveInt | None]
28
+ age_at_enrollment_units: Mapped[AgeAtEnrollmentUnits | None]
29
+ age_90_or_older: Mapped[bool]
30
+ sex: Mapped[Sex]
31
+ race: Mapped[Race]
32
+ ethnicity: Mapped[Ethnicity]
33
+ height: Mapped[PositiveFloat]
34
+ height_units: Mapped[HeightUnits]
35
+ weight: Mapped[PositiveFloat]
36
+ weight_units: Mapped[WeightUnits]
37
+ body_mass_index: Mapped[PositiveFloat]
38
+ body_surface_area: Mapped[PositiveFloat]
39
+ body_surface_area_units: Mapped[BodySurfaceAreaUnits]
40
+ occupation: Mapped[Occupation | None]
41
+ income: Mapped[NonNegativeFloat | None]
42
+ highest_level_of_education: Mapped[Education | None]
43
+
44
+ participant: Mapped["ParticipantORM"] = relationship(back_populates="demographic", cascade="all, delete")
@@ -0,0 +1,53 @@
1
+ from typing import List, Optional
2
+
3
+ from pydantic import NonPositiveInt
4
+ from sqlalchemy import ForeignKey
5
+ from sqlalchemy.orm import Mapped, mapped_column, relationship
6
+ from sqlalchemy.types import JSON
7
+
8
+ from cidc_api.models.db.base_orm import BaseORM
9
+ from cidc_api.models.types import (
10
+ PrimaryDiagnosisDiseaseGroup,
11
+ TumorGrade,
12
+ CancerStageSystem,
13
+ CancerStageSystemVersion,
14
+ CancerStage,
15
+ TCategory,
16
+ NCategory,
17
+ MCategory,
18
+ UberonAnatomicalTerm,
19
+ ICDO3MorphologicalCode,
20
+ ICDO3MorphologicalTerm,
21
+ YNU,
22
+ )
23
+ from sqlalchemy import String
24
+
25
+
26
+ class DiseaseORM(BaseORM):
27
+ __tablename__ = "disease"
28
+ __repr_attrs__ = [
29
+ "disease_id",
30
+ "participant_id",
31
+ ]
32
+ __table_args__ = {"schema": "stage2"}
33
+
34
+ disease_id: Mapped[int] = mapped_column(primary_key=True)
35
+ participant_id: Mapped[int] = mapped_column(ForeignKey("stage2.participant.participant_id", ondelete="CASCADE"))
36
+ primary_diagnosis_disease_group: Mapped[PrimaryDiagnosisDiseaseGroup]
37
+ primary_disease_site: Mapped[UberonAnatomicalTerm]
38
+ morphological_code: Mapped[ICDO3MorphologicalCode]
39
+ morphological_term: Mapped[ICDO3MorphologicalTerm]
40
+ cancer_type_description: Mapped[str | None]
41
+ days_since_original_diagnosis: Mapped[NonPositiveInt]
42
+ tumor_grade: Mapped[TumorGrade | None]
43
+ cancer_stage_system: Mapped[CancerStageSystem]
44
+ cancer_stage_system_version: Mapped[CancerStageSystemVersion | None] = mapped_column(String, nullable=True)
45
+ cancer_stage: Mapped[CancerStage] = mapped_column(String)
46
+ t_category: Mapped[TCategory]
47
+ n_category: Mapped[NCategory]
48
+ m_category: Mapped[MCategory]
49
+ metastatic_organ: Mapped[List[UberonAnatomicalTerm]] = mapped_column(JSON, nullable=True)
50
+ solely_extramedullary_disease: Mapped[YNU]
51
+ extramedullary_organ: Mapped[List[UberonAnatomicalTerm]] = mapped_column(JSON, nullable=True)
52
+
53
+ participant: Mapped["ParticipantORM"] = relationship(back_populates="diseases", cascade="all, delete")
@@ -0,0 +1,21 @@
1
+ from typing import List
2
+
3
+ from sqlalchemy import ForeignKey
4
+ from sqlalchemy.orm import Mapped, mapped_column, relationship
5
+
6
+ from cidc_api.models.db.base_orm import BaseORM
7
+ from cidc_api.models.types import YNU, ExposureType
8
+
9
+
10
+ class ExposureORM(BaseORM):
11
+ __tablename__ = "exposure"
12
+ __repr_attrs__ = ["exposure_id", "exposure_type", "carcinogen_exposure"]
13
+ __table_args__ = {"schema": "stage2"}
14
+
15
+ exposure_id: Mapped[int] = mapped_column(primary_key=True)
16
+ participant_id: Mapped[int] = mapped_column(ForeignKey("stage2.participant.participant_id", ondelete="CASCADE"))
17
+
18
+ carcinogen_exposure: Mapped[YNU]
19
+ exposure_type: Mapped[ExposureType]
20
+
21
+ participant: Mapped["ParticipantORM"] = relationship(back_populates="exposures", cascade="all, delete")
@@ -0,0 +1,38 @@
1
+ from datetime import datetime
2
+ from typing import Optional
3
+
4
+ from sqlalchemy import ForeignKeyConstraint, ForeignKey
5
+ from sqlalchemy.orm import Mapped, mapped_column, relationship
6
+
7
+ from cidc_api.models.db.base_orm import BaseORM
8
+ from cidc_api.models.types import ChecksumType, FileFormat
9
+
10
+
11
+ class FileORM(BaseORM):
12
+ __tablename__ = "file"
13
+ __table_args__ = (
14
+ ForeignKeyConstraint(
15
+ ["trial_id", "version"], ["stage2.trial.trial_id", "stage2.trial.version"], ondelete="CASCADE"
16
+ ),
17
+ {"schema": "stage2"},
18
+ )
19
+
20
+ file_id: Mapped[int] = mapped_column(primary_key=True)
21
+ trial_id: Mapped[str]
22
+ version: Mapped[str]
23
+
24
+ creator_id: Mapped[Optional[int]] = mapped_column(
25
+ ForeignKey("stage2.institution.institution_id", ondelete="CASCADE")
26
+ )
27
+ description: Mapped[Optional[str]]
28
+ uuid: Mapped[str]
29
+ file_name: Mapped[str]
30
+ object_url: Mapped[str]
31
+ uploaded_timestamp: Mapped[datetime]
32
+ file_size_bytes: Mapped[int]
33
+ checksum_value: Mapped[str]
34
+ checksum_type: Mapped[ChecksumType]
35
+ file_format: Mapped[FileFormat]
36
+
37
+ trial: Mapped["TrialORM"] = relationship(back_populates="files", cascade="all, delete")
38
+ creator: Mapped[Optional["InstitutionORM"]] = relationship(back_populates="files", cascade="all, delete")
@@ -0,0 +1,33 @@
1
+ from typing import List
2
+
3
+ from sqlalchemy import ForeignKey, UniqueConstraint
4
+ from sqlalchemy.orm import Mapped, mapped_column, relationship
5
+
6
+ from cidc_api.models.db.base_orm import BaseORM
7
+ from cidc_api.models.types import (
8
+ GVHDDiagnosisAcuteAssessmentSystem,
9
+ GVHDDiagnosisAcuteAssessmentSystemVersion,
10
+ GVHDDiagnosisAcuteGrade,
11
+ PreOrPostEnrollment,
12
+ )
13
+
14
+
15
+ class GVHDDiagnosisAcuteORM(BaseORM):
16
+ __tablename__ = "gvhd_diagnosis_acute"
17
+ __table_args__ = (
18
+ UniqueConstraint("participant_id", "pre_or_post_enrollment", name="unique_ix_gvhd_diagnosis_acute_pre_or_post"),
19
+ {"schema": "stage2"},
20
+ )
21
+ __repr_attrs__ = ["gvhd_diagnosis_acute_id", "pre_or_post_enrollment"]
22
+
23
+ gvhd_diagnosis_acute_id: Mapped[int] = mapped_column(primary_key=True)
24
+ participant_id: Mapped[int] = mapped_column(ForeignKey("stage2.participant.participant_id", ondelete="CASCADE"))
25
+ acute_assessment_system: Mapped[GVHDDiagnosisAcuteAssessmentSystem]
26
+ system_version: Mapped[GVHDDiagnosisAcuteAssessmentSystemVersion]
27
+ acute_grade: Mapped[GVHDDiagnosisAcuteGrade]
28
+ pre_or_post_enrollment: Mapped[PreOrPostEnrollment]
29
+
30
+ participant: Mapped["ParticipantORM"] = relationship(back_populates="gvhd_diagnosis_acutes", cascade="all, delete")
31
+ organs: Mapped[List["GVHDOrganAcuteORM"]] = relationship(
32
+ back_populates="diagnosis", cascade="all, delete", passive_deletes=True
33
+ )
@@ -0,0 +1,37 @@
1
+ from typing import List
2
+
3
+ from sqlalchemy import ForeignKey, UniqueConstraint
4
+ from sqlalchemy.orm import Mapped, mapped_column, relationship
5
+
6
+ from cidc_api.models.db.base_orm import BaseORM
7
+ from cidc_api.models.types import (
8
+ GVHDDiagnosisChronicAssessmentSystem,
9
+ GVHDDiagnosisChronicAssessmentSystemVersion,
10
+ GVHDDiagnosisChronicGlobalSeverity,
11
+ PreOrPostEnrollment,
12
+ )
13
+
14
+
15
+ class GVHDDiagnosisChronicORM(BaseORM):
16
+ __tablename__ = "gvhd_diagnosis_chronic"
17
+ __table_args__ = (
18
+ UniqueConstraint(
19
+ "participant_id", "pre_or_post_enrollment", name="unique_ix_gvhd_diagnosis_chronic_pre_or_post"
20
+ ),
21
+ {"schema": "stage2"},
22
+ )
23
+ __repr_attrs__ = ["gvhd_diagnosis_chronic_id", "pre_or_post_enrollment"]
24
+
25
+ gvhd_diagnosis_chronic_id: Mapped[int] = mapped_column(primary_key=True)
26
+ participant_id: Mapped[int] = mapped_column(ForeignKey("stage2.participant.participant_id", ondelete="CASCADE"))
27
+ chronic_assessment_system: Mapped[GVHDDiagnosisChronicAssessmentSystem]
28
+ system_version: Mapped[GVHDDiagnosisChronicAssessmentSystemVersion]
29
+ chronic_global_severity: Mapped[GVHDDiagnosisChronicGlobalSeverity]
30
+ pre_or_post_enrollment: Mapped[PreOrPostEnrollment]
31
+
32
+ participant: Mapped["ParticipantORM"] = relationship(
33
+ back_populates="gvhd_diagnosis_chronics", cascade="all, delete"
34
+ )
35
+ organs: Mapped[List["GVHDOrganChronicORM"]] = relationship(
36
+ back_populates="diagnosis", cascade="all, delete", passive_deletes=True
37
+ )