diff options
author | Joseph Kocherhans <joseph@jkocherhans.com> | 2010-01-01 21:11:57 +0000 |
---|---|---|
committer | Joseph Kocherhans <joseph@jkocherhans.com> | 2010-01-01 21:11:57 +0000 |
commit | a907e15cad3ede93f8b785007bdf93205b4f431a (patch) | |
tree | 42f912d059aae461aa9c70ca4201174c801a022e | |
parent | c2a2b51ac3009739813a7e6ba22f3c7053a30da2 (diff) | |
download | django-a907e15cad3ede93f8b785007bdf93205b4f431a.tar.gz |
[soc2009/model-validation] Renamed Model's clean method to full_validate to be more consistent with django.forms.
git-svn-id: http://code.djangoproject.com/svn/django/branches/soc2009/model-validation@12039 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r-- | django/db/models/base.py | 4 | ||||
-rw-r--r-- | django/forms/models.py | 5 | ||||
-rw-r--r-- | docs/ref/models/instances.txt | 9 | ||||
-rw-r--r-- | tests/modeltests/validation/test_custom_messages.py | 6 | ||||
-rw-r--r-- | tests/modeltests/validation/test_unique.py | 7 | ||||
-rw-r--r-- | tests/modeltests/validation/tests.py | 27 | ||||
-rw-r--r-- | tests/modeltests/validation/validators.py | 16 |
7 files changed, 37 insertions, 37 deletions
diff --git a/django/db/models/base.py b/django/db/models/base.py index c83b0fd5b5..eace314fe8 100644 --- a/django/db/models/base.py +++ b/django/db/models/base.py @@ -644,7 +644,7 @@ class Model(object): def validate(self): """ - Hook for doing any extra model-wide validation after Model.clean() been + Hook for doing any extra model-wide validation after clean() has been called on every field. Any ValidationError raised by this method will not be associated with a particular field; it will have a special-case association with the field named '__all__'. @@ -785,7 +785,7 @@ class Model(object): 'field_label': unicode(field_labels) } - def clean(self, exclude=[]): + def full_validate(self, exclude=[]): """ Cleans all fields and raises ValidationError containing message_dict of all validation errors if any occur. diff --git a/django/forms/models.py b/django/forms/models.py index 124bb3e170..12cfcdbfe5 100644 --- a/django/forms/models.py +++ b/django/forms/models.py @@ -244,7 +244,7 @@ class BaseModelForm(BaseForm): opts = self._meta self.instance = make_instance(self, self.instance, opts.fields, opts.exclude) try: - self.instance.clean(exclude=self._errors.keys()) + self.instance.full_validate(exclude=self._errors.keys()) except ValidationError, e: for k, v in e.message_dict.items(): if k != NON_FIELD_ERRORS: @@ -257,7 +257,7 @@ class BaseModelForm(BaseForm): # what about fields that don't validate but aren't present on the form? if NON_FIELD_ERRORS in e.message_dict: raise ValidationError(e.message_dict[NON_FIELD_ERRORS]) - + return self.cleaned_data def save(self, commit=True): @@ -272,7 +272,6 @@ class BaseModelForm(BaseForm): fail_message = 'created' else: fail_message = 'changed' - return save_made_instance(self, self.instance, self._meta.fields, commit, fail_message) save.alters_data = True diff --git a/docs/ref/models/instances.txt b/docs/ref/models/instances.txt index ee5a607ff4..3f61d729ff 100644 --- a/docs/ref/models/instances.txt +++ b/docs/ref/models/instances.txt @@ -32,9 +32,9 @@ Validating objects .. versionadded:: 1.2 -To validate your model, just call it's ``clean()`` method: +To validate your model, just call it's ``full_validate()`` method: -.. method:: Model.clean([exclude=[]]) +.. method:: Model.full_validate([exclude=[]]) The optional ``exclude`` argument can contain a list of field names that should be omitted when validating. This method raises ``ValidationError`` containing a @@ -45,8 +45,9 @@ To add your own validation logic, override the supplied ``validate()`` method: .. method:: Model.validate() The ``validate()`` method on ``Model`` by default checks for uniqueness of -fields and group of fields that are declared to be unique so remember to call -``super.validate()`` if you want this validation to run. +fields and group of fields that are declared to be unique so, remember to call +``self.validate_unique()`` or the superclasses ``validate`` method if you want +this validation to run. Any ``ValidationError`` raised in this method will be propagated in the ``message_dict`` under ``NON_FIELD_ERRORS``. diff --git a/tests/modeltests/validation/test_custom_messages.py b/tests/modeltests/validation/test_custom_messages.py index 059b7f462d..e543dbd73f 100644 --- a/tests/modeltests/validation/test_custom_messages.py +++ b/tests/modeltests/validation/test_custom_messages.py @@ -4,13 +4,13 @@ from models import CustomMessagesModel class CustomMessagesTest(ValidationTestCase): def test_custom_complex_validator_message(self): cmm = CustomMessagesModel(number=42, other=42) - self.assertFieldFailsValidationWithMessage(cmm.clean, 'number', ['other != me']) + self.assertFieldFailsValidationWithMessage(cmm.full_validate, 'number', ['other != me']) def test_custom_simple_validator_message(self): cmm = CustomMessagesModel(number=12) - self.assertFieldFailsValidationWithMessage(cmm.clean, 'number', ['AAARGH']) + self.assertFieldFailsValidationWithMessage(cmm.full_validate, 'number', ['AAARGH']) def test_custom_null_message(self): cmm = CustomMessagesModel() - self.assertFieldFailsValidationWithMessage(cmm.clean, 'number', ['NULL']) + self.assertFieldFailsValidationWithMessage(cmm.full_validate, 'number', ['NULL']) diff --git a/tests/modeltests/validation/test_unique.py b/tests/modeltests/validation/test_unique.py index 618a5578c7..53b1a72e65 100644 --- a/tests/modeltests/validation/test_unique.py +++ b/tests/modeltests/validation/test_unique.py @@ -2,9 +2,9 @@ import unittest from django.conf import settings from django.db import connection - from models import CustomPKModel, UniqueTogetherModel, UniqueFieldsModel, UniqueForDateModel, ModelToValidate + class GetUniqueCheckTests(unittest.TestCase): def test_unique_fields_get_collected(self): m = UniqueFieldsModel() @@ -26,7 +26,6 @@ class GetUniqueCheckTests(unittest.TestCase): ), m._get_unique_checks() ) - class PerformUniqueChecksTest(unittest.TestCase): def setUp(self): # set debug to True to gain access to connection.queries @@ -43,12 +42,12 @@ class PerformUniqueChecksTest(unittest.TestCase): l = len(connection.queries) mtv = ModelToValidate(number=10, name='Some Name') setattr(mtv, '_adding', True) - mtv.clean() + mtv.full_validate() self.assertEqual(l+1, len(connection.queries)) def test_primary_key_unique_check_not_performed_when_not_adding(self): """Regression test for #12132""" l = len(connection.queries) mtv = ModelToValidate(number=10, name='Some Name') - mtv.clean() + mtv.full_validate() self.assertEqual(l, len(connection.queries)) diff --git a/tests/modeltests/validation/tests.py b/tests/modeltests/validation/tests.py index 656e9d8216..c00070b2ab 100644 --- a/tests/modeltests/validation/tests.py +++ b/tests/modeltests/validation/tests.py @@ -8,50 +8,51 @@ from validators import TestModelsWithValidators from test_unique import GetUniqueCheckTests, PerformUniqueChecksTest from test_custom_messages import CustomMessagesTest + class BaseModelValidationTests(ValidationTestCase): def test_missing_required_field_raises_error(self): mtv = ModelToValidate(f_with_custom_validator=42) - self.assertFailsValidation(mtv.clean, ['name', 'number']) - + self.assertFailsValidation(mtv.full_validate, ['name', 'number']) + def test_with_correct_value_model_validates(self): mtv = ModelToValidate(number=10, name='Some Name') - self.assertEqual(None, mtv.clean()) + self.assertEqual(None, mtv.full_validate()) def test_custom_validate_method_is_called(self): mtv = ModelToValidate(number=11) - self.assertFailsValidation(mtv.clean, [NON_FIELD_ERRORS, 'name']) + self.assertFailsValidation(mtv.full_validate, [NON_FIELD_ERRORS, 'name']) def test_wrong_FK_value_raises_error(self): mtv=ModelToValidate(number=10, name='Some Name', parent_id=3) - self.assertFailsValidation(mtv.clean, ['parent']) + self.assertFailsValidation(mtv.full_validate, ['parent']) - def test_correct_FK_value_cleans(self): + def test_correct_FK_value_validates(self): parent = ModelToValidate.objects.create(number=10, name='Some Name') mtv=ModelToValidate(number=10, name='Some Name', parent_id=parent.pk) - self.assertEqual(None, mtv.clean()) + self.assertEqual(None, mtv.full_validate()) def test_wrong_email_value_raises_error(self): mtv = ModelToValidate(number=10, name='Some Name', email='not-an-email') - self.assertFailsValidation(mtv.clean, ['email']) + self.assertFailsValidation(mtv.full_validate, ['email']) def test_correct_email_value_passes(self): mtv = ModelToValidate(number=10, name='Some Name', email='valid@email.com') - self.assertEqual(None, mtv.clean()) + self.assertEqual(None, mtv.full_validate()) def test_wrong_url_value_raises_error(self): mtv = ModelToValidate(number=10, name='Some Name', url='not a url') - self.assertFieldFailsValidationWithMessage(mtv.clean, 'url', [u'Enter a valid value.']) + self.assertFieldFailsValidationWithMessage(mtv.full_validate, 'url', [u'Enter a valid value.']) def test_correct_url_but_nonexisting_gives_404(self): mtv = ModelToValidate(number=10, name='Some Name', url='http://google.com/we-love-microsoft.html') - self.assertFieldFailsValidationWithMessage(mtv.clean, 'url', [u'This URL appears to be a broken link.']) + self.assertFieldFailsValidationWithMessage(mtv.full_validate, 'url', [u'This URL appears to be a broken link.']) def test_correct_url_value_passes(self): mtv = ModelToValidate(number=10, name='Some Name', url='http://www.djangoproject.com/') - self.assertEqual(None, mtv.clean()) # This will fail if there's no Internet connection + self.assertEqual(None, mtv.full_validate()) # This will fail if there's no Internet connection def test_text_greater_that_charfields_max_length_eaises_erros(self): mtv = ModelToValidate(number=10, name='Some Name'*100) - self.assertFailsValidation(mtv.clean, ['name',]) + self.assertFailsValidation(mtv.full_validate, ['name',]) diff --git a/tests/modeltests/validation/validators.py b/tests/modeltests/validation/validators.py index ac22afa295..d54aab6234 100644 --- a/tests/modeltests/validation/validators.py +++ b/tests/modeltests/validation/validators.py @@ -3,34 +3,34 @@ from unittest import TestCase from modeltests.validation import ValidationTestCase from models import * + class TestModelsWithValidators(ValidationTestCase): def test_custom_validator_passes_for_correct_value(self): mtv = ModelToValidate(number=10, name='Some Name', f_with_custom_validator=42) - self.assertEqual(None, mtv.clean()) + self.assertEqual(None, mtv.full_validate()) def test_custom_validator_raises_error_for_incorrect_value(self): mtv = ModelToValidate(number=10, name='Some Name', f_with_custom_validator=12) - self.assertFailsValidation(mtv.clean, ['f_with_custom_validator']) + self.assertFailsValidation(mtv.full_validate, ['f_with_custom_validator']) self.assertFieldFailsValidationWithMessage( - mtv.clean, + mtv.full_validate, 'f_with_custom_validator', [u'This is not the answer to life, universe and everything!'] ) def test_custom_complex_validator_raises_error_for_incorrect_value(self): mtv = ModelToValidate(number=42, name='Some Name', f_with_custom_validator=42) - self.assertFailsValidation(mtv.clean, ['f_with_custom_validator']) + self.assertFailsValidation(mtv.full_validate, ['f_with_custom_validator']) self.assertFieldFailsValidationWithMessage( - mtv.clean, + mtv.full_validate, 'f_with_custom_validator', [u"Must not equal to 'number''s value"] ) - - def test_complex_validator_isnt_run_if_field_doesnt_clean(self): + def test_complex_validator_isnt_run_if_field_doesnt_validate(self): mtv = ModelToValidate(number=32, name='Some Name', f_with_custom_validator=32) self.assertFieldFailsValidationWithMessage( - mtv.clean, + mtv.full_validate, 'f_with_custom_validator', [u'This is not the answer to life, universe and everything!'] ) |