Skip to content
Snippets Groups Projects
Commit 2a618887 authored by Piotr Gawron's avatar Piotr Gawron
Browse files

PDP study specific fields

parent 7d8f3031
No related branches found
No related tags found
1 merge request!115Resolve "PDP study patient data"
...@@ -6,6 +6,7 @@ smash/~/ ...@@ -6,6 +6,7 @@ smash/~/
# files uploaded and hosted by django # files uploaded and hosted by django
smash/uploads/ smash/uploads/
smash/smash/uploads/
# Disable python bytecode # Disable python bytecode
*.pyc *.pyc
......
...@@ -5,18 +5,31 @@ from django import forms ...@@ -5,18 +5,31 @@ from django import forms
from django.forms import ModelForm from django.forms import ModelForm
from web.forms.forms import DATETIMEPICKER_DATE_ATTRS, get_worker_from_args from web.forms.forms import DATETIMEPICKER_DATE_ATTRS, get_worker_from_args
from web.models import StudySubject, Study, StudyColumns from web.models import StudySubject, Study, StudyColumns, VoucherType
from web.models.constants import SCREENING_NUMBER_PREFIXES_FOR_TYPE from web.models.constants import SCREENING_NUMBER_PREFIXES_FOR_TYPE
from web.widgets.secure_file_widget import SecuredFileWidget
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class StudySubjectAddForm(ModelForm): class StudySubjectForm(ModelForm):
datetime_contact_reminder = forms.DateTimeField(label="Contact on", datetime_contact_reminder = forms.DateTimeField(label="Contact on",
widget=forms.DateTimeInput(DATETIMEPICKER_DATE_ATTRS), widget=forms.DateTimeInput(DATETIMEPICKER_DATE_ATTRS),
required=False required=False
) )
referral_letter = forms.FileField(label='Select a file', widget=SecuredFileWidget(), required=False)
voucher_types = forms.ModelMultipleChoiceField(required=False,
widget=forms.CheckboxSelectMultiple,
queryset=VoucherType.objects.all(),
)
def __init__(self, *args, **kwargs):
super(StudySubjectForm, self).__init__(*args, **kwargs)
class StudySubjectAddForm(StudySubjectForm):
class Meta: class Meta:
model = StudySubject model = StudySubject
fields = '__all__' fields = '__all__'
...@@ -26,12 +39,12 @@ class StudySubjectAddForm(ModelForm): ...@@ -26,12 +39,12 @@ class StudySubjectAddForm(ModelForm):
self.user = get_worker_from_args(kwargs) self.user = get_worker_from_args(kwargs)
self.study = get_study_from_args(kwargs) self.study = get_study_from_args(kwargs)
super(ModelForm, self).__init__(*args, **kwargs) super(StudySubjectAddForm, self).__init__(*args, **kwargs)
prepare_study_subject_fields(fields=self.fields, study=self.study) prepare_study_subject_fields(fields=self.fields, study=self.study)
def save(self, commit=True): def save(self, commit=True):
self.instance.study_id = self.study.id self.instance.study_id = self.study.id
return super(ModelForm, self).save(commit) return super(StudySubjectAddForm, self).save(commit)
def build_screening_number(self, cleaned_data): def build_screening_number(self, cleaned_data):
screening_number = cleaned_data.get('screening_number', None) screening_number = cleaned_data.get('screening_number', None)
...@@ -83,7 +96,7 @@ def get_new_screening_number(screening_number_prefix): ...@@ -83,7 +96,7 @@ def get_new_screening_number(screening_number_prefix):
return screening_number_prefix + str(result_number + 1).zfill(3) return screening_number_prefix + str(result_number + 1).zfill(3)
class StudySubjectDetailForm(ModelForm): class StudySubjectDetailForm(StudySubjectForm):
class Meta: class Meta:
model = StudySubject model = StudySubject
fields = '__all__' fields = '__all__'
...@@ -104,11 +117,7 @@ def get_study_from_study_subject_instance(study_subject): ...@@ -104,11 +117,7 @@ def get_study_from_study_subject_instance(study_subject):
return Study(columns=StudyColumns()) return Study(columns=StudyColumns())
class StudySubjectEditForm(ModelForm): class StudySubjectEditForm(StudySubjectForm):
datetime_contact_reminder = forms.DateTimeField(label="Contact on",
widget=forms.DateTimeInput(DATETIMEPICKER_DATE_ATTRS),
required=False
)
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
was_resigned = kwargs.get('was_resigned', False) was_resigned = kwargs.get('was_resigned', False)
...@@ -166,6 +175,12 @@ def prepare_study_subject_fields(fields, study): ...@@ -166,6 +175,12 @@ def prepare_study_subject_fields(fields, study):
prepare_field(fields, study.columns, 'pd_in_family') prepare_field(fields, study.columns, 'pd_in_family')
prepare_field(fields, study.columns, 'resigned') prepare_field(fields, study.columns, 'resigned')
prepare_field(fields, study.columns, 'resign_reason') prepare_field(fields, study.columns, 'resign_reason')
prepare_field(fields, study.columns, 'referral_letter')
prepare_field(fields, study.columns, 'health_partner')
prepare_field(fields, study.columns, 'health_partner_feedback_agreement')
prepare_field(fields, study.columns, 'screening')
prepare_field(fields, study.columns, 'previously_in_study')
prepare_field(fields, study.columns, 'voucher_types')
def validate_subject_screening_number(self, cleaned_data): def validate_subject_screening_number(self, cleaned_data):
......
# -*- coding: utf-8 -*-
# Generated by Django 1.10.7 on 2017-12-11 16:16
from __future__ import unicode_literals
import django.core.files.storage
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('web', '0096_auto_20171208_1509'),
]
operations = [
migrations.AddField(
model_name='studycolumns',
name='health_partner',
field=models.BooleanField(choices=[(True, b'Yes'), (False, b'No')], default=False, verbose_name=b'Health partner'),
),
migrations.AddField(
model_name='studycolumns',
name='health_partner_feedback_agreement',
field=models.BooleanField(choices=[(True, b'Yes'), (False, b'No')], default=False, verbose_name=b'Agrees to give information to referral'),
),
migrations.AddField(
model_name='studycolumns',
name='previously_in_study',
field=models.BooleanField(choices=[(True, b'Yes'), (False, b'No')], default=False, verbose_name=b'Previously in PDP study'),
),
migrations.AddField(
model_name='studycolumns',
name='referral_letter',
field=models.BooleanField(choices=[(True, b'Yes'), (False, b'No')], default=False, verbose_name=b'Referral letter'),
),
migrations.AddField(
model_name='studycolumns',
name='screening',
field=models.BooleanField(choices=[(True, b'Yes'), (False, b'No')], default=False, verbose_name=b'Screening'),
),
migrations.AddField(
model_name='studycolumns',
name='voucher_types',
field=models.BooleanField(choices=[(True, b'Yes'), (False, b'No')], default=False, verbose_name=b'Voucher types'),
),
migrations.AddField(
model_name='studycolumns',
name='vouchers',
field=models.BooleanField(choices=[(True, b'Yes'), (False, b'No')], default=False, verbose_name=b'Vouchers'),
),
migrations.AddField(
model_name='studysubject',
name='health_partner',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='web.Worker', verbose_name=b'Health partner'),
),
migrations.AddField(
model_name='studysubject',
name='health_partner_feedback_agreement',
field=models.BooleanField(default=False, verbose_name=b'Agrees to give information to referral'),
),
migrations.AddField(
model_name='studysubject',
name='previously_in_study',
field=models.BooleanField(default=False, verbose_name=b'Previously in PDP study'),
),
migrations.AddField(
model_name='studysubject',
name='referral_letter',
field=models.FileField(blank=True, null=True, storage=django.core.files.storage.FileSystemStorage(location=b'uploads'), upload_to=b'referral_letters', verbose_name=b'Referral letter'),
),
migrations.AddField(
model_name='studysubject',
name='screening',
field=models.CharField(blank=True, max_length=1024, null=True, verbose_name=b'Screening'),
),
migrations.AddField(
model_name='studysubject',
name='voucher_types',
field=models.ManyToManyField(blank=True, to='web.VoucherType', verbose_name=b'Voucher types'),
),
migrations.AlterField(
model_name='studycolumns',
name='datetime_contact_reminder',
field=models.BooleanField(choices=[(True, b'Yes'), (False, b'No')], default=True, verbose_name=b'Please make a contact on'),
),
migrations.AlterField(
model_name='studysubject',
name='diagnosis',
field=models.CharField(blank=True, max_length=1024, null=True, verbose_name=b'Diagnosis'),
),
migrations.AlterField(
model_name='voucher',
name='study_subject',
field=models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, related_name='vouchers', to='web.StudySubject'),
),
]
...@@ -78,7 +78,37 @@ class StudyColumns(models.Model): ...@@ -78,7 +78,37 @@ class StudyColumns(models.Model):
verbose_name='Resign reason' verbose_name='Resign reason'
) )
datetime_contact_reminder = models.BooleanField(choices=BOOL_CHOICES, referral_letter = models.BooleanField(choices=BOOL_CHOICES,
default=True, default=False,
verbose_name='Last contact attempt' verbose_name='Referral letter'
) )
health_partner = models.BooleanField(choices=BOOL_CHOICES,
default=False,
verbose_name='Health partner'
)
health_partner_feedback_agreement = models.BooleanField(choices=BOOL_CHOICES,
default=False,
verbose_name='Agrees to give information to referral'
)
screening = models.BooleanField(choices=BOOL_CHOICES,
default=False,
verbose_name='Screening'
)
previously_in_study = models.BooleanField(choices=BOOL_CHOICES,
default=False,
verbose_name='Previously in PDP study',
)
voucher_types = models.BooleanField(choices=BOOL_CHOICES,
default=False,
verbose_name='Voucher types',
)
vouchers = models.BooleanField(choices=BOOL_CHOICES,
default=False,
verbose_name='Vouchers',
)
# coding=utf-8 # coding=utf-8
from django.core.validators import RegexValidator
from django.db import models from django.db import models
from constants import BOOL_CHOICES, SUBJECT_TYPE_CHOICES from web.models import VoucherType, Appointment, Location, Visit
from . import Appointment, Location, Visit from web.models.constants import BOOL_CHOICES, SUBJECT_TYPE_CHOICES, FILE_STORAGE
class StudySubject(models.Model): class StudySubject(models.Model):
...@@ -92,11 +91,47 @@ class StudySubject(models.Model): ...@@ -92,11 +91,47 @@ class StudySubject(models.Model):
blank=True, blank=True,
verbose_name='Referred by' verbose_name='Referred by'
) )
diagnosis = models.CharField(max_length=128, referral_letter = models.FileField(
storage=FILE_STORAGE,
upload_to='referral_letters',
verbose_name='Referral letter',
blank=True,
null=True,
)
health_partner = models.ForeignKey("web.Worker",
verbose_name='Health partner',
null=True,
blank=True
)
health_partner_feedback_agreement = models.BooleanField(
verbose_name='Agrees to give information to referral',
default=False,
)
screening = models.CharField(max_length=1024,
null=True,
blank=True,
verbose_name='Screening'
)
diagnosis = models.CharField(max_length=1024,
null=True, null=True,
blank=True, blank=True,
verbose_name='Diagnosis' verbose_name='Diagnosis'
) )
previously_in_study = models.BooleanField(
verbose_name='Previously in PDP study',
default=False,
)
voucher_types = models.ManyToManyField(VoucherType,
blank=True,
verbose_name='Voucher types'
)
year_of_diagnosis = models.IntegerField( year_of_diagnosis = models.IntegerField(
null=True, null=True,
blank=True, blank=True,
......
...@@ -31,6 +31,7 @@ class Voucher(models.Model): ...@@ -31,6 +31,7 @@ class Voucher(models.Model):
StudySubject, StudySubject,
on_delete=models.CASCADE, on_delete=models.CASCADE,
null=False, null=False,
related_name="vouchers",
editable=False editable=False
) )
......
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
</div> </div>
<div class="box box-info"> <div class="box box-info">
<form method="post" action="" class="form-horizontal"> <form method="post" action="" enctype="multipart/form-data" class="form-horizontal">
{% csrf_token %} {% csrf_token %}
<fieldset> <fieldset>
<div class="box-header with-border"> <div class="box-header with-border">
......
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
</div> </div>
<div class="row"> <div class="row">
<form method="post" action="" class="form-horizontal"> <form method="post" action="" enctype="multipart/form-data" class="form-horizontal">
{% csrf_token %} {% csrf_token %}
<div class="col-md-12"> <div class="col-md-12">
<div class="box box-body"> <div class="box box-body">
......
...@@ -41,7 +41,7 @@ ...@@ -41,7 +41,7 @@
<h3>Subject details</h3> <h3>Subject details</h3>
</div> </div>
<form method="post" action="" class="form-horizontal"> <form method="post" action="" enctype="multipart/form-data" class="form-horizontal">
{% csrf_token %} {% csrf_token %}
<div class="box-body"> <div class="box-body">
<div class="col-md-12"> <div class="col-md-12">
......
...@@ -29,6 +29,7 @@ class StudySubjectEditFormTests(LoggedInWithWorkerTestCase): ...@@ -29,6 +29,7 @@ class StudySubjectEditFormTests(LoggedInWithWorkerTestCase):
def test_validation(self): def test_validation(self):
edit_form = StudySubjectEditForm(self.sample_data) edit_form = StudySubjectEditForm(self.sample_data)
save_status = edit_form.is_valid() save_status = edit_form.is_valid()
logger.debug(edit_form.errors)
self.assertTrue(save_status) self.assertTrue(save_status)
def test_validation_with_empty_study(self): def test_validation_with_empty_study(self):
......
...@@ -75,7 +75,7 @@ def create_voucher(study_subject=None): ...@@ -75,7 +75,7 @@ def create_voucher(study_subject=None):
issue_date=get_today_midnight_date(), issue_date=get_today_midnight_date(),
expiry_date=get_today_midnight_date(), expiry_date=get_today_midnight_date(),
voucher_type=create_voucher_type(), voucher_type=create_voucher_type(),
status = VOUCHER_STATUS_NEW) status=VOUCHER_STATUS_NEW)
def create_empty_notification_parameters(): def create_empty_notification_parameters():
...@@ -260,6 +260,8 @@ def format_form_field(value): ...@@ -260,6 +260,8 @@ def format_form_field(value):
return value.strftime('%Y-%m-%d') return value.strftime('%Y-%m-%d')
elif isinstance(value, datetime.datetime): elif isinstance(value, datetime.datetime):
return value.strftime('%Y-%m-%d %H:%M') return value.strftime('%Y-%m-%d %H:%M')
elif value is None:
return ""
else: else:
return value return value
......
import datetime import datetime
import logging import logging
from django.core.files.uploadedfile import SimpleUploadedFile
from django.urls import reverse from django.urls import reverse
from web.forms import AppointmentEditForm, SubjectEditForm, StudySubjectEditForm from web.forms import AppointmentEditForm, SubjectEditForm, StudySubjectEditForm
...@@ -171,17 +172,15 @@ class AppointmentsViewTests(LoggedInTestCase): ...@@ -171,17 +172,15 @@ class AppointmentsViewTests(LoggedInTestCase):
def prepare_form(self, appointment, subject): def prepare_form(self, appointment, subject):
form_appointment = AppointmentEditForm(user=self.user, instance=appointment, prefix="appointment") form_appointment = AppointmentEditForm(user=self.user, instance=appointment, prefix="appointment")
form_study_subject = StudySubjectEditForm(instance=subject, prefix="study-subject") form_study_subject = StudySubjectEditForm(instance=subject, prefix="study-subject")
form_subject = SubjectEditForm(instance=subject.subject, prefix="study-subject") form_subject = SubjectEditForm(instance=subject.subject, prefix="subject")
form_data = {} form_data = {}
for key, value in form_appointment.initial.items(): for key, value in form_appointment.initial.items():
if value is not None: form_data['appointment-{}'.format(key)] = format_form_field(value)
form_data['appointment-{}'.format(key)] = format_form_field(value)
for key, value in form_study_subject.initial.items(): for key, value in form_study_subject.initial.items():
if value is not None: form_data['study-subject-{}'.format(key)] = format_form_field(value)
form_data['study-subject-{}'.format(key)] = format_form_field(value)
for key, value in form_subject.initial.items(): for key, value in form_subject.initial.items():
if value is not None: form_data['subject-{}'.format(key)] = format_form_field(value)
form_data['subject-{}'.format(key)] = format_form_field(value) form_data["study-subject-referral_letter"] = SimpleUploadedFile("file.txt", b"file_content")
return form_data return form_data
def test_subject_flying_team_location(self): def test_subject_flying_team_location(self):
......
import datetime import datetime
import logging import logging
from django.core.files.uploadedfile import SimpleUploadedFile
from django.urls import reverse from django.urls import reverse
from web.forms import SubjectAddForm, SubjectEditForm, StudySubjectAddForm, StudySubjectEditForm from web.forms import SubjectAddForm, SubjectEditForm, StudySubjectAddForm, StudySubjectEditForm
...@@ -9,7 +10,7 @@ from web.models.constants import SEX_CHOICES_MALE, SUBJECT_TYPE_CHOICES_CONTROL, ...@@ -9,7 +10,7 @@ from web.models.constants import SEX_CHOICES_MALE, SUBJECT_TYPE_CHOICES_CONTROL,
COUNTRY_AFGHANISTAN_ID, COUNTRY_OTHER_ID, MAIL_TEMPLATE_CONTEXT_SUBJECT COUNTRY_AFGHANISTAN_ID, COUNTRY_OTHER_ID, MAIL_TEMPLATE_CONTEXT_SUBJECT
from web.tests import LoggedInWithWorkerTestCase from web.tests import LoggedInWithWorkerTestCase
from web.tests.functions import create_study_subject, create_visit, create_appointment, get_test_location, \ from web.tests.functions import create_study_subject, create_visit, create_appointment, get_test_location, \
create_language, get_resource_path, get_test_study create_language, get_resource_path, get_test_study, format_form_field
from web.views.notifications import get_today_midnight_date from web.views.notifications import get_today_midnight_date
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
...@@ -75,8 +76,11 @@ class SubjectsViewTests(LoggedInWithWorkerTestCase): ...@@ -75,8 +76,11 @@ class SubjectsViewTests(LoggedInWithWorkerTestCase):
form_data['subject-dead'] = "True" form_data['subject-dead'] = "True"
form_data['study_subject-resigned'] = "True" form_data['study_subject-resigned'] = "True"
form_data['study_subject-resign_reason'] = "doesn't want to participate" form_data['study_subject-resign_reason'] = "doesn't want to participate"
response = self.client.post(
reverse('web.views.subject_edit', kwargs={'id': self.study_subject.id}), data=form_data) url = reverse('web.views.subject_edit', kwargs={'id': self.study_subject.id})
response = self.client.post(url, data=form_data)
logger.debug(response.content)
self.assertEqual(response.status_code, 302) self.assertEqual(response.status_code, 302)
updated_study_subject = StudySubject.objects.filter(id=self.study_subject.id)[0] updated_study_subject = StudySubject.objects.filter(id=self.study_subject.id)[0]
...@@ -98,11 +102,10 @@ class SubjectsViewTests(LoggedInWithWorkerTestCase): ...@@ -98,11 +102,10 @@ class SubjectsViewTests(LoggedInWithWorkerTestCase):
form_subject = SubjectEditForm(instance=self.study_subject.subject, prefix="subject") form_subject = SubjectEditForm(instance=self.study_subject.subject, prefix="subject")
form_data = {} form_data = {}
for key, value in form_study_subject.initial.items(): for key, value in form_study_subject.initial.items():
if value is not None: form_data['study_subject-{}'.format(key)] = format_form_field(value)
form_data['study_subject-{}'.format(key)] = value
for key, value in form_subject.initial.items(): for key, value in form_subject.initial.items():
if value is not None: form_data['subject-{}'.format(key)] = format_form_field(value)
form_data['subject-{}'.format(key)] = value form_data["study_subject-referral_letter"] = SimpleUploadedFile("file.txt", b"file_content")
return form_data return form_data
def create_add_form_data_for_study_subject(self): def create_add_form_data_for_study_subject(self):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment