From 8368d5a4006d84abacbcf53b9688a8f84ccf6f0c Mon Sep 17 00:00:00 2001 From: Mariusz Felisiak Date: Thu, 28 Sep 2017 18:07:19 +0200 Subject: [PATCH] [2.0.x] Fixed #28629 -- Made tree.Node instances hashable. Regression in 508b5debfb16843a8443ebac82c1fb91f15da687 which added Node.__eq__(). Backport of fc6528b25ab1834be1a478b405bf8f7ec5cf860c from master --- django/utils/tree.py | 3 +++ tests/utils_tests/test_tree.py | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/django/utils/tree.py b/django/utils/tree.py index 74612736f10..677f03d1b26 100644 --- a/django/utils/tree.py +++ b/django/utils/tree.py @@ -70,6 +70,9 @@ class Node: return self.children == other.children return False + def __hash__(self): + return hash((self.__class__, self.connector, self.negated) + tuple(self.children)) + def add(self, data, conn_type, squash=True): """ Combine this tree and the data represented by data using the diff --git a/tests/utils_tests/test_tree.py b/tests/utils_tests/test_tree.py index 98db5f6012f..65f49c06a6c 100644 --- a/tests/utils_tests/test_tree.py +++ b/tests/utils_tests/test_tree.py @@ -19,6 +19,16 @@ class NodeTests(unittest.TestCase): "") self.assertEqual(repr(self.node2), "") + def test_hash(self): + node3 = Node(self.node1_children, negated=True) + node4 = Node(self.node1_children, connector='OTHER') + node5 = Node(self.node1_children) + self.assertNotEqual(hash(self.node1), hash(self.node2)) + self.assertNotEqual(hash(self.node1), hash(node3)) + self.assertNotEqual(hash(self.node1), hash(node4)) + self.assertEqual(hash(self.node1), hash(node5)) + self.assertEqual(hash(self.node2), hash(Node())) + def test_len(self): self.assertEqual(len(self.node1), 2) self.assertEqual(len(self.node2), 0)