From 284f018b52ec06810ec8ffed994386ec2a2697df Mon Sep 17 00:00:00 2001 From: Piotr Gawron <piotr.gawron@uni.lu> Date: Tue, 17 Nov 2020 10:11:30 +0100 Subject: [PATCH] visit date column name is configurable --- smash/web/importer/csv_tns_visit_import_reader.py | 14 ++++++++++++-- smash/web/migrations/0179_visitimportdata.py | 1 + smash/web/models/etl/visit_import.py | 7 +++++++ .../importer/test_tns_csv_visit_import_reader.py | 9 +++++++++ 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/smash/web/importer/csv_tns_visit_import_reader.py b/smash/web/importer/csv_tns_visit_import_reader.py index 9842573d..ec174b34 100644 --- a/smash/web/importer/csv_tns_visit_import_reader.py +++ b/smash/web/importer/csv_tns_visit_import_reader.py @@ -50,9 +50,12 @@ class TnsCsvVisitImportReader: data = {} for h, v in zip(headers, row): data[h] = v + nd_number = self.get_study_subject_id(data) + study_subject = self.get_study_subject_by_id(nd_number) - date = self.extract_date(data['dateofvisit']) + + date = self.get_visit_date(data) location = self.extract_location(data) @@ -179,6 +182,12 @@ class TnsCsvVisitImportReader: return result + def get_visit_date(self, data: dict) -> datetime: + try: + return TnsCsvVisitImportReader.extract_date(data[self.visit_import_data.visit_date_column_name]) + except KeyError as e: + raise EtlException('Visit date is not defined') from e + def get_study_subject_by_id(self, nd_number: str) -> StudySubject: study_subjects = StudySubject.objects.filter(nd_number=nd_number, study=self.visit_import_data.study) if len(study_subjects) == 0: @@ -199,7 +208,8 @@ class TnsCsvVisitImportReader: except KeyError as e: raise EtlException('Subject id is not defined') from e - def extract_date(self, text: str) -> datetime: + @staticmethod + def extract_date(text: str) -> datetime: # by default use day after tomorrow result = datetime.datetime.now().replace(hour=9, minute=0) + datetime.timedelta(days=2) diff --git a/smash/web/migrations/0179_visitimportdata.py b/smash/web/migrations/0179_visitimportdata.py index 83d8d742..fece3e79 100644 --- a/smash/web/migrations/0179_visitimportdata.py +++ b/smash/web/migrations/0179_visitimportdata.py @@ -19,6 +19,7 @@ class Migration(migrations.Migration): ('import_worker', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='web.Worker', verbose_name='Worker used by importer')), ('study', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, to='web.Study', verbose_name='Study')), ('subject_id_column_name', models.CharField(blank=False, default='donor_id', max_length=128, null=False,verbose_name='Subject id column name')), + ('visit_date_column_name', models.CharField(blank=False, default='dateofvisit', max_length=128, null=False,verbose_name='Visit date column name')), ], ), ] diff --git a/smash/web/models/etl/visit_import.py b/smash/web/models/etl/visit_import.py index d613677f..7247cc1f 100644 --- a/smash/web/models/etl/visit_import.py +++ b/smash/web/models/etl/visit_import.py @@ -31,3 +31,10 @@ class VisitImportData(models.Model): null=False, blank=False ) + + visit_date_column_name = models.CharField(max_length=128, + verbose_name='Visit date column name', + default='dateofvisit', + null=False, + blank=False + ) diff --git a/smash/web/tests/importer/test_tns_csv_visit_import_reader.py b/smash/web/tests/importer/test_tns_csv_visit_import_reader.py index b5f56c80..a1b8f17b 100644 --- a/smash/web/tests/importer/test_tns_csv_visit_import_reader.py +++ b/smash/web/tests/importer/test_tns_csv_visit_import_reader.py @@ -170,6 +170,15 @@ class TestTnsCsvVisitReader(TestCase): subject_id = TnsCsvVisitImportReader(self.visit_import_data).get_study_subject_id({'donor_id': 'x001'}) self.assertEqual('x001', subject_id) + def test_get_visit_date_by_invalid_id_column(self): + self.assertRaises(EtlException, + TnsCsvVisitImportReader(self.visit_import_data).get_visit_date, + {'invalid_date': '19901010'}) + + def test_get_visit_date_by_valid_id_column(self): + visit_date = TnsCsvVisitImportReader(self.visit_import_data).get_visit_date({'dateofvisit': '19901010'}) + self.assertEqual(1990, visit_date.year) + def test_get_study_subject_by_id_for_existing_subject(self): reader = TnsCsvVisitImportReader(self.visit_import_data) study_subject = StudySubject.objects.get(nd_number='cov-000111') -- GitLab