From ca56785cbcf3747428b219f1ce0029c7e80bfd29 Mon Sep 17 00:00:00 2001 From: sshwsfc Date: Thu, 18 Nov 2010 21:33:05 -0800 Subject: [PATCH 1/2] add some prepare_query_value method for fields --- mongoengine/fields.py | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/mongoengine/fields.py b/mongoengine/fields.py index e95fd65e..f658b107 100644 --- a/mongoengine/fields.py +++ b/mongoengine/fields.py @@ -150,6 +150,8 @@ class IntField(BaseField): if self.max_value is not None and value > self.max_value: raise ValidationError('Integer value is too large') + def prepare_query_value(self, op, value): + return int(value) class FloatField(BaseField): """An floating point number field. @@ -173,6 +175,9 @@ class FloatField(BaseField): if self.max_value is not None and value > self.max_value: raise ValidationError('Float value is too large') + def prepare_query_value(self, op, value): + return float(value) + class DecimalField(BaseField): """A fixed-point decimal number field. @@ -227,6 +232,40 @@ class DateTimeField(BaseField): def validate(self, value): assert isinstance(value, datetime.datetime) + def prepare_query_value(self, op, value): + if value is None: + return value + if isinstance(value, datetime.datetime): + return value + if isinstance(value, datetime.date): + return datetime.datetime(value.year, value.month, value.day) + + # Attempt to parse a datetime: + #value = smart_str(value) + # split usecs, because they are not recognized by strptime. + if '.' in value: + try: + value, usecs = value.split('.') + usecs = int(usecs) + except ValueError: + return None + else: + usecs = 0 + kwargs = {'microsecond': usecs} + try: # Seconds are optional, so try converting seconds first. + return datetime.datetime(*time.strptime(value, '%Y-%m-%d %H:%M:%S')[:6], + **kwargs) + + except ValueError: + try: # Try without seconds. + return datetime.datetime(*time.strptime(value, '%Y-%m-%d %H:%M')[:5], + **kwargs) + except ValueError: # Try without hour/minutes/seconds. + try: + return datetime.datetime(*time.strptime(value, '%Y-%m-%d')[:3], + **kwargs) + except ValueError: + return None class EmbeddedDocumentField(BaseField): """An embedded document field. Only valid values are subclasses of From ca8c3981c4f1fcf35a83e29395647366ffff6283 Mon Sep 17 00:00:00 2001 From: sshwsfc Date: Thu, 18 Nov 2010 22:35:11 -0800 Subject: [PATCH 2/2] --- mongoengine/fields.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mongoengine/fields.py b/mongoengine/fields.py index f658b107..7942e5eb 100644 --- a/mongoengine/fields.py +++ b/mongoengine/fields.py @@ -8,7 +8,7 @@ import pymongo import pymongo.dbref import pymongo.son import pymongo.binary -import datetime +import datetime, time import decimal import gridfs import warnings