Updated validation error messages

refs hmarr/mongoengine#539
This commit is contained in:
Ross Lawley 2012-07-19 15:04:12 +01:00
parent d83e67c121
commit 1b17fb0ae7
4 changed files with 21 additions and 19 deletions

View File

@ -4,6 +4,7 @@ Changelog
Changes in 0.6.15 Changes in 0.6.15
================= =================
- Updated validation error message
- Added support for null / zero / false values in item_frequencies - Added support for null / zero / false values in item_frequencies
- Fixed cascade save edge case - Fixed cascade save edge case
- Fixed geo index creation through reference fields - Fixed geo index creation through reference fields

View File

@ -1,4 +1,5 @@
import warnings import warnings
from collections import defaultdict
from queryset import QuerySet, QuerySetManager from queryset import QuerySet, QuerySetManager
from queryset import DoesNotExist, MultipleObjectsReturned from queryset import DoesNotExist, MultipleObjectsReturned
@ -53,9 +54,9 @@ class ValidationError(AssertionError):
message = super(ValidationError, self).__getattribute__(name) message = super(ValidationError, self).__getattribute__(name)
if name == 'message': if name == 'message':
if self.field_name: if self.field_name:
message = '%s ("%s")' % (message, self.field_name) message = '%s' % message
if self.errors: if self.errors:
message = '%s:\n%s' % (message, self._format_errors()) message = '%s(%s)' % (message, self._format_errors())
return message return message
def _get_message(self): def _get_message(self):
@ -93,17 +94,20 @@ class ValidationError(AssertionError):
def _format_errors(self): def _format_errors(self):
"""Returns a string listing all errors within a document""" """Returns a string listing all errors within a document"""
def format_error(field, value, prefix=''): def generate_key(value, prefix=''):
prefix = "%s.%s" % (prefix, field) if prefix else "%s" % field if isinstance(value, list):
value = ' '.join([generate_key(k) for k in value])
if isinstance(value, dict): if isinstance(value, dict):
value = ' '.join(
[generate_key(v, k) for k, v in value.iteritems()])
return '\n'.join( results = "%s.%s" % (prefix, value) if prefix else value
[format_error(k, value[k], prefix) for k in value]) return results
else:
return "%s: %s" % (prefix, value)
return '\n'.join( error_dict = defaultdict(list)
[format_error(k, v) for k, v in self.to_dict().items()]) for k, v in self.to_dict().iteritems():
error_dict[generate_key(v)].append(k)
return ' '.join(["%s: %s" % (k, v) for k, v in error_dict.iteritems()])
_document_registry = {} _document_registry = {}
@ -899,8 +903,7 @@ class BaseDocument(object):
errors[field.name] = ValidationError('Field is required', errors[field.name] = ValidationError('Field is required',
field_name=field.name) field_name=field.name)
if errors: if errors:
raise ValidationError('Errors encountered validating document', raise ValidationError('ValidationError', errors=errors)
errors=errors)
def to_mongo(self): def to_mongo(self):
"""Return data dictionary ready for use with MongoDB. """Return data dictionary ready for use with MongoDB.

View File

@ -3137,7 +3137,7 @@ class ValidatorErrorTest(unittest.TestCase):
self.assertEquals(error.to_dict()['1st']['2nd']['3rd']['4th'], self.assertEquals(error.to_dict()['1st']['2nd']['3rd']['4th'],
'Inception') 'Inception')
self.assertEquals(error.message, "root:\n1st.2nd.3rd.4th: Inception") self.assertEquals(error.message, "root(2nd.3rd.4th.Inception: ['1st'])")
def test_model_validation(self): def test_model_validation(self):
@ -3148,13 +3148,11 @@ class ValidatorErrorTest(unittest.TestCase):
try: try:
User().validate() User().validate()
except ValidationError, e: except ValidationError, e:
expected_error_message = """Errors encountered validating document: expected_error_message = """ValidationError(Field is required: ['username', 'name'])"""
username: Field is required ("username")
name: Field is required ("name")"""
self.assertEquals(e.message, expected_error_message) self.assertEquals(e.message, expected_error_message)
self.assertEquals(e.to_dict(), { self.assertEquals(e.to_dict(), {
'username': 'Field is required ("username")', 'username': 'Field is required',
'name': u'Field is required ("name")'}) 'name': 'Field is required'})
def test_spaces_in_keys(self): def test_spaces_in_keys(self):

View File

@ -2122,7 +2122,7 @@ class FieldTest(unittest.TestCase):
self.assertTrue(1 in error_dict['comments']) self.assertTrue(1 in error_dict['comments'])
self.assertTrue('content' in error_dict['comments'][1]) self.assertTrue('content' in error_dict['comments'][1])
self.assertEquals(error_dict['comments'][1]['content'], self.assertEquals(error_dict['comments'][1]['content'],
u'Field is required ("content")') 'Field is required')
post.comments[1].content = 'here we go' post.comments[1].content = 'here we go'
post.validate() post.validate()