diff --git a/AUTHORS b/AUTHORS index ddd3cf8566..a32e0d62cb 100644 --- a/AUTHORS +++ b/AUTHORS @@ -35,6 +35,7 @@ answer newbie questions, and generally made Django that much better: Gisle Aas Chris Adams + Mathieu Agopian ajs alang@bright-green.com A S Alam diff --git a/django/core/serializers/__init__.py b/django/core/serializers/__init__.py index 7afc94c1d0..09bcb651d5 100644 --- a/django/core/serializers/__init__.py +++ b/django/core/serializers/__init__.py @@ -18,6 +18,7 @@ from django.conf import settings from django.utils import importlib +from django.core.serializers.base import SerializerDoesNotExist # Built-in serializers BUILTIN_SERIALIZERS = { @@ -60,11 +61,15 @@ def unregister_serializer(format): "Unregister a given serializer. This is not a thread-safe operation." if not _serializers: _load_serializers() + if format not in _serializers: + raise SerializerDoesNotExist(format) del _serializers[format] def get_serializer(format): if not _serializers: _load_serializers() + if format not in _serializers: + raise SerializerDoesNotExist(format) return _serializers[format].Serializer def get_serializer_formats(): @@ -80,6 +85,8 @@ def get_public_serializer_formats(): def get_deserializer(format): if not _serializers: _load_serializers() + if format not in _serializers: + raise SerializerDoesNotExist(format) return _serializers[format].Deserializer def serialize(format, queryset, **options): diff --git a/django/core/serializers/base.py b/django/core/serializers/base.py index cdcc7fa36a..6afaf216a8 100644 --- a/django/core/serializers/base.py +++ b/django/core/serializers/base.py @@ -8,6 +8,10 @@ from django.utils.encoding import smart_str, smart_unicode from django.utils import datetime_safe +class SerializerDoesNotExist(KeyError): + """The requested serializer was not found.""" + pass + class SerializationError(Exception): """Something bad happened during serialization.""" pass diff --git a/docs/topics/serialization.txt b/docs/topics/serialization.txt index c8acc8539e..f0f17b2ee2 100644 --- a/docs/topics/serialization.txt +++ b/docs/topics/serialization.txt @@ -38,6 +38,12 @@ This is useful if you want to serialize data directly to a file-like object out = open("file.xml", "w") xml_serializer.serialize(SomeModel.objects.all(), stream=out) +.. note:: + + Calling :func:`~django.core.serializers.get_serializer` with an unknown + :ref:`format ` will raise a + :class:`~django.core.serializers.SerializerDoesNotExist` exception. + Subset of fields ~~~~~~~~~~~~~~~~ diff --git a/tests/regressiontests/serializers_regress/tests.py b/tests/regressiontests/serializers_regress/tests.py index de57a6f0de..97b2a792eb 100644 --- a/tests/regressiontests/serializers_regress/tests.py +++ b/tests/regressiontests/serializers_regress/tests.py @@ -6,7 +6,7 @@ the serializers. This includes all valid data values, plus forward, backwards and self references. """ - +from __future__ import with_statement import datetime import decimal @@ -17,6 +17,7 @@ from django.conf import settings from django.core import serializers, management +from django.core.serializers import SerializerDoesNotExist from django.db import transaction, DEFAULT_DB_ALIAS, connection from django.test import TestCase from django.utils.functional import curry @@ -350,7 +351,28 @@ def inherited_compare(testcase, pk, klass, data): # Dynamically create serializer tests to ensure that all # registered serializers are automatically tested. class SerializerTests(TestCase): - pass + def test_get_unknown_serializer(self): + """ + #15889: get_serializer('nonsense') raises a SerializerDoesNotExist + """ + with self.assertRaises(SerializerDoesNotExist): + serializers.get_serializer("nonsense") + + with self.assertRaises(KeyError): + serializers.get_serializer("nonsense") + + # SerializerDoesNotExist is instantiated with the nonexistent format + with self.assertRaises(SerializerDoesNotExist) as cm: + serializers.get_serializer("nonsense") + self.assertEqual(cm.exception.args, ("nonsense",)) + + def test_unregister_unkown_serializer(self): + with self.assertRaises(SerializerDoesNotExist): + serializers.unregister_serializer("nonsense") + + def test_get_unkown_deserializer(self): + with self.assertRaises(SerializerDoesNotExist): + serializers.get_deserializer("nonsense") def serializerTest(format, self):