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
This commit is contained in:
Jacob Kaplan-Moss 2009-12-17 22:06:41 +00:00
parent 3bd849062c
commit 574eafe4c0
24 changed files with 48 additions and 50 deletions

View File

@ -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 File

@ -821,7 +821,7 @@ class GEOSTest(unittest.TestCase):
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 File

@ -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 File

@ -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 File

@ -1,4 +1,3 @@
import copy
import types
import sys
import os
@ -13,6 +12,7 @@ from django.db.models.options import Options
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 File

@ -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 File

@ -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 File

@ -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 File

@ -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 File

@ -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 File

@ -7,16 +7,11 @@ circular import difficulties.
"""
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 File

@ -7,7 +7,7 @@ databases). The abstraction barrier only works one way: this module has to know
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 File

@ -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 File

@ -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 File

@ -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 File

@ -183,7 +183,7 @@ class QueryDict(MultiValueDict):
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 File

@ -134,7 +134,7 @@ __all__ = [
'setcontext', 'getcontext'
]
import copy as _copy
import django.utils.copycompat as _copy
#Rounding
ROUND_DOWN = 'ROUND_DOWN'

View File

@ -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 File

@ -1,4 +1,4 @@
from copy import deepcopy
from django.utils.copycompat import deepcopy
class MergeDict(object):
@ -214,7 +214,7 @@ class MultiValueDict(dict):
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 File

@ -335,8 +335,10 @@ class SimpleLazyObject(LazyObject):
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 File

@ -3,7 +3,7 @@ A class for storing a tree graph. Primarily used for filter constructs in the
ORM.
"""
from copy import deepcopy
from django.utils.copycompat import deepcopy
class Node(object):
"""

View File

@ -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 File

@ -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 File

@ -220,7 +220,7 @@ class TestUtilsSimpleLazyObject(TestCase):
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.