Author: jacob Date: 2009-12-17 16:06:41 -0600 (Thu, 17 Dec 2009) New Revision: 11901
Added: django/trunk/django/utils/copycompat.py Modified: django/trunk/django/contrib/admin/widgets.py django/trunk/django/contrib/gis/geos/tests/test_geos.py django/trunk/django/contrib/gis/geos/tests/test_geos_mutation.py django/trunk/django/contrib/gis/tests/layermap/tests.py django/trunk/django/db/models/base.py django/trunk/django/db/models/expressions.py django/trunk/django/db/models/fields/__init__.py django/trunk/django/db/models/fields/files.py django/trunk/django/db/models/manager.py django/trunk/django/db/models/query.py django/trunk/django/db/models/query_utils.py django/trunk/django/db/models/sql/query.py django/trunk/django/forms/fields.py django/trunk/django/forms/forms.py django/trunk/django/forms/widgets.py django/trunk/django/http/__init__.py django/trunk/django/utils/_decimal.py django/trunk/django/utils/datastructures.py django/trunk/django/utils/functional.py django/trunk/django/utils/tree.py django/trunk/tests/regressiontests/dispatch/tests/test_dispatcher.py django/trunk/tests/regressiontests/extra_regress/models.py django/trunk/tests/regressiontests/utils/tests.py Log: Fixed #11753 - Q objects with callables no longer explode on Python 2.4. Thanks, Jeremy Dunck. Modified: django/trunk/django/contrib/admin/widgets.py =================================================================== --- django/trunk/django/contrib/admin/widgets.py 2009-12-17 21:54:37 UTC (rev 11900) +++ django/trunk/django/contrib/admin/widgets.py 2009-12-17 22:06:41 UTC (rev 11901) @@ -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 Modified: django/trunk/django/contrib/gis/geos/tests/test_geos.py =================================================================== --- django/trunk/django/contrib/gis/geos/tests/test_geos.py 2009-12-17 21:54:37 UTC (rev 11900) +++ django/trunk/django/contrib/gis/geos/tests/test_geos.py 2009-12-17 22:06:41 UTC (rev 11901) @@ -821,7 +821,7 @@ 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) Modified: django/trunk/django/contrib/gis/geos/tests/test_geos_mutation.py =================================================================== --- django/trunk/django/contrib/gis/geos/tests/test_geos_mutation.py 2009-12-17 21:54:37 UTC (rev 11900) +++ django/trunk/django/contrib/gis/geos/tests/test_geos_mutation.py 2009-12-17 22:06:41 UTC (rev 11901) @@ -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] Modified: django/trunk/django/contrib/gis/tests/layermap/tests.py =================================================================== --- django/trunk/django/contrib/gis/tests/layermap/tests.py 2009-12-17 21:54:37 UTC (rev 11900) +++ django/trunk/django/contrib/gis/tests/layermap/tests.py 2009-12-17 22:06:41 UTC (rev 11901) @@ -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') Modified: django/trunk/django/db/models/base.py =================================================================== --- django/trunk/django/db/models/base.py 2009-12-17 21:54:37 UTC (rev 11900) +++ django/trunk/django/db/models/base.py 2009-12-17 22:06:41 UTC (rev 11901) @@ -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 Modified: django/trunk/django/db/models/expressions.py =================================================================== --- django/trunk/django/db/models/expressions.py 2009-12-17 21:54:37 UTC (rev 11900) +++ django/trunk/django/db/models/expressions.py 2009-12-17 22:06:41 UTC (rev 11901) @@ -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): """ Modified: django/trunk/django/db/models/fields/__init__.py =================================================================== --- django/trunk/django/db/models/fields/__init__.py 2009-12-17 21:54:37 UTC (rev 11900) +++ django/trunk/django/db/models/fields/__init__.py 2009-12-17 22:06:41 UTC (rev 11901) @@ -1,13 +1,11 @@ -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 from django.db.models.query_utils import QueryWrapper Modified: django/trunk/django/db/models/fields/files.py =================================================================== --- django/trunk/django/db/models/fields/files.py 2009-12-17 21:54:37 UTC (rev 11900) +++ django/trunk/django/db/models/fields/files.py 2009-12-17 22:06:41 UTC (rev 11901) @@ -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 Modified: django/trunk/django/db/models/manager.py =================================================================== --- django/trunk/django/db/models/manager.py 2009-12-17 21:54:37 UTC (rev 11900) +++ django/trunk/django/db/models/manager.py 2009-12-17 22:06:41 UTC (rev 11901) @@ -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 Modified: django/trunk/django/db/models/query.py =================================================================== --- django/trunk/django/db/models/query.py 2009-12-17 21:54:37 UTC (rev 11900) +++ django/trunk/django/db/models/query.py 2009-12-17 22:06:41 UTC (rev 11901) @@ -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). Modified: django/trunk/django/db/models/query_utils.py =================================================================== --- django/trunk/django/db/models/query_utils.py 2009-12-17 21:54:37 UTC (rev 11900) +++ django/trunk/django/db/models/query_utils.py 2009-12-17 22:06:41 UTC (rev 11901) @@ -7,17 +7,12 @@ """ 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): """ An error when dealing with a collection of objects that have a cyclic Modified: django/trunk/django/db/models/sql/query.py =================================================================== --- django/trunk/django/db/models/sql/query.py 2009-12-17 21:54:37 UTC (rev 11900) +++ django/trunk/django/db/models/sql/query.py 2009-12-17 22:06:41 UTC (rev 11901) @@ -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 Modified: django/trunk/django/forms/fields.py =================================================================== --- django/trunk/django/forms/fields.py 2009-12-17 21:54:37 UTC (rev 11900) +++ django/trunk/django/forms/fields.py 2009-12-17 22:06:41 UTC (rev 11901) @@ -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 Modified: django/trunk/django/forms/forms.py =================================================================== --- django/trunk/django/forms/forms.py 2009-12-17 21:54:37 UTC (rev 11900) +++ django/trunk/django/forms/forms.py 2009-12-17 22:06:41 UTC (rev 11901) @@ -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 Modified: django/trunk/django/forms/widgets.py =================================================================== --- django/trunk/django/forms/widgets.py 2009-12-17 21:54:37 UTC (rev 11900) +++ django/trunk/django/forms/widgets.py 2009-12-17 22:06:41 UTC (rev 11901) @@ -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 Modified: django/trunk/django/http/__init__.py =================================================================== --- django/trunk/django/http/__init__.py 2009-12-17 21:54:37 UTC (rev 11900) +++ django/trunk/django/http/__init__.py 2009-12-17 22:06:41 UTC (rev 11901) @@ -183,7 +183,7 @@ 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): Modified: django/trunk/django/utils/_decimal.py =================================================================== --- django/trunk/django/utils/_decimal.py 2009-12-17 21:54:37 UTC (rev 11900) +++ django/trunk/django/utils/_decimal.py 2009-12-17 22:06:41 UTC (rev 11901) @@ -134,7 +134,7 @@ 'setcontext', 'getcontext' ] -import copy as _copy +import django.utils.copycompat as _copy #Rounding ROUND_DOWN = 'ROUND_DOWN' Added: django/trunk/django/utils/copycompat.py =================================================================== --- django/trunk/django/utils/copycompat.py (rev 0) +++ django/trunk/django/utils/copycompat.py 2009-12-17 22:06:41 UTC (rev 11901) @@ -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 * Modified: django/trunk/django/utils/datastructures.py =================================================================== --- django/trunk/django/utils/datastructures.py 2009-12-17 21:54:37 UTC (rev 11900) +++ django/trunk/django/utils/datastructures.py 2009-12-17 22:06:41 UTC (rev 11901) @@ -1,4 +1,4 @@ -from copy import deepcopy +from django.utils.copycompat import deepcopy class MergeDict(object): @@ -214,7 +214,7 @@ 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__() Modified: django/trunk/django/utils/functional.py =================================================================== --- django/trunk/django/utils/functional.py 2009-12-17 21:54:37 UTC (rev 11900) +++ django/trunk/django/utils/functional.py 2009-12-17 22:06:41 UTC (rev 11901) @@ -335,8 +335,10 @@ 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) Modified: django/trunk/django/utils/tree.py =================================================================== --- django/trunk/django/utils/tree.py 2009-12-17 21:54:37 UTC (rev 11900) +++ django/trunk/django/utils/tree.py 2009-12-17 22:06:41 UTC (rev 11901) @@ -3,7 +3,7 @@ ORM. """ -from copy import deepcopy +from django.utils.copycompat import deepcopy class Node(object): """ Modified: django/trunk/tests/regressiontests/dispatch/tests/test_dispatcher.py =================================================================== --- django/trunk/tests/regressiontests/dispatch/tests/test_dispatcher.py 2009-12-17 21:54:37 UTC (rev 11900) +++ django/trunk/tests/regressiontests/dispatch/tests/test_dispatcher.py 2009-12-17 22:06:41 UTC (rev 11901) @@ -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(): Modified: django/trunk/tests/regressiontests/extra_regress/models.py =================================================================== --- django/trunk/tests/regressiontests/extra_regress/models.py 2009-12-17 21:54:37 UTC (rev 11900) +++ django/trunk/tests/regressiontests/extra_regress/models.py 2009-12-17 22:06:41 UTC (rev 11901) @@ -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 Modified: django/trunk/tests/regressiontests/utils/tests.py =================================================================== --- django/trunk/tests/regressiontests/utils/tests.py 2009-12-17 21:54:37 UTC (rev 11900) +++ django/trunk/tests/regressiontests/utils/tests.py 2009-12-17 22:06:41 UTC (rev 11901) @@ -220,7 +220,7 @@ 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. -- You received this message because you are subscribed to the Google Groups "Django updates" group. To post to this group, send email to django-upda...@googlegroups.com. To unsubscribe from this group, send email to django-updates+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-updates?hl=en.