Mercurial > hg > orthanc
comparison OrthancServer/OrthancRestApi/OrthancRestAnonymizeModify.cpp @ 2517:d3d306bc4b99
refactoring
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Thu, 29 Mar 2018 14:35:48 +0200 |
parents | 8cc3ca64a534 |
children | 63d2cc0fb40a |
comparison
equal
deleted
inserted
replaced
2516:48db5c1fcbf3 | 2517:d3d306bc4b99 |
---|---|
160 throw OrthancException(ErrorCode_BadFileFormat); | 160 throw OrthancException(ErrorCode_BadFileFormat); |
161 } | 161 } |
162 } | 162 } |
163 | 163 |
164 | 164 |
165 bool OrthancRestApi::ParseModifyRequest(DicomModification& target, | 165 void OrthancRestApi::ParseModifyRequest(DicomModification& target, |
166 const Json::Value& request) | 166 const Json::Value& request) |
167 { | 167 { |
168 if (request.isObject()) | 168 if (!request.isObject()) |
169 { | 169 { |
170 bool force = GetBooleanValue("Force", request, false); | 170 throw OrthancException(ErrorCode_BadFileFormat); |
171 } | |
172 | |
173 bool force = GetBooleanValue("Force", request, false); | |
171 | 174 |
172 if (GetBooleanValue("RemovePrivateTags", request, false)) | 175 if (GetBooleanValue("RemovePrivateTags", request, false)) |
173 { | 176 { |
174 target.SetRemovePrivateTags(true); | 177 target.SetRemovePrivateTags(true); |
175 } | 178 } |
176 | 179 |
177 if (request.isMember("Remove")) | 180 if (request.isMember("Remove")) |
178 { | 181 { |
179 ParseListOfTags(target, request["Remove"], TagOperation_Remove, force); | 182 ParseListOfTags(target, request["Remove"], TagOperation_Remove, force); |
180 } | 183 } |
181 | 184 |
182 if (request.isMember("Replace")) | 185 if (request.isMember("Replace")) |
183 { | 186 { |
184 ParseReplacements(target, request["Replace"], force); | 187 ParseReplacements(target, request["Replace"], force); |
185 } | 188 } |
186 | 189 |
187 // The "Keep" operation only makes sense for the tags | 190 // The "Keep" operation only makes sense for the tags |
188 // StudyInstanceUID, SeriesInstanceUID and SOPInstanceUID. Avoid | 191 // StudyInstanceUID, SeriesInstanceUID and SOPInstanceUID. Avoid |
189 // this feature as much as possible, as this breaks the DICOM | 192 // this feature as much as possible, as this breaks the DICOM |
190 // model of the real world, except if you know exactly what | 193 // model of the real world, except if you know exactly what |
191 // you're doing! | 194 // you're doing! |
192 if (request.isMember("Keep")) | 195 if (request.isMember("Keep")) |
193 { | 196 { |
194 ParseListOfTags(target, request["Keep"], TagOperation_Keep, force); | 197 ParseListOfTags(target, request["Keep"], TagOperation_Keep, force); |
195 } | 198 } |
196 | 199 } |
197 return true; | 200 |
198 } | 201 |
199 else | 202 static void ParseAnonymizationRequest(DicomModification& target, |
200 { | 203 const Json::Value& request, |
201 return false; | 204 ServerContext& context) |
202 } | 205 { |
203 } | 206 if (!request.isObject()) |
204 | 207 { |
205 | 208 throw OrthancException(ErrorCode_BadFileFormat); |
206 static bool ParseModifyRequest(DicomModification& target, | |
207 const RestApiPostCall& call) | |
208 { | |
209 // curl http://localhost:8042/series/95a6e2bf-9296e2cc-bf614e2f-22b391ee-16e010e0/modify -X POST -d '{"Replace":{"InstitutionName":"My own clinic"}}' | |
210 | |
211 Json::Value request; | |
212 if (call.ParseJsonRequest(request)) | |
213 { | |
214 return OrthancRestApi::ParseModifyRequest(target, request); | |
215 } | |
216 else | |
217 { | |
218 return false; | |
219 } | |
220 } | |
221 | |
222 | |
223 static bool ParseAnonymizationRequest(DicomModification& target, | |
224 RestApiPostCall& call) | |
225 { | |
226 // curl http://localhost:8042/instances/6e67da51-d119d6ae-c5667437-87b9a8a5-0f07c49f/anonymize -X POST -d '{"Replace":{"PatientName":"hello","0010-0020":"world"},"Keep":["StudyDescription", "SeriesDescription"],"KeepPrivateTags": true,"Remove":["Modality"]}' > Anonymized.dcm | |
227 | |
228 Json::Value request; | |
229 if (!call.ParseJsonRequest(request) || | |
230 !request.isObject()) | |
231 { | |
232 return false; | |
233 } | 209 } |
234 | 210 |
235 bool force = GetBooleanValue("Force", request, false); | 211 bool force = GetBooleanValue("Force", request, false); |
236 | 212 |
237 // As of Orthanc 1.3.0, the default anonymization is done | 213 // As of Orthanc 1.3.0, the default anonymization is done |
248 version = StringToDicomVersion(request["DicomVersion"].asString()); | 224 version = StringToDicomVersion(request["DicomVersion"].asString()); |
249 } | 225 } |
250 } | 226 } |
251 | 227 |
252 target.SetupAnonymization(version); | 228 target.SetupAnonymization(version); |
253 std::string patientName = target.GetReplacementAsString(DICOM_TAG_PATIENT_NAME); | 229 |
230 std::string patientName = target.GetReplacementAsString(DICOM_TAG_PATIENT_NAME); | |
254 | 231 |
255 if (GetBooleanValue("KeepPrivateTags", request, false)) | 232 if (GetBooleanValue("KeepPrivateTags", request, false)) |
256 { | 233 { |
257 target.SetRemovePrivateTags(false); | 234 target.SetRemovePrivateTags(false); |
258 } | 235 } |
275 if (target.IsReplaced(DICOM_TAG_PATIENT_NAME) && | 252 if (target.IsReplaced(DICOM_TAG_PATIENT_NAME) && |
276 target.GetReplacement(DICOM_TAG_PATIENT_NAME) == patientName) | 253 target.GetReplacement(DICOM_TAG_PATIENT_NAME) == patientName) |
277 { | 254 { |
278 // Overwrite the random Patient's Name by one that is more | 255 // Overwrite the random Patient's Name by one that is more |
279 // user-friendly (provided none was specified by the user) | 256 // user-friendly (provided none was specified by the user) |
280 target.Replace(DICOM_TAG_PATIENT_NAME, GeneratePatientName(OrthancRestApi::GetContext(call)), true); | 257 target.Replace(DICOM_TAG_PATIENT_NAME, GeneratePatientName(context), true); |
281 } | 258 } |
282 | 259 } |
283 return true; | 260 |
261 | |
262 static void ParseModifyRequest(DicomModification& target, | |
263 const RestApiPostCall& call) | |
264 { | |
265 // curl http://localhost:8042/series/95a6e2bf-9296e2cc-bf614e2f-22b391ee-16e010e0/modify -X POST -d '{"Replace":{"InstitutionName":"My own clinic"}}' | |
266 | |
267 Json::Value request; | |
268 if (call.ParseJsonRequest(request)) | |
269 { | |
270 OrthancRestApi::ParseModifyRequest(target, request); | |
271 } | |
272 else | |
273 { | |
274 throw OrthancException(ErrorCode_BadFileFormat); | |
275 } | |
276 } | |
277 | |
278 | |
279 static void ParseAnonymizationRequest(DicomModification& target, | |
280 RestApiPostCall& call) | |
281 { | |
282 // curl http://localhost:8042/instances/6e67da51-d119d6ae-c5667437-87b9a8a5-0f07c49f/anonymize -X POST -d '{"Replace":{"PatientName":"hello","0010-0020":"world"},"Keep":["StudyDescription", "SeriesDescription"],"KeepPrivateTags": true,"Remove":["Modality"]}' > Anonymized.dcm | |
283 | |
284 Json::Value request; | |
285 if (call.ParseJsonRequest(request) && | |
286 request.isObject()) | |
287 { | |
288 ParseAnonymizationRequest(target, request, OrthancRestApi::GetContext(call)); | |
289 } | |
290 else | |
291 { | |
292 throw OrthancException(ErrorCode_BadFileFormat); | |
293 } | |
284 } | 294 } |
285 | 295 |
286 | 296 |
287 static void AnonymizeOrModifyInstance(DicomModification& modification, | 297 static void AnonymizeOrModifyInstance(DicomModification& modification, |
288 RestApiPostCall& call) | 298 RestApiPostCall& call) |
440 static void ModifyInstance(RestApiPostCall& call) | 450 static void ModifyInstance(RestApiPostCall& call) |
441 { | 451 { |
442 DicomModification modification; | 452 DicomModification modification; |
443 modification.SetAllowManualIdentifiers(true); | 453 modification.SetAllowManualIdentifiers(true); |
444 | 454 |
445 if (ParseModifyRequest(modification, call)) | 455 ParseModifyRequest(modification, call); |
446 { | 456 |
447 if (modification.IsReplaced(DICOM_TAG_PATIENT_ID)) | 457 if (modification.IsReplaced(DICOM_TAG_PATIENT_ID)) |
448 { | 458 { |
449 modification.SetLevel(ResourceType_Patient); | 459 modification.SetLevel(ResourceType_Patient); |
450 } | 460 } |
451 else if (modification.IsReplaced(DICOM_TAG_STUDY_INSTANCE_UID)) | 461 else if (modification.IsReplaced(DICOM_TAG_STUDY_INSTANCE_UID)) |
452 { | 462 { |
453 modification.SetLevel(ResourceType_Study); | 463 modification.SetLevel(ResourceType_Study); |
454 } | 464 } |
455 else if (modification.IsReplaced(DICOM_TAG_SERIES_INSTANCE_UID)) | 465 else if (modification.IsReplaced(DICOM_TAG_SERIES_INSTANCE_UID)) |
456 { | 466 { |
457 modification.SetLevel(ResourceType_Series); | 467 modification.SetLevel(ResourceType_Series); |
458 } | 468 } |
459 else | 469 else |
460 { | 470 { |
461 modification.SetLevel(ResourceType_Instance); | 471 modification.SetLevel(ResourceType_Instance); |
462 } | 472 } |
463 | 473 |
464 AnonymizeOrModifyInstance(modification, call); | 474 AnonymizeOrModifyInstance(modification, call); |
465 } | |
466 } | 475 } |
467 | 476 |
468 | 477 |
469 static void AnonymizeInstance(RestApiPostCall& call) | 478 static void AnonymizeInstance(RestApiPostCall& call) |
470 { | 479 { |
471 DicomModification modification; | 480 DicomModification modification; |
472 modification.SetAllowManualIdentifiers(true); | 481 modification.SetAllowManualIdentifiers(true); |
473 | 482 |
474 if (ParseAnonymizationRequest(modification, call)) | 483 ParseAnonymizationRequest(modification, call); |
475 { | 484 |
476 AnonymizeOrModifyInstance(modification, call); | 485 AnonymizeOrModifyInstance(modification, call); |
477 } | |
478 } | 486 } |
479 | 487 |
480 | 488 |
481 template <enum ChangeType changeType, | 489 template <enum ChangeType changeType, |
482 enum ResourceType resourceType> | 490 enum ResourceType resourceType> |
483 static void ModifyResource(RestApiPostCall& call) | 491 static void ModifyResource(RestApiPostCall& call) |
484 { | 492 { |
485 DicomModification modification; | 493 DicomModification modification; |
486 | 494 |
487 if (ParseModifyRequest(modification, call)) | 495 ParseModifyRequest(modification, call); |
488 { | 496 |
489 modification.SetLevel(resourceType); | 497 modification.SetLevel(resourceType); |
490 AnonymizeOrModifyResource(modification, MetadataType_ModifiedFrom, | 498 AnonymizeOrModifyResource(modification, MetadataType_ModifiedFrom, |
491 changeType, resourceType, call); | 499 changeType, resourceType, call); |
492 } | |
493 } | 500 } |
494 | 501 |
495 | 502 |
496 template <enum ChangeType changeType, | 503 template <enum ChangeType changeType, |
497 enum ResourceType resourceType> | 504 enum ResourceType resourceType> |
498 static void AnonymizeResource(RestApiPostCall& call) | 505 static void AnonymizeResource(RestApiPostCall& call) |
499 { | 506 { |
500 DicomModification modification; | 507 DicomModification modification; |
501 | 508 |
502 if (ParseAnonymizationRequest(modification, call)) | 509 ParseAnonymizationRequest(modification, call); |
503 { | 510 |
504 AnonymizeOrModifyResource(modification, MetadataType_AnonymizedFrom, | 511 AnonymizeOrModifyResource(modification, MetadataType_AnonymizedFrom, |
505 changeType, resourceType, call); | 512 changeType, resourceType, call); |
506 } | |
507 } | 513 } |
508 | 514 |
509 | 515 |
510 static void StoreCreatedInstance(std::string& id /* out */, | 516 static void StoreCreatedInstance(std::string& id /* out */, |
511 RestApiPostCall& call, | 517 RestApiPostCall& call, |