Commit e2e4cdba authored by Yehonatan Daniv's avatar Yehonatan Daniv Committed by Tim Graham
Browse files

Fixed #22539 -- Copied exclude argument in Model.full_clean() to prevent side effects.

parent 45c2d1f5
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -988,6 +988,8 @@ class Model(six.with_metaclass(ModelBase)):
        errors = {}
        if exclude is None:
            exclude = []
        else:
            exclude = list(exclude)

        try:
            self.clean_fields(exclude=exclude)
+2 −2
Original line number Diff line number Diff line
@@ -3,9 +3,9 @@ from django.test import TestCase


class ValidationTestCase(TestCase):
    def assertFailsValidation(self, clean, failed_fields):
    def assertFailsValidation(self, clean, failed_fields, **kwargs):
        with self.assertRaises(ValidationError) as cm:
            clean()
            clean(**kwargs)
        self.assertEqual(sorted(failed_fields), sorted(cm.exception.message_dict))

    def assertFieldFailsValidationWithMessage(self, clean, field_name, message):
+7 −0
Original line number Diff line number Diff line
@@ -59,6 +59,13 @@ class BaseModelValidationTests(ValidationTestCase):
        mtv = ModelToValidate(number=10, name='Some Name', slug='##invalid##')
        self.assertFailsValidation(mtv.full_clean, ['slug'])

    def test_full_clean_does_not_mutate_exclude(self):
        mtv = ModelToValidate(f_with_custom_validator=42)
        exclude = ['number']
        self.assertFailsValidation(mtv.full_clean, ['name'], exclude=exclude)
        self.assertEqual(len(exclude), 1)
        self.assertEqual(exclude[0], 'number')


class ArticleForm(forms.ModelForm):
    class Meta: