From 9877e84caaf42b307086dcc62003e1d2e7c80671 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anssi=20K=C3=A4=C3=A4ri=C3=A4inen?= Date: Mon, 7 May 2012 20:38:14 +0300 Subject: [PATCH] Fixed total_ordering for Python < 2.7.2 The total_ordering in Python versions prior to 2.7.2 is buggy, and this caused infinite recursion for Field comparisons on those versions. Use the borrowed total_ordering for all Python versions prior to 2.7.2. The buggy total_ordering was introduced in commit 5cbfb48b92cb26a335f9c8c0f79d3390290103e2 --- django/utils/functional.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/django/utils/functional.py b/django/utils/functional.py index 86bbed7a7b2..5b88c3f3cbb 100644 --- a/django/utils/functional.py +++ b/django/utils/functional.py @@ -1,6 +1,7 @@ import copy import operator from functools import wraps, update_wrapper +import sys # You can't trivially replace this `functools.partial` because this binds to @@ -311,11 +312,13 @@ def partition(predicate, values): results[predicate(item)].append(item) return results -try: +if sys.version_info >= (2,7,2): from functools import total_ordering -except ImportError: - # For Python < 2.7 - # Code borrowed from python 2.7.3 stdlib +else: + # For Python < 2.7.2. Python 2.6 does not have total_ordering, and + # total_ordering in 2.7 versions prior to 2.7.2 is buggy. See + # http://bugs.python.org/issue10042 for details. For these versions use + # code borrowed from Python 2.7.3. def total_ordering(cls): """Class decorator that fills in missing ordering methods""" convert = {