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