From 540a0cc59c57de51e89350bdc4add0ddfc93afa2 Mon Sep 17 00:00:00 2001 From: Adam Reeve Date: Fri, 9 Mar 2012 16:08:30 +1300 Subject: [PATCH] List all document errors when raising a ValidationError --- mongoengine/base.py | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/mongoengine/base.py b/mongoengine/base.py index 5a9dd88f..e4235586 100644 --- a/mongoengine/base.py +++ b/mongoengine/base.py @@ -51,10 +51,12 @@ class ValidationError(AssertionError): def __getattribute__(self, name): message = super(ValidationError, self).__getattribute__(name) - if name == 'message' and self.field_name: - return message + ' ("%s")' % self.field_name - else: - return message + if name == 'message': + if self.field_name: + message += ' ("%s")' % self.field_name + if self.errors: + message += ':\n' + self._format_errors() + return message def _get_message(self): return self._message @@ -88,6 +90,20 @@ class ValidationError(AssertionError): return {} return build_dict(self.errors) + def _format_errors(self): + """Returns a string listing all errors within a document""" + + def format_error(field, value, prefix=''): + if isinstance(value, dict): + new_prefix = (prefix + '.' if prefix else '') + str(field) + return '\n'.join( + [format_error(k, value[k], new_prefix) for k in value]) + else: + return (prefix + ": " if prefix else '') + str(value) + + return '\n'.join( + [format_error(k, v) for k, v in self.to_dict().items()]) + _document_registry = {}