diff --git a/smash/web/importer/importer.py b/smash/web/importer/importer.py index 1e9b377e3da44042c3b8607181adab60c8e5d6a8..2b089534df235d9e75cff8696dd8364719ead303 100644 --- a/smash/web/importer/importer.py +++ b/smash/web/importer/importer.py @@ -3,6 +3,8 @@ import logging import sys import traceback +from django.db import models + from subject_import_reader import SubjectImportReader from warning_counter import MsgCounterHandler from web.models import StudySubject, Subject @@ -57,7 +59,21 @@ class Importer(object): db_study_subjects = StudySubject.objects.filter(screening_number=study_subject.screening_number) if db_study_subjects.count() > 0: db_study_subject = db_study_subjects.first() - raise NotImplementedError() + for field in Subject._meta.get_fields(): + if field.get_internal_type() == "CharField" or field.get_internal_type() == "DateField" or field.get_internal_type() is "BooleanField": + new_value = getattr(study_subject.subject, field.name) + if new_value is not None and new_value != "": + setattr(db_study_subject.subject, field.name, new_value) + print db_study_subject.subject.first_name + db_study_subject.subject.save() + + for field in StudySubject._meta.get_fields(): + if field.get_internal_type() == "CharField" or field.get_internal_type() == "DateField" or field.get_internal_type() is "BooleanField": + new_value = getattr(study_subject, field.name) + if new_value is not None and new_value != "": + setattr(db_study_subject, field.name, new_value) + db_study_subject.save() + self.merged_count += 1 else: study_subject.subject.save() study_subject.subject = Subject.objects.filter(id=study_subject.subject.id)[0] diff --git a/smash/web/tests/importer/test_importer.py b/smash/web/tests/importer/test_importer.py index da4bb9c32478f532683b291892bc8252f4e8419f..fe12f9bec7ae03af96f39cbd229dcde9b9d63030 100644 --- a/smash/web/tests/importer/test_importer.py +++ b/smash/web/tests/importer/test_importer.py @@ -1,10 +1,12 @@ # coding=utf-8 +import datetime import logging from django.test import TestCase from mock_reader import MockReader +from tests.functions import create_study_subject from web.importer import Importer from web.models import Subject, StudySubject, Study from web.models.constants import GLOBAL_STUDY_ID @@ -70,3 +72,35 @@ class TestImporter(TestCase): self.assertEqual(0, importer.added_count) self.assertEqual(1, importer.problematic_count) + + def test_import_merge_subject(self): + existing_study_subject = create_study_subject() + study_subjects = [] + subject = Subject() + subject.first_name = "XYZ" + subject.last_name = "AAA" + subject.date_born = datetime.datetime.now() + study_subject = StudySubject() + study_subject.screening_number = existing_study_subject.screening_number + study_subject.subject = subject + study_subject.study = self.study + study_subjects.append(study_subject) + + importer = Importer(filename="empty.csv", reader=MockReader(study_subjects)) + subject_counter = Subject.objects.count() + study_subject_counter = StudySubject.objects.count() + importer.execute() + + self.assertEqual(subject_counter, Subject.objects.count()) + self.assertEqual(study_subject_counter, StudySubject.objects.count()) + + self.assertEqual(0, importer.added_count) + self.assertEqual(1, importer.merged_count) + self.assertEqual(0, importer.problematic_count) + self.assertEqual(0, importer.warning_count) + + existing_study_subject = StudySubject.objects.filter(id=existing_study_subject.id)[0] + self.assertEquals(existing_study_subject.subject.first_name, subject.first_name) + self.assertEquals(existing_study_subject.subject.last_name, subject.last_name) + self.assertEquals(existing_study_subject.subject.date_born.strftime("%Y-%m-%d"), + subject.date_born.strftime("%Y-%m-%d"))