Skip to content
Snippets Groups Projects

Virus visit column changes

Merged Carlos Vega requested to merge virus_visit_column_changes into master
import logging
import re
from distutils.util import strtobool
from django import forms
from django.forms import ModelForm
from web.models import ConfigurationItem
from distutils.util import strtobool
from web.forms.forms import DATETIMEPICKER_DATE_ATTRS, get_worker_from_args
from web.models import ConfigurationItem
from web.models import StudySubject, Study, StudyColumns, VoucherType, Worker
from web.models.constants import SCREENING_NUMBER_PREFIXES_FOR_TYPE, VISIT_SHOW_VISIT_NUMBER_FROM_ZERO
from web.models.worker_study_role import WORKER_HEALTH_PARTNER
@@ -16,17 +15,20 @@ logger = logging.getLogger(__name__)
class StudySubjectForm(ModelForm):
datetime_contact_reminder = forms.DateTimeField(label="Contact on", widget=forms.DateTimeInput(DATETIMEPICKER_DATE_ATTRS), required=False)
datetime_contact_reminder = forms.DateTimeField(label="Contact on",
widget=forms.DateTimeInput(DATETIMEPICKER_DATE_ATTRS),
required=False)
referral_letter = forms.FileField(label='Referral letter', widget=SecuredFileWidget(), required=False)
voucher_types = forms.ModelMultipleChoiceField(required=False, widget=forms.CheckboxSelectMultiple, queryset=VoucherType.objects.all())
voucher_types = forms.ModelMultipleChoiceField(required=False, widget=forms.CheckboxSelectMultiple,
queryset=VoucherType.objects.all())
def __init__(self, *args, **kwargs):
super(StudySubjectForm, self).__init__(*args, **kwargs)
self.fields['health_partner'].queryset = Worker.get_workers_by_worker_type(
WORKER_HEALTH_PARTNER)
visit_from_zero = ConfigurationItem.objects.get(type=VISIT_SHOW_VISIT_NUMBER_FROM_ZERO).value
#True values are y, yes, t, true, on and 1; false values are n, no, f, false, off and 0.
# True values are y, yes, t, true, on and 1; false values are n, no, f, false, off and 0.
if strtobool(visit_from_zero):
virus_visit_numbers = range(0, 5)
for one_based_idx, virus_visit_number in enumerate(virus_visit_numbers, 1):
@@ -34,11 +36,24 @@ class StudySubjectForm(ModelForm):
self.fields[field].label = 'Visit {} RT-PCR'.format(virus_visit_number)
date_field = 'virus_test_{}_updated'.format(one_based_idx)
self.fields[date_field].label = 'Visit {} RT-PCR date'.format(virus_visit_number)
for visit_number in range(1, 6):
disable_virus_test_field(self, visit_number)
self.update_virus_inconclusive_data(visit_number)
def update_virus_inconclusive_data(self, visit_number):
test_result_column_name = 'virus_test_{}'.format(visit_number)
test_date_column_name = 'virus_test_{}_updated'.format(visit_number)
self.fields[test_result_column_name].widget.choices.append(("Inc", 'Inconclusive'))
instance = getattr(self, 'instance', None)
if instance and instance.id:
test_result = getattr(instance, test_result_column_name)
test_date = getattr(instance, test_date_column_name)
if test_result is None and test_date is not None:
self.initial[test_result_column_name] = "Inc"
class StudySubjectAddForm(StudySubjectForm):
class StudySubjectAddForm(StudySubjectForm):
class Meta:
model = StudySubject
fields = '__all__'
@@ -49,16 +64,8 @@ class StudySubjectAddForm(StudySubjectForm):
self.study = get_study_from_args(kwargs)
super(StudySubjectAddForm, self).__init__(*args, **kwargs)
self.fields['virus_test_1'].widget.attrs['readonly'] = True
self.fields['virus_test_2'].widget.attrs['readonly'] = True
self.fields['virus_test_3'].widget.attrs['readonly'] = True
self.fields['virus_test_4'].widget.attrs['readonly'] = True
self.fields['virus_test_5'].widget.attrs['readonly'] = True
self.fields['virus_test_1_updated'].widget.attrs['readonly'] = True
self.fields['virus_test_2_updated'].widget.attrs['readonly'] = True
self.fields['virus_test_3_updated'].widget.attrs['readonly'] = True
self.fields['virus_test_4_updated'].widget.attrs['readonly'] = True
self.fields['virus_test_5_updated'].widget.attrs['readonly'] = True
for visit_number in range(1, 6):
disable_virus_test_field(self, visit_number)
prepare_study_subject_fields(fields=self.fields, study=self.study)
@@ -117,7 +124,6 @@ def get_new_screening_number(screening_number_prefix):
class StudySubjectDetailForm(StudySubjectForm):
class Meta:
model = StudySubject
fields = '__all__'
@@ -152,18 +158,6 @@ class StudySubjectEditForm(StudySubjectForm):
self.fields['resigned'].disabled = was_resigned
self.fields['endpoint_reached'].disabled = endpoint_was_reached
self.fields['virus_test_1'].widget.attrs['readonly'] = True
self.fields['virus_test_2'].widget.attrs['readonly'] = True
self.fields['virus_test_3'].widget.attrs['readonly'] = True
self.fields['virus_test_4'].widget.attrs['readonly'] = True
self.fields['virus_test_5'].widget.attrs['readonly'] = True
self.fields['virus_test_1_updated'].widget.attrs['readonly'] = True
self.fields['virus_test_2_updated'].widget.attrs['readonly'] = True
self.fields['virus_test_3_updated'].widget.attrs['readonly'] = True
self.fields['virus_test_4_updated'].widget.attrs['readonly'] = True
self.fields['virus_test_5_updated'].widget.attrs['readonly'] = True
prepare_study_subject_fields(fields=self.fields, study=self.study)
def clean(self):
@@ -176,6 +170,14 @@ class StudySubjectEditForm(StudySubjectForm):
fields = '__all__'
def disable_virus_test_field(self, visit_number):
test_result_column_name = 'virus_test_{}'.format(visit_number)
test_date_column_name = 'virus_test_{}_updated'.format(visit_number)
self.fields[test_result_column_name].widget.attrs['readonly'] = True
self.fields[test_result_column_name].widget.attrs['disabled'] = True
self.fields[test_date_column_name].widget.attrs['readonly'] = True
def get_study_from_args(kwargs):
study = kwargs.pop('study', None)
if study is None:
@@ -251,7 +253,8 @@ def validate_subject_nd_number(self, cleaned_data):
if subjects_from_db:
if subjects_from_db[0].screening_number != cleaned_data.get('screening_number', ''):
self.add_error('nd_number', "ND number already in use")
#else: #empty nd_number is valid
# else: #empty nd_number is valid
def validate_subject_resign_reason(self, cleaned_data):
if self.study.columns.resigned and self.study.columns.resign_reason:
Loading