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:
parent
d693074d43
commit
ed20dd2e85
|
@ -5,6 +5,8 @@ ORM.
|
||||||
|
|
||||||
import copy
|
import copy
|
||||||
|
|
||||||
|
from django.utils.encoding import force_str, force_text
|
||||||
|
|
||||||
|
|
||||||
class Node(object):
|
class Node(object):
|
||||||
"""
|
"""
|
||||||
|
@ -42,14 +44,11 @@ class Node(object):
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
if self.negated:
|
template = '(NOT (%s: %s))' if self.negated else '(%s: %s)'
|
||||||
return '(NOT (%s: %s))' % (self.connector, ', '.join(str(c) for c
|
return force_str(template % (self.connector, ', '.join(force_text(c) for c in self.children)))
|
||||||
in self.children))
|
|
||||||
return '(%s: %s)' % (self.connector, ', '.join(str(c) for c in
|
|
||||||
self.children))
|
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "<%s: %s>" % (self.__class__.__name__, self)
|
return str("<%s: %s>") % (self.__class__.__name__, self)
|
||||||
|
|
||||||
def __deepcopy__(self, memodict):
|
def __deepcopy__(self, memodict):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
# -*- encoding: utf-8 -*-
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
@ -5,6 +6,7 @@ from operator import attrgetter
|
||||||
|
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
|
from django.utils.encoding import force_str
|
||||||
|
|
||||||
from .models import Article
|
from .models import Article
|
||||||
|
|
||||||
|
@ -123,6 +125,12 @@ class OrLookupsTests(TestCase):
|
||||||
attrgetter("headline"),
|
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):
|
def test_q_negated(self):
|
||||||
# Q objects can be negated
|
# Q objects can be negated
|
||||||
self.assertQuerysetEqual(
|
self.assertQuerysetEqual(
|
||||||
|
|
Loading…
Reference in New Issue