From 54a6733a90f062558a02d798f5721cdd29f95ce4 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Tue, 5 Dec 2017 17:09:36 +0100
Subject: [PATCH] common serialization function for subject and visit lists

---
 smash/web/api_views/serialization_utils.py | 14 ++++++++++++++
 smash/web/api_views/subject.py             | 10 +++-------
 smash/web/api_views/visit.py               | 22 +++++++++++++++++++---
 smash/web/static/js/smash.js               |  3 +++
 4 files changed, 39 insertions(+), 10 deletions(-)

diff --git a/smash/web/api_views/serialization_utils.py b/smash/web/api_views/serialization_utils.py
index a780e4e0..2f75ab11 100644
--- a/smash/web/api_views/serialization_utils.py
+++ b/smash/web/api_views/serialization_utils.py
@@ -8,3 +8,17 @@ def bool_to_yes_no(val):
         return "YES"
     else:
         return "NO"
+
+
+def flying_team_to_str(flying_team):
+    result = ""
+    if flying_team is not None:
+        result = unicode(flying_team)
+    return result
+
+
+def location_to_str(location):
+    result = ""
+    if location is not None:
+        result = unicode(location.name)
+    return result
\ No newline at end of file
diff --git a/smash/web/api_views/subject.py b/smash/web/api_views/subject.py
index f05f17d0..7d4a979e 100644
--- a/smash/web/api_views/subject.py
+++ b/smash/web/api_views/subject.py
@@ -5,7 +5,7 @@ from django.db.models import Count, Case, When, Min, Max
 from django.db.models import Q
 from django.http import JsonResponse
 
-from web.api_views.serialization_utils import bool_to_yes_no
+from web.api_views.serialization_utils import bool_to_yes_no, flying_team_to_str,location_to_str
 from web.models import StudySubject, Visit, Appointment, Subject, SubjectColumns, StudyColumns, Study, ContactAttempt
 from web.models.constants import SUBJECT_TYPE_CHOICES, GLOBAL_STUDY_ID
 from web.models.study_subject_list import SUBJECT_LIST_GENERIC, SUBJECT_LIST_NO_VISIT, SUBJECT_LIST_REQUIRE_CONTACT, \
@@ -323,12 +323,8 @@ def types(request):
 
 
 def serialize_subject(study_subject):
-    location = ""
-    if study_subject.default_location is not None:
-        location = study_subject.default_location.name
-    flying_team = ""
-    if study_subject.flying_team is not None:
-        flying_team = unicode(study_subject.flying_team)
+    location = location_to_str(study_subject.location)
+    flying_team = flying_team_to_str(study_subject.flying_team)
     visits = Visit.objects.filter(subject=study_subject).order_by('visit_number')
     serialized_visits = []
     for visit in visits:
diff --git a/smash/web/api_views/visit.py b/smash/web/api_views/visit.py
index c2b024c9..00251938 100644
--- a/smash/web/api_views/visit.py
+++ b/smash/web/api_views/visit.py
@@ -3,9 +3,9 @@ import logging
 from django.contrib.auth.decorators import login_required
 from django.http import JsonResponse
 
-from web.api_views.serialization_utils import bool_to_yes_no
+from web.api_views.serialization_utils import bool_to_yes_no, flying_team_to_str, location_to_str
 from web.models import SubjectColumns
-from web.models import Visit, Study, VisitColumns, StudyVisitList
+from web.models import Visit, Study, VisitColumns, StudyVisitList, StudyColumns
 from web.models.constants import GLOBAL_STUDY_ID
 from web.models.study_visit_list import VISIT_LIST_GENERIC, VISIT_LIST_EXCEEDED_TIME, VISIT_LIST_UNFINISHED, \
     VISIT_LIST_MISSING_APPOINTMENTS, VISIT_LIST_APPROACHING_WITHOUT_APPOINTMENTS, \
@@ -43,15 +43,21 @@ def get_visit_columns(request, visit_list_type):
     if len(study_visit_lists) > 0:
         visit_list = study_visit_lists[0]
         visit_columns = visit_list.visible_visit_columns
-        visit_subject_columns = visit_list.visible_visit_columns
+        visit_subject_columns = visit_list.visible_subject_columns
+        visit_subject_study_columns = visit_list.visible_subject_study_columns
     else:
         visit_list = StudyVisitList()
         visit_columns = VisitColumns()
         visit_subject_columns = SubjectColumns()
+        visit_subject_study_columns = StudyColumns()
 
     result = []
     add_column(result, "First name", "first_name", visit_subject_columns, "string_filter")
     add_column(result, "Last name", "last_name", visit_subject_columns, "string_filter")
+    add_column(result, "Location", "default_location", visit_subject_study_columns, "location_filter",
+               study.columns)
+    add_column(result, "Flying team location", "flying_team", visit_subject_study_columns, "flying_team_filter",
+               study.columns)
     add_column(result, "Visit begins", "datetime_begin", visit_columns, None)
     add_column(result, "Visit ends", "datetime_end", visit_columns, None)
     add_column(result, "Finished", "is_finished", visit_columns, "yes_no_filter")
@@ -91,6 +97,10 @@ def get_visits_order(visits_to_be_ordered, order_column, order_direction):
         result = visits_to_be_ordered.order_by(order_direction + 'subject__subject__first_name')
     elif order_column == "last_name":
         result = visits_to_be_ordered.order_by(order_direction + 'subject__subject__last_name')
+    elif order_column == "default_location":
+        result = visits_to_be_ordered.order_by(order_direction + 'subject__default_location')
+    elif order_column == "flying_team":
+        result = visits_to_be_ordered.order_by(order_direction + 'subject__flying_team')
     elif order_column == "datetime_begin":
         result = visits_to_be_ordered.order_by(order_direction + 'datetime_begin')
     elif order_column == "datetime_end":
@@ -115,6 +125,10 @@ def get_visits_filtered(visits_to_be_filtered, filters):
             result = result.filter(subject__subject__first_name__icontains=value)
         elif column == "last_name":
             result = result.filter(subject__subject__last_name__icontains=value)
+        elif column == "flying_team":
+            result = result.filter(subject__flying_team=value)
+        elif column == "default_location":
+            result = result.filter(subject__default_location=value)
         elif column == "is_finished":
             result = result.filter(is_finished=(value == "true"))
         elif column == "post_mail_sent":
@@ -184,6 +198,8 @@ def serialize_visit(visit):
         "last_name": visit.subject.subject.last_name,
         "datetime_begin": datetime_begin,
         "datetime_end": datetime_end,
+        "flying_team": flying_team_to_str(visit.subject.flying_team),
+        "default_location": location_to_str(visit.subject.default_location),
         "is_finished": bool_to_yes_no(visit.is_finished),
         "post_mail_sent": bool_to_yes_no(visit.post_mail_sent),
         "visit_number": visit.visit_number,
diff --git a/smash/web/static/js/smash.js b/smash/web/static/js/smash.js
index 8cb7943f..aa9575cd 100644
--- a/smash/web/static/js/smash.js
+++ b/smash/web/static/js/smash.js
@@ -206,6 +206,9 @@ function createVisibilityCheckboxes(checkboxesElement, columns) {
 function createTable(params) {
     var tableElement = params.tableElement;
     var worker_locations = params.worker_locations;
+    if (worker_locations === undefined) {
+        worker_locations = [];
+    }
     var subject_types_url = params.subject_types_url;
     var locations_url = params.locations_url;
     var flying_teams_url = params.flying_teams_url;
-- 
GitLab