mirror of https://github.com/django/django.git
Fixed #14823 -- Corrected bootstrapping problems with register_serializers. 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
This commit is contained in:
parent
456b8a9d0c
commit
4a3ea263ef
|
@ -48,6 +48,8 @@ def register_serializer(format, serializer_module, serializers=None):
|
||||||
directly into the global register of serializers. Adding serializers
|
directly into the global register of serializers. Adding serializers
|
||||||
directly is not a thread-safe operation.
|
directly is not a thread-safe operation.
|
||||||
"""
|
"""
|
||||||
|
if serializers is None and not _serializers:
|
||||||
|
_load_serializers()
|
||||||
module = importlib.import_module(serializer_module)
|
module = importlib.import_module(serializer_module)
|
||||||
if serializers is None:
|
if serializers is None:
|
||||||
_serializers[format] = module
|
_serializers[format] = module
|
||||||
|
@ -56,6 +58,8 @@ def register_serializer(format, serializer_module, serializers=None):
|
||||||
|
|
||||||
def unregister_serializer(format):
|
def unregister_serializer(format):
|
||||||
"Unregister a given serializer. This is not a thread-safe operation."
|
"Unregister a given serializer. This is not a thread-safe operation."
|
||||||
|
if not _serializers:
|
||||||
|
_load_serializers()
|
||||||
del _serializers[format]
|
del _serializers[format]
|
||||||
|
|
||||||
def get_serializer(format):
|
def get_serializer(format):
|
||||||
|
|
|
@ -3,14 +3,65 @@ from datetime import datetime
|
||||||
from StringIO import StringIO
|
from StringIO import StringIO
|
||||||
from xml.dom import minidom
|
from xml.dom import minidom
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
from django.core import serializers
|
from django.core import serializers
|
||||||
from django.db import transaction
|
from django.db import transaction
|
||||||
from django.test import TestCase, TransactionTestCase, Approximate
|
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, \
|
from models import Category, Author, Article, AuthorProfile, Actor, \
|
||||||
Movie, Score, Player, Team
|
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):
|
class SerializersTestBase(object):
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _comparison_value(value):
|
def _comparison_value(value):
|
||||||
|
|
Loading…
Reference in New Issue