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

StudySubjectAddForm requires study parameter

during save study is automatically injected into model
parent f1578f05
No related branches found
No related tags found
1 merge request!101Resolve "list of subjects should contain columns dependent on the study"
import logging
from docx import Document from docx import Document
logger = logging.getLogger(__name__)
def process_file(path_to_docx, path_to_new_docx, changes_to_apply): def process_file(path_to_docx, path_to_new_docx, changes_to_apply):
""" """
......
...@@ -66,6 +66,23 @@ def validate_subject_mpower_number(self, cleaned_data): ...@@ -66,6 +66,23 @@ def validate_subject_mpower_number(self, cleaned_data):
self.add_error('mpower_id', "mPower number already in use") self.add_error('mpower_id', "mPower number already in use")
def get_worker_from_args(kwargs):
user = kwargs.pop('user', None)
if user is None:
raise TypeError("User not defined")
result = Worker.get_by_user(user)
if result is None:
raise TypeError("Worker not defined for: " + user.username)
return result
def get_study_from_args(kwargs):
study = kwargs.pop('study', None)
if study is None:
raise TypeError("Study not defined")
return study
class StudySubjectAddForm(ModelForm): class StudySubjectAddForm(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),
...@@ -78,16 +95,16 @@ class StudySubjectAddForm(ModelForm): ...@@ -78,16 +95,16 @@ class StudySubjectAddForm(ModelForm):
exclude = ['resigned', 'resign_reason'] exclude = ['resigned', 'resign_reason']
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
user = kwargs.pop('user', None) self.user = get_worker_from_args(kwargs)
if user is None: self.study = get_study_from_args(kwargs)
raise TypeError("User not defined")
self.user = Worker.get_by_user(user)
if self.user is None:
raise TypeError("Worker not defined for: " + user.username)
super(ModelForm, self).__init__(*args, **kwargs) super(ModelForm, self).__init__(*args, **kwargs)
self.fields['screening_number'].required = False self.fields['screening_number'].required = False
def save(self, commit=True):
self.instance.study_id = self.study.id
return super(ModelForm, 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)
if not screening_number: if not screening_number:
......
...@@ -23,7 +23,7 @@ class StudySubjectAddFormTests(LoggedInWithWorkerTestCase): ...@@ -23,7 +23,7 @@ class StudySubjectAddFormTests(LoggedInWithWorkerTestCase):
} }
def test_validation(self): def test_validation(self):
form = StudySubjectAddForm(data=self.sample_data, user=self.user) form = StudySubjectAddForm(data=self.sample_data, user=self.user, study=self.study)
form.is_valid() form.is_valid()
self.assertTrue(form.is_valid()) self.assertTrue(form.is_valid())
...@@ -31,15 +31,14 @@ class StudySubjectAddFormTests(LoggedInWithWorkerTestCase): ...@@ -31,15 +31,14 @@ class StudySubjectAddFormTests(LoggedInWithWorkerTestCase):
form_data = self.sample_data form_data = self.sample_data
form_data['screening_number'] = "123" form_data['screening_number'] = "123"
form = StudySubjectAddForm(data=form_data, user=self.user) form = StudySubjectAddForm(data=form_data, user=self.user, study=self.study)
form.is_valid() form.is_valid()
form.instance.subject_id = self.subject.id form.instance.subject_id = self.subject.id
form.instance.study_id = self.study.id
self.assertTrue(form.is_valid()) self.assertTrue(form.is_valid())
self.assertIsNone(form.fields['year_of_diagnosis'].initial) self.assertIsNone(form.fields['year_of_diagnosis'].initial)
form.save() form.save()
form2 = StudySubjectAddForm(data=form_data, user=self.user) form2 = StudySubjectAddForm(data=form_data, user=self.user, study=self.study)
validation_status = form2.is_valid() validation_status = form2.is_valid()
self.assertFalse(validation_status) self.assertFalse(validation_status)
self.assertTrue("screening_number" in form2.errors) self.assertTrue("screening_number" in form2.errors)
...@@ -48,15 +47,14 @@ class StudySubjectAddFormTests(LoggedInWithWorkerTestCase): ...@@ -48,15 +47,14 @@ class StudySubjectAddFormTests(LoggedInWithWorkerTestCase):
form_data = self.sample_data form_data = self.sample_data
form_data['nd_number'] = "ND0123" form_data['nd_number'] = "ND0123"
form = StudySubjectAddForm(data=form_data, user=self.user) form = StudySubjectAddForm(data=form_data, user=self.user, study=self.study)
form.is_valid() form.is_valid()
self.assertTrue(form.is_valid()) self.assertTrue(form.is_valid())
form.instance.subject_id = self.subject.id form.instance.subject_id = self.subject.id
form.instance.study_id = self.study.id
form.save() form.save()
form_data['screening_number'] = "2" form_data['screening_number'] = "2"
form2 = StudySubjectAddForm(data=form_data, user=self.user) form2 = StudySubjectAddForm(data=form_data, user=self.user, study=self.study)
validation_status = form2.is_valid() validation_status = form2.is_valid()
self.assertFalse(validation_status) self.assertFalse(validation_status)
self.assertTrue("nd_number" in form2.errors) self.assertTrue("nd_number" in form2.errors)
...@@ -65,15 +63,14 @@ class StudySubjectAddFormTests(LoggedInWithWorkerTestCase): ...@@ -65,15 +63,14 @@ class StudySubjectAddFormTests(LoggedInWithWorkerTestCase):
form_data = self.sample_data form_data = self.sample_data
form_data['mpower_id'] = "123" form_data['mpower_id'] = "123"
form = StudySubjectAddForm(data=form_data, user=self.user) form = StudySubjectAddForm(data=form_data, user=self.user, study=self.study)
form.is_valid() form.is_valid()
self.assertTrue(form.is_valid()) self.assertTrue(form.is_valid())
form.instance.subject_id = self.subject.id form.instance.subject_id = self.subject.id
form.instance.study_id = self.study.id
form.save() form.save()
form_data['screening_number'] = "2" form_data['screening_number'] = "2"
form2 = StudySubjectAddForm(data=form_data, user=self.user) form2 = StudySubjectAddForm(data=form_data, user=self.user, study=self.study)
validation_status = form2.is_valid() validation_status = form2.is_valid()
self.assertFalse(validation_status) self.assertFalse(validation_status)
self.assertTrue("mpower_id" in form2.errors) self.assertTrue("mpower_id" in form2.errors)
......
...@@ -9,7 +9,7 @@ from web.models.constants import SEX_CHOICES_MALE, SUBJECT_TYPE_CHOICES_CONTROL, ...@@ -9,7 +9,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 create_language, get_resource_path, get_test_study
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__)
...@@ -19,6 +19,7 @@ class SubjectsViewTests(LoggedInWithWorkerTestCase): ...@@ -19,6 +19,7 @@ class SubjectsViewTests(LoggedInWithWorkerTestCase):
def setUp(self): def setUp(self):
super(SubjectsViewTests, self).setUp() super(SubjectsViewTests, self).setUp()
self.study_subject = create_study_subject() self.study_subject = create_study_subject()
self.study = get_test_study()
def test_render_subjects_add(self): def test_render_subjects_add(self):
self.worker.save() self.worker.save()
...@@ -105,7 +106,7 @@ class SubjectsViewTests(LoggedInWithWorkerTestCase): ...@@ -105,7 +106,7 @@ class SubjectsViewTests(LoggedInWithWorkerTestCase):
return form_data return form_data
def create_add_form_data_for_study_subject(self): def create_add_form_data_for_study_subject(self):
form_study_subject = StudySubjectAddForm(prefix="study_subject", user=self.user) form_study_subject = StudySubjectAddForm(prefix="study_subject", user=self.user, study=self.study)
form_subject = SubjectAddForm(prefix="subject") form_subject = SubjectAddForm(prefix="subject")
form_data = {} form_data = {}
for key, value in form_study_subject.initial.items(): for key, value in form_study_subject.initial.items():
......
...@@ -4,10 +4,10 @@ import logging ...@@ -4,10 +4,10 @@ import logging
from django.contrib import messages from django.contrib import messages
from django.shortcuts import redirect, get_object_or_404 from django.shortcuts import redirect, get_object_or_404
from ..models.constants import GLOBAL_STUDY_ID
from . import wrap_response from . import wrap_response
from ..forms import StudySubjectAddForm, StudySubjectEditForm, VisitDetailForm, SubjectEditForm, SubjectAddForm from ..forms import StudySubjectAddForm, StudySubjectEditForm, VisitDetailForm, SubjectEditForm, SubjectAddForm
from ..models import StudySubject, MailTemplate, Worker from ..models import StudySubject, MailTemplate, Worker, Study
from ..models.constants import GLOBAL_STUDY_ID
SUBJECT_LIST_GENERIC = "GENERIC" SUBJECT_LIST_GENERIC = "GENERIC"
SUBJECT_LIST_NO_VISIT = "NO_VISIT" SUBJECT_LIST_NO_VISIT = "NO_VISIT"
...@@ -25,14 +25,14 @@ def subjects(request): ...@@ -25,14 +25,14 @@ def subjects(request):
def subject_add(request): def subject_add(request):
study = Study.objects.filter(id=GLOBAL_STUDY_ID)[0]
if request.method == 'POST': if request.method == 'POST':
study_subject_form = StudySubjectAddForm(request.POST, request.FILES, prefix="study_subject", user=request.user) study_subject_form = StudySubjectAddForm(request.POST, request.FILES, prefix="study_subject", user=request.user, study=study)
subject_form = SubjectAddForm(request.POST, request.FILES, prefix="subject") subject_form = SubjectAddForm(request.POST, request.FILES, prefix="subject")
if study_subject_form.is_valid() and subject_form.is_valid(): if study_subject_form.is_valid() and subject_form.is_valid():
subject = subject_form.save() subject = subject_form.save()
study_subject_form.instance.subject_id = subject.id study_subject_form.instance.subject_id = subject.id
study_subject_form.instance.study_id = GLOBAL_STUDY_ID
study_subject_form.save() study_subject_form.save()
messages.add_message(request, messages.SUCCESS, 'Subject created') messages.add_message(request, messages.SUCCESS, 'Subject created')
return redirect('web.views.subject_edit', id=study_subject_form.instance.id) return redirect('web.views.subject_edit', id=study_subject_form.instance.id)
...@@ -40,7 +40,7 @@ def subject_add(request): ...@@ -40,7 +40,7 @@ def subject_add(request):
messages.add_message(request, messages.ERROR, 'Invalid data. Please fix data and try again.') messages.add_message(request, messages.ERROR, 'Invalid data. Please fix data and try again.')
else: else:
study_subject_form = StudySubjectAddForm(user=request.user, prefix="study_subject") study_subject_form = StudySubjectAddForm(user=request.user, prefix="study_subject", study=study)
subject_form = SubjectAddForm(prefix="subject") subject_form = SubjectAddForm(prefix="subject")
return wrap_response(request, 'subjects/add.html', return wrap_response(request, 'subjects/add.html',
......
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