From 2f6ee01fb9250926847130eede02d48a59afb323 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Thu, 16 Apr 2020 16:17:27 +0200
Subject: [PATCH] there must be date in the visit to mark is as finished when
 importing from redcap

---
 ...onfigurationitem_email_items_for_redcap.py | 33 +++++++++++++++++++
 smash/web/models/constants.py                 |  1 +
 smash/web/redcap_connector.py                 | 17 +++++++---
 3 files changed, 47 insertions(+), 4 deletions(-)
 create mode 100644 smash/web/migrations/0164_configurationitem_email_items_for_redcap.py

diff --git a/smash/web/migrations/0164_configurationitem_email_items_for_redcap.py b/smash/web/migrations/0164_configurationitem_email_items_for_redcap.py
new file mode 100644
index 00000000..efa3e50f
--- /dev/null
+++ b/smash/web/migrations/0164_configurationitem_email_items_for_redcap.py
@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.3 on 2017-04-04 09:43
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+from web.models.constants import RED_CAP_SAMPLE_DATE_FIELD_TYPE
+
+
+def create_item(apps, type, value, name):
+    # We can't import the ConfigurationItem model directly as it may be a newer
+    # version than this migration expects. We use the historical version.
+    ConfigurationItem = apps.get_model("web", "ConfigurationItem")
+    item = ConfigurationItem.objects.create()
+    item.type = type
+    item.value = value
+    item.name = name
+    item.save()
+
+
+def configuration_items(apps, schema_editor):
+    create_item(apps, RED_CAP_SAMPLE_DATE_FIELD_TYPE, "",
+                "Redcap field for sample date in the visit")
+
+
+class Migration(migrations.Migration):
+    dependencies = [
+        ('web', '0163_study_redcap_first_visit_number'),
+    ]
+
+    operations = [
+        migrations.RunPython(configuration_items),
+    ]
diff --git a/smash/web/models/constants.py b/smash/web/models/constants.py
index b512e714..049ea707 100644
--- a/smash/web/models/constants.py
+++ b/smash/web/models/constants.py
@@ -62,6 +62,7 @@ RED_CAP_SEX_FIELD_TYPE = 'RED_CAP_SEX_FIELD_TYPE'
 RED_CAP_DATE_BORN_FIELD_TYPE = 'RED_CAP_DATE_BORN_FIELD_TYPE'
 RED_CAP_ND_NUMBER_FIELD_TYPE = 'RED_CAP_ND_NUMBER_FIELD_TYPE'
 RED_CAP_VIRUS_FIELD_TYPE = 'RED_CAP_VIRUS_FIELD_TYPE'
+RED_CAP_SAMPLE_DATE_FIELD_TYPE = "RED_CAP_SAMPLE_DATE_FIELD_TYPE"
 
 MAIL_TEMPLATE_CONTEXT_SUBJECT = 'S'
 MAIL_TEMPLATE_CONTEXT_APPOINTMENT = 'A'
diff --git a/smash/web/redcap_connector.py b/smash/web/redcap_connector.py
index 8329ef60..df68598c 100644
--- a/smash/web/redcap_connector.py
+++ b/smash/web/redcap_connector.py
@@ -16,7 +16,7 @@ from web.models.constants import REDCAP_TOKEN_CONFIGURATION_TYPE, \
     REDCAP_BASE_URL_CONFIGURATION_TYPE, CRON_JOB_TIMEOUT, RED_CAP_LANGUAGE_4_FIELD_TYPE, RED_CAP_LANGUAGE_3_FIELD_TYPE, \
     RED_CAP_LANGUAGE_2_FIELD_TYPE, RED_CAP_LANGUAGE_1_FIELD_TYPE, RED_CAP_MPOWER_ID_FIELD_TYPE, RED_CAP_DEAD_FIELD_TYPE, \
     RED_CAP_SEX_FIELD_TYPE, RED_CAP_DATE_BORN_FIELD_TYPE, RED_CAP_ND_NUMBER_FIELD_TYPE, RED_CAP_VIRUS_FIELD_TYPE, \
-    GLOBAL_STUDY_ID
+    GLOBAL_STUDY_ID, RED_CAP_SAMPLE_DATE_FIELD_TYPE
 from web.models.inconsistent_subject import InconsistentField, InconsistentSubject
 from web.models.missing_subject import MissingSubject
 
@@ -81,6 +81,7 @@ class RedcapConnector(object):
         self.language_4_field = ConfigurationItem.objects.get(type=RED_CAP_LANGUAGE_4_FIELD_TYPE).value
         self.m_power_id_field = ConfigurationItem.objects.get(type=RED_CAP_MPOWER_ID_FIELD_TYPE).value
         self.virus_field = ConfigurationItem.objects.get(type=RED_CAP_VIRUS_FIELD_TYPE).value
+        self.sample_date_field = ConfigurationItem.objects.get(type=RED_CAP_SAMPLE_DATE_FIELD_TYPE).value
 
         self.study = Study.objects.get(id=GLOBAL_STUDY_ID)
 
@@ -187,6 +188,7 @@ class RedcapConnector(object):
                     result.append(inconsistent_subject)
                 if appointment_type_to_finish is not None:
                     for visit in red_cap_subject.visits:
+
                         smasch_visits = Visit.objects.filter(visit_number=visit.visit_number, subject=subject)
                         smasch_appointments = Appointment.objects.filter(visit__in=smasch_visits,
                                                                          appointment_types=appointment_type_to_finish,
@@ -328,7 +330,9 @@ class RedcapConnector(object):
                         visit.virus = False
                     elif row.get(self.virus_field) == "Positive":
                         visit.virus = True
-                redcap_subject.visits.append(visit)
+                if self.sample_date_field != "":
+                    if row.get(self.sample_date_field) != "":
+                        redcap_subject.visits.append(visit)
                 result.append(redcap_subject)
         for i in range(1, 9):
             query_data = self.get_subject_query_data()
@@ -342,13 +346,15 @@ class RedcapConnector(object):
                     for redcap_subject in result:
                         if redcap_subject.nd_number == nd_number:
                             visit = RedcapVisit()
-                            visit.visit_number = i
+                            visit.visit_number = i + self.study.redcap_first_visit_number + 1
                             if self.virus_field != "":
                                 if row.get(self.virus_field) == "Negative":
                                     visit.virus = False
                                 elif row.get(self.virus_field) == "Positive":
                                     visit.virus = True
-                            redcap_subject.visits.append(visit)
+                            if self.sample_date_field != "":
+                                if row.get(self.sample_date_field) != "":
+                                    redcap_subject.visits.append(visit)
 
         return result
 
@@ -397,6 +403,9 @@ class RedcapConnector(object):
         if self.virus_field != "":
             result['fields[' + str(field_number) + ']'] = self.virus_field
             field_number += 1
+        if self.sample_date_field != "":
+            result['fields[' + str(field_number) + ']'] = self.sample_date_field
+            field_number += 1
         return result
 
     def get_language(self, name):
-- 
GitLab