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