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,