mirror of
https://github.com/django/django.git
synced 2025-10-31 09:41:08 +00:00
Merge pull request #1582 from rca/12756-missing-yaml-module-serializer-error-message
Fixed #12756: Improved error message when yaml module is missing.
This commit is contained in:
@@ -106,11 +106,11 @@ class Command(BaseCommand):
|
||||
# Check that the serialization format exists; this is a shortcut to
|
||||
# avoid collating all the objects and _then_ failing.
|
||||
if format not in serializers.get_public_serializer_formats():
|
||||
raise CommandError("Unknown serialization format: %s" % format)
|
||||
try:
|
||||
serializers.get_serializer(format)
|
||||
except serializers.SerializerDoesNotExist:
|
||||
pass
|
||||
|
||||
try:
|
||||
serializers.get_serializer(format)
|
||||
except KeyError:
|
||||
raise CommandError("Unknown serialization format: %s" % format)
|
||||
|
||||
def get_objects():
|
||||
|
||||
@@ -27,17 +27,29 @@ BUILTIN_SERIALIZERS = {
|
||||
"xml" : "django.core.serializers.xml_serializer",
|
||||
"python" : "django.core.serializers.python",
|
||||
"json" : "django.core.serializers.json",
|
||||
"yaml" : "django.core.serializers.pyyaml",
|
||||
}
|
||||
|
||||
# Check for PyYaml and register the serializer if it's available.
|
||||
try:
|
||||
import yaml
|
||||
BUILTIN_SERIALIZERS["yaml"] = "django.core.serializers.pyyaml"
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
_serializers = {}
|
||||
|
||||
|
||||
class BadSerializer(object):
|
||||
"""
|
||||
Stub serializer to hold exception raised during registration
|
||||
|
||||
This allows the serializer registration to cache serializers and if there
|
||||
is an error raised in the process of creating a serializer it will be
|
||||
raised and passed along to the caller when the serializer is used.
|
||||
"""
|
||||
internal_use_only = False
|
||||
|
||||
def __init__(self, exception):
|
||||
self.exception = exception
|
||||
|
||||
def __call__(self, *args, **kwargs):
|
||||
raise self.exception
|
||||
|
||||
|
||||
def register_serializer(format, serializer_module, serializers=None):
|
||||
"""Register a new serializer.
|
||||
|
||||
@@ -53,12 +65,23 @@ def register_serializer(format, serializer_module, serializers=None):
|
||||
"""
|
||||
if serializers is None and not _serializers:
|
||||
_load_serializers()
|
||||
module = importlib.import_module(serializer_module)
|
||||
|
||||
try:
|
||||
module = importlib.import_module(serializer_module)
|
||||
except ImportError, exc:
|
||||
bad_serializer = BadSerializer(exc)
|
||||
|
||||
module = type('BadSerializerModule', (object,), {
|
||||
'Deserializer': bad_serializer,
|
||||
'Serializer': bad_serializer,
|
||||
})
|
||||
|
||||
if serializers is None:
|
||||
_serializers[format] = module
|
||||
else:
|
||||
serializers[format] = module
|
||||
|
||||
|
||||
def unregister_serializer(format):
|
||||
"Unregister a given serializer. This is not a thread-safe operation."
|
||||
if not _serializers:
|
||||
|
||||
Reference in New Issue
Block a user