Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
study_forms.py 2.44 KiB
import logging

from django.forms import ModelForm, ValidationError
from web.models import Study, StudyNotificationParameters, StudyColumns, StudySubject

import datetime
from dateutil.relativedelta import relativedelta

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')

        if StudySubject.check_nd_number_regex(nd_number_study_subject_regex) == 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
        t = datetime.datetime.today()

        visit_duration_in_months = cleaned_data.get('default_visit_duration_in_months')
        visit_duration = relativedelta(months=int(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')

        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

    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__'