From d46191159e750a68e7b45e41fbc1e10bf62fd243 Mon Sep 17 00:00:00 2001 From: Harry Marr Date: Mon, 23 Nov 2009 18:03:10 +0000 Subject: [PATCH] Added DateTimeField and FloatField --- mongoengine/fields.py | 35 +++++++++++++++++++++++++++++++++-- tests/fields.py | 24 ++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/mongoengine/fields.py b/mongoengine/fields.py index 71f54539..c8a9086d 100644 --- a/mongoengine/fields.py +++ b/mongoengine/fields.py @@ -4,10 +4,12 @@ from connection import _get_db import re import pymongo +import datetime -__all__ = ['StringField', 'IntField', 'EmbeddedDocumentField', 'ListField', - 'ObjectIdField', 'ReferenceField', 'ValidationError'] +__all__ = ['StringField', 'IntField', 'FloatField', 'DateTimeField', + 'EmbeddedDocumentField', 'ListField', 'ObjectIdField', + 'ReferenceField', 'ValidationError'] class StringField(BaseField): @@ -54,6 +56,35 @@ class IntField(BaseField): raise ValidationError('Integer value is too large') +class FloatField(BaseField): + """An floating point number field. + """ + + def __init__(self, min_value=None, max_value=None, **kwargs): + self.min_value, self.max_value = min_value, max_value + super(FloatField, self).__init__(**kwargs) + + def to_python(self, value): + return float(value) + + def validate(self, value): + assert(isinstance(value, float)) + + if self.min_value is not None and value < self.min_value: + raise ValidationError('Float value is too small') + + if self.max_value is not None and value > self.max_value: + raise ValidationError('Float value is too large') + + +class DateTimeField(BaseField): + """A datetime field. + """ + + def validate(self, value): + assert(isinstance(value, datetime.datetime)) + + class EmbeddedDocumentField(BaseField): """An embedded document field. Only valid values are subclasses of EmbeddedDocument. diff --git a/tests/fields.py b/tests/fields.py index 2777a89e..e8e7a46b 100644 --- a/tests/fields.py +++ b/tests/fields.py @@ -1,4 +1,5 @@ import unittest +import datetime from mongoengine import * from mongoengine.connection import _get_db @@ -84,6 +85,29 @@ class FieldTest(unittest.TestCase): self.assertRaises(ValidationError, person.__setattr__, 'age', 120) self.assertRaises(ValidationError, person.__setattr__, 'age', 'ten') + def test_float_validation(self): + """Ensure that invalid values cannot be assigned to float fields. + """ + class Person(Document): + height = FloatField(min_value=0.1, max_value=3.5) + + person = Person() + person.height = 1.89 + self.assertRaises(ValidationError, person.__setattr__, 'height', 2) + self.assertRaises(ValidationError, person.__setattr__, 'height', 0.01) + self.assertRaises(ValidationError, person.__setattr__, 'height', 4.0) + + def test_datetime_validation(self): + """Ensure that invalid values cannot be assigned to datetime fields. + """ + class LogEntry(Document): + time = DateTimeField() + + log = LogEntry() + self.assertRaises(ValidationError, log.__setattr__, 'time', -1) + self.assertRaises(ValidationError, log.__setattr__, 'time', '1pm') + log.time = datetime.datetime.now() + def test_list_validation(self): """Ensure that a list field only accepts lists with valid elements. """