From dce278673a409a10c1f74f597035b737bbf6a017 Mon Sep 17 00:00:00 2001
From: Andrew Godwin <andrew@aeracode.org>
Date: Thu, 9 Jun 2011 17:03:45 +0000
Subject: [PATCH] Fixed #9459: forms.HiddenInput and DateTime field loses
 microseconds. Thanks to mt.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@16347 bcc190cf-cafb-0310-a4f2-bffc1f526a37
---
 django/conf/global_settings.py              |  3 +++
 django/forms/fields.py                      | 12 ++++++++++--
 tests/regressiontests/forms/tests/fields.py |  3 +++
 3 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/django/conf/global_settings.py b/django/conf/global_settings.py
index 1300e86caa..ab31c15da3 100644
--- a/django/conf/global_settings.py
+++ b/django/conf/global_settings.py
@@ -366,12 +366,15 @@ TIME_INPUT_FORMATS = (
 # * Note that these format strings are different from the ones to display dates
 DATETIME_INPUT_FORMATS = (
     '%Y-%m-%d %H:%M:%S',     # '2006-10-25 14:30:59'
+    '%Y-%m-%d %H:%M:%S.%f',  # '2006-10-25 14:30:59.000200'
     '%Y-%m-%d %H:%M',        # '2006-10-25 14:30'
     '%Y-%m-%d',              # '2006-10-25'
     '%m/%d/%Y %H:%M:%S',     # '10/25/2006 14:30:59'
+    '%m/%d/%Y %H:%M:%S.%f',  # '10/25/2006 14:30:59.000200'
     '%m/%d/%Y %H:%M',        # '10/25/2006 14:30'
     '%m/%d/%Y',              # '10/25/2006'
     '%m/%d/%y %H:%M:%S',     # '10/25/06 14:30:59'
+    '%m/%d/%y %H:%M:%S.%f',  # '10/25/06 14:30:59.000200'
     '%m/%d/%y %H:%M',        # '10/25/06 14:30'
     '%m/%d/%y',              # '10/25/06'
 )
diff --git a/django/forms/fields.py b/django/forms/fields.py
index a5ea81d4b6..dd23b12e5c 100644
--- a/django/forms/fields.py
+++ b/django/forms/fields.py
@@ -338,7 +338,15 @@ class BaseTemporalField(Field):
                 try:
                     return self.strptime(value, format)
                 except ValueError:
-                    continue
+                    if format.endswith('.%f'):
+                        if not value.count('.')==1:
+                            continue
+                        try:
+                            datetime_str, usecs_str = value.rsplit('.', 1)
+                            usecs = int(usecs_str)
+                            return datetime.datetime(*time.strptime(datetime_str, format[:-3])[:6]+(usecs,))
+                        except ValueError:
+                            continue
         raise ValidationError(self.error_messages['invalid'])
 
     def strptime(self, value, format):
@@ -417,7 +425,7 @@ class DateTimeField(BaseTemporalField):
         return super(DateTimeField, self).to_python(value)
 
     def strptime(self, value, format):
-        return datetime.datetime(*time.strptime(value, format)[:6])
+        return datetime.datetime.strptime(value, format)
 
 class RegexField(CharField):
     def __init__(self, regex, max_length=None, min_length=None, error_message=None, *args, **kwargs):
diff --git a/tests/regressiontests/forms/tests/fields.py b/tests/regressiontests/forms/tests/fields.py
index 2303b4e9db..ad8d1d92d9 100644
--- a/tests/regressiontests/forms/tests/fields.py
+++ b/tests/regressiontests/forms/tests/fields.py
@@ -379,14 +379,17 @@ class FieldsTests(TestCase):
         self.assertEqual(datetime.datetime(2006, 10, 25, 14, 30), f.clean(datetime.datetime(2006, 10, 25, 14, 30)))
         self.assertEqual(datetime.datetime(2006, 10, 25, 14, 30, 59), f.clean(datetime.datetime(2006, 10, 25, 14, 30, 59)))
         self.assertEqual(datetime.datetime(2006, 10, 25, 14, 30, 59, 200), f.clean(datetime.datetime(2006, 10, 25, 14, 30, 59, 200)))
+        self.assertEqual(datetime.datetime(2006, 10, 25, 14, 30, 45, 200), f.clean('2006-10-25 14:30:45.000200'))
         self.assertEqual(datetime.datetime(2006, 10, 25, 14, 30, 45), f.clean('2006-10-25 14:30:45'))
         self.assertEqual(datetime.datetime(2006, 10, 25, 14, 30), f.clean('2006-10-25 14:30:00'))
         self.assertEqual(datetime.datetime(2006, 10, 25, 14, 30), f.clean('2006-10-25 14:30'))
         self.assertEqual(datetime.datetime(2006, 10, 25, 0, 0), f.clean('2006-10-25'))
+        self.assertEqual(datetime.datetime(2006, 10, 25, 14, 30, 45, 200), f.clean('10/25/2006 14:30:45.000200'))
         self.assertEqual(datetime.datetime(2006, 10, 25, 14, 30, 45), f.clean('10/25/2006 14:30:45'))
         self.assertEqual(datetime.datetime(2006, 10, 25, 14, 30), f.clean('10/25/2006 14:30:00'))
         self.assertEqual(datetime.datetime(2006, 10, 25, 14, 30), f.clean('10/25/2006 14:30'))
         self.assertEqual(datetime.datetime(2006, 10, 25, 0, 0), f.clean('10/25/2006'))
+        self.assertEqual(datetime.datetime(2006, 10, 25, 14, 30, 45, 200), f.clean('10/25/06 14:30:45.000200'))
         self.assertEqual(datetime.datetime(2006, 10, 25, 14, 30, 45), f.clean('10/25/06 14:30:45'))
         self.assertEqual(datetime.datetime(2006, 10, 25, 14, 30), f.clean('10/25/06 14:30:00'))
         self.assertEqual(datetime.datetime(2006, 10, 25, 14, 30), f.clean('10/25/06 14:30'))