Author: aaugustin
Date: 2012-03-18 13:58:22 -0700 (Sun, 18 Mar 2012)
New Revision: 17766

Modified:
   django/trunk/django/http/__init__.py
   django/trunk/tests/regressiontests/requests/tests.py
Log:
Fixed #17931 -- Accepted aware datetimes to set cookies expiry dates. Thanks 
jaddison for the report.


Modified: django/trunk/django/http/__init__.py
===================================================================
--- django/trunk/django/http/__init__.py        2012-03-17 22:31:03 UTC (rev 
17765)
+++ django/trunk/django/http/__init__.py        2012-03-18 20:58:22 UTC (rev 
17766)
@@ -121,6 +121,7 @@
 from django.utils.datastructures import MultiValueDict, ImmutableList
 from django.utils.encoding import smart_str, iri_to_uri, force_unicode
 from django.utils.http import cookie_date
+from django.utils import timezone
 
 RESERVED_CHARS="!*'();:@&=+$,/?%#[]"
 
@@ -641,13 +642,18 @@
         """
         Sets a cookie.
 
-        ``expires`` can be a string in the correct format or a
-        ``datetime.datetime`` object in UTC. If ``expires`` is a datetime
-        object then ``max_age`` will be calculated.
+        ``expires`` can be:
+        - a string in the correct format,
+        - a naive ``datetime.datetime`` object in UTC,
+        - an aware ``datetime.datetime`` object in any time zone.
+        If it is a ``datetime.datetime`` object then ``max_age`` will be 
calculated.
+
         """
         self.cookies[key] = value
         if expires is not None:
             if isinstance(expires, datetime.datetime):
+                if timezone.is_aware(expires):
+                    expires = timezone.make_naive(expires, timezone.utc)
                 delta = expires - expires.utcnow()
                 # Add one second so the date matches exactly (a fraction of
                 # time gets lost between converting to a timedelta and

Modified: django/trunk/tests/regressiontests/requests/tests.py
===================================================================
--- django/trunk/tests/regressiontests/requests/tests.py        2012-03-17 
22:31:03 UTC (rev 17765)
+++ django/trunk/tests/regressiontests/requests/tests.py        2012-03-18 
20:58:22 UTC (rev 17766)
@@ -12,6 +12,7 @@
 from django.test.utils import get_warnings_state, restore_warnings_state
 from django.utils import unittest
 from django.utils.http import cookie_date
+from django.utils.timezone import utc
 
 
 class RequestsTests(unittest.TestCase):
@@ -207,6 +208,15 @@
         datetime_cookie = response.cookies['datetime']
         self.assertEqual(datetime_cookie['max-age'], 10)
 
+    def test_aware_expiration(self):
+        "Cookie accepts an aware datetime as expiration time"
+        response = HttpResponse()
+        expires = (datetime.utcnow() + 
timedelta(seconds=10)).replace(tzinfo=utc)
+        time.sleep(0.001)
+        response.set_cookie('datetime', expires=expires)
+        datetime_cookie = response.cookies['datetime']
+        self.assertEqual(datetime_cookie['max-age'], 10)
+
     def test_far_expiration(self):
         "Cookie will expire when an distant expiration time is provided"
         response = HttpResponse()

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en.

Reply via email to