From 601db0d2df9dfdf639b2a32f7cac41a31e6329dc Mon Sep 17 00:00:00 2001 From: Alex Gaynor Date: Thu, 17 Dec 2009 22:18:23 +0000 Subject: [soc2009/multidb] Merged up to trunk r11901. git-svn-id: http://code.djangoproject.com/svn/django/branches/soc2009/multidb@11904 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/contrib/admin/widgets.py | 2 +- django/contrib/gis/geos/tests/test_geos.py | 2 +- django/contrib/gis/geos/tests/test_geos_mutation.py | 4 +++- django/contrib/gis/tests/layermap/tests.py | 12 ++++++++---- django/db/models/base.py | 2 +- django/db/models/expressions.py | 2 +- django/db/models/fields/__init__.py | 3 ++- django/db/models/fields/files.py | 3 ++- django/db/models/manager.py | 2 +- django/db/models/query.py | 1 + django/db/models/query_utils.py | 7 +------ django/db/models/sql/query.py | 2 +- django/forms/fields.py | 13 ++----------- django/forms/forms.py | 3 +-- django/forms/widgets.py | 7 +------ django/http/__init__.py | 2 +- django/utils/_decimal.py | 2 +- django/utils/copycompat.py | 14 ++++++++++++++ django/utils/datastructures.py | 4 ++-- django/utils/functional.py | 6 ++++-- django/utils/tree.py | 2 +- tests/regressiontests/dispatch/tests/test_dispatcher.py | 2 +- tests/regressiontests/extra_regress/models.py | 3 ++- tests/regressiontests/utils/tests.py | 2 +- 24 files changed, 54 insertions(+), 48 deletions(-) create mode 100644 django/utils/copycompat.py diff --git a/django/contrib/admin/widgets.py b/django/contrib/admin/widgets.py index 105de48ed3..0392b642bb 100644 --- a/django/contrib/admin/widgets.py +++ b/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 diff --git a/django/contrib/gis/geos/tests/test_geos.py b/django/contrib/gis/geos/tests/test_geos.py index 440075dd49..4f2e33f9a0 100644 --- a/django/contrib/gis/geos/tests/test_geos.py +++ b/django/contrib/gis/geos/tests/test_geos.py @@ -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) diff --git a/django/contrib/gis/geos/tests/test_geos_mutation.py b/django/contrib/gis/geos/tests/test_geos_mutation.py index 260a4689a6..28f484dca7 100644 --- a/django/contrib/gis/geos/tests/test_geos_mutation.py +++ b/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] diff --git a/django/contrib/gis/tests/layermap/tests.py b/django/contrib/gis/tests/layermap/tests.py index 1f2de66539..f8239cb46d 100644 --- a/django/contrib/gis/tests/layermap/tests.py +++ b/django/contrib/gis/tests/layermap/tests.py @@ -1,10 +1,14 @@ -import os, unittest -from copy import copy +import os +import unittest 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.utils.layermapping import LayerMapping, LayerMapError, InvalidDecimal, MissingForeignKey + +from django.utils.copycompat import copy + from django.contrib.gis.gdal import DataSource from django.contrib.gis.tests.utils import mysql +from django.contrib.gis.utils.layermapping import LayerMapping, LayerMapError, InvalidDecimal, MissingForeignKey + +from models import City, County, CountyFeat, Interstate, ICity1, ICity2, State, city_mapping, co_mapping, cofeat_mapping, inter_mapping shp_path = os.path.realpath(os.path.join(os.path.dirname(__file__), '..', 'data')) city_shp = os.path.join(shp_path, 'cities', 'cities.shp') diff --git a/django/db/models/base.py b/django/db/models/base.py index 73c2c3903c..3464ae6712 100644 --- a/django/db/models/base.py +++ b/django/db/models/base.py @@ -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 connections, transaction, DatabaseError, DEFAULT_DB_ALIAS 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 diff --git a/django/db/models/expressions.py b/django/db/models/expressions.py index e782d98c61..f760e4c5f3 100644 --- a/django/db/models/expressions.py +++ b/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): """ diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py index c86e63a6fc..b70f320df3 100644 --- a/django/db/models/fields/__init__.py +++ b/django/db/models/fields/__init__.py @@ -1,10 +1,11 @@ -import copy import datetime import decimal import os import re import time +import django.utils.copycompat as copy + from django.db import connection from django.db.models import signals from django.db.models.fields.subclassing import LegacyConnection diff --git a/django/db/models/fields/files.py b/django/db/models/fields/files.py index d3ba975412..6dfeddbc41 100644 --- a/django/db/models/fields/files.py +++ b/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 diff --git a/django/db/models/manager.py b/django/db/models/manager.py index d752519f5c..baaa1c9cd9 100644 --- a/django/db/models/manager.py +++ b/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 diff --git a/django/db/models/query.py b/django/db/models/query.py index 5b5a2e7f76..7d2b2df28e 100644 --- a/django/db/models/query.py +++ b/django/db/models/query.py @@ -9,6 +9,7 @@ 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). diff --git a/django/db/models/query_utils.py b/django/db/models/query_utils.py index cdee1c7dfc..54bb91ea02 100644 --- a/django/db/models/query_utils.py +++ b/django/db/models/query_utils.py @@ -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): """ diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py index d1217bf048..60d70baf21 100644 --- a/django/db/models/sql/query.py +++ b/django/db/models/sql/query.py @@ -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 diff --git a/django/forms/fields.py b/django/forms/fields.py index 0aef355d0f..c0ee2f0955 100644 --- a/django/forms/fields.py +++ b/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 diff --git a/django/forms/forms.py b/django/forms/forms.py index e854de8a7a..7f6fa51287 100644 --- a/django/forms/forms.py +++ b/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 diff --git a/django/forms/widgets.py b/django/forms/widgets.py index b1d2cb7cda..d59e6343e5 100644 --- a/django/forms/widgets.py +++ b/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 diff --git a/django/http/__init__.py b/django/http/__init__.py index 446659b560..7b0c469c51 100644 --- a/django/http/__init__.py +++ b/django/http/__init__.py @@ -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): diff --git a/django/utils/_decimal.py b/django/utils/_decimal.py index 677d26bb32..2801046cf1 100644 --- a/django/utils/_decimal.py +++ b/django/utils/_decimal.py @@ -134,7 +134,7 @@ __all__ = [ 'setcontext', 'getcontext' ] -import copy as _copy +import django.utils.copycompat as _copy #Rounding ROUND_DOWN = 'ROUND_DOWN' diff --git a/django/utils/copycompat.py b/django/utils/copycompat.py new file mode 100644 index 0000000000..22b3cfbef7 --- /dev/null +++ b/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 * diff --git a/django/utils/datastructures.py b/django/utils/datastructures.py index 2b586d7efe..06cf6c6b75 100644 --- a/django/utils/datastructures.py +++ b/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 @@ 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__() diff --git a/django/utils/functional.py b/django/utils/functional.py index 823cda4587..43b7ab1437 100644 --- a/django/utils/functional.py +++ b/django/utils/functional.py @@ -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) diff --git a/django/utils/tree.py b/django/utils/tree.py index a9028b834b..a6cfec27ad 100644 --- a/django/utils/tree.py +++ b/django/utils/tree.py @@ -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): """ diff --git a/tests/regressiontests/dispatch/tests/test_dispatcher.py b/tests/regressiontests/dispatch/tests/test_dispatcher.py index adf760386c..ad3a05f2cd 100644 --- a/tests/regressiontests/dispatch/tests/test_dispatcher.py +++ b/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(): diff --git a/tests/regressiontests/extra_regress/models.py b/tests/regressiontests/extra_regress/models.py index 2b5791f5e3..d4d7cb86e5 100644 --- a/tests/regressiontests/extra_regress/models.py +++ b/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 diff --git a/tests/regressiontests/utils/tests.py b/tests/regressiontests/utils/tests.py index a7a6e4c3a1..6258b81200 100644 --- a/tests/regressiontests/utils/tests.py +++ b/tests/regressiontests/utils/tests.py @@ -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. -- cgit v1.2.1