got rid of assert for validation; ValidationError now extends AssertionError for BC purpose
This commit is contained in:
parent
b8e2bdc99f
commit
a1db437c42
@ -19,13 +19,13 @@ class InvalidDocumentError(Exception):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class ValidationError(Exception):
|
class ValidationError(AssertionError):
|
||||||
"""Validation exception.
|
"""Validation exception.
|
||||||
"""
|
"""
|
||||||
errors = {}
|
errors = {}
|
||||||
field_name = None
|
field_name = None
|
||||||
|
|
||||||
def __init__(self, message, **kwargs):
|
def __init__(self, message="", **kwargs):
|
||||||
self.errors = kwargs.get('errors', {})
|
self.errors = kwargs.get('errors', {})
|
||||||
self.field_name = kwargs.get('field_name')
|
self.field_name = kwargs.get('field_name')
|
||||||
super(ValidationError, self).__init__(message)
|
super(ValidationError, self).__init__(message)
|
||||||
@ -157,7 +157,7 @@ class BaseField(object):
|
|||||||
instance._data[self.name] = value
|
instance._data[self.name] = value
|
||||||
instance._mark_as_changed(self.name)
|
instance._mark_as_changed(self.name)
|
||||||
|
|
||||||
def error(self, message, errors=None, field_name=None):
|
def error(self, message="", errors=None, field_name=None):
|
||||||
"""Raises a ValidationError.
|
"""Raises a ValidationError.
|
||||||
"""
|
"""
|
||||||
field_name = field_name if field_name else self.name
|
field_name = field_name if field_name else self.name
|
||||||
@ -794,9 +794,8 @@ 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:
|
||||||
error = ValidationError('Errors encountered validating document')
|
raise ValidationError('Errors encountered validating document',
|
||||||
error.errors = errors
|
errors=errors)
|
||||||
raise error
|
|
||||||
|
|
||||||
@apply
|
@apply
|
||||||
def pk():
|
def pk():
|
||||||
|
@ -41,7 +41,8 @@ class StringField(BaseField):
|
|||||||
return unicode(value)
|
return unicode(value)
|
||||||
|
|
||||||
def validate(self, value):
|
def validate(self, value):
|
||||||
assert isinstance(value, (str, unicode))
|
if not isinstance(value, (str, unicode)):
|
||||||
|
self.error('StringField only accepts string values')
|
||||||
|
|
||||||
if self.max_length is not None and len(value) > self.max_length:
|
if self.max_length is not None and len(value) > self.max_length:
|
||||||
self.error('String value is too long')
|
self.error('String value is too long')
|
||||||
@ -143,7 +144,7 @@ class IntField(BaseField):
|
|||||||
try:
|
try:
|
||||||
value = int(value)
|
value = int(value)
|
||||||
except:
|
except:
|
||||||
raise self.error('%s could not be converted to int' % value)
|
self.error('%s could not be converted to int' % value)
|
||||||
|
|
||||||
if self.min_value is not None and value < self.min_value:
|
if self.min_value is not None and value < self.min_value:
|
||||||
self.error('Integer value is too small')
|
self.error('Integer value is too small')
|
||||||
@ -169,7 +170,8 @@ class FloatField(BaseField):
|
|||||||
def validate(self, value):
|
def validate(self, value):
|
||||||
if isinstance(value, int):
|
if isinstance(value, int):
|
||||||
value = float(value)
|
value = float(value)
|
||||||
assert isinstance(value, float)
|
if not isinstance(value, float):
|
||||||
|
self.error('FoatField only accepts float values')
|
||||||
|
|
||||||
if self.min_value is not None and value < self.min_value:
|
if self.min_value is not None and value < self.min_value:
|
||||||
self.error('Float value is too small')
|
self.error('Float value is too small')
|
||||||
@ -225,7 +227,8 @@ class BooleanField(BaseField):
|
|||||||
return bool(value)
|
return bool(value)
|
||||||
|
|
||||||
def validate(self, value):
|
def validate(self, value):
|
||||||
assert isinstance(value, bool)
|
if not isinstance(value, bool):
|
||||||
|
self.error('BooleanField only accepts boolean values')
|
||||||
|
|
||||||
|
|
||||||
class DateTimeField(BaseField):
|
class DateTimeField(BaseField):
|
||||||
@ -238,7 +241,8 @@ class DateTimeField(BaseField):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
def validate(self, value):
|
def validate(self, value):
|
||||||
assert isinstance(value, (datetime.datetime, datetime.date))
|
if not isinstance(value, (datetime.datetime, datetime.date)):
|
||||||
|
self.error(u'cannot parse date "%s"' % value)
|
||||||
|
|
||||||
def to_mongo(self, value):
|
def to_mongo(self, value):
|
||||||
return self.prepare_query_value(None, value)
|
return self.prepare_query_value(None, value)
|
||||||
@ -524,7 +528,8 @@ class DictField(ComplexBaseField):
|
|||||||
def __init__(self, basecls=None, field=None, *args, **kwargs):
|
def __init__(self, basecls=None, field=None, *args, **kwargs):
|
||||||
self.field = field
|
self.field = field
|
||||||
self.basecls = basecls or BaseField
|
self.basecls = basecls or BaseField
|
||||||
assert issubclass(self.basecls, BaseField)
|
if not issubclass(self.basecls, BaseField):
|
||||||
|
self.error('DictField only accepts dict values')
|
||||||
kwargs.setdefault('default', lambda: {})
|
kwargs.setdefault('default', lambda: {})
|
||||||
super(DictField, self).__init__(*args, **kwargs)
|
super(DictField, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
@ -646,11 +651,12 @@ class ReferenceField(BaseField):
|
|||||||
return self.to_mongo(value)
|
return self.to_mongo(value)
|
||||||
|
|
||||||
def validate(self, value):
|
def validate(self, value):
|
||||||
assert isinstance(value, (self.document_type, pymongo.dbref.DBRef))
|
if not isinstance(value, (self.document_type, pymongo.dbref.DBRef)):
|
||||||
|
self.error('A ReferenceField only accepts DBRef')
|
||||||
|
|
||||||
if isinstance(value, Document) and value.id is None:
|
if isinstance(value, Document) and value.id is None:
|
||||||
raise self.error('You can only reference documents once they have'
|
self.error('You can only reference documents once they have been '
|
||||||
' been saved to the database')
|
'saved to the database')
|
||||||
|
|
||||||
def lookup_member(self, member_name):
|
def lookup_member(self, member_name):
|
||||||
return self.document_type._fields.get(member_name)
|
return self.document_type._fields.get(member_name)
|
||||||
@ -678,7 +684,7 @@ class GenericReferenceField(BaseField):
|
|||||||
|
|
||||||
def validate(self, value):
|
def validate(self, value):
|
||||||
if not isinstance(value, (Document, pymongo.dbref.DBRef)):
|
if not isinstance(value, (Document, pymongo.dbref.DBRef)):
|
||||||
raise self.error('GenericReferences can only contain documents')
|
self.error('GenericReferences can only contain documents')
|
||||||
|
|
||||||
# We need the id from the saved object to create the DBRef
|
# We need the id from the saved object to create the DBRef
|
||||||
if isinstance(value, Document) and value.id is None:
|
if isinstance(value, Document) and value.id is None:
|
||||||
@ -734,7 +740,8 @@ class BinaryField(BaseField):
|
|||||||
return str(value)
|
return str(value)
|
||||||
|
|
||||||
def validate(self, value):
|
def validate(self, value):
|
||||||
assert isinstance(value, str)
|
if not isinstance(value, str):
|
||||||
|
self.error('BinaryField only accepts string values')
|
||||||
|
|
||||||
if self.max_bytes is not None and len(value) > self.max_bytes:
|
if self.max_bytes is not None and len(value) > self.max_bytes:
|
||||||
self.error('Binary value is too long')
|
self.error('Binary value is too long')
|
||||||
@ -895,8 +902,10 @@ class FileField(BaseField):
|
|||||||
|
|
||||||
def validate(self, value):
|
def validate(self, value):
|
||||||
if value.grid_id is not None:
|
if value.grid_id is not None:
|
||||||
assert isinstance(value, GridFSProxy)
|
if not isinstance(value, GridFSProxy):
|
||||||
assert isinstance(value.grid_id, pymongo.objectid.ObjectId)
|
self.error('FileField only accepts GridFSProxy values')
|
||||||
|
if not isinstance(value.grid_id, pymongo.objectid.ObjectId):
|
||||||
|
self.error('Invalid GridFSProxy value')
|
||||||
|
|
||||||
|
|
||||||
class GeoPointField(BaseField):
|
class GeoPointField(BaseField):
|
||||||
@ -915,7 +924,7 @@ class GeoPointField(BaseField):
|
|||||||
'of (x, y)')
|
'of (x, y)')
|
||||||
|
|
||||||
if not len(value) == 2:
|
if not len(value) == 2:
|
||||||
raise self.error('Value must be a two-dimensional point')
|
self.error('Value must be a two-dimensional point')
|
||||||
if (not isinstance(value[0], (float, int)) and
|
if (not isinstance(value[0], (float, int)) and
|
||||||
not isinstance(value[1], (float, int))):
|
not isinstance(value[1], (float, int))):
|
||||||
self.error('Both values in point must be float or int')
|
self.error('Both values in point must be float or int')
|
||||||
|
Loading…
x
Reference in New Issue
Block a user