nci-cidc-api-modules 1.2.56__py3-none-any.whl → 1.2.57__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.
cidc_api/__init__.py CHANGED
@@ -1 +1 @@
1
- __version__ = "1.2.56"
1
+ __version__ = "1.2.57"
File without changes
@@ -0,0 +1,126 @@
1
+ from pathlib import Path
2
+ from typing import Iterable
3
+ from time import perf_counter
4
+
5
+ from textual import on
6
+ from textual.app import App, ComposeResult
7
+ from textual.containers import Container
8
+ from textual.widgets import Button, DirectoryTree, Footer, Header, Log, Select
9
+
10
+ from cidc_api.code_systems.importer import delete_data, import_data, load_app
11
+
12
+
13
+ class FilteredDirectoryTree(DirectoryTree):
14
+ def filter_paths(self, paths: Iterable[Path]) -> Iterable[Path]:
15
+ return [path for path in paths if path.name.endswith(".csv")]
16
+
17
+ def on_directory_tree_file_selected(self, event: DirectoryTree.FileSelected) -> None:
18
+ """Called when a file is selected in the directory tree."""
19
+ # log = self.app.query_one(Log)
20
+ # log.write_line(f"Selected file: {event.path.parent.name}/{event.path.name}")
21
+
22
+
23
+ class CodeSystems(App):
24
+ """A Textual app to manage code systems."""
25
+
26
+ CSS = """
27
+ Select { width: 40%; margin: 1;}
28
+ FilteredDirectoryTree { margin-left: 2; }
29
+ Button, Log { margin: 1 2; }
30
+ Container { height: 10; }
31
+ #results { margin: 1; text-style: bold; }
32
+ """
33
+
34
+ BINDINGS = [("d", "toggle_dark", "Toggle dark mode"), ("q", "quit", "Quit the app")]
35
+ SELECT_OPTIONS = [(code, code) for code in ["Ctcae60", "Icdo3"]]
36
+
37
+ def compose(self) -> ComposeResult:
38
+ """Create child widgets for the app."""
39
+ yield Header()
40
+ yield Select(self.SELECT_OPTIONS, prompt="Select code system")
41
+ with Container(id="tree-container"):
42
+ yield FilteredDirectoryTree(Path(__file__).resolve().parent / "data")
43
+ yield Button("Import data", variant="primary", disabled=True)
44
+ yield Log()
45
+ yield Footer()
46
+
47
+ @on(Select.Changed)
48
+ async def check_select(self, event: Select.Changed):
49
+
50
+ old_tree = self.query_one(FilteredDirectoryTree)
51
+ await old_tree.remove()
52
+
53
+ folder_name = event.value
54
+ new_path = Path(__file__).resolve().parent / "data" / folder_name
55
+ new_tree = FilteredDirectoryTree(str(new_path))
56
+ await self.query_one("#tree-container").mount(new_tree)
57
+ new_tree.focus() # optional: set focus to the new tree
58
+
59
+ self.maybe_enable_button()
60
+
61
+ @on(DirectoryTree.FileSelected)
62
+ def check_tree(self, _event: DirectoryTree.FileSelected):
63
+ self.maybe_enable_button()
64
+
65
+ def maybe_enable_button(self):
66
+ button_widget = self.query_one(Button)
67
+ code_system_widget = self.query_one(Select)
68
+ file_path_widget = self.query_one(FilteredDirectoryTree)
69
+ button_widget.disabled = not (
70
+ code_system_widget.value != Select.BLANK and file_path_widget.cursor_node.data.path.is_file()
71
+ )
72
+
73
+ # def on_ready(self) -> None:
74
+ # log = self.query_one(Log)
75
+ # log.write_line("Hello!")
76
+
77
+ def action_toggle_dark(self) -> None:
78
+ """An action to toggle dark mode."""
79
+ self.theme = "textual-dark" if self.theme == "textual-light" else "textual-light"
80
+
81
+ async def on_button_pressed(self, event: Button.Pressed) -> None:
82
+ """Event handler called when the button is pressed."""
83
+ code_system_widget = self.query_one(Select)
84
+ file_path_widget = self.query_one(FilteredDirectoryTree)
85
+ log_widget = self.query_one(Log)
86
+
87
+ log_widget.clear()
88
+ code_system = code_system_widget.value
89
+ file_path = file_path_widget.cursor_node.data.path
90
+
91
+ button = event.button
92
+ button.disabled = True
93
+ old_label = button.label
94
+ button.label = "Running task, please wait..."
95
+ await self.run_task(log_widget, code_system, file_path)
96
+ button.disabled = False
97
+ button.label = old_label
98
+
99
+ async def run_task(self, log_widget: Log, code_system: str, file_path: Path) -> None:
100
+ log_widget.write_line("Loading app ...")
101
+ start = perf_counter()
102
+
103
+ flask_app, db, model = await load_app(code_system)
104
+ table_name = model.__tablename__
105
+ schema = model.__table__.schema
106
+ log_widget.write_line(f"{perf_counter() - start:.3f} seconds to load app.\n\n")
107
+
108
+ with flask_app.app_context():
109
+ engine = db.engine
110
+
111
+ log_widget.write_line("Deleting data ...")
112
+ start = perf_counter()
113
+ msg = await delete_data(engine, f"{schema}.{table_name}")
114
+ log_widget.write_line(msg)
115
+ log_widget.write_line(f"{perf_counter() - start:.3f} seconds to delete data.\n\n")
116
+
117
+ log_widget.write_line("Importing data ...")
118
+ start = perf_counter()
119
+ msg = await import_data(engine, file_path, f"{schema}.{table_name}")
120
+ log_widget.write_line(msg)
121
+ log_widget.write_line(f"{perf_counter() - start:.3f} seconds to import data.")
122
+
123
+
124
+ if __name__ == "__main__":
125
+ app = CodeSystems()
126
+ app.run()
@@ -0,0 +1,34 @@
1
+ # Stubbed to accept any string
2
+ def is_ctcae_event_term(v):
3
+ if not isinstance(v, str):
4
+ raise TypeError("Value must be a string")
5
+ return v
6
+
7
+
8
+ # Stubbed to accept any string
9
+ def is_ctcae_event_code(v):
10
+ if not isinstance(v, str):
11
+ raise TypeError("Value must be a string")
12
+ return v
13
+
14
+
15
+ # Stubbed to accept any string
16
+ def is_ctcae_severity_grade(v):
17
+ if not isinstance(v, str):
18
+ raise TypeError("Value must be a string")
19
+ return v
20
+
21
+
22
+ # Stubbed to accept any string
23
+ def is_ctcae_system_organ_class(v):
24
+ if not isinstance(v, str):
25
+ raise TypeError("Value must be a string")
26
+ return v
27
+
28
+
29
+ # Determines if the CTCAE term is one of the "Other, specify" types of terms for which we include
30
+ # additional data about the AE.
31
+ def is_ctcae_other_term(v):
32
+ if isinstance(v, str):
33
+ return "Other, specify" in v
34
+ return False
@@ -0,0 +1,6 @@
1
+ # Stubbed to accept any string
2
+ # Should support MAGIC and Modified Glucksberg
3
+ def is_gvhd_organ(v):
4
+ if not isinstance(v, str):
5
+ raise TypeError("Value must be a string")
6
+ return v
@@ -0,0 +1,12 @@
1
+ # Stubbed to accept any string
2
+ def is_ICD10CM_code(v):
3
+ if not isinstance(v, str):
4
+ raise TypeError("Value must be a string")
5
+ return v
6
+
7
+
8
+ # Stubbed to accept any string
9
+ def is_ICD10CM_term(v):
10
+ if not isinstance(v, str):
11
+ raise TypeError("Value must be a string")
12
+ return v
@@ -0,0 +1,12 @@
1
+ # Stubbed to accept any string
2
+ def is_ICDO3_code(v):
3
+ if not isinstance(v, str):
4
+ raise TypeError("Value must be a string")
5
+ return v
6
+
7
+
8
+ # Stubbed to accept any string
9
+ def is_ICDO3_term(v):
10
+ if not isinstance(v, str):
11
+ raise TypeError("Value must be a string")
12
+ return v
@@ -0,0 +1,108 @@
1
+ # pylint: disable=import-outside-toplevel,broad-except,invalid-name,redefined-outer-name
2
+
3
+ from os import environ
4
+ from pathlib import Path
5
+ import asyncio
6
+ import importlib
7
+
8
+
9
+ async def load_app(model):
10
+ print("Loading app ...")
11
+
12
+ # async load to allow reporting progress in UI
13
+ flask_app_mod = await asyncio.to_thread(importlib.import_module, "cidc_api.app")
14
+ db_mod = await asyncio.to_thread(importlib.import_module, "cidc_api.config.db")
15
+ code_systems = await asyncio.to_thread(importlib.import_module, "cidc_api.models.code_systems")
16
+
17
+ return flask_app_mod.app, db_mod.db, getattr(code_systems, model)
18
+
19
+
20
+ async def import_data(engine, file_path, table_name):
21
+ print("Importing data ...")
22
+
23
+ conn = engine.raw_connection()
24
+ cursor = conn.cursor()
25
+
26
+ try:
27
+ with open(file_path, "r", encoding="utf-8") as file:
28
+ # define the COPY command, specifying STDIN for the file-like object
29
+ sql = f"COPY {table_name} FROM STDIN WITH CSV HEADER"
30
+
31
+ # execute the copy operation
32
+ cursor.copy_expert(sql, file)
33
+
34
+ msg = f"Number of rows copied: {cursor.rowcount}"
35
+ conn.commit()
36
+
37
+ except Exception as exc:
38
+ conn.rollback()
39
+ msg = f"Error during COPY command: {exc}"
40
+
41
+ finally:
42
+ cursor.close()
43
+ conn.close()
44
+
45
+ return msg
46
+
47
+
48
+ async def delete_data(engine, table_name):
49
+ print("Deleting data ...")
50
+
51
+ conn = engine.raw_connection()
52
+ cursor = conn.cursor()
53
+
54
+ try:
55
+ cursor.execute(f"TRUNCATE TABLE {table_name} RESTART IDENTITY")
56
+ msg = "Table truncated successfully."
57
+ conn.commit()
58
+
59
+ except Exception as exc:
60
+ conn.rollback()
61
+ msg = f"Error during TRUNCATE command: {exc}"
62
+
63
+ finally:
64
+ cursor.close()
65
+ conn.close()
66
+
67
+ return msg
68
+
69
+
70
+ async def call_local(table_name, file_path):
71
+ from dotenv import load_dotenv
72
+ from sqlalchemy import create_engine
73
+
74
+ load_dotenv()
75
+
76
+ engine = create_engine(environ.get("POSTGRES_URI"))
77
+ msg = await import_data(engine, file_path, table_name)
78
+
79
+ return msg
80
+
81
+
82
+ if __name__ == "__main__":
83
+ model = "Ctcae60"
84
+ file_path = Path(__file__).resolve().parent / "data/ctcae_6.0.csv"
85
+
86
+ # model = "Icdo3"
87
+ # file_path = Path(__file__).resolve().parent / "data/icdo3.csv"
88
+
89
+ # direct connection with conn string from env
90
+ # from dotenv import load_dotenv
91
+ # from sqlalchemy import create_engine
92
+ # load_dotenv()
93
+ # engine = create_engine(environ.get("POSTGRES_URI"))
94
+ # msg = asyncio.run(import_data(engine, file_path, table_name))
95
+
96
+ app, db, model = asyncio.run(load_app(model))
97
+ table_name = model.__tablename__
98
+ schema = model.__table__.schema
99
+ table_name = f"{schema}.{table_name}"
100
+
101
+ with app.app_context():
102
+ engine = db.engine
103
+
104
+ msg = asyncio.run(delete_data(engine, table_name))
105
+ print(msg)
106
+
107
+ msg = asyncio.run(import_data(engine, file_path, table_name))
108
+ print(msg)
@@ -0,0 +1,5 @@
1
+ # Stubbed to accept any string
2
+ def is_uberon_term(v):
3
+ if not isinstance(v, str):
4
+ raise TypeError("Value must be a string")
5
+ return v
@@ -11,7 +11,6 @@ from cidc_api.models.db.stage2 import all_models as stage2_all_db_models
11
11
  from cidc_api.models.db.stage1 import TrialORM as s1TrialORM
12
12
  from cidc_api.models.db.stage2 import TrialORM as s2TrialORM
13
13
 
14
-
15
14
  standard_data_categories = [
16
15
  model.__data_category__ for model in stage1_all_models if hasattr(model, "__data_category__")
17
16
  ]
@@ -24,7 +24,6 @@ from .therapy_agent_dose_orm import TherapyAgentDoseORM
24
24
  from .treatment_orm import TreatmentORM
25
25
  from .trial_orm import TrialORM
26
26
 
27
-
28
27
  __all__ = [
29
28
  "AdditionalTreatmentORM",
30
29
  "AdverseEventORM",
@@ -35,7 +35,6 @@ from .therapy_agent_dose_orm import TherapyAgentDoseORM
35
35
  from .treatment_orm import TreatmentORM
36
36
  from .trial_orm import TrialORM
37
37
 
38
-
39
38
  __all__ = [
40
39
  "AdditionalTreatmentORM",
41
40
  "AdministrativePersonORM",
@@ -1,7 +1,6 @@
1
1
  from typing import NamedTuple
2
2
  from typing_extensions import Literal
3
3
 
4
-
5
4
  FilePurpose = Literal["source", "analysis", "clinical", "miscellaneous"]
6
5
 
7
6
 
@@ -24,7 +24,6 @@ from .therapy_agent_dose import TherapyAgentDose
24
24
  from .treatment import Treatment
25
25
  from .trial import Trial
26
26
 
27
-
28
27
  __all__ = [
29
28
  "AdditionalTreatment",
30
29
  "AdverseEvent",
@@ -8,7 +8,6 @@ from cidc_api.models.pydantic.base import Base
8
8
  from cidc_api.models.pydantic.stage1.response import Response
9
9
  from cidc_api.models.types import ResponseSystem, ResponseSystemVersion, BestOverallResponse, YNUNA, YN
10
10
 
11
-
12
11
  negative_response_values = [
13
12
  "Progressive Disease",
14
13
  "Stable Disease",
@@ -35,7 +35,6 @@ from .therapy_agent_dose import TherapyAgentDose
35
35
  from .treatment import Treatment
36
36
  from .trial import Trial
37
37
 
38
-
39
38
  __all__ = [
40
39
  "AdditionalTreatment",
41
40
  "AdministrativePerson",
@@ -8,7 +8,6 @@ from cidc_api.models.pydantic.base import Base
8
8
  from cidc_api.models.pydantic.stage1.response import Response
9
9
  from cidc_api.models.types import ResponseSystem, ResponseSystemVersion, BestOverallResponse, YNUNA, YN
10
10
 
11
-
12
11
  negative_response_values = [
13
12
  "Progressive Disease",
14
13
  "Stable Disease",
@@ -70,7 +70,6 @@ from ..config.settings import (
70
70
  )
71
71
  from ..shared.utils import strip_whitespaces
72
72
 
73
-
74
73
  os.environ["TZ"] = "UTC"
75
74
  logger = get_logger(__name__)
76
75
 
cidc_api/shared/jose.py CHANGED
@@ -8,7 +8,6 @@ from cachetools import cached, TTLCache
8
8
  # loacal modules
9
9
  from ..config.settings import AUTH0_DOMAIN, AUTH0_CLIENT_ID
10
10
 
11
-
12
11
  ALGORITHMS = ["RS256"]
13
12
  TIMEOUT_IN_SECONDS = 20
14
13
  PUBLIC_KEYS_CACHE = TTLCache(maxsize=3600, ttl=1024) # 1 hour, 1 MB
@@ -1,49 +1,48 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nci_cidc_api_modules
3
- Version: 1.2.56
3
+ Version: 1.2.57
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
7
7
  Requires-Python: >=3.13
8
8
  Description-Content-Type: text/markdown
9
9
  License-File: LICENSE
10
- Requires-Dist: cachetools>=6.2.4
11
- Requires-Dist: certifi>=2026.1.4
12
- Requires-Dist: cloud-sql-python-connector[pg8000]>=1.20.0
13
- Requires-Dist: flask>=3.1.2
14
- Requires-Dist: flask-migrate>=4.1.0
15
- Requires-Dist: flask-sqlalchemy>=3.1.1
16
- Requires-Dist: flask-talisman>=0.7.0
10
+ Requires-Dist: cachetools~=7.0.0
11
+ Requires-Dist: certifi~=2026.1.4
12
+ Requires-Dist: cloud-sql-python-connector[pg8000]~=1.20.0
13
+ Requires-Dist: flask~=3.1.2
14
+ Requires-Dist: flask-migrate~=4.1.0
15
+ Requires-Dist: flask-sqlalchemy~=3.1.1
16
+ Requires-Dist: flask-talisman~=0.7.0
17
17
  Requires-Dist: gcloud-aio-storage~=9.6.1
18
- Requires-Dist: google-api-python-client>=2.188.0
19
- Requires-Dist: google-auth==2.47.0
20
- Requires-Dist: google-cloud-bigquery>=3.40.0
21
- Requires-Dist: google-cloud-pubsub>=2.34.0
22
- Requires-Dist: google-cloud-secret-manager>=2.26.0
23
- Requires-Dist: google-cloud-storage>=3.8.0
24
- Requires-Dist: jinja2>=3.1.6
25
- Requires-Dist: joserfc>=1.6.1
26
- Requires-Dist: marshmallow>=4.2.0
27
- Requires-Dist: marshmallow-sqlalchemy>=1.4.2
28
- Requires-Dist: numpy>=2.4.1
29
- Requires-Dist: packaging>=25.0
30
- Requires-Dist: pandas>=2.3.3
31
- Requires-Dist: pyarrow>=22.0.0
18
+ Requires-Dist: google-api-python-client~=2.188.0
19
+ Requires-Dist: google-auth==2.48.0
20
+ Requires-Dist: google-cloud-bigquery~=3.40.0
21
+ Requires-Dist: google-cloud-pubsub~=2.34.0
22
+ Requires-Dist: google-cloud-secret-manager~=2.26.0
23
+ Requires-Dist: google-cloud-storage~=3.9.0
24
+ Requires-Dist: jinja2~=3.1.6
25
+ Requires-Dist: joserfc~=1.6.1
26
+ Requires-Dist: marshmallow~=4.2.1
27
+ Requires-Dist: marshmallow-sqlalchemy~=1.4.2
28
+ Requires-Dist: numpy~=2.4.2
29
+ Requires-Dist: pandas~=3.0.0
30
+ Requires-Dist: pyarrow~=23.0.0
32
31
  Requires-Dist: pydantic~=2.12.5
33
- Requires-Dist: python-dotenv>=1.2.1
34
- Requires-Dist: requests>=2.32.5
35
- Requires-Dist: sqlalchemy>=2.0.45
32
+ Requires-Dist: python-dotenv~=1.2.1
33
+ Requires-Dist: requests~=2.32.5
34
+ Requires-Dist: sqlalchemy~=2.0.45
36
35
  Requires-Dist: sqlalchemy-mixins~=2.0.5
37
- Requires-Dist: werkzeug>=3.1.5
38
- Requires-Dist: opentelemetry-api>=1.39.1
39
- Requires-Dist: opentelemetry-exporter-otlp-proto-grpc>=1.39.1
40
- Requires-Dist: opentelemetry-sdk>=1.39.1
41
- Requires-Dist: opentelemetry-instrumentation-flask>=0.59b0
42
- Requires-Dist: opentelemetry-instrumentation-requests>=0.59b0
43
- Requires-Dist: opentelemetry-instrumentation-sqlalchemy>=0.59b0
44
- Requires-Dist: opentelemetry-exporter-gcp-trace>=1.11.0
45
- Requires-Dist: opentelemetry-propagator-gcp>=1.11.0
46
- Requires-Dist: nci-cidc-schemas==0.28.12
36
+ Requires-Dist: werkzeug~=3.1.5
37
+ Requires-Dist: opentelemetry-api~=1.39.1
38
+ Requires-Dist: opentelemetry-exporter-otlp-proto-grpc~=1.39.1
39
+ Requires-Dist: opentelemetry-sdk~=1.39.1
40
+ Requires-Dist: opentelemetry-instrumentation-flask~=0.59b0
41
+ Requires-Dist: opentelemetry-instrumentation-requests~=0.59b0
42
+ Requires-Dist: opentelemetry-instrumentation-sqlalchemy~=0.59b0
43
+ Requires-Dist: opentelemetry-exporter-gcp-trace~=1.11.0
44
+ Requires-Dist: opentelemetry-propagator-gcp~=1.11.0
45
+ Requires-Dist: nci-cidc-schemas==0.28.13
47
46
  Dynamic: description
48
47
  Dynamic: description-content-type
49
48
  Dynamic: home-page
@@ -1,6 +1,14 @@
1
1
  boot.py,sha256=a5zD_ORheoOy3CuEIwjM9jcR4_Phngz6nc-E6RYIEj8,585
2
- cidc_api/__init__.py,sha256=vHvjSAme38UPREXXcNqyijbgVzmFAnAOgLeqHeHpZAM,23
2
+ cidc_api/__init__.py,sha256=4bvatwbfE15IIgVfHJZH8d-WXGATbSGcT6GSdTUc1l0,23
3
3
  cidc_api/telemetry.py,sha256=SRPXhN1O4P2jYaRN_K4hAhFURygrzzRrkQsGZmghUUQ,3355
4
+ cidc_api/code_systems/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
+ cidc_api/code_systems/app.py,sha256=nyv7MBkOaZlB8trRCerWlOPOU9Hy-qCu71t8aLX1iQY,4804
6
+ cidc_api/code_systems/ctcae.py,sha256=H5JvDQ5R5kYbK37UxjhmXMnKD3d40HmG0DONxfhNxnE,871
7
+ cidc_api/code_systems/gvhd.py,sha256=r5jbHEa5yos0tmghjiruAeXI-r-4lU81JKCUpMHtO14,194
8
+ cidc_api/code_systems/icd10cm.py,sha256=K1vbTQB75uAQeKgj0U9izhtMKVb2vqp69_hyx3z_jro,300
9
+ cidc_api/code_systems/icdo3.py,sha256=A19yNX5-9Gs3X83kXcTlGgsXDTTJ9yR2dxEIoBVmpmU,296
10
+ cidc_api/code_systems/importer.py,sha256=61lu0FF0r_2Q6UX_UWMO_qP9J56Xphj4RVX5EdYb8Vw,2959
11
+ cidc_api/code_systems/uberon.py,sha256=BO2mYNDvPzZyLdhL_ZjCyEgHSLHuVifnTJvfktUfVWA,148
4
12
  cidc_api/config/__init__.py,sha256=5mX8GAPxUKV84iS-aGOoE-4m68LsOCGCDptXNdlgvj0,148
5
13
  cidc_api/config/db.py,sha256=mEz8ugjvRNGylCqDYHaaMqaZfDh7sbd76BowmfBvq5c,2428
6
14
  cidc_api/config/logging.py,sha256=abhVYtn8lfhIt0tyV2WHFgSmp_s2eeJh7kodB6LH4J0,1149
@@ -8,13 +16,13 @@ cidc_api/config/secrets.py,sha256=jRFj7W43pWuPf9DZQLCKF7WPXf5cUv-BAaS3ASqhV_Q,14
8
16
  cidc_api/config/settings.py,sha256=IlOSJhSyYYK4XQQ4uBdD58kXO-a2AHPWTSN1AT95b9Y,4545
9
17
  cidc_api/models/__init__.py,sha256=bl445G8Zic9YbhZ8ZBni07wtBMhLJRMBA-JqjLxx2bw,66
10
18
  cidc_api/models/code_systems.py,sha256=YR-SGg1UnCElHjibUauAFAs9ENLd7tT28V3sc-NQ4xk,918
11
- cidc_api/models/dataset.py,sha256=pz5CAzKioKCuArcXqD5MaLm-MnSRlr4I2VgNapGGjPA,3021
19
+ cidc_api/models/dataset.py,sha256=1rz2Gww5wsqWqXOOZ7hWY0lL2H3lA5YZ1k7u5zc5el8,3020
12
20
  cidc_api/models/errors.py,sha256=UncRrh-4v0CR5mpLO0erWD1y9ctus3Nk6XOSvrTjfco,338
13
21
  cidc_api/models/migrations.py,sha256=UlS5How3J4ryaRuZT6F5VQtAKikkl0LTv9MgMO_ltiQ,11161
14
22
  cidc_api/models/models.py,sha256=RycbGNQHIud9mqCyIH_yrnN7PVSFwbUCjP6pe6sX5VA,154106
15
23
  cidc_api/models/schemas.py,sha256=6IE2dJoEMcMbi0Vr1V3cYKnPKU0hv9vRKBixOZHe88s,2766
16
24
  cidc_api/models/types.py,sha256=V0N3RrrnP5bgj44bv3Aet1Mw424KgkcAOfv3QJRyRQI,30112
17
- cidc_api/models/db/stage1/__init__.py,sha256=zsxOSoogzL_xZ8B5OwcwLXvAmm6g2GYx1Zf6LLw8dq8,1917
25
+ cidc_api/models/db/stage1/__init__.py,sha256=4RIPYj7FZfFIk7N15mUPfuB_2DOQX_NmJSxvKASFUFA,1916
18
26
  cidc_api/models/db/stage1/additional_treatment_orm.py,sha256=Oe1wfYEOlMKAvNrOTCCnyXeEqAZtHSLk6d4ChIL2J58,1200
19
27
  cidc_api/models/db/stage1/adverse_event_orm.py,sha256=vhDDVMaksvXflH8unJJDlHL_8_SCFqWy0GWwxKSpge8,2194
20
28
  cidc_api/models/db/stage1/base_orm.py,sha256=izKizTf2W1fCK2CRUeyuErJbOaxNp6d299n4gqKWHDQ,246
@@ -41,7 +49,7 @@ cidc_api/models/db/stage1/surgery_orm.py,sha256=LaodgOnH4BJwt0Svvd37Q2RmdxNqa1sp
41
49
  cidc_api/models/db/stage1/therapy_agent_dose_orm.py,sha256=lwL1asNtJ70JRLTm5SXH7S8DZiQ0-oHGmc1sA5MbXR8,1580
42
50
  cidc_api/models/db/stage1/treatment_orm.py,sha256=qEuGOJATfOBJyKVmBaDEg0nRK2j65_HlmOoelkAvzec,1899
43
51
  cidc_api/models/db/stage1/trial_orm.py,sha256=orXC7srYEU_CY9m9VNE_1-iYP559Oqe6g8-NqdHXbto,1282
44
- cidc_api/models/db/stage2/__init__.py,sha256=R33BM1VDKJya5uuyYnPoGFVfhSViclIOklSoHH-EtBQ,2691
52
+ cidc_api/models/db/stage2/__init__.py,sha256=9KE50cL-l6T1GY4Hm4MRLPzoZQ-V_2syOIX0LEMISLc,2690
45
53
  cidc_api/models/db/stage2/additional_treatment_orm.py,sha256=bq_E9h-AeYjhaYHaKUHmQ1k_OSP1OtNeu6bupA-ZKP4,1198
46
54
  cidc_api/models/db/stage2/administrative_person_orm.py,sha256=49Mon6yLXjTRM-pypTL2R0qlIT1eJRqSaMGKNubjVak,1290
47
55
  cidc_api/models/db/stage2/administrative_role_assignment_orm.py,sha256=vi8Xwe3Xz7QlRSTO4zVSd-42YMAfBnY3RNWFrh90f-Y,1292
@@ -80,10 +88,10 @@ cidc_api/models/db/stage2/therapy_agent_dose_orm.py,sha256=obAA7uvTWvSc_1E80_9cP
80
88
  cidc_api/models/db/stage2/treatment_orm.py,sha256=WGLvAVR1SlGpT-j11eAtq2waNHhCN-ywE43mDZWdK_Y,2193
81
89
  cidc_api/models/db/stage2/trial_orm.py,sha256=ijQLs1JjalXcS-s0HDv2_O2HoPL7Xvv_9AXtGeFc6BU,2821
82
90
  cidc_api/models/files/__init__.py,sha256=8BMTnUSHzUbz0lBeEQY6NvApxDD3GMWMduoVMos2g4Y,213
83
- cidc_api/models/files/details.py,sha256=sZkGM7iEV4-J6IDQCdiMV6KBDLbPxCOqUMaU3aY9rX8,65153
91
+ cidc_api/models/files/details.py,sha256=EIk5yaUHtATOumxiHSZs2UtBWrAQRqIdZZn6d4oVuRQ,65152
84
92
  cidc_api/models/files/facets.py,sha256=vieZ3z_tYB29NqtvNzvKqajVwxM5ZLLZKeyQTq5lheU,33776
85
93
  cidc_api/models/pydantic/base.py,sha256=sL_0PwEH2vS8BMT_w-zL7CPeaU-R7ih5afRigX6k2DM,4069
86
- cidc_api/models/pydantic/stage1/__init__.py,sha256=H-NDjCd8isHTgZ7sqz-MIbzC-PpW1kEtR-x-Dyc8r6Q,1667
94
+ cidc_api/models/pydantic/stage1/__init__.py,sha256=4H1YlqHFbcaX62sA3NkHg025eSXtFxEwj1UPWhyXfHw,1666
87
95
  cidc_api/models/pydantic/stage1/additional_treatment.py,sha256=TFVzjd1NPLSfH9UnL2W3aZhpZSzDsg97j9IK8t882YA,1050
88
96
  cidc_api/models/pydantic/stage1/adverse_event.py,sha256=PanE03MgP70M_i3glCeBCtScuG4zIpyKiJZfeNAOOBc,5176
89
97
  cidc_api/models/pydantic/stage1/baseline_clinical_assessment.py,sha256=5FYvtOVf_nIK1h3xTs3vQgJe2ivQSVHt_wfrTSDgVxU,1119
@@ -102,14 +110,14 @@ cidc_api/models/pydantic/stage1/participant.py,sha256=QfRkK2okY7nM84y9QMK12kZLUR
102
110
  cidc_api/models/pydantic/stage1/prior_treatment.py,sha256=axhyPHwYCoIvcIonjyPJ95HUyaAXqIuOd6hhoDM3LJU,2101
103
111
  cidc_api/models/pydantic/stage1/radiotherapy_dose.py,sha256=8TbBqx_BYzwygQE-LxlSEK2ntIAFlTpAq_GS479TabI,3839
104
112
  cidc_api/models/pydantic/stage1/response.py,sha256=hq5_eJ2BEaVH8pdU444p3AKHuZMdLsoDZcMA3XQa8Rw,3491
105
- cidc_api/models/pydantic/stage1/response_by_system.py,sha256=0QbGX-ZTiAbLTXtcu8irukC4E72rS1ARrCCnTyboTno,12622
113
+ cidc_api/models/pydantic/stage1/response_by_system.py,sha256=JcsKCWTHaxubbaUTOpFs2U6EDjOTuqYog-GZXXAoBMg,12621
106
114
  cidc_api/models/pydantic/stage1/specimen.py,sha256=scDekZ-RtXOQTTLburhqT3RF4KM34iY9NAV1wYi_HSg,1281
107
115
  cidc_api/models/pydantic/stage1/stem_cell_transplant.py,sha256=XsDVUksqbIprPxHwLlwHGyji4jsIFNMcIk-S0H4rDnQ,1228
108
116
  cidc_api/models/pydantic/stage1/surgery.py,sha256=sHPzYMNusYIQrC6gjWopwxo0j9BNOq_Tcl6HKAMvuAQ,2421
109
117
  cidc_api/models/pydantic/stage1/therapy_agent_dose.py,sha256=XX7JM4CdvTuAsbI5rI4wYDcbevP46BetTk_z7N_EL-M,3527
110
118
  cidc_api/models/pydantic/stage1/treatment.py,sha256=eEjCcmkLdPmS2kg9dtUm3pt9apo1sRypBbte_xUVAYU,2607
111
119
  cidc_api/models/pydantic/stage1/trial.py,sha256=EfY7HZEn7HT_N5-g4hkYtAM5BQ3yiMRCtj4rm12UQ7U,1909
112
- cidc_api/models/pydantic/stage2/__init__.py,sha256=OQRG5wFkNsyAU_0KI1W5PDn8pBDe1EJDcgKZ19shh_g,2331
120
+ cidc_api/models/pydantic/stage2/__init__.py,sha256=jBLPaYfgZWqBL6fohtyKQxsjRbl0N4dtfnNdyEYLc1Y,2330
113
121
  cidc_api/models/pydantic/stage2/additional_treatment.py,sha256=TFVzjd1NPLSfH9UnL2W3aZhpZSzDsg97j9IK8t882YA,1050
114
122
  cidc_api/models/pydantic/stage2/administrative_person.py,sha256=3UYRgGLP7RukwZYTvQEnviDxBvWXj1uqditsoLJOw0s,1552
115
123
  cidc_api/models/pydantic/stage2/administrative_role_assignment.py,sha256=kWUciVSnczjejdBSlynsVxSQ4dytDdgw9OxSvgzParg,536
@@ -137,7 +145,7 @@ cidc_api/models/pydantic/stage2/prior_treatment.py,sha256=axhyPHwYCoIvcIonjyPJ95
137
145
  cidc_api/models/pydantic/stage2/publication.py,sha256=GBuvqBf0lyOoopN1S-3qX310xFxhixk7oDJLuGzLuiw,1817
138
146
  cidc_api/models/pydantic/stage2/radiotherapy_dose.py,sha256=8TbBqx_BYzwygQE-LxlSEK2ntIAFlTpAq_GS479TabI,3839
139
147
  cidc_api/models/pydantic/stage2/response.py,sha256=hq5_eJ2BEaVH8pdU444p3AKHuZMdLsoDZcMA3XQa8Rw,3491
140
- cidc_api/models/pydantic/stage2/response_by_system.py,sha256=vW0Xj_hYRa3W-JbqJgvty559_B9x5UIySaAOhIDVMOs,9853
148
+ cidc_api/models/pydantic/stage2/response_by_system.py,sha256=G5fZltd1szrtz0eyQ5IIbOwQUTMEqPy-f3JKe8OucZM,9852
141
149
  cidc_api/models/pydantic/stage2/shipment.py,sha256=dsZcDPikCRS3cjr58EGHHJ2gjir78J4cdHh_1SwFyrQ,1595
142
150
  cidc_api/models/pydantic/stage2/shipment_specimen.py,sha256=exR7joXsH3Xd-o5vJV_Z-az33Edr8BBm5LCDv01iMI4,488
143
151
  cidc_api/models/pydantic/stage2/specimen.py,sha256=scDekZ-RtXOQTTLburhqT3RF4KM34iY9NAV1wYi_HSg,1281
@@ -152,12 +160,12 @@ cidc_api/shared/auth.py,sha256=EIP9AKokLNrI79Fkpv3P7WdzaddJIsuGGICc1W494X0,9110
152
160
  cidc_api/shared/email_layout.html,sha256=pBoTNw3ACHH-ncZFaNvcy5bXMqPwizR78usb0uCYtIc,7670
153
161
  cidc_api/shared/emails.py,sha256=8kNFEaSnKpY-GX_iE59QUhSp3c4_uzy3SpHYt2QjuqI,6121
154
162
  cidc_api/shared/file_handling.py,sha256=9MZXx5RfXO3A_pXf8Ulb7DQEuyp9j12eO9ad-PcTBXo,5908
155
- cidc_api/shared/gcloud_client.py,sha256=EJ2ZzZ0gwDOZx18PEzXil4F-jpruacShkVIoecw8qzY,40751
156
- cidc_api/shared/jose.py,sha256=-qzGzEDAlokEp9E7WtBtQkXyyfPWTYXlwYpCqVJWmqM,1830
163
+ cidc_api/shared/gcloud_client.py,sha256=nhyU11hZ049bez3-QaPC-Y3NZ-1t7o9XwT_QkE9ds6k,40750
164
+ cidc_api/shared/jose.py,sha256=gNXVjZMHMPRfG6hoTeDxRi4HjbIo_JTBnZ6C9LaHh1I,1829
157
165
  cidc_api/shared/rest_utils.py,sha256=RwR30WOUAYCxL7V-i2totEyeriG30GbBDvBcpLXhM9w,6594
158
166
  cidc_api/shared/utils.py,sha256=-gLnzxCR9E6h0plt2xrNisUG5_Y6GhhVwz3DgDIzpvs,367
159
- nci_cidc_api_modules-1.2.56.dist-info/licenses/LICENSE,sha256=pNYWVTHaYonnmJyplmeAp7tQAjosmDpAWjb34jjv7Xs,1102
160
- nci_cidc_api_modules-1.2.56.dist-info/METADATA,sha256=NS_GSV4rLWWKJ7vN5bxj3fISWowaOS8feJS-SHaXci4,40301
161
- nci_cidc_api_modules-1.2.56.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
162
- nci_cidc_api_modules-1.2.56.dist-info/top_level.txt,sha256=BSJqF6ura8-bWCKZvarvQEKvidMM05lH0bLQsNOrI0o,14
163
- nci_cidc_api_modules-1.2.56.dist-info/RECORD,,
167
+ nci_cidc_api_modules-1.2.57.dist-info/licenses/LICENSE,sha256=pNYWVTHaYonnmJyplmeAp7tQAjosmDpAWjb34jjv7Xs,1102
168
+ nci_cidc_api_modules-1.2.57.dist-info/METADATA,sha256=dJEJsXit5jKfR1MP7cwOpF1F4s4lP2Mg_W_Q-z1L51w,40270
169
+ nci_cidc_api_modules-1.2.57.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
170
+ nci_cidc_api_modules-1.2.57.dist-info/top_level.txt,sha256=BSJqF6ura8-bWCKZvarvQEKvidMM05lH0bLQsNOrI0o,14
171
+ nci_cidc_api_modules-1.2.57.dist-info/RECORD,,