Fixed #25875 -- Prevented UnicodeDecodeError for Q object repr

Thanks Ben Kraft for the report, and Simon Charette for the review.
This commit is contained in:
Claude Paroz 2015-12-12 23:09:13 +01:00
parent d693074d43
commit ed20dd2e85
2 changed files with 13 additions and 6 deletions

View File

@ -5,6 +5,8 @@ ORM.
import copy
from django.utils.encoding import force_str, force_text
class Node(object):
"""
@ -42,14 +44,11 @@ class Node(object):
return obj
def __str__(self):
if self.negated:
return '(NOT (%s: %s))' % (self.connector, ', '.join(str(c) for c
in self.children))
return '(%s: %s)' % (self.connector, ', '.join(str(c) for c in
self.children))
template = '(NOT (%s: %s))' if self.negated else '(%s: %s)'
return force_str(template % (self.connector, ', '.join(force_text(c) for c in self.children)))
def __repr__(self):
return "<%s: %s>" % (self.__class__.__name__, self)
return str("<%s: %s>") % (self.__class__.__name__, self)
def __deepcopy__(self, memodict):
"""

View File

@ -1,3 +1,4 @@
# -*- encoding: utf-8 -*-
from __future__ import unicode_literals
from datetime import datetime
@ -5,6 +6,7 @@ from operator import attrgetter
from django.db.models import Q
from django.test import TestCase
from django.utils.encoding import force_str
from .models import Article
@ -123,6 +125,12 @@ class OrLookupsTests(TestCase):
attrgetter("headline"),
)
def test_q_repr(self):
or_expr = Q(baz=Article(headline="Foö"))
self.assertEqual(repr(or_expr), force_str("<Q: (AND: ('baz', <Article: Foö>))>"))
negated_or = ~Q(baz=Article(headline="Foö"))
self.assertEqual(repr(negated_or), force_str("<Q: (NOT (AND: ('baz', <Article: Foö>)))>"))
def test_q_negated(self):
# Q objects can be negated
self.assertQuerysetEqual(