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/~/
# files uploaded and hosted by django
smash/uploads/
smash/smash/uploads/
# Disable python bytecode
*.pyc
......
......@@ -5,18 +5,31 @@ from django import forms
from django.forms import ModelForm
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.widgets.secure_file_widget import SecuredFileWidget
logger = logging.getLogger(__name__)
class StudySubjectAddForm(ModelForm):
class StudySubjectForm(ModelForm):
datetime_contact_reminder = forms.DateTimeField(label="Contact on",
widget=forms.DateTimeInput(DATETIMEPICKER_DATE_ATTRS),
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:
model = StudySubject
fields = '__all__'
......@@ -26,12 +39,12 @@ class StudySubjectAddForm(ModelForm):
self.user = get_worker_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)
def save(self, commit=True):
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):
screening_number = cleaned_data.get('screening_number', None)
......@@ -83,7 +96,7 @@ def get_new_screening_number(screening_number_prefix):
return screening_number_prefix + str(result_number + 1).zfill(3)
class StudySubjectDetailForm(ModelForm):
class StudySubjectDetailForm(StudySubjectForm):
class Meta:
model = StudySubject
fields = '__all__'
......@@ -104,11 +117,7 @@ def get_study_from_study_subject_instance(study_subject):
return Study(columns=StudyColumns())
class StudySubjectEditForm(ModelForm):
datetime_contact_reminder = forms.DateTimeField(label="Contact on",
widget=forms.DateTimeInput(DATETIMEPICKER_DATE_ATTRS),
required=False
)
class StudySubjectEditForm(StudySubjectForm):
def __init__(self, *args, **kwargs):
was_resigned = kwargs.get('was_resigned', False)
......@@ -166,6 +175,12 @@ def prepare_study_subject_fields(fields, study):
prepare_field(fields, study.columns, 'pd_in_family')
prepare_field(fields, study.columns, 'resigned')
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):
......
# -*- 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):
verbose_name='Resign reason'
)
datetime_contact_reminder = models.BooleanField(choices=BOOL_CHOICES,
default=True,
verbose_name='Last contact attempt'
)
referral_letter = models.BooleanField(choices=BOOL_CHOICES,
default=False,
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
from django.core.validators import RegexValidator
from django.db import models
from constants import BOOL_CHOICES, SUBJECT_TYPE_CHOICES
from . import Appointment, Location, Visit
from web.models import VoucherType, Appointment, Location, Visit
from web.models.constants import BOOL_CHOICES, SUBJECT_TYPE_CHOICES, FILE_STORAGE
class StudySubject(models.Model):
......@@ -92,11 +91,47 @@ class StudySubject(models.Model):
blank=True,
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,
blank=True,
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(
null=True,
blank=True,
......
......@@ -31,6 +31,7 @@ class Voucher(models.Model):
StudySubject,
on_delete=models.CASCADE,
null=False,
related_name="vouchers",
editable=False
)
......
......@@ -35,7 +35,7 @@
</div>
<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 %}
<fieldset>
<div class="box-header with-border">
......
......@@ -31,7 +31,7 @@
</div>
<div class="row">
<form method="post" action="" class="form-horizontal">
<form method="post" action="" enctype="multipart/form-data" class="form-horizontal">
{% csrf_token %}
<div class="col-md-12">
<div class="box box-body">
......
......@@ -41,7 +41,7 @@
<h3>Subject details</h3>
</div>
<form method="post" action="" class="form-horizontal">
<form method="post" action="" enctype="multipart/form-data" class="form-horizontal">
{% csrf_token %}
<div class="box-body">
<div class="col-md-12">
......
......@@ -29,6 +29,7 @@ class StudySubjectEditFormTests(LoggedInWithWorkerTestCase):
def test_validation(self):
edit_form = StudySubjectEditForm(self.sample_data)
save_status = edit_form.is_valid()
logger.debug(edit_form.errors)
self.assertTrue(save_status)
def test_validation_with_empty_study(self):
......
......@@ -75,7 +75,7 @@ def create_voucher(study_subject=None):
issue_date=get_today_midnight_date(),
expiry_date=get_today_midnight_date(),
voucher_type=create_voucher_type(),
status = VOUCHER_STATUS_NEW)
status=VOUCHER_STATUS_NEW)
def create_empty_notification_parameters():
......@@ -260,6 +260,8 @@ def format_form_field(value):
return value.strftime('%Y-%m-%d')
elif isinstance(value, datetime.datetime):
return value.strftime('%Y-%m-%d %H:%M')
elif value is None:
return ""
else:
return value
......
import datetime
import logging
from django.core.files.uploadedfile import SimpleUploadedFile
from django.urls import reverse
from web.forms import AppointmentEditForm, SubjectEditForm, StudySubjectEditForm
......@@ -171,17 +172,15 @@ class AppointmentsViewTests(LoggedInTestCase):
def prepare_form(self, appointment, subject):
form_appointment = AppointmentEditForm(user=self.user, instance=appointment, prefix="appointment")
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 = {}
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():
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():
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
def test_subject_flying_team_location(self):
......
import datetime
import logging
from django.core.files.uploadedfile import SimpleUploadedFile
from django.urls import reverse
from web.forms import SubjectAddForm, SubjectEditForm, StudySubjectAddForm, StudySubjectEditForm
......@@ -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
from web.tests import LoggedInWithWorkerTestCase
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
logger = logging.getLogger(__name__)
......@@ -75,8 +76,11 @@ class SubjectsViewTests(LoggedInWithWorkerTestCase):
form_data['subject-dead'] = "True"
form_data['study_subject-resigned'] = "True"
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)
updated_study_subject = StudySubject.objects.filter(id=self.study_subject.id)[0]
......@@ -98,11 +102,10 @@ class SubjectsViewTests(LoggedInWithWorkerTestCase):
form_subject = SubjectEditForm(instance=self.study_subject.subject, prefix="subject")
form_data = {}
for key, value in form_study_subject.initial.items():
if value is not None:
form_data['study_subject-{}'.format(key)] = value
form_data['study_subject-{}'.format(key)] = format_form_field(value)
for key, value in form_subject.initial.items():
if value is not None:
form_data['subject-{}'.format(key)] = 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
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