Commit 8de2a440 authored by Andrey Maslov's avatar Andrey Maslov Committed by Tim Graham
Browse files

[1.7.x] Fixed #24008 -- Fixed ValidationError crash with list of dicts.

Backport of 7a878ca5 from master
parent 4abfa73c
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -118,6 +118,9 @@ class ValidationError(Exception):
                # Normalize plain strings to instances of ValidationError.
                if not isinstance(message, ValidationError):
                    message = ValidationError(message)
                if hasattr(message, 'error_dict'):
                    self.error_list.extend(sum(message.error_dict.values(), []))
                else:
                    self.error_list.extend(message.error_list)

        else:
+3 −0
Original line number Diff line number Diff line
@@ -186,3 +186,6 @@ Bugfixes

* Restored the ability to use more than five levels of subqueries
  (:ticket:`23758`).

* Fixed crash when ``ValidationError`` is initialized with a ``ValidationError``
  that is initialized with a dictionary (:ticket:`24008`).
+24 −2
Original line number Diff line number Diff line
@@ -45,9 +45,31 @@ class FormsUtilsTestCase(TestCase):
        self.assertHTMLEqual(str(ErrorList(ValidationError(["Error one.", "Error two."]).messages)),
                         '<ul class="errorlist"><li>Error one.</li><li>Error two.</li></ul>')

        # Can take a dict.
        self.assertHTMLEqual(
            str(ErrorList(sorted(ValidationError({'error_1': "1. Error one.", 'error_2': "2. Error two."}).messages))),
            '<ul class="errorlist"><li>1. Error one.</li><li>2. Error two.</li></ul>'
        )

        # Can take a mixture in a list.
        self.assertHTMLEqual(str(ErrorList(ValidationError(["First error.", "Not \u03C0.", ugettext_lazy("Error.")]).messages)),
                         '<ul class="errorlist"><li>First error.</li><li>Not π.</li><li>Error.</li></ul>')
        self.assertHTMLEqual(
            str(ErrorList(sorted(ValidationError([
                "1. First error.",
                "2. Not \u03C0.",
                ugettext_lazy("3. Error."),
                {
                    'error_1': "4. First dict error.",
                    'error_2': "5. Second dict error.",
                },
            ]).messages))),
            '<ul class="errorlist">'
            '<li>1. First error.</li>'
            '<li>2. Not π.</li>'
            '<li>3. Error.</li>'
            '<li>4. First dict error.</li>'
            '<li>5. Second dict error.</li>'
            '</ul>'
        )

        @python_2_unicode_compatible
        class VeryBadError: