diff --git a/mongoengine/fields.py b/mongoengine/fields.py index ba505fb5..edf6515b 100644 --- a/mongoengine/fields.py +++ b/mongoengine/fields.py @@ -260,10 +260,14 @@ class FloatField(BaseField): return value def validate(self, value): - if isinstance(value, int): - value = float(value) + if isinstance(value, (int, long)): + try: + value = float(value) + except OverflowError: + self.error('The value is too large to be converted to float') + if not isinstance(value, float): - self.error('FloatField only accepts float values') + self.error('FloatField only accepts float, int and long values') if self.min_value is not None and value < self.min_value: self.error('Float value is too small') diff --git a/tests/fields/fields.py b/tests/fields/fields.py index 757f66a8..3b048094 100644 --- a/tests/fields/fields.py +++ b/tests/fields/fields.py @@ -399,20 +399,36 @@ class FieldTest(unittest.TestCase): class Person(Document): height = FloatField(min_value=0.1, max_value=3.5) + class BigPerson(Document): + height = FloatField() + person = Person() person.height = 1.89 person.validate() person.height = '2.0' self.assertRaises(ValidationError, person.validate) + person.height = 0.01 self.assertRaises(ValidationError, person.validate) + person.height = 4.0 self.assertRaises(ValidationError, person.validate) person_2 = Person(height='something invalid') self.assertRaises(ValidationError, person_2.validate) + big_person = BigPerson() + + big_person.height = 1L + big_person.validate() + + big_person.height = 2 ** 500 + big_person.validate() + + big_person.height = 2 ** 100000 # Too big for a float value + self.assertRaises(ValidationError, big_person.validate) + def test_decimal_validation(self): """Ensure that invalid values cannot be assigned to decimal fields. """