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
-~----------~----~----~----~------~----~------~--~---

Reply via email to