def anonymise_with_pseudo_cli(args): if args.delete_unknown_tags: handle_unknown_tags = True elif args.ignore_unknown_tags: handle_unknown_tags = False else: handle_unknown_tags = None if not args.keywords_to_leave_unchanged: keywords_to_leave_unchanged = () else: keywords_to_leave_unchanged = args.keywords_to_leave_unchanged replacement_strategy = None if args.pseudo: logging.info("Was run with pseudo!") identifying_keywords_for_pseudo = get_default_pseudonymisation_keywords( ) logging.info("Using pseudonymisation keywords") replacement_strategy = strategy.pseudonymisation_dispatch logging.info("Using pseudonymisation strategy") if isfile(args.input_path): anonymise_file( dicom_filepath=args.input_path, output_filepath=args.output_path, delete_original_file=args.delete_original_files, anonymise_filename=not args.preserve_filenames, replace_values=not args.clear_values, keywords_to_leave_unchanged=keywords_to_leave_unchanged, delete_private_tags=not args.keep_private_tags, delete_unknown_tags=handle_unknown_tags, replacement_strategy=replacement_strategy, identifying_keywords=identifying_keywords_for_pseudo, ) elif isdir(args.input_path): anonymise_directory( dicom_dirpath=args.input_path, output_dirpath=args.output_path, delete_original_files=args.delete_original_files, anonymise_filenames=not args.preserve_filenames, replace_values=not args.clear_values, keywords_to_leave_unchanged=keywords_to_leave_unchanged, delete_private_tags=not args.keep_private_tags, delete_unknown_tags=handle_unknown_tags, replacement_strategy=replacement_strategy, identifying_keywords=identifying_keywords_for_pseudo, ) else: raise FileNotFoundError( "No file or directory was found at the supplied input path.")
def test_anonymise_file(): assert not is_anonymised_file(TEST_FILEPATH) temp_basename = "{}_{}.dcm".format(".".join(TEST_FILEPATH.split(".")[:-1]), uuid4()) temp_filepath = pjoin(dirname(TEST_FILEPATH), temp_basename) anon_private_filepath = "" anon_filepath_orig = "" anon_filepath_pres = "" try: # Private tag handling anon_private_filepath = anonymise_file(TEST_FILEPATH, delete_private_tags=False) assert not is_anonymised_file(anon_private_filepath, ignore_private_tags=False) assert is_anonymised_file(anon_private_filepath, ignore_private_tags=True) anon_private_filepath = anonymise_file(TEST_FILEPATH, delete_private_tags=True) assert is_anonymised_file(anon_private_filepath, ignore_private_tags=False) # Filename is anonymised? assert basename(anon_private_filepath) == TEST_ANON_BASENAME # Deletion of original file copyfile(TEST_FILEPATH, temp_filepath) anon_filepath_orig = anonymise_file(temp_filepath, delete_original_file=True) assert is_anonymised_file(anon_filepath_orig) assert not exists(temp_filepath) # Preservation of filename if desired expected_filepath = "{}_Anonymised.dcm".format(".".join( TEST_FILEPATH.split(".")[:-1])) anon_filepath_pres = anonymise_file(TEST_FILEPATH, anonymise_filename=False) assert anon_filepath_pres == expected_filepath finally: remove_file(temp_filepath) remove_file(anon_private_filepath) remove_file(anon_filepath_orig) remove_file(anon_filepath_pres)
def test_alternative_identifying_keywords(): alternative_keyword_list = copy.copy(get_default_identifying_keywords()) alternative_keyword_list.append("SOPInstanceUID") test_file_path = get_treatment_record_test_file_path() ds_test = pydicom.dcmread(test_file_path, force=True) with tempfile.TemporaryDirectory() as output_directory: anon_private_filepath = anonymise_file( test_file_path, output_filepath=output_directory, delete_private_tags=True, identifying_keywords=alternative_keyword_list, ) ds_anon = pydicom.dcmread(anon_private_filepath, force=True) assert is_anonymised_file(anon_private_filepath, ignore_private_tags=False) assert ds_test["SOPInstanceUID"].value != ds_anon["SOPInstanceUID"].value
def _test_pseudonymise_file_at_path( test_file_path, test_identifying_keywords=None, test_replacement_strategy=None ): assert not is_anonymised_file(test_file_path) if test_identifying_keywords is None: identifying_keywords_for_pseudo = ( pseudonymisation_api.get_default_pseudonymisation_keywords() ) logging.info("Using pseudonymisation keywords") else: identifying_keywords_for_pseudo = test_identifying_keywords if test_replacement_strategy is None: replacement_strategy = pseudonymisation_api.pseudonymisation_dispatch logging.info("Using pseudonymisation strategy") else: replacement_strategy = test_replacement_strategy with tempfile.TemporaryDirectory() as output_directory: pseudonymised_file_path = anonymise_file( dicom_filepath=test_file_path, output_filepath=output_directory, delete_original_file=False, anonymise_filename=True, replace_values=True, # keywords_to_leave_unchanged=None, delete_private_tags=True, delete_unknown_tags=True, replacement_strategy=replacement_strategy, identifying_keywords=identifying_keywords_for_pseudo, ) # debug print + Assert to force the print # print("Pseudonymised file at: ", pseudonymised_file_path) # assert False assert exists(pseudonymised_file_path) ds_input = pydicom.dcmread(test_file_path, force=True) ds_pseudo = pydicom.dcmread(pseudonymised_file_path, force=True) # simplistic stand-in to make sure *something* is happening assert ds_input["PatientID"].value != ds_pseudo["PatientID"].value # make sure that we are not accidentally using the hardcode replacement approach assert ds_pseudo["PatientID"].value not in ["", "Anonymous"]