Skip to content
Snippets Groups Projects
Commit a74d7d6c authored by Piotr Gawron's avatar Piotr Gawron
Browse files

allow to import language for written communication

parent 99d846dc
No related branches found
No related tags found
1 merge request!301Error logging
......@@ -5,7 +5,7 @@ from typing import List, Type, Tuple
from django.db import models
from django.db.models import Field
from web.models import StudySubject, Subject, SubjectImportData
from web.models import StudySubject, Subject, SubjectImportData, Language
from .etl_common import EtlCommon
from .subject_import_reader import SubjectImportReader
......@@ -52,6 +52,9 @@ class CsvSubjectImportReader(SubjectImportReader):
if field.get_internal_type() == "DateField":
value = self.get_date(value)
if field.get_internal_type() == "ForeignKey":
value = self.get_value_for_foreign_field(field, value)
if table == Subject:
old_val = getattr(study_subject.subject, field.name)
setattr(study_subject.subject, field.name, self.get_new_value(old_val, value))
......@@ -61,6 +64,20 @@ class CsvSubjectImportReader(SubjectImportReader):
else:
logger.warning("Don't know how to handle column " + column_name + " with data " + value)
@staticmethod
def get_value_for_foreign_field(field, value):
if field.related_model == Language:
if value == "":
return None
else:
language = Language.objects.filter(name=value).first()
if language is None:
language = Language.objects.create(name=value)
return language
else:
logger.warning("Don't know how to handle type " + str(field.related_model))
return None
def get_table_and_field(self, column_name: str) -> Tuple[Type[models.Model], Field]:
return self.mappings.get(column_name, (None, None))
......@@ -68,7 +85,8 @@ class CsvSubjectImportReader(SubjectImportReader):
for field in object_type._meta.get_fields():
if field.get_internal_type() == "CharField" or \
field.get_internal_type() == "DateField" or \
field.get_internal_type() == "TextField":
field.get_internal_type() == "TextField" or \
(field.get_internal_type() == "ForeignKey" and field.related_model in (Language,)):
found = False
for mapping in self.import_data.column_mappings.all():
if mapping.table_name == object_type._meta.db_table and field.name == mapping.column_name:
......
first_name,last_name,participant_id,default_written_communication_language
Piotr,Gawron,Cov-000001,English
Piotr,Gawron,Cov-000002,Polish
Piotr,Gawron,Cov-000003,
\ No newline at end of file
......@@ -51,6 +51,18 @@ class TestCsvReader(TestCase):
self.assertIsNone(study_subjects[1].subject.date_born)
self.assertIsNone(study_subjects[2].subject.date_born)
def test_load_language(self):
self.subject_import_data.filename = get_resource_path('import_language.csv')
study_subjects = CsvSubjectImportReader(self.subject_import_data).load_data()
for study_subject in study_subjects:
study_subject.subject.save()
study_subject.save()
self.assertEqual(3, len(study_subjects))
self.assertIsNotNone(study_subjects[0].subject.default_written_communication_language)
self.assertIsNotNone(study_subjects[1].subject.default_written_communication_language)
self.assertIsNone(study_subjects[2].subject.default_written_communication_language)
def test_load_data_for_tns(self):
self.subject_import_data = SubjectImportData.objects.create(study=get_test_study(),
date_format="%d/%m/%Y",
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment