Skip to content
Snippets Groups Projects
study_forms.py 2.67 KiB
Newer Older
Piotr Gawron's avatar
Piotr Gawron committed
import logging

from django.forms import ModelForm, ValidationError
from web.models import Study, StudyNotificationParameters, StudyColumns, StudySubject
Piotr Gawron's avatar
Piotr Gawron committed

import datetime
from dateutil.relativedelta import relativedelta

Piotr Gawron's avatar
Piotr Gawron committed
logger = logging.getLogger(__name__)


class StudyEditForm(ModelForm):

    def __init__(self, *args, **kwargs):
        super(StudyEditForm, self).__init__(*args, **kwargs)

    def clean(self):
        cleaned_data = super(StudyEditForm, self).clean()

        #check regex
        nd_number_study_subject_regex = cleaned_data.get('nd_number_study_subject_regex')
        instance = getattr(self, 'instance', None)
        if nd_number_study_subject_regex is None or StudySubject.check_nd_number_regex(nd_number_study_subject_regex, instance) == False:
            self.add_error('nd_number_study_subject_regex', 'Please enter a valid nd_number_study_subject_regex regex.')

        #check default_visit_duration_in_months
        visit_duration_in_months = cleaned_data.get('default_visit_duration_in_months')
        control_follow_up = cleaned_data.get('default_delta_time_for_control_follow_up')
        patient_follow_up = cleaned_data.get('default_delta_time_for_patient_follow_up')
        units = cleaned_data.get('default_delta_time_for_follow_up_units')

        if None not in [visit_duration_in_months, control_follow_up, patient_follow_up, units]:
            t = datetime.datetime.today()
            visit_duration = relativedelta(months=int(visit_duration_in_months))
            control_delta = relativedelta(**{units: control_follow_up})
            patient_delta = relativedelta(**{units: patient_follow_up})
            #relative time delta has no __cmp__ method, so we add them to a datetime
            min_delta_time = min((t + control_delta), (t + patient_delta))
            if (t+visit_duration) > min_delta_time:
                self.add_error('default_visit_duration_in_months', 'Please enter a valid "duration of the visits". It must be shorter than the time difference between patient and control visits.')
        return cleaned_data
Piotr Gawron's avatar
Piotr Gawron committed
    class Meta:
        model = Study
        fields = '__all__'
        exclude = ['columns', 'notification_parameters']


class StudyNotificationParametersEditForm(ModelForm):

    def __init__(self, *args, **kwargs):
        super(StudyNotificationParametersEditForm,
              self).__init__(*args, **kwargs)

    class Meta:
        model = StudyNotificationParameters
        fields = '__all__'


class StudyColumnsEditForm(ModelForm):

    def __init__(self, *args, **kwargs):
        super(StudyColumnsEditForm, self).__init__(*args, **kwargs)

    class Meta:
        model = StudyColumns
        fields = '__all__'