Skip to content

Commit 95401fd

Browse files
committed
Fix missing query-actions buttons for queries with date/datetime params.
The param `strings_only=True` caused params with type `time`, `date` and `datetime` to not be converted to string by `NormalCursorWrapper._decode()`, and in turn causes the json dumping to fail. This change keeps `strings_only=True` for every type but datetime, date and time, enabling conversion to string in those cases. Fixes #882
1 parent b7672d9 commit 95401fd

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

debug_toolbar/panels/sql/tracking.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from __future__ import absolute_import, unicode_literals
22

3+
import datetime
34
import json
45
from threading import local
56
from time import time
@@ -95,8 +96,10 @@ def _quote_params(self, params):
9596
return [self._quote_expr(p) for p in params]
9697

9798
def _decode(self, param):
99+
# make sure datetime, date and time are converted to string by force_text
100+
CONVERT_TYPES = (datetime.datetime, datetime.date, datetime.time)
98101
try:
99-
return force_text(param, strings_only=True)
102+
return force_text(param, strings_only=not isinstance(param, CONVERT_TYPES))
100103
except UnicodeDecodeError:
101104
return '(encoded string)'
102105

@@ -114,7 +117,7 @@ def _record(self, method, sql, params):
114117
_params = ''
115118
try:
116119
_params = json.dumps([self._decode(p) for p in params])
117-
except Exception:
120+
except TypeError as e:
118121
pass # object not JSON serializable
119122

120123
template_info = get_template_info()

tests/panels/test_sql.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from __future__ import absolute_import, unicode_literals
44

5+
import datetime
56
import unittest
67

78
from django.contrib.auth.models import User
@@ -69,6 +70,31 @@ def test_non_ascii_query(self):
6970
# ensure the panel renders correctly
7071
self.assertIn('café', self.panel.content)
7172

73+
def test_param_conversion(self):
74+
self.assertEqual(len(self.panel._queries), 0)
75+
76+
list(
77+
User.objects
78+
.filter(first_name='Foo')
79+
.filter(is_staff=True)
80+
.filter(is_superuser=False)
81+
.filter(date_joined__hour=13)
82+
.filter(date_joined__gte=datetime.datetime(2017, 12, 22, 16, 7, 1))
83+
.filter(date_joined__date__gte=datetime.date(2017, 12, 23))
84+
.filter(date_joined__time__gte=datetime.time(11, 11, 11))
85+
)
86+
self.panel.process_response(self.request, self.response)
87+
self.panel.generate_stats(self.request, self.response)
88+
89+
# ensure query was logged
90+
self.assertEqual(len(self.panel._queries), 1)
91+
query = self.panel._queries[0]
92+
93+
self.assertEqual(
94+
query[1]['params'],
95+
'["Foo", true, false, 13, "2017-12-22 16:07:01", "2017-12-23", "11:11:11"]'
96+
)
97+
7298
def test_insert_content(self):
7399
"""
74100
Test that the panel only inserts content after generate_stats and

0 commit comments

Comments
 (0)