Author: russellm Date: 2009-04-28 08:19:30 -0500 (Tue, 28 Apr 2009) New Revision: 10641
Modified: django/trunk/django/forms/widgets.py django/trunk/tests/regressiontests/forms/widgets.py Log: Fixed #10288 -- Corrected _has_changed handling of DateTimeInput, DateInput, TimeInput, and SplitDateTimeWidget when a custom date/time format is in use. Thanks to Koen Biermans for the report and patch. Modified: django/trunk/django/forms/widgets.py =================================================================== --- django/trunk/django/forms/widgets.py 2009-04-28 09:44:48 UTC (rev 10640) +++ django/trunk/django/forms/widgets.py 2009-04-28 13:19:30 UTC (rev 10641) @@ -294,14 +294,21 @@ if format: self.format = format - def render(self, name, value, attrs=None): + def _format_value(self, value): if value is None: - value = '' + return '' elif hasattr(value, 'strftime'): value = datetime_safe.new_date(value) - value = value.strftime(self.format) + return value.strftime(self.format) + return value + + def render(self, name, value, attrs=None): + value = self._format_value(value) return super(DateInput, self).render(name, value, attrs) + def _has_changed(self, initial, data): + return super(DateInput, self)._has_changed(self._format_value(initial), data) + class DateTimeInput(Input): input_type = 'text' format = '%Y-%m-%d %H:%M:%S' # '2006-10-25 14:30:59' @@ -311,14 +318,21 @@ if format: self.format = format - def render(self, name, value, attrs=None): + def _format_value(self, value): if value is None: - value = '' + return '' elif hasattr(value, 'strftime'): value = datetime_safe.new_datetime(value) - value = value.strftime(self.format) + return value.strftime(self.format) + return value + + def render(self, name, value, attrs=None): + value = self._format_value(value) return super(DateTimeInput, self).render(name, value, attrs) + def _has_changed(self, initial, data): + return super(DateTimeInput, self)._has_changed(self._format_value(initial), data) + class TimeInput(Input): input_type = 'text' format = '%H:%M:%S' # '14:30:59' @@ -328,13 +342,20 @@ if format: self.format = format - def render(self, name, value, attrs=None): + def _format_value(self, value): if value is None: - value = '' + return '' elif hasattr(value, 'strftime'): - value = value.strftime(self.format) + return value.strftime(self.format) + return value + + def render(self, name, value, attrs=None): + value = self._format_value(value) return super(TimeInput, self).render(name, value, attrs) + def _has_changed(self, initial, data): + return super(TimeInput, self)._has_changed(self._format_value(initial), data) + class CheckboxInput(Widget): def __init__(self, attrs=None, check_test=bool): super(CheckboxInput, self).__init__(attrs) @@ -422,11 +443,11 @@ def value_from_datadict(self, data, files, name): value = data.get(name, None) - return {u'2': True, - True: True, - 'True': True, - u'3': False, - 'False': False, + return {u'2': True, + True: True, + 'True': True, + u'3': False, + 'False': False, False: False}.get(value, None) def _has_changed(self, initial, data): Modified: django/trunk/tests/regressiontests/forms/widgets.py =================================================================== --- django/trunk/tests/regressiontests/forms/widgets.py 2009-04-28 09:44:48 UTC (rev 10640) +++ django/trunk/tests/regressiontests/forms/widgets.py 2009-04-28 13:19:30 UTC (rev 10641) @@ -1076,9 +1076,11 @@ >>> w.render('date', datetime.datetime(2006, 1, 10, 7, 30)) u'<input type="text" name="date_0" value="10/01/2006" /><input type="text" name="date_1" value="07:30" />' ->>> w._has_changed(datetime.datetime(2008, 5, 5, 12, 40, 00), [u'2008-05-05', u'12:40:00']) +>>> w._has_changed(datetime.datetime(2008, 5, 6, 12, 40, 00), [u'2008-05-06', u'12:40:00']) +True +>>> w._has_changed(datetime.datetime(2008, 5, 6, 12, 40, 00), [u'06/05/2008', u'12:40']) False ->>> w._has_changed(datetime.datetime(2008, 5, 5, 12, 40, 00), [u'2008-05-05', u'12:41:00']) +>>> w._has_changed(datetime.datetime(2008, 5, 6, 12, 40, 00), [u'06/05/2008', u'12:41']) True # DateTimeInput ############################################################### @@ -1102,6 +1104,8 @@ >>> w = DateTimeInput(format='%d/%m/%Y %H:%M') >>> w.render('date', d) u'<input type="text" name="date" value="17/09/2007 12:51" />' +>>> w._has_changed(d, '17/09/2007 12:51') +False # DateInput ################################################################### @@ -1125,6 +1129,8 @@ >>> w = DateInput(format='%d/%m/%Y') >>> w.render('date', d) u'<input type="text" name="date" value="17/09/2007" />' +>>> w._has_changed(d, '17/09/2007') +False # TimeInput ################################################################### @@ -1151,6 +1157,8 @@ >>> w = TimeInput(format='%H:%M') >>> w.render('time', t) u'<input type="text" name="time" value="12:51" />' +>>> w._has_changed(t, '12:51') +False # SplitHiddenDateTimeWidget ################################################### --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Django updates" group. To post to this group, send email to django-updates@googlegroups.com To unsubscribe from this group, send email to django-updates+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/django-updates?hl=en -~----------~----~----~----~------~----~------~--~---