Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Fixed #14823 -- Corrected bootstrapping problems with register_serial…

…izers. Thanks to miker985@uw.edu for the report and draft patch.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@15336 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit 4a3ea263ef964a7fb7840544870834889f56f7e4 1 parent 456b8a9
@freakboy3742 freakboy3742 authored
View
4 django/core/serializers/__init__.py
@@ -48,6 +48,8 @@ def register_serializer(format, serializer_module, serializers=None):
directly into the global register of serializers. Adding serializers
directly is not a thread-safe operation.
"""
+ if serializers is None and not _serializers:
+ _load_serializers()
module = importlib.import_module(serializer_module)
if serializers is None:
_serializers[format] = module
@@ -56,6 +58,8 @@ def register_serializer(format, serializer_module, serializers=None):
def unregister_serializer(format):
"Unregister a given serializer. This is not a thread-safe operation."
+ if not _serializers:
+ _load_serializers()
del _serializers[format]
def get_serializer(format):
View
53 tests/modeltests/serializers/tests.py
@@ -3,14 +3,65 @@
from StringIO import StringIO
from xml.dom import minidom
+from django.conf import settings
from django.core import serializers
from django.db import transaction
from django.test import TestCase, TransactionTestCase, Approximate
-from django.utils import simplejson
+from django.utils import simplejson, unittest
from models import Category, Author, Article, AuthorProfile, Actor, \
Movie, Score, Player, Team
+class SerializerRegistrationTests(unittest.TestCase):
+ def setUp(self):
+ self.old_SERIALIZATION_MODULES = getattr(settings, 'SERIALIZATION_MODULES', None)
+ self.old_serializers = serializers._serializers
+
+ serializers._serializers = {}
+ settings.SERIALIZATION_MODULES = {
+ "json2" : "django.core.serializers.json",
+ }
+
+ def tearDown(self):
+ serializers._serializers = self.old_serializers
+ if self.old_SERIALIZATION_MODULES:
+ settings.SERIALIZATION_MODULES = self.old_SERIALIZATION_MODULES
+ else:
+ delattr(settings, 'SERIALIZATION_MODULES')
+
+ def test_register(self):
+ "Registering a new serializer populates the full registry. Refs #14823"
+ serializers.register_serializer('json3', 'django.core.serializers.json')
+
+ public_formats = serializers.get_public_serializer_formats()
+ self.assertIn('json3', public_formats)
+ self.assertIn('json2', public_formats)
+ self.assertIn('xml', public_formats)
+
+ def test_unregister(self):
+ "Unregistering a serializer doesn't cause the registry to be repopulated. Refs #14823"
+ serializers.unregister_serializer('xml')
+ serializers.register_serializer('json3', 'django.core.serializers.json')
+
+ public_formats = serializers.get_public_serializer_formats()
+
+ self.assertNotIn('xml', public_formats)
+ self.assertIn('json3', public_formats)
+
+ def test_builtin_serializers(self):
+ "Requesting a list of serializer formats popuates the registry"
+ all_formats = set(serializers.get_serializer_formats())
+ public_formats = set(serializers.get_public_serializer_formats())
+
+ self.assertIn('xml', all_formats),
+ self.assertIn('xml', public_formats)
+
+ self.assertIn('json2', all_formats)
+ self.assertIn('json2', public_formats)
+
+ self.assertIn('python', all_formats)
+ self.assertNotIn('python', public_formats)
+
class SerializersTestBase(object):
@staticmethod
def _comparison_value(value):
Please sign in to comment.
Something went wrong with that request. Please try again.