Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Fixed #11753 - Q objects with callables no longer explode on Python 2…

….4. Thanks, Jeremy Dunck.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@11901 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit 574eafe4c08c4a63876e199e0f2657868c8d0718 1 parent 3bd8490
@jacobian jacobian authored
View
2  django/contrib/admin/widgets.py
@@ -2,7 +2,7 @@
Form Widget classes specific to the Django admin site.
"""
-import copy
+import django.utils.copycompat as copy
from django import forms
from django.forms.widgets import RadioFieldRenderer
View
2  django/contrib/gis/geos/tests/test_geos.py
@@ -821,7 +821,7 @@ def test21_test_gdal(self):
def test22_copy(self):
"Testing use with the Python `copy` module."
- import copy
+ import django.utils.copycompat as copy
poly = GEOSGeometry('POLYGON((0 0, 0 23, 23 23, 23 0, 0 0), (5 5, 5 10, 10 10, 10 5, 5 5))')
cpy1 = copy.copy(poly)
cpy2 = copy.deepcopy(poly)
View
4 django/contrib/gis/geos/tests/test_geos_mutation.py
@@ -2,9 +2,11 @@
# Modified from original contribution by Aryeh Leib Taurog, which was
# released under the New BSD license.
import unittest
+
+import django.utils.copycompat as copy
+
from django.contrib.gis.geos import *
from django.contrib.gis.geos.error import GEOSIndexError
-import copy
def getItem(o,i): return o[i]
def delItem(o,i): del o[i]
View
2  django/contrib/gis/tests/layermap/tests.py
@@ -1,10 +1,10 @@
import os, unittest
-from copy import copy
from decimal import Decimal
from models import City, County, CountyFeat, Interstate, ICity1, ICity2, State, city_mapping, co_mapping, cofeat_mapping, inter_mapping
from django.contrib.gis.db.backend import SpatialBackend
from django.contrib.gis.utils.layermapping import LayerMapping, LayerMapError, InvalidDecimal, MissingForeignKey
from django.contrib.gis.gdal import DataSource
+from django.utils.copycompat import copy
shp_path = os.path.dirname(__file__)
city_shp = os.path.join(shp_path, '../data/cities/cities.shp')
View
2  django/db/models/base.py
@@ -1,4 +1,3 @@
-import copy
import types
import sys
import os
@@ -13,6 +12,7 @@
from django.db import connection, transaction, DatabaseError
from django.db.models import signals
from django.db.models.loading import register_models, get_model
+import django.utils.copycompat as copy
from django.utils.functional import curry
from django.utils.encoding import smart_str, force_unicode, smart_unicode
from django.conf import settings
View
2  django/db/models/expressions.py
@@ -1,7 +1,7 @@
-from copy import deepcopy
from datetime import datetime
from django.utils import tree
+from django.utils.copycompat import deepcopy
class ExpressionNode(tree.Node):
"""
View
8 django/db/models/fields/__init__.py
@@ -1,12 +1,10 @@
-import copy
import datetime
+import decimal
import os
import re
import time
-try:
- import decimal
-except ImportError:
- from django.utils import _decimal as decimal # for Python 2.3
+
+import django.utils.copycompat as copy
from django.db import connection
from django.db.models import signals
View
3  django/db/models/fields/files.py
@@ -1,7 +1,8 @@
-import copy
import datetime
import os
+import django.utils.copycompat as copy
+
from django.conf import settings
from django.db.models.fields import Field
from django.core.files.base import File, ContentFile
View
2  django/db/models/manager.py
@@ -1,4 +1,4 @@
-import copy
+import django.utils.copycompat as copy
from django.db.models.query import QuerySet, EmptyQuerySet, insert_query
from django.db.models import signals
from django.db.models.fields import FieldDoesNotExist
View
2  django/db/models/query.py
@@ -2,12 +2,12 @@
The main QuerySet implementation. This provides the public API for the ORM.
"""
-from copy import deepcopy
from django.db import connection, transaction, IntegrityError
from django.db.models.aggregates import Aggregate
from django.db.models.fields import DateField
from django.db.models.query_utils import Q, select_related_descend, CollectedObjects, CyclicDependency, deferred_class_factory
from django.db.models import signals, sql
+from django.utils.copycompat import deepcopy
# Used to control how many objects are worked with at once in some cases (e.g.
# when deleting objects).
View
7 django/db/models/query_utils.py
@@ -7,16 +7,11 @@
"""
import weakref
-from copy import deepcopy
+from django.utils.copycompat import deepcopy
from django.utils import tree
from django.utils.datastructures import SortedDict
-try:
- sorted
-except NameError:
- from django.utils.itercompat import sorted # For Python 2.3.
-
class CyclicDependency(Exception):
"""
View
2  django/db/models/sql/query.py
@@ -7,7 +7,7 @@
all about the internals of models in order to get the information it needs.
"""
-from copy import deepcopy
+from django.utils.copycompat import deepcopy
from django.utils.tree import Node
from django.utils.datastructures import SortedDict
from django.utils.encoding import force_unicode
View
13 django/forms/fields.py
@@ -2,28 +2,19 @@
Field classes.
"""
-import copy
import datetime
import os
import re
import time
import urlparse
+from decimal import Decimal, DecimalException
try:
from cStringIO import StringIO
except ImportError:
from StringIO import StringIO
-# Python 2.3 fallbacks
-try:
- from decimal import Decimal, DecimalException
-except ImportError:
- from django.utils._decimal import Decimal, DecimalException
-try:
- set
-except NameError:
- from sets import Set as set
-
import django.core.exceptions
+import django.utils.copycompat as copy
from django.utils.translation import ugettext_lazy as _
from django.utils.encoding import smart_unicode, smart_str
View
3  django/forms/forms.py
@@ -2,8 +2,7 @@
Form classes
"""
-from copy import deepcopy
-
+from django.utils.copycompat import deepcopy
from django.utils.datastructures import SortedDict
from django.utils.html import conditional_escape
from django.utils.encoding import StrAndUnicode, smart_unicode, force_unicode
View
7 django/forms/widgets.py
@@ -2,12 +2,7 @@
HTML Widget classes
"""
-try:
- set
-except NameError:
- from sets import Set as set # Python 2.3 fallback
-
-import copy
+import django.utils.copycompat as copy
from itertools import chain
from django.conf import settings
from django.utils.datastructures import MultiValueDict, MergeDict
View
2  django/http/__init__.py
@@ -183,7 +183,7 @@ def __copy__(self):
return result
def __deepcopy__(self, memo):
- import copy
+ import django.utils.copycompat as copy
result = self.__class__('', mutable=True)
memo[id(self)] = result
for key, value in dict.items(self):
View
2  django/utils/_decimal.py
@@ -134,7 +134,7 @@
'setcontext', 'getcontext'
]
-import copy as _copy
+import django.utils.copycompat as _copy
#Rounding
ROUND_DOWN = 'ROUND_DOWN'
View
14 django/utils/copycompat.py
@@ -0,0 +1,14 @@
+"""
+Fixes Python 2.4's failure to deepcopy unbound functions.
+"""
+
+import copy
+import types
+
+# Monkeypatch copy's deepcopy registry to handle functions correctly.
+if (hasattr(copy, '_deepcopy_dispatch') and types.FunctionType not in copy._deepcopy_dispatch):
+ copy._deepcopy_dispatch[types.FunctionType] = copy._deepcopy_atomic
+
+# Pose as the copy module now.
+del copy, types
+from copy import *
View
4 django/utils/datastructures.py
@@ -1,4 +1,4 @@
-from copy import deepcopy
+from django.utils.copycompat import deepcopy
class MergeDict(object):
@@ -214,7 +214,7 @@ def __copy__(self):
return self.__class__(super(MultiValueDict, self).items())
def __deepcopy__(self, memo=None):
- import copy
+ import django.utils.copycompat as copy
if memo is None:
memo = {}
result = self.__class__()
View
6 django/utils/functional.py
@@ -335,8 +335,10 @@ def __deepcopy__(self, memo):
memo[id(self)] = result
return result
else:
- import copy
- return copy.deepcopy(self._wrapped, memo)
+ # Changed to use deepcopy from copycompat, instead of copy
+ # For Python 2.4.
+ from django.utils.copycompat import deepcopy
+ return deepcopy(self._wrapped, memo)
# Need to pretend to be the wrapped class, for the sake of objects that care
# about this (especially in equality tests)
View
2  django/utils/tree.py
@@ -3,7 +3,7 @@
ORM.
"""
-from copy import deepcopy
+from django.utils.copycompat import deepcopy
class Node(object):
"""
View
2  tests/regressiontests/dispatch/tests/test_dispatcher.py
@@ -1,8 +1,8 @@
from django.dispatch import Signal
import unittest
-import copy
import sys
import gc
+import django.utils.copycompat as copy
if sys.platform.startswith('java'):
def garbage_collect():
View
3  tests/regressiontests/extra_regress/models.py
@@ -1,6 +1,7 @@
-import copy
import datetime
+import django.utils.copycompat as copy
+
from django.contrib.auth.models import User
from django.db import models
from django.db.models.query import Q
View
2  tests/regressiontests/utils/tests.py
@@ -220,7 +220,7 @@ def test_class(self):
self.assertEqual(_ComplexObject, SimpleLazyObject(complex_object).__class__)
def test_deepcopy(self):
- import copy
+ import django.utils.copycompat as copy
# Check that we *can* do deep copy, and that it returns the right
# objects.
Please sign in to comment.
Something went wrong with that request. Please try again.