diff --git a/smash/web/importer/csv_tns_visit_import_reader.py b/smash/web/importer/csv_tns_visit_import_reader.py index 9842573db0fa1a197b35135143544bf39883f96a..ec174b3415d1d96db99da007a815c839761475f2 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 83d8d74250379d2986eb1c1034c72012bac74ace..fece3e794d703a031333e31dbccf72ecb6007833 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 d613677f300e6a3453cb50060d27906573f9d4ad..7247cc1f8b3892f6dd892444af4e22a3a1db1921 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 b5f56c8018f5a698c5509955d3be4c0f3c8d88dd..a1b8f17b1ba00b248d6ab0c006aa6a1492d01ef4 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')