From 7725e0b1d26dc3596f7dc300fe9767d7d805bffc Mon Sep 17 00:00:00 2001 From: Benoit Crickboom Date: Thu, 15 Feb 2024 17:55:15 +0100 Subject: [PATCH] clean up --- advanced-setup/README.md | 8 +++----- proxy.py | 4 ---- simple-setup/README.md | 2 +- stimuli/CT_small2.dcm | Bin 0 -> 39236 bytes 4 files changed, 4 insertions(+), 10 deletions(-) create mode 100644 stimuli/CT_small2.dcm diff --git a/advanced-setup/README.md b/advanced-setup/README.md index 1cf03b2..e796761 100644 --- a/advanced-setup/README.md +++ b/advanced-setup/README.md @@ -5,6 +5,7 @@ between a DICOM compliant modality and a dicomweb compliant PACS. This advanced setup includes Keycloak. The Orthanc user has permissions only on a specific tag, so that not all the studies are available. +Of course, this setup is relevant only if the DICOMweb server to query is Orthanc... # Description @@ -15,9 +16,6 @@ This demo contains the same containers as the sample setup plus: # Starting the setup -- To start the setup, type: `docker-compose up --build` -- visit Keycloak admin page, get the client secret and put it in the compose, the restart the setup +- To start the setup, type: `docker-compose up -d --build` +- visit Keycloak admin page, get the client secret and put it in the compose, then restart the setup - still in Keycloak admin page, add an `api-key` attribute (and value) for the user from the proxy - -# demo -TODO \ No newline at end of file diff --git a/proxy.py b/proxy.py index cb57a69..fabad16 100644 --- a/proxy.py +++ b/proxy.py @@ -140,8 +140,6 @@ def OnFind(answers, query, issuerAet, calledAet): answers.FindAddAnswer(orthanc.CreateDicom( json.dumps(dicomTagsList), None, orthanc.CreateDicomFlags.NONE)) -# todo: test scenario - def WadoRs(request, dicomwebServerAlias = None): # Let's build the payload @@ -202,8 +200,6 @@ def GetOrthancAliasFromAET(AET): raise Exception('It seems that the modality issuing the original DICOM query is not registered in the Proxy config!') def OnMove(**request): - print("entering in move------------------") - time.sleep(18) # fetch the resource from the dicomweb server if request["SourceAET"] in {None, ''}: raise Exception('The DICOM query does not contain a value for the SourceAET, unable to process it!') diff --git a/simple-setup/README.md b/simple-setup/README.md index 8e229fc..8fcd094 100644 --- a/simple-setup/README.md +++ b/simple-setup/README.md @@ -15,7 +15,7 @@ the modality to dicomweb queries. It also converts the dicomweb replies from the # Starting the setup -To start the setup, type: `docker-compose up --build` +To start the setup, type: `docker-compose up -d --build` # demo diff --git a/stimuli/CT_small2.dcm b/stimuli/CT_small2.dcm new file mode 100644 index 0000000000000000000000000000000000000000..914bef9dc4b47b123c29fcb3aae47756fb56542e GIT binary patch literal 39236 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
j1e$?qlez2LdBHb3e3w45>y{vU_2W8qb3yEb+ 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 Up$;FI58Q<3ga1!Ayt7pIKhUb#aR2}S literal 0 HcmV?d00001