summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Apolloner <florian@apolloner.eu>2014-04-15 18:52:30 +0300
committerFlorian Apolloner <florian@apolloner.eu>2014-04-22 10:47:26 +0200
commit97b5833e212d3e6520dfa43525aa75f625a760a0 (patch)
treecc313ad0608952ce9f674951babb34b80df70154
parentdf81625da64473c43c7d0a948704d9efca84edbf (diff)
[1.7.x] Fixed #22426 -- Added support old-style d.c.messages format.
Forward ported code from 1.5 that adds backwards compatibility with legacy message length. See commit 9e7183073f64e541587e8dcfd8bb3ddeb47f8162 for details. Thanks to Ofir Ovadia for the initial patch. Backport of f286721f7fdc2202f77a5f4d650d9d0779b86811 from master.
-rw-r--r--django/contrib/messages/storage/cookie.py3
-rw-r--r--django/contrib/messages/tests/test_cookie.py22
2 files changed, 25 insertions, 0 deletions
diff --git a/django/contrib/messages/storage/cookie.py b/django/contrib/messages/storage/cookie.py
index a318002127..ca1ae7f6b6 100644
--- a/django/contrib/messages/storage/cookie.py
+++ b/django/contrib/messages/storage/cookie.py
@@ -33,6 +33,9 @@ class MessageDecoder(json.JSONDecoder):
def process_messages(self, obj):
if isinstance(obj, list) and obj:
if obj[0] == MessageEncoder.message_key:
+ if len(obj) == 3:
+ # Compatibility with previously-encoded messages
+ return Message(*obj[1:])
if obj[1]:
obj[3] = mark_safe(obj[3])
return Message(*obj[2:])
diff --git a/django/contrib/messages/tests/test_cookie.py b/django/contrib/messages/tests/test_cookie.py
index d44dd94491..10082634f6 100644
--- a/django/contrib/messages/tests/test_cookie.py
+++ b/django/contrib/messages/tests/test_cookie.py
@@ -153,3 +153,25 @@ class CookieTest(BaseTests, TestCase):
encode_decode(mark_safe("<b>Hello Django!</b>")), SafeData)
self.assertNotIsInstance(
encode_decode("<b>Hello Django!</b>"), SafeData)
+
+ def test_pre_1_5_message_format(self):
+ """
+ For ticket #22426. Tests whether messages that were set in the cookie
+ before the addition of is_safedata are decoded correctly.
+ """
+
+ # Encode the messages using the current encoder.
+ messages = [Message(constants.INFO, 'message %s') for x in range(5)]
+ encoder = MessageEncoder(separators=(',', ':'))
+ encoded_messages = encoder.encode(messages)
+
+ # Remove the is_safedata flag from the messages in order to imitate
+ # the behavior of before 1.5 (monkey patching).
+ encoded_messages = json.loads(encoded_messages)
+ for obj in encoded_messages:
+ obj.pop(1)
+ encoded_messages = json.dumps(encoded_messages, separators=(',', ':'))
+
+ # Decode the messages in the old format (without is_safedata)
+ decoded_messages = json.loads(encoded_messages, cls=MessageDecoder)
+ self.assertEqual(messages, decoded_messages)