Skip to content

Commit b6989c4

Browse files
committed
migrate orm to pathlib.Path
1 parent 685f4ae commit b6989c4

20 files changed

+112
-58
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
from pathlib import Path
2+
3+
from sqlalchemy import String
4+
from sqlalchemy.engine import Dialect
5+
from sqlalchemy.types import TypeDecorator
6+
7+
8+
class StringPath(TypeDecorator[Path]):
9+
"""
10+
Decorator for a database path type.
11+
In SQL, the type will appear as a string.
12+
In Python, the type will appear as a path object.
13+
"""
14+
15+
impl = String
16+
17+
def process_bind_param(self, value: Path | None, dialect: Dialect) -> str | None:
18+
if value is None:
19+
return None
20+
21+
return str(value)
22+
23+
def process_result_value(self, value: str | None, dialect: Dialect) -> Path | None:
24+
if value is None:
25+
return None
26+
27+
return Path(value)

python/lib/db/models/dicom_archive.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from datetime import date, datetime
2+
from pathlib import Path
23
from typing import Optional
34

45
from sqlalchemy import ForeignKey
@@ -12,6 +13,7 @@
1213
import lib.db.models.session as db_session
1314
from lib.db.base import Base
1415
from lib.db.decorators.int_bool import IntBool
16+
from lib.db.decorators.string_path import StringPath
1517

1618

1719
class DbDicomArchive(Base):
@@ -37,8 +39,8 @@ class DbDicomArchive(Base):
3739
creating_user : Mapped[str] = mapped_column('CreatingUser')
3840
sum_type_version : Mapped[int] = mapped_column('sumTypeVersion')
3941
tar_type_version : Mapped[int | None] = mapped_column('tarTypeVersion')
40-
source_location : Mapped[str] = mapped_column('SourceLocation')
41-
archive_location : Mapped[str | None] = mapped_column('ArchiveLocation')
42+
source_path : Mapped[Path] = mapped_column('SourceLocation', StringPath)
43+
archive_path : Mapped[Path | None] = mapped_column('ArchiveLocation', StringPath)
4244
scanner_manufacturer : Mapped[str] = mapped_column('ScannerManufacturer')
4345
scanner_model : Mapped[str] = mapped_column('ScannerModel')
4446
scanner_serial_number : Mapped[str] = mapped_column('ScannerSerialNumber')

python/lib/db/models/file.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from datetime import date, datetime
2+
from pathlib import Path
23

34
from sqlalchemy import ForeignKey
45
from sqlalchemy.orm import Mapped, mapped_column, relationship
@@ -8,14 +9,15 @@
89
from lib.db.base import Base
910
from lib.db.decorators.int_bool import IntBool
1011
from lib.db.decorators.int_datetime import IntDatetime
12+
from lib.db.decorators.string_path import StringPath
1113

1214

1315
class DbFile(Base):
1416
__tablename__ = 'files'
1517

1618
id : Mapped[int] = mapped_column('FileID', primary_key=True)
1719
session_id : Mapped[int] = mapped_column('SessionID', ForeignKey('session.ID'))
18-
rel_path : Mapped[str] = mapped_column('File')
20+
path : Mapped[Path] = mapped_column('File', StringPath)
1921
series_uid : Mapped[str | None] = mapped_column('SeriesUID')
2022
echo_time : Mapped[float | None] = mapped_column('EchoTime')
2123
phase_encoding_direction : Mapped[str | None] = mapped_column('PhaseEncodingDirection')

python/lib/db/models/mri_protocol_violated_scan.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from datetime import datetime
2+
from pathlib import Path
23
from typing import Optional
34

45
from sqlalchemy import ForeignKey
@@ -8,6 +9,7 @@
89
import lib.db.models.dicom_archive as db_dicom_archive
910
import lib.db.models.mri_protocol_group as db_mri_protocol_group
1011
from lib.db.base import Base
12+
from lib.db.decorators.string_path import StringPath
1113

1214

1315
class DbMriProtocolViolatedScan(Base):
@@ -19,7 +21,7 @@ class DbMriProtocolViolatedScan(Base):
1921
dicom_archive_id : Mapped[int | None] = mapped_column('TarchiveID', ForeignKey('tarchive.TarchiveID'))
2022
time_run : Mapped[datetime | None] = mapped_column('time_run')
2123
series_description : Mapped[str | None] = mapped_column('series_description')
22-
file_rel_path : Mapped[str | None] = mapped_column('minc_location')
24+
file_path : Mapped[Path | None] = mapped_column('minc_location', StringPath)
2325
patient_name : Mapped[str | None] = mapped_column('PatientName')
2426
tr_range : Mapped[str | None] = mapped_column('TR_range')
2527
te_range : Mapped[str | None] = mapped_column('TE_range')

python/lib/db/models/mri_upload.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from datetime import datetime
2+
from pathlib import Path
23
from typing import Optional
34

45
from sqlalchemy import ForeignKey
@@ -8,6 +9,7 @@
89
import lib.db.models.session as db_session
910
from lib.db.base import Base
1011
from lib.db.decorators.int_bool import IntBool
12+
from lib.db.decorators.string_path import StringPath
1113
from lib.db.decorators.y_n_bool import YNBool
1214

1315

@@ -17,8 +19,8 @@ class DbMriUpload(Base):
1719
id : Mapped[int] = mapped_column('UploadID', primary_key=True)
1820
uploaded_by : Mapped[str] = mapped_column('UploadedBy')
1921
upload_date : Mapped[datetime | None] = mapped_column('UploadDate')
20-
upload_location : Mapped[str] = mapped_column('UploadLocation')
21-
decompressed_location : Mapped[str] = mapped_column('DecompressedLocation')
22+
upload_path : Mapped[Path] = mapped_column('UploadLocation', StringPath)
23+
decompressed_path : Mapped[Path] = mapped_column('DecompressedLocation', StringPath)
2224
insertion_complete : Mapped[bool] = mapped_column('InsertionComplete', IntBool)
2325
inserting : Mapped[bool | None] = mapped_column('Inserting', IntBool)
2426
patient_name : Mapped[str] = mapped_column('PatientName')

python/lib/db/models/mri_violation_log.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from datetime import datetime
2+
from pathlib import Path
23
from typing import Optional
34

45
from sqlalchemy import ForeignKey
@@ -9,6 +10,7 @@
910
import lib.db.models.mri_protocol_check_group as db_mri_protocol_check_group
1011
import lib.db.models.mri_scan_type as db_mri_scan_type
1112
from lib.db.base import Base
13+
from lib.db.decorators.string_path import StringPath
1214

1315

1416
class DbMriViolationLog(Base):
@@ -19,7 +21,7 @@ class DbMriViolationLog(Base):
1921
series_uid : Mapped[str | None] = mapped_column('SeriesUID')
2022
dicom_archive_id : Mapped[int | None] \
2123
= mapped_column('TarchiveID', ForeignKey('tarchive.TarchiveID'))
22-
file_rel_path : Mapped[str | None] = mapped_column('MincFile')
24+
file_path : Mapped[Path | None] = mapped_column('MincFile', StringPath)
2325
patient_name : Mapped[str | None] = mapped_column('PatientName')
2426
candidate_id : Mapped[int | None] = mapped_column('CandidateID', ForeignKey('candidate.ID'))
2527
visit_label : Mapped[str | None] = mapped_column('Visit_label')

python/lib/db/models/physio_channel.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from datetime import datetime
22
from decimal import Decimal
3+
from pathlib import Path
34

45
from sqlalchemy import ForeignKey
56
from sqlalchemy.orm import Mapped, mapped_column, relationship
@@ -8,6 +9,7 @@
89
import lib.db.models.physio_file as db_physio_file
910
import lib.db.models.physio_status_type as db_physio_status_type
1011
from lib.db.base import Base
12+
from lib.db.decorators.string_path import StringPath
1113

1214

1315
class DbPhysioChannel(Base):
@@ -28,7 +30,7 @@ class DbPhysioChannel(Base):
2830
reference : Mapped[str | None] = mapped_column('Reference')
2931
status_description : Mapped[str | None] = mapped_column('StatusDescription')
3032
unit : Mapped[str | None] = mapped_column('Unit')
31-
file_path : Mapped[str | None] = mapped_column('FilePath')
33+
file_path : Mapped[Path | None] = mapped_column('FilePath', StringPath)
3234

3335
physio_file : Mapped['db_physio_file.DbPhysioFile'] = relationship('DbPhysioFile', back_populates='channels')
3436
channel_type : Mapped['db_physio_channel_type.DbPhysioChannelType'] = relationship('DbPhysioChannelType')

python/lib/db/models/physio_coord_system.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from pathlib import Path
2+
13
from sqlalchemy import ForeignKey
24
from sqlalchemy.orm import Mapped, mapped_column, relationship
35

@@ -11,12 +13,12 @@
1113
class DbPhysioCoordSystem(Base):
1214
__tablename__ = 'physiological_coord_system'
1315

14-
id : Mapped[int] = mapped_column('PhysiologicalCoordSystemID', primary_key=True)
15-
name_id : Mapped[int] = mapped_column('NameID', ForeignKey('physiological_coord_system_name.PhysiologicalCoordSystemNameID'))
16-
type_id : Mapped[int] = mapped_column('TypeID', ForeignKey('physiological_coord_system_type.PhysiologicalCoordSystemTypeID'))
17-
unit_id : Mapped[int] = mapped_column('UnitID', ForeignKey('physiological_coord_system_unit.PhysiologicalCoordSystemUnitID'))
18-
modality_id : Mapped[int] = mapped_column('ModalityID', ForeignKey('physiological_modality.PhysiologicalModalityID'))
19-
file_path : Mapped[str | None] = mapped_column('FilePath')
16+
id : Mapped[int] = mapped_column('PhysiologicalCoordSystemID', primary_key=True)
17+
name_id : Mapped[int] = mapped_column('NameID', ForeignKey('physiological_coord_system_name.PhysiologicalCoordSystemNameID'))
18+
type_id : Mapped[int] = mapped_column('TypeID', ForeignKey('physiological_coord_system_type.PhysiologicalCoordSystemTypeID'))
19+
unit_id : Mapped[int] = mapped_column('UnitID', ForeignKey('physiological_coord_system_unit.PhysiologicalCoordSystemUnitID'))
20+
modality_id : Mapped[int] = mapped_column('ModalityID', ForeignKey('physiological_modality.PhysiologicalModalityID'))
21+
file_path : Mapped[Path | None] = mapped_column('FilePath')
2022

2123
name : Mapped['db_physio_coord_system_name.DbPhysioCoordSystemName'] = relationship('DbPhysioCoordSystemName')
2224
type : Mapped['db_physio_coord_system_type.DbPhysioCoordSystemType'] = relationship('DbPhysioCoordSystemType')

python/lib/db/models/physio_event_file.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from datetime import datetime
2+
from pathlib import Path
23

34
from sqlalchemy import ForeignKey
45
from sqlalchemy.orm import Mapped, mapped_column, relationship
@@ -9,18 +10,19 @@
910
import lib.db.models.physio_task_event as db_physio_task_event
1011
import lib.db.models.project as db_project
1112
from lib.db.base import Base
13+
from lib.db.decorators.string_path import StringPath
1214

1315

1416
class DbPhysioEventFile(Base):
1517
__tablename__ = 'physiological_event_file'
1618

17-
id : Mapped[int] = mapped_column('EventFileID', primary_key=True)
18-
physio_file_id : Mapped[int | None] = mapped_column('PhysiologicalFileID', ForeignKey('physiological_file.PhysiologicalFileID'))
19-
project_id : Mapped[int | None] = mapped_column('ProjectID', ForeignKey('Project.ProjectID'))
20-
file_type : Mapped[str] = mapped_column('FileType', ForeignKey('ImagingFileTypes.type'))
21-
file_path : Mapped[str | None] = mapped_column('FilePath')
22-
last_update : Mapped[datetime] = mapped_column('LastUpdate')
23-
last_written : Mapped[datetime] = mapped_column('LastWritten')
19+
id : Mapped[int] = mapped_column('EventFileID', primary_key=True)
20+
physio_file_id : Mapped[int | None] = mapped_column('PhysiologicalFileID', ForeignKey('physiological_file.PhysiologicalFileID'))
21+
project_id : Mapped[int | None] = mapped_column('ProjectID', ForeignKey('Project.ProjectID'))
22+
file_type : Mapped[str] = mapped_column('FileType', ForeignKey('ImagingFileTypes.type'))
23+
file_path : Mapped[Path | None] = mapped_column('FilePath', StringPath)
24+
last_update : Mapped[datetime] = mapped_column('LastUpdate')
25+
last_written : Mapped[datetime] = mapped_column('LastWritten')
2426

2527
physio_file : Mapped['db_physio_file.DbPhysioFile | None'] = relationship('PhysiologicalFile')
2628
project : Mapped['db_project.DbProject | None'] = relationship('Project')

python/lib/db/models/physio_file.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from datetime import datetime
2+
from pathlib import Path
23

34
from sqlalchemy import ForeignKey
45
from sqlalchemy.orm import Mapped, mapped_column, relationship
@@ -7,6 +8,7 @@
78
import lib.db.models.physio_modality as db_physio_modality
89
import lib.db.models.physio_output_type as db_physio_output_type
910
from lib.db.base import Base
11+
from lib.db.decorators.string_path import StringPath
1012

1113

1214
class DbPhysioFile(Base):
@@ -20,7 +22,7 @@ class DbPhysioFile(Base):
2022
file_type : Mapped[str | None] = mapped_column('FileType')
2123
acquisition_time : Mapped[datetime | None] = mapped_column('AcquisitionTime')
2224
inserted_by_user : Mapped[str] = mapped_column('InsertedByUser')
23-
path : Mapped[str] = mapped_column('FilePath')
25+
path : Mapped[Path] = mapped_column('FilePath', StringPath)
2426
index : Mapped[int | None] = mapped_column('Index')
2527
parent_id : Mapped[int | None] = mapped_column('ParentID')
2628

0 commit comments

Comments
 (0)