diff --git a/src/server.py b/src/server.py index 1f327a60..d985b21d 100644 --- a/src/server.py +++ b/src/server.py @@ -7,8 +7,11 @@ import logging -from pynetdicom import AE, StoragePresentationContexts, evt +import pydicom.uid as dicom_uid +from pynetdicom import AE, evt from pynetdicom.sop_class import ( + DigitalMammographyXRayImageStorageForPresentation, # type: ignore[attr-defined] + DigitalMammographyXRayImageStorageForProcessing, # type: ignore[attr-defined] ModalityPerformedProcedureStep, # type: ignore[attr-defined] ModalityWorklistInformationFind, # type: ignore[attr-defined] ) @@ -56,8 +59,17 @@ def start(self): """Start the PACS server and listen for incoming connections.""" logger.info(f"Starting PACS server: {self.ae_title} on port {self.port}") + transfer_syntaxes = [ + dicom_uid.JPEGLosslessSV1, # Hologic preferred + dicom_uid.ExplicitVRLittleEndian, + dicom_uid.ImplicitVRLittleEndian, + dicom_uid.ExplicitVRBigEndian, + dicom_uid.JPEGLSLossless, + dicom_uid.JPEG2000Lossless, + ] self.ae = AE(ae_title=self.ae_title) - self.ae.supported_contexts = StoragePresentationContexts + self.ae.add_supported_context(DigitalMammographyXRayImageStorageForPresentation, transfer_syntaxes) + self.ae.add_supported_context(DigitalMammographyXRayImageStorageForProcessing, transfer_syntaxes) handlers = [ (evt.EVT_C_ECHO, CEcho().call), diff --git a/src/services/dicom/c_store.py b/src/services/dicom/c_store.py index acfe45ad..55205634 100644 --- a/src/services/dicom/c_store.py +++ b/src/services/dicom/c_store.py @@ -3,10 +3,6 @@ from pydicom import Dataset, dcmwrite from pynetdicom.events import Event -from pynetdicom.sop_class import ( - DigitalMammographyXRayImageStorageForPresentation, # type: ignore - DigitalMammographyXRayImageStorageForProcessing, # type: ignore -) from services.dicom import FAILURE, SUCCESS from services.dicom.image_compressor import ImageCompressor @@ -18,11 +14,6 @@ class CStore: - VALID_SOP_CLASSES = [ - DigitalMammographyXRayImageStorageForPresentation, - DigitalMammographyXRayImageStorageForProcessing, - ] - def __init__( self, storage: PACSStorage, @@ -42,10 +33,6 @@ def call(self, event: Event) -> int: ds = event.dataset ds.file_meta = event.file_meta - if ds.file_meta.MediaStorageSOPClassUID not in self.VALID_SOP_CLASSES: - logger.error(f"Invalid SOP Class UID: {ds.file_meta.MediaStorageSOPClassUID}") - return FAILURE - sop_instance_uid = ds.get("SOPInstanceUID", "") accession_number = ds.get("AccessionNumber", "") patient_id = ds.get("PatientID") diff --git a/tests/test_server.py b/tests/test_server.py index 23a76197..da9844e8 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -3,6 +3,8 @@ from pynetdicom import evt from pynetdicom.sop_class import ( # pyright: ignore[reportAttributeAccessIssue] + DigitalMammographyXRayImageStorageForPresentation, + DigitalMammographyXRayImageStorageForProcessing, ModalityPerformedProcedureStep, ModalityWorklistInformationFind, ) @@ -51,6 +53,9 @@ def test_start(self, mock_c_store, mock_c_echo, mock_ae, _mock_pacs_storage, _mo assert subject.ae == mock_ae.return_value mock_ae.assert_called_once_with(ae_title="SCREENING_PACS") + add_context_calls = [call.args[0] for call in mock_ae.return_value.add_supported_context.call_args_list] + assert DigitalMammographyXRayImageStorageForPresentation in add_context_calls + assert DigitalMammographyXRayImageStorageForProcessing in add_context_calls mock_ae.return_value.start_server.assert_called_once_with( ("0.0.0.0", 4244), block=True,