diff --git a/smash/web/api_views/appointment.py b/smash/web/api_views/appointment.py index 13dd32595ac6cee510ea6323b9a2e8eb0704337e..cdc4e8e499f7f06dd9277e3895b1a11b077e9060 100644 --- a/smash/web/api_views/appointment.py +++ b/smash/web/api_views/appointment.py @@ -7,7 +7,7 @@ from django.utils import timezone from web.api_views.serialization_utils import serialize_datetime, location_to_str, flying_team_to_str, add_column, \ bool_to_yes_no, get_filters_for_data_table_request -from web.models import Appointment, Study, SubjectColumns, AppointmentColumns, AppointmentList +from web.models import Appointment, Study, SubjectColumns, AppointmentColumns, AppointmentList, StudyColumns from web.models.appointment_list import APPOINTMENT_LIST_GENERIC, APPOINTMENT_LIST_UNFINISHED, \ APPOINTMENT_LIST_APPROACHING from web.models.constants import GLOBAL_STUDY_ID @@ -22,14 +22,18 @@ def get_appointment_columns(request, appointment_list_type): if len(appointment_lists) > 0: appointment_list = appointment_lists[0] subject_columns = appointment_list.visible_subject_columns + subject_study_columns = appointment_list.visible_study_subject_columns appointment_columns = appointment_list.visible_appointment_columns else: subject_columns = SubjectColumns() + subject_study_columns = StudyColumns() appointment_columns = AppointmentColumns() result = [] add_column(result, "First name", "first_name", subject_columns, "string_filter") add_column(result, "Last name", "last_name", subject_columns, "string_filter") + add_column(result, "ND number", "nd_number", subject_study_columns, "string_filter") + add_column(result, "Type", "type", subject_study_columns, "type_filter") add_column(result, "Info sent", "post_mail_sent", appointment_columns, "yes_no_filter") add_column(result, "Date", "datetime_when", appointment_columns, None) add_column(result, "Appointment types", "appointment_types", appointment_columns, "appointment_type_filter", @@ -73,6 +77,10 @@ def get_appointments_order(appointments_to_be_ordered, order_column, order_direc result = appointments_to_be_ordered.order_by(order_direction + 'visit__subject__subject__first_name') elif order_column == "last_name": result = appointments_to_be_ordered.order_by(order_direction + 'visit__subject__subject__last_name') + elif order_column == "nd_number": + result = appointments_to_be_ordered.order_by(order_direction + 'visit__subject__nd_number') + elif order_column == "type": + result = appointments_to_be_ordered.order_by(order_direction + 'visit__subject__type') elif order_column == "location": result = appointments_to_be_ordered.order_by(order_direction + 'location') elif order_column == "flying_team": @@ -95,6 +103,10 @@ def get_appointments_filtered(appointments_to_be_filtered, filters): result = result.filter(visit__subject__subject__first_name__icontains=value) elif column == "last_name": result = result.filter(visit__subject__subject__last_name__icontains=value) + elif column == "nd_number": + result = result.filter(visit__subject__nd_number__icontains=value) + elif column == "type": + result = result.filter(visit__subject__type=value) elif column == "location": result = result.filter(location=value) elif column == "flying_team": @@ -159,6 +171,7 @@ def serialize_appointment(appointment): subject_string = "" first_name = "" last_name = "" + subject_type = "" nd_number = screening_number = phone_numbers = appointment_type_names = None if appointment.visit is not None: title = "Visit " + str(appointment.visit.visit_number) @@ -168,6 +181,7 @@ def serialize_appointment(appointment): last_name = study_subject.subject.last_name nd_number = study_subject.nd_number screening_number = study_subject.screening_number + subject_type = study_subject.get_type_display() phone_numbers = ", ".join(filter(None, [study_subject.subject.phone_number, study_subject.subject.phone_number_2, study_subject.subject.phone_number_3])) @@ -188,6 +202,7 @@ def serialize_appointment(appointment): "title": title, "nd_number": nd_number, "screening_number": screening_number, + "type": subject_type, "phone_number": phone_numbers, "appointment_type_names": appointment_type_names, "datetime_until": until, diff --git a/smash/web/api_views/visit.py b/smash/web/api_views/visit.py index e6fbe9693dc121643817b92a73d93463ff038716..59f0eb977ae48eca6fee42d9231f2dee8de4097c 100644 --- a/smash/web/api_views/visit.py +++ b/smash/web/api_views/visit.py @@ -36,8 +36,8 @@ def get_visit_columns(request, visit_list_type): 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, "ND number", "nd_number", visit_subject_study_columns, "string_filter", study.columns) + 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) @@ -86,6 +86,8 @@ 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 == "nd_number": + result = visits_to_be_ordered.order_by(order_direction + 'subject__nd_number') elif order_column == "default_location": result = visits_to_be_ordered.order_by(order_direction + 'subject__default_location') elif order_column == "flying_team": @@ -139,6 +141,8 @@ 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 == "nd_number": + result = result.filter(subject__nd_number__icontains=value) elif column == "flying_team": result = result.filter(subject__flying_team=value) elif column == "default_location": @@ -227,6 +231,7 @@ def serialize_visit(visit): result = { "first_name": visit.subject.subject.first_name, "last_name": visit.subject.subject.last_name, + "nd_number": visit.subject.nd_number, "datetime_begin": serialize_date(visit.datetime_begin), "datetime_end": serialize_date(visit.datetime_end), "flying_team": flying_team_to_str(visit.subject.flying_team), diff --git a/smash/web/migrations/0103_auto_20180214_1026.py b/smash/web/migrations/0103_auto_20180214_1026.py new file mode 100644 index 0000000000000000000000000000000000000000..d59dc089c6955e9985e1040fdc3ccf155023aac7 --- /dev/null +++ b/smash/web/migrations/0103_auto_20180214_1026.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.7 on 2018-02-14 10:26 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('web', '0102_studynotificationparameters_subject_voucher_expiry_visible'), + ] + + operations = [ + migrations.AlterField( + model_name='studysubjectlist', + name='type', + field=models.CharField(blank=True, choices=[(b'GENERIC', b'Generic'), (b'NO_VISIT', b'Subjects without visit'), (b'REQUIRE_CONTACT', b'Subjects required contact'), (b'VOUCHER_EXPIRY', b'Subject with vouchers to be expired soon')], max_length=50, null=True, verbose_name=b'Type of list'), + ), + ] diff --git a/smash/web/migrations/0104_contact_required_list_update.py b/smash/web/migrations/0104_contact_required_list_update.py new file mode 100644 index 0000000000000000000000000000000000000000..87e58febfa4a9805f679a920108176a06366686e --- /dev/null +++ b/smash/web/migrations/0104_contact_required_list_update.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.7 on 2018-02-14 10:26 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ('web', '0103_auto_20180214_1026'), + ] + + operations = [ + migrations.RunSQL( + 'UPDATE web_studysubjectlist SET last_contact_attempt = TRUE WHERE type=\'REQUIRE_CONTACT\';'), + ] diff --git a/smash/web/migrations/0105_unfinished_appointments_list_update.py b/smash/web/migrations/0105_unfinished_appointments_list_update.py new file mode 100644 index 0000000000000000000000000000000000000000..7bd87a667301747e53b71bc3336c8ac70f637320 --- /dev/null +++ b/smash/web/migrations/0105_unfinished_appointments_list_update.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.7 on 2018-02-14 10:26 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ('web', '0104_contact_required_list_update'), + ] + + operations = [ + migrations.RunSQL( + 'UPDATE web_studycolumns SET nd_number=TRUE, type=TRUE WHERE id IN ' + + '(SELECT visible_study_subject_columns_id FROM web_appointmentlist WHERE type = \'UNFINISHED\');'), + ] diff --git a/smash/web/migrations/0106_approaching_post_mail_list_update.py b/smash/web/migrations/0106_approaching_post_mail_list_update.py new file mode 100644 index 0000000000000000000000000000000000000000..1f37f6cde747d5834a083dd87c3733cb60415d2d --- /dev/null +++ b/smash/web/migrations/0106_approaching_post_mail_list_update.py @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.7 on 2018-02-14 10:26 +from __future__ import unicode_literals + +from django.db import migrations, models + +def create_default_columns_for_VISIT_LIST_APPROACHING_FOR_MAIL_CONTACT(apps, schema_editor): + # We can't import the Study model directly as it may be a newer + # version than this migration expects. We use the historical version. + SubjectColumns = apps.get_model("web", "SubjectColumns") + subject_columns = SubjectColumns.objects.create() + subject_columns.sex = False + subject_columns.first_name = True + subject_columns.last_name = True + subject_columns.languages = False + subject_columns.default_written_communication_langua0106_approaching_post_mail_list_updatege = False + subject_columns.phone_number = False + subject_columns.phone_number_2 = False + subject_columns.phone_number_3 = False + subject_columns.email = False + subject_columns.date_born = False + subject_columns.address = False + subject_columns.postal_code = False + subject_columns.city = False + subject_columns.country = False + subject_columns.dead = False + subject_columns.save() + + StudyColumns = apps.get_model("web", "StudyColumns") + study_columns = StudyColumns.objects.create() + study_columns.postponed = False + study_columns.datetime_contact_reminder = False + study_columns.type = False + study_columns.default_location = True + study_columns.flying_team = True + study_columns.screening_number = False + study_columns.nd_number = True + study_columns.mpower_id = False + study_columns.comments = False + study_columns.referral = False + study_columns.diagnosis = False + study_columns.year_of_diagnosis = False + study_columns.information_sent = False + study_columns.pd_in_family = False + study_columns.resigned = False + study_columns.resign_reason = False + study_columns.save() + + VisitColumns = apps.get_model("web", "VisitColumns") + visit_columns = VisitColumns.objects.create() + visit_columns.datetime_begin = True + visit_columns.datetime_end = False + visit_columns.is_finished = False + visit_columns.post_mail_sent = False + visit_columns.visit_number = True + visit_columns.visible_appointment_types = False + visit_columns.save() + + +class Migration(migrations.Migration): + dependencies = [ + ('web', '0105_unfinished_appointments_list_update'), + ] + + operations = [ + migrations.RunPython(create_default_columns_for_VISIT_LIST_APPROACHING_FOR_MAIL_CONTACT), + migrations.RunSQL('INSERT INTO web_studyvisitlist (' + + 'study_id, ' + + 'visible_visit_columns_id, ' + + 'visible_subject_columns_id, ' + + 'visible_study_subject_columns_id, ' + + 'visible_appointment_types_done,' + 'visible_appointment_types_in_progress,' + 'visible_appointment_types_missing,' + 'type) ' + + "SELECT " + + "1, " + + "max(web_visitcolumns.id), " + + "max(web_subjectcolumns.id), " + + "max(web_studycolumns.id), " + + "FALSE, " + + "FALSE, " + + "FALSE, " + + "'APPROACHING_FOR_MAIL_CONTACT' FROM web_visitcolumns, web_studycolumns, web_subjectcolumns;"), + ] diff --git a/smash/web/migrations/0107_exceeded_visit_time_list_update.py b/smash/web/migrations/0107_exceeded_visit_time_list_update.py new file mode 100644 index 0000000000000000000000000000000000000000..a4dc7b4ad27fda4e62ed9a22423a29d58f81b563 --- /dev/null +++ b/smash/web/migrations/0107_exceeded_visit_time_list_update.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.7 on 2018-02-14 10:26 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ('web', '0106_approaching_post_mail_list_update'), + ] + + operations = [ + migrations.RunSQL( + 'UPDATE web_studycolumns SET nd_number=TRUE WHERE id IN ' + + '(SELECT visible_study_subject_columns_id FROM web_studyvisitlist WHERE type = \'EXCEEDED_TIME\');'), + ] diff --git a/smash/web/migrations/0108_unfinished_visit_list_update.py b/smash/web/migrations/0108_unfinished_visit_list_update.py new file mode 100644 index 0000000000000000000000000000000000000000..86469c033ec6684d8aeefd80e1967ab8f2b986b7 --- /dev/null +++ b/smash/web/migrations/0108_unfinished_visit_list_update.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.7 on 2018-02-14 10:26 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ('web', '0107_exceeded_visit_time_list_update'), + ] + + operations = [ + migrations.RunSQL( + 'UPDATE web_studycolumns SET nd_number=TRUE where id IN ' + + '(SELECT visible_study_subject_columns_id FROM web_studyvisitlist WHERE type = \'UNFINISHED\');'), + ] diff --git a/smash/web/migrations/0109_missing_appointment_list_update.py b/smash/web/migrations/0109_missing_appointment_list_update.py new file mode 100644 index 0000000000000000000000000000000000000000..799c768136b345a73ed6ecfedadc5e4153e16f3e --- /dev/null +++ b/smash/web/migrations/0109_missing_appointment_list_update.py @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.7 on 2018-02-14 10:26 +from __future__ import unicode_literals + +from django.db import migrations, models + +def create_default_columns_for_VISIT_LIST_MISSING_APPOINTMENT(apps, schema_editor): + # We can't import the Study model directly as it may be a newer + # version than this migration expects. We use the historical version. + SubjectColumns = apps.get_model("web", "SubjectColumns") + subject_columns = SubjectColumns.objects.create() + subject_columns.sex = False + subject_columns.first_name = True + subject_columns.last_name = True + subject_columns.languages = False + subject_columns.default_written_communication_langua0106_approaching_post_mail_list_updatege = False + subject_columns.phone_number = False + subject_columns.phone_number_2 = False + subject_columns.phone_number_3 = False + subject_columns.email = False + subject_columns.date_born = False + subject_columns.address = False + subject_columns.postal_code = False + subject_columns.city = False + subject_columns.country = False + subject_columns.dead = False + subject_columns.save() + + StudyColumns = apps.get_model("web", "StudyColumns") + study_columns = StudyColumns.objects.create() + study_columns.postponed = False + study_columns.datetime_contact_reminder = False + study_columns.type = False + study_columns.default_location = True + study_columns.flying_team = True + study_columns.screening_number = False + study_columns.nd_number = True + study_columns.mpower_id = False + study_columns.comments = False + study_columns.referral = False + study_columns.diagnosis = False + study_columns.year_of_diagnosis = False + study_columns.information_sent = False + study_columns.pd_in_family = False + study_columns.resigned = False + study_columns.resign_reason = False + study_columns.save() + + VisitColumns = apps.get_model("web", "VisitColumns") + visit_columns = VisitColumns.objects.create() + visit_columns.datetime_begin = True + visit_columns.datetime_end = True + visit_columns.is_finished = False + visit_columns.post_mail_sent = False + visit_columns.visit_number = True + visit_columns.visible_appointment_types = False + visit_columns.save() + + +class Migration(migrations.Migration): + dependencies = [ + ('web', '0108_unfinished_visit_list_update'), + ] + + operations = [ + migrations.RunPython(create_default_columns_for_VISIT_LIST_MISSING_APPOINTMENT), + migrations.RunSQL('INSERT INTO web_studyvisitlist (' + + 'study_id, ' + + 'visible_visit_columns_id, ' + + 'visible_subject_columns_id, ' + + 'visible_study_subject_columns_id, ' + + 'visible_appointment_types_done,' + 'visible_appointment_types_in_progress,' + 'visible_appointment_types_missing,' + 'type) ' + + "SELECT " + + "1, " + + "max(web_visitcolumns.id), " + + "max(web_subjectcolumns.id), " + + "max(web_studycolumns.id), " + + "TRUE, " + + "TRUE, " + + "TRUE, " + + "'MISSING_APPOINTMENTS' FROM web_visitcolumns, web_studycolumns, web_subjectcolumns;"), + ]