diff --git a/smash/web/api_views/subject.py b/smash/web/api_views/subject.py index fb81d9624b40750c5f24315112d873516b2ff3ab..c31d13903ab43b26fa7db0fd1f9c570d28e5cb5e 100644 --- a/smash/web/api_views/subject.py +++ b/smash/web/api_views/subject.py @@ -70,6 +70,10 @@ def get_subject_columns(request, subject_list_type): add_column(result, "Resigned", "resigned", study_subject_columns, "yes_no_filter", study.columns) add_column(result, "Endpoint Reached", "endpoint_reached", study_subject_columns, "yes_no_filter", study.columns) add_column(result, "Postponed", "postponed", study_subject_columns, "yes_no_filter", study.columns) + add_column(result, "Next of keen", "next_of_keen_name", subject_columns, "string_filter") + add_column(result, "Next of keen phone", "next_of_keen_phone", subject_columns, "string_filter") + add_column(result, "Next of keen address", "next_of_keen_address", subject_columns, "string_filter") + add_column(result, "Brain donation agreement", "brain_donation_agreement", study_subject_columns, "yes_no_filter", study.columns) add_column(result, "Excluded", "excluded", study_subject_columns, "yes_no_filter", study.columns) add_column(result, "Info sent", "information_sent", study_subject_columns, "yes_no_filter", study.columns) add_column(result, "Type", "type", study_subject_columns, "type_filter", study.columns) @@ -113,6 +117,12 @@ def get_subjects_order(subjects_to_be_ordered, order_column, order_direction, co result = subjects_to_be_ordered.order_by(order_direction + 'subject__last_name') elif order_column == "address": result = subjects_to_be_ordered.order_by(order_direction + 'subject__address') + elif order_column == "next_of_keen_name": + result = subjects_to_be_ordered.order_by(order_direction + 'subject__next_of_keen_name') + elif order_column == "next_of_keen_phone": + result = subjects_to_be_ordered.order_by(order_direction + 'subject__next_of_keen_phone') + elif order_column == "next_of_keen_address": + result = subjects_to_be_ordered.order_by(order_direction + 'subject__next_of_keen_address') elif order_column == "nd_number": result = subjects_to_be_ordered.order_by(order_direction + 'nd_number') elif order_column == "referral": @@ -144,6 +154,8 @@ def get_subjects_order(subjects_to_be_ordered, order_column, order_direction, co result = subjects_to_be_ordered.order_by(order_direction + 'subject__social_security_number') elif order_column == "postponed": result = subjects_to_be_ordered.order_by(order_direction + 'postponed') + elif order_column == "brain_donation_agreement": + result = subjects_to_be_ordered.order_by(order_direction + 'brain_donation_agreement') elif order_column == "excluded": result = subjects_to_be_ordered.order_by(order_direction + 'excluded') elif order_column == "type": @@ -242,6 +254,12 @@ def get_subjects_filtered(subjects_to_be_filtered, filters): result = result.filter(subject__last_name__icontains=value) elif column == "address": result = result.filter(subject__address__icontains=value) + elif column == "next_of_keen_name": + result = result.filter(subject__next_of_keen_name__icontains=value) + elif column == "next_of_keen_phone": + result = result.filter(subject__next_of_keen_phone__icontains=value) + elif column == "next_of_keen_address": + result = result.filter(subject__next_of_keen_address__icontains=value) elif column == "nd_number": result = result.filter(nd_number__icontains=value) elif column == "referral": @@ -254,6 +272,8 @@ def get_subjects_filtered(subjects_to_be_filtered, filters): result = result.filter(resigned=(value == "true")) elif column == "endpoint_reached": result = result.filter(endpoint_reached=(value == "true")) + elif column == "brain_donation_agreement": + result = result.filter(brain_donation_agreement=(value == "true")) elif column == "postponed": result = result.filter(postponed=(value == "true")) elif column == "excluded": @@ -402,6 +422,9 @@ def serialize_subject(study_subject): "first_name": study_subject.subject.first_name, "last_name": study_subject.subject.last_name, "address": study_subject.subject.pretty_address(), + "next_of_keen_name": study_subject.subject.next_of_keen_name, + "next_of_keen_phone": study_subject.subject.next_of_keen_phone, + "next_of_keen_address": study_subject.subject.next_of_keen_address, "date_born": study_subject.subject.date_born, "datetime_contact_reminder": contact_reminder, "last_contact_attempt": last_contact_attempt_string, @@ -414,6 +437,7 @@ def serialize_subject(study_subject): "resigned": bool_to_yes_no(study_subject.resigned), "endpoint_reached": bool_to_yes_no(study_subject.endpoint_reached), "postponed": bool_to_yes_no(study_subject.postponed), + "brain_donation_agreement": bool_to_yes_no(study_subject.brain_donation_agreement), "excluded": bool_to_yes_no(study_subject.excluded), "information_sent": bool_to_yes_no(study_subject.information_sent), "health_partner_first_name": health_partner_first_name, diff --git a/smash/web/forms/study_subject_forms.py b/smash/web/forms/study_subject_forms.py index ea2849fc6ae8ddce7b8f5ddc62d1bb7467908b8a..2bc880780226734cfa1653501960eb47bc8138b0 100644 --- a/smash/web/forms/study_subject_forms.py +++ b/smash/web/forms/study_subject_forms.py @@ -161,6 +161,7 @@ def prepare_study_subject_fields(fields, study): prepare_field(fields, study.columns, 'nd_number') prepare_field(fields, study.columns, 'datetime_contact_reminder') prepare_field(fields, study.columns, 'postponed') + prepare_field(fields, study.columns, 'brain_donation_agreement') prepare_field(fields, study.columns, 'flying_team') prepare_field(fields, study.columns, 'mpower_id') prepare_field(fields, study.columns, 'comments') diff --git a/smash/web/migrations/0146_auto_20200320_0932.py b/smash/web/migrations/0146_auto_20200320_0932.py new file mode 100644 index 0000000000000000000000000000000000000000..93b2487ba4a8bcf2f002110c262a83cc370d33b8 --- /dev/null +++ b/smash/web/migrations/0146_auto_20200320_0932.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.5 on 2020-03-20 09:32 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('web', '0145_add_permissions_to_existing_workers'), + ] + + operations = [ + migrations.AddField( + model_name='studycolumns', + name='brain_donation_agreement', + field=models.BooleanField(default=False, verbose_name=b'Brain donation agreement'), + ), + migrations.AddField( + model_name='studysubject', + name='brain_donation_agreement', + field=models.BooleanField(default=False, verbose_name=b'Brain donation agreement'), + ), + migrations.AddField( + model_name='subject', + name='next_of_keen_address', + field=models.TextField(blank=True, max_length=2000, verbose_name=b'Next of keen address'), + ), + migrations.AddField( + model_name='subject', + name='next_of_keen_name', + field=models.CharField(blank=True, max_length=50, verbose_name=b'Next of keen'), + ), + migrations.AddField( + model_name='subject', + name='next_of_keen_phone', + field=models.CharField(blank=True, max_length=50, verbose_name=b'Next of keen phone'), + ), + migrations.AddField( + model_name='subjectcolumns', + name='next_of_keen_address', + field=models.BooleanField(default=False, max_length=1, verbose_name=b'Next of keen address'), + ), + migrations.AddField( + model_name='subjectcolumns', + name='next_of_keen_name', + field=models.BooleanField(default=False, max_length=1, verbose_name=b'Next of keen'), + ), + migrations.AddField( + model_name='subjectcolumns', + name='next_of_keen_phone', + field=models.BooleanField(default=False, max_length=1, verbose_name=b'Next of keen phone'), + ), + ] diff --git a/smash/web/models/study_columns.py b/smash/web/models/study_columns.py index a1b345700db1db01741b050496d1e609524c30da..7d20b3913d40a71f72fc0b70327a20084e83a158 100644 --- a/smash/web/models/study_columns.py +++ b/smash/web/models/study_columns.py @@ -1,8 +1,6 @@ # coding=utf-8 from django.db import models -from web.models.constants import BOOL_CHOICES - class StudyColumns(models.Model): class Meta: @@ -81,7 +79,7 @@ class StudyColumns(models.Model): excluded = models.BooleanField(default=False, verbose_name='Excluded') endpoint_reached = models.BooleanField(default=True, verbose_name='Endpoint reached') - + resign_reason = models.BooleanField(default=True, verbose_name='Endpoint reached comments') referral_letter = models.BooleanField( @@ -117,4 +115,9 @@ class StudyColumns(models.Model): vouchers = models.BooleanField( default=False, verbose_name='Vouchers', - ) \ No newline at end of file + ) + + brain_donation_agreement = models.BooleanField( + default=False, + verbose_name='Brain donation agreement', + ) diff --git a/smash/web/models/study_subject.py b/smash/web/models/study_subject.py index a4d217784f01a67e34d2698777f743f5a2e06548..f08d450d3b0b516c9de4c943b3347eddc610aad5 100644 --- a/smash/web/models/study_subject.py +++ b/smash/web/models/study_subject.py @@ -164,6 +164,11 @@ class StudySubject(models.Model): verbose_name='PD in family', default=None, ) + brain_donation_agreement = models.BooleanField( + default=False, + verbose_name='Brain donation agreement', + ) + resigned = models.BooleanField( verbose_name='Resigned', default=False, diff --git a/smash/web/models/subject.py b/smash/web/models/subject.py index 0d0eb57f960b91551ab63e40c6c4d83026b3be3c..fa9f067db93781e5e4fb90a70a51f5eee41a339e 100644 --- a/smash/web/models/subject.py +++ b/smash/web/models/subject.py @@ -101,6 +101,21 @@ class Subject(models.Model): verbose_name='Country' ) + next_of_keen_name = models.CharField(max_length=50, + blank=True, + verbose_name='Next of keen' + ) + + next_of_keen_phone = models.CharField(max_length=50, + blank=True, + verbose_name='Next of keen phone' + ) + + next_of_keen_address = models.TextField(max_length=2000, + blank=True, + verbose_name='Next of keen address' + ) + dead = models.BooleanField( verbose_name='Deceased', default=False, diff --git a/smash/web/models/subject_columns.py b/smash/web/models/subject_columns.py index d83847c7d6589aa98adbcd1740137fcb1a80526b..04a1869b0787f66eb61e8c76bd858419db16798f 100644 --- a/smash/web/models/subject_columns.py +++ b/smash/web/models/subject_columns.py @@ -83,3 +83,18 @@ class SubjectColumns(models.Model): default=True, verbose_name='Deceased', ) + + next_of_keen_name = models.BooleanField(max_length=1, + default=False, + verbose_name='Next of keen', + ) + + next_of_keen_phone = models.BooleanField(max_length=1, + default=False, + verbose_name='Next of keen phone', + ) + + next_of_keen_address = models.BooleanField(max_length=1, + default=False, + verbose_name='Next of keen address', + ) diff --git a/smash/web/templates/subjects/edit.html b/smash/web/templates/subjects/edit.html index a8fe444044085df8d4bb26c9c8203b8e2bc848c1..4fbc1ca90b4063e780d625b930c047c6f4792aef 100644 --- a/smash/web/templates/subjects/edit.html +++ b/smash/web/templates/subjects/edit.html @@ -204,6 +204,11 @@ $("#confirm-dead-resigned-mark-dialog").modal("show"); return false; } + var brainDonation = $("#id_study_subject-brain_donation_agreement").is(":checked"); + if (brainDonation && ($("#id_subject-next_of_keen_phone").val() === '' || $("#id_subject-next_of_keen_address").val() === '' || $("#id_subject-next_of_keen_name").val() === '')) { + alert("Next of keen data must be entered when brain donation agreement is in place"); + return false; + } }); $("#confirm-save").click(function () { confirmed = true;