From 94a85baaa4da6e6d2a7321630377d2fa09426924 Mon Sep 17 00:00:00 2001 From: Ritik Soni <47344024+ritiksoni00@users.noreply.github.com> Date: Sun, 18 Sep 2022 12:23:35 +0000 Subject: [PATCH 1/5] added functionality to keep unsort the session dict --- debug_toolbar/panels/request.py | 11 +++++++---- tests/panels/test_request.py | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/debug_toolbar/panels/request.py b/debug_toolbar/panels/request.py index 966301d97..0f612fe42 100644 --- a/debug_toolbar/panels/request.py +++ b/debug_toolbar/panels/request.py @@ -59,13 +59,16 @@ def generate_stats(self, request, response): self.record_stats(view_info) if hasattr(request, "session"): + try: + session_list = [(k, request.session.get(k)) + for k in sorted(request.session.keys())] + except TypeError: + session_list = [(k, request.session.get(k)) + for k in request.session.keys()] self.record_stats( { "session": { - "list": [ - (k, request.session.get(k)) - for k in sorted(request.session.keys()) - ] + "list": session_list } } ) diff --git a/tests/panels/test_request.py b/tests/panels/test_request.py index 8087203c3..4f4e1b85a 100644 --- a/tests/panels/test_request.py +++ b/tests/panels/test_request.py @@ -104,3 +104,21 @@ def test_namespaced_url(self): self.panel.generate_stats(self.request, response) panel_stats = self.panel.get_stats() self.assertEqual(panel_stats["view_urlname"], "admin:login") + + def test_session_list_sorted_or_not(self): + """ + Verify the session is sorted when all keys are strings. + + See https://github.com/jazzband/django-debug-toolbar/issues/1668 + """ + self.request.session = { + 1: "value", + 'data': ['foo', 'bar', 1], + (2, 3): "tuple_key", + } + data = {'list': [(1, 'value'), ('data', ['foo', 'bar', 1]), ((2, 3), 'tuple_key')]} + response = self.panel.process_request(self.request) + self.panel.generate_stats(self.request, response) + panel_stats = self.panel.get_stats() + self.assertEqual(panel_stats['session'], data) + From 6c4f29f99d0a84637162480617d33117c0af5e2b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 18 Sep 2022 12:24:49 +0000 Subject: [PATCH 2/5] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- debug_toolbar/panels/request.py | 18 +++++++----------- tests/panels/test_request.py | 17 +++++++++-------- 2 files changed, 16 insertions(+), 19 deletions(-) diff --git a/debug_toolbar/panels/request.py b/debug_toolbar/panels/request.py index 0f612fe42..bfb485ae7 100644 --- a/debug_toolbar/panels/request.py +++ b/debug_toolbar/panels/request.py @@ -60,15 +60,11 @@ def generate_stats(self, request, response): if hasattr(request, "session"): try: - session_list = [(k, request.session.get(k)) - for k in sorted(request.session.keys())] + session_list = [ + (k, request.session.get(k)) for k in sorted(request.session.keys()) + ] except TypeError: - session_list = [(k, request.session.get(k)) - for k in request.session.keys()] - self.record_stats( - { - "session": { - "list": session_list - } - } - ) + session_list = [ + (k, request.session.get(k)) for k in request.session.keys() + ] + self.record_stats({"session": {"list": session_list}}) diff --git a/tests/panels/test_request.py b/tests/panels/test_request.py index 4f4e1b85a..7463bb2e4 100644 --- a/tests/panels/test_request.py +++ b/tests/panels/test_request.py @@ -104,7 +104,7 @@ def test_namespaced_url(self): self.panel.generate_stats(self.request, response) panel_stats = self.panel.get_stats() self.assertEqual(panel_stats["view_urlname"], "admin:login") - + def test_session_list_sorted_or_not(self): """ Verify the session is sorted when all keys are strings. @@ -112,13 +112,14 @@ def test_session_list_sorted_or_not(self): See https://github.com/jazzband/django-debug-toolbar/issues/1668 """ self.request.session = { - 1: "value", - 'data': ['foo', 'bar', 1], - (2, 3): "tuple_key", - } - data = {'list': [(1, 'value'), ('data', ['foo', 'bar', 1]), ((2, 3), 'tuple_key')]} + 1: "value", + "data": ["foo", "bar", 1], + (2, 3): "tuple_key", + } + data = { + "list": [(1, "value"), ("data", ["foo", "bar", 1]), ((2, 3), "tuple_key")] + } response = self.panel.process_request(self.request) self.panel.generate_stats(self.request, response) panel_stats = self.panel.get_stats() - self.assertEqual(panel_stats['session'], data) - + self.assertEqual(panel_stats["session"], data) From 5625fa69b9220ee8479cefb931178407ef0435c9 Mon Sep 17 00:00:00 2001 From: Ritik Soni <47344024+ritiksoni00@users.noreply.github.com> Date: Tue, 20 Sep 2022 09:13:57 +0530 Subject: [PATCH 3/5] Update tests/panels/test_request.py Co-authored-by: Matthias Kestenholz --- tests/panels/test_request.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/panels/test_request.py b/tests/panels/test_request.py index 7463bb2e4..66acb86ce 100644 --- a/tests/panels/test_request.py +++ b/tests/panels/test_request.py @@ -123,3 +123,15 @@ def test_session_list_sorted_or_not(self): self.panel.generate_stats(self.request, response) panel_stats = self.panel.get_stats() self.assertEqual(panel_stats["session"], data) + + self.request.session = { + "b": "b-value", + "a": "a-value", + } + data = { + "list": [("a", "a-value"), ("b", "b-value")] + } + response = self.panel.process_request(self.request) + self.panel.generate_stats(self.request, response) + panel_stats = self.panel.get_stats() + self.assertEqual(panel_stats["session"], data) From 1a4ec1e9471ad534974c158a869f2381ef3f3c0d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 20 Sep 2022 03:44:13 +0000 Subject: [PATCH 4/5] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- tests/panels/test_request.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/tests/panels/test_request.py b/tests/panels/test_request.py index 66acb86ce..ea7f1681a 100644 --- a/tests/panels/test_request.py +++ b/tests/panels/test_request.py @@ -123,15 +123,13 @@ def test_session_list_sorted_or_not(self): self.panel.generate_stats(self.request, response) panel_stats = self.panel.get_stats() self.assertEqual(panel_stats["session"], data) - + self.request.session = { "b": "b-value", "a": "a-value", } - data = { - "list": [("a", "a-value"), ("b", "b-value")] - } + data = {"list": [("a", "a-value"), ("b", "b-value")]} response = self.panel.process_request(self.request) self.panel.generate_stats(self.request, response) panel_stats = self.panel.get_stats() - self.assertEqual(panel_stats["session"], data) + self.assertEqual(panel_stats["session"], data) From 6995cb8bc44add31514dddf5bf6d0d76ea0df7f0 Mon Sep 17 00:00:00 2001 From: tschilling Date: Sun, 25 Sep 2022 10:48:29 -0500 Subject: [PATCH 5/5] Add mention of session sorting change to changes.rst. --- docs/changes.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/changes.rst b/docs/changes.rst index 1c45177b0..e049aa3a5 100644 --- a/docs/changes.rst +++ b/docs/changes.rst @@ -16,6 +16,8 @@ Pending ``settings.BASE_DIR``. * The toolbar's font stack now prefers system UI fonts. Tweaked paddings, margins and alignments a bit in the CSS code. +* Only sort the session dictionary when the keys are all strings. Fixes a + bug that causes the toolbar to crash when non-strings are used as keys. 3.6.0 (2022-08-17) ------------------