Changeset 704

Show
Ignore:
Timestamp:
11/24/10 14:25:15 (2 years ago)
Author:
jose.brandao
Message:

Widget for enrolment dates

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/opentrials/repository/trds_forms.py

    r688 r704  
    1818from django.forms.formsets import DELETION_FIELD_NAME 
    1919from django.template.defaultfilters import linebreaksbr 
     20from django.utils.dates import MONTHS 
    2021 
    2122from django import forms 
     
    321322trial_validator.register(TRIAL_FORMS[3], [InterventionForm, InterventionDescriptorForm]) 
    322323 
     324class YearMonthWidget(forms.MultiWidget): 
     325    """ 
     326    This widget shows two combos with year and month and returns as a date of first day 
     327    of that month 
     328    """ 
     329 
     330    def __init__(self, *args, **kwargs): 
     331        MONTHS_CHOICES = [('','-------')] + MONTHS.items() 
     332        YEARS_CHOICES = [('','-------')] + [(y,y) for y in range(2000,2050)] 
     333        widgets = [ 
     334                forms.Select(choices=MONTHS_CHOICES), 
     335                forms.Select(choices=YEARS_CHOICES), 
     336                ] 
     337 
     338        super(YearMonthWidget, self).__init__(widgets=widgets, *args, **kwargs) 
     339 
     340    def decompress(self, value): 
     341        if not value: 
     342            ret = ['', ''] 
     343        else: 
     344            ret = map(int, value.split('-')[:2]) 
     345            ret.reverse() 
     346        return ret 
     347 
     348    def value_from_datadict(self, data, files, name): 
     349        month, year = data[name+'_0'], data[name+'_1'] 
     350 
     351        try: 
     352            return date(int(year), int(month), 1) 
     353        except ValueError: 
     354            return None 
     355 
     356 
    323357### step_5 ##################################################################### 
    324358class RecruitmentForm(ReviewModelForm): 
    325359    class Meta: 
    326360        model = ClinicalTrial 
    327         fields = ['recruitment_status', 'recruitment_country','enrollment_start_planned', 
    328                   'enrollment_end_planned','target_sample_size', 'inclusion_criteria', 
     361        fields = ['recruitment_status', 'recruitment_country', 
     362                  'target_sample_size', 'inclusion_criteria', 
    329363                  'gender', 'agemin_value', 'agemin_unit', 
    330364                  'agemax_value', 'agemax_unit', 'exclusion_criteria', 
     
    348382 
    349383    # TRDS 16a,b (type_enrollment: anticipated or actual) 
    350     enrollment_start_planned = forms.DateField( # yyyy-mm or yyyy-mm-dd 
    351         required=False, 
    352         label=_('Planned Date of First Enrollment')) 
     384    enrollment_start_date = forms.Field( # yyyy-mm or yyyy-mm-dd 
     385        required=False, 
     386        label=_('Planned Date of First Enrollment'), 
     387        widget=YearMonthWidget, 
     388        ) 
     389    enrollment_end_date = forms.Field( # yyyy-mm or yyyy-mm-dd 
     390        required=False, 
     391        label=_('Planned Date of Last Enrollment'), 
     392        widget=YearMonthWidget, 
     393        ) 
    353394 
    354395    # TRDS 17 
     
    375416    exclusion_criteria = forms.CharField(label=_('Exclusion Criteria'),required=False, 
    376417                                        max_length=8000, widget=forms.Textarea,) 
     418 
     419    def __init__(self, *args, **kwargs): 
     420        self.base_fields.keyOrder = ['recruitment_status', 'recruitment_country', 
     421                'enrollment_start_date', 'enrollment_end_date', 'target_sample_size', 
     422                'inclusion_criteria', 'gender', 'agemin_value', 'agemin_unit', 
     423                'agemax_value', 'agemax_unit', 'exclusion_criteria'] 
     424 
     425        super(RecruitmentForm, self).__init__(*args, **kwargs) 
     426 
     427        if self.instance: 
     428            self.fields['enrollment_start_date'].initial = self.instance.enrollment_start_planned or\ 
     429                                                           self.instance.enrollment_start_actual 
     430            self.fields['enrollment_end_date'].initial = self.instance.enrollment_end_planned or\ 
     431                                                         self.instance.enrollment_end_actual 
     432 
     433    def save(self, commit=True, *args, **kwargs): 
     434        obj = super(RecruitmentForm, self).save(commit=False, *args, **kwargs) 
     435 
     436        obj.enrollment_start_planned = None 
     437        obj.enrollment_start_actual = None 
     438        if self.cleaned_data.get('enrollment_start_date', None): 
     439            if self.cleaned_data['enrollment_start_date'] > date.today(): 
     440                obj.enrollment_start_planned = self.cleaned_data['enrollment_start_date'] 
     441            else: 
     442                obj.enrollment_start_actual = self.cleaned_data['enrollment_start_date'] 
     443 
     444        obj.enrollment_end_planned = None 
     445        obj.enrollment_end_actual = None 
     446        if self.cleaned_data.get('enrollment_end_date', None): 
     447            if self.cleaned_data['enrollment_end_date'] > date.today(): 
     448                obj.enrollment_end_planned = self.cleaned_data['enrollment_end_date'] 
     449            else: 
     450                obj.enrollment_end_actual = self.cleaned_data['enrollment_end_date'] 
     451 
     452        if commit: 
     453            obj.save() 
     454 
     455        return obj 
    377456 
    378457trial_validator.register(TRIAL_FORMS[4], [RecruitmentForm])