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.