Django

Code

Changeset 4202

Show
Ignore:
Timestamp:
12/14/06 14:35:32 (2 years ago)
Author:
adrian
Message:

Fixed #3143 -- Added TimeField? to newforms. Thanks, jkocherhans

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/trunk/django/newforms/fields.py

    r4188 r4202  
    1313    'Field', 'CharField', 'IntegerField', 
    1414    'DEFAULT_DATE_INPUT_FORMATS', 'DateField', 
     15    'DEFAULT_TIME_INPUT_FORMATS', 'TimeField', 
    1516    'DEFAULT_DATETIME_INPUT_FORMATS', 'DateTimeField', 
    1617    'RegexField', 'EmailField', 'URLField', 'BooleanField', 
     
    134135                continue 
    135136        raise ValidationError(gettext(u'Enter a valid date.')) 
     137 
     138DEFAULT_TIME_INPUT_FORMATS = ( 
     139    '%H:%M:%S',     # '14:30:59' 
     140    '%H:%M',        # '14:30' 
     141) 
     142 
     143class TimeField(Field): 
     144    def __init__(self, input_formats=None, required=True, widget=None, label=None): 
     145        Field.__init__(self, required, widget, label) 
     146        self.input_formats = input_formats or DEFAULT_TIME_INPUT_FORMATS 
     147 
     148    def clean(self, value): 
     149        """ 
     150        Validates that the input can be converted to a time. Returns a Python 
     151        datetime.time object. 
     152        """ 
     153        Field.clean(self, value) 
     154        if value in EMPTY_VALUES: 
     155            return None 
     156        if isinstance(value, datetime.time): 
     157            return value 
     158        for format in self.input_formats: 
     159            try: 
     160                return datetime.time(*time.strptime(value, format)[3:6]) 
     161            except ValueError: 
     162                continue 
     163        raise ValidationError(gettext(u'Enter a valid time.')) 
    136164 
    137165DEFAULT_DATETIME_INPUT_FORMATS = ( 
  • django/trunk/tests/regressiontests/forms/tests.py

    r4199 r4202  
    834834... 
    835835ValidationError: [u'Enter a valid date.'] 
     836 
     837# TimeField ################################################################### 
     838 
     839>>> import datetime 
     840>>> f = TimeField() 
     841>>> f.clean(datetime.time(14, 25)) 
     842datetime.time(14, 25) 
     843>>> f.clean(datetime.time(14, 25, 59)) 
     844datetime.time(14, 25, 59) 
     845>>> f.clean('14:25') 
     846datetime.time(14, 25) 
     847>>> f.clean('14:25:59') 
     848datetime.time(14, 25, 59) 
     849>>> f.clean('hello') 
     850Traceback (most recent call last): 
     851... 
     852ValidationError: [u'Enter a valid time.'] 
     853>>> f.clean('1:24 p.m.') 
     854Traceback (most recent call last): 
     855... 
     856ValidationError: [u'Enter a valid time.'] 
     857 
     858TimeField accepts an optional input_formats parameter: 
     859>>> f = TimeField(input_formats=['%I:%M %p']) 
     860>>> f.clean(datetime.time(14, 25)) 
     861datetime.time(14, 25) 
     862>>> f.clean(datetime.time(14, 25, 59)) 
     863datetime.time(14, 25, 59) 
     864>>> f.clean('4:25 AM') 
     865datetime.time(4, 25) 
     866>>> f.clean('4:25 PM') 
     867datetime.time(16, 25) 
     868 
     869The input_formats parameter overrides all default input formats, 
     870so the default formats won't work unless you specify them: 
     871>>> f.clean('14:30:45') 
     872Traceback (most recent call last): 
     873... 
     874ValidationError: [u'Enter a valid time.'] 
    836875 
    837876# DateTimeField ###############################################################