From b066e20081a3300bdf594e94ed8f0b770306b242 Mon Sep 17 00:00:00 2001 From: Piotr Gawron <piotr.gawron@uni.lu> Date: Sun, 5 Apr 2020 22:08:27 +0200 Subject: [PATCH] properly handle invalid date strings --- smash/web/importer/csv_subject_import_reader.py | 7 ++++++- smash/web/tests/data/import_date_of_birth.csv | 4 ++++ .../web/tests/importer/test_csv_subject_import_reader.py | 8 ++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 smash/web/tests/data/import_date_of_birth.csv diff --git a/smash/web/importer/csv_subject_import_reader.py b/smash/web/importer/csv_subject_import_reader.py index 54883161..187b59ab 100644 --- a/smash/web/importer/csv_subject_import_reader.py +++ b/smash/web/importer/csv_subject_import_reader.py @@ -60,7 +60,12 @@ class CsvSubjectImportReader(SubjectImportReader): def get_new_date_value(self, old_value, column_name, new_value): # type: (datetime,unicode,unicode) -> datetime if old_value is None or old_value == "": - return datetime.datetime.strptime(new_value, CSV_DATE_FORMAT) + try: + result = datetime.datetime.strptime(new_value, CSV_DATE_FORMAT) + except ValueError: + logger.warn("Invalid date: " + new_value) + result = old_value + return result if new_value is None or new_value == "": return old_value logger.warn( diff --git a/smash/web/tests/data/import_date_of_birth.csv b/smash/web/tests/data/import_date_of_birth.csv new file mode 100644 index 00000000..43d9adb8 --- /dev/null +++ b/smash/web/tests/data/import_date_of_birth.csv @@ -0,0 +1,4 @@ +first_name,last_name,participant_id,date_born +Piotr,Gawron,Cov-000001, +Piotr,Gawron,Cov-000002,invalid +Piotr,Gawron,Cov-000003,2222-20-20 \ No newline at end of file diff --git a/smash/web/tests/importer/test_csv_subject_import_reader.py b/smash/web/tests/importer/test_csv_subject_import_reader.py index 79846518..a80f3234 100644 --- a/smash/web/tests/importer/test_csv_subject_import_reader.py +++ b/smash/web/tests/importer/test_csv_subject_import_reader.py @@ -27,3 +27,11 @@ class TestCsvReader(TestCase): self.assertEqual(2020, study_subject.subject.date_born.year) self.assertIsNotNone(study_subject.study) + + def test_load_problematic_dates(self): + filename = get_resource_path('import_date_of_birth.csv') + study_subjects = CsvSubjectImportReader().load_data(filename) + self.assertEqual(3, len(study_subjects)) + self.assertIsNone(study_subjects[0].subject.date_born) + self.assertIsNone(study_subjects[1].subject.date_born) + self.assertIsNone(study_subjects[2].subject.date_born) -- GitLab