Add flexibility for fields handling bad data (MongoEngine/mongoengine#78)

This commit is contained in:
Ross Lawley 2012-08-17 16:02:33 +01:00
parent 22010d7d95
commit 90fa0f6c4a
3 changed files with 39 additions and 11 deletions

View File

@ -4,6 +4,7 @@ Changelog
Changes in 0.7.X Changes in 0.7.X
================= =================
- Add flexibility for fields handling bad data (MongoEngine/mongoengine#78)
- Embedded Documents no longer handle meta definitions - Embedded Documents no longer handle meta definitions
- Use weakref proxies in base lists / dicts (MongoEngine/mongoengine#74) - Use weakref proxies in base lists / dicts (MongoEngine/mongoengine#74)
- Improved queryset filtering (hmarr/mongoengine#554) - Improved queryset filtering (hmarr/mongoengine#554)

View File

@ -207,7 +207,6 @@ class Document(BaseDocument):
else: else:
object_id = doc['_id'] object_id = doc['_id']
updates, removals = self._delta() updates, removals = self._delta()
# Need to add shard key to query, or you get an error # Need to add shard key to query, or you get an error
select_dict = {'_id': object_id} select_dict = {'_id': object_id}
shard_key = self.__class__._meta.get('shard_key', tuple()) shard_key = self.__class__._meta.get('shard_key', tuple())

View File

@ -49,8 +49,11 @@ class StringField(BaseField):
def to_python(self, value): def to_python(self, value):
if isinstance(value, unicode): if isinstance(value, unicode):
return value return value
else: try:
return value.decode('utf-8') value = value.decode('utf-8')
except:
pass
return value
def validate(self, value): def validate(self, value):
if not isinstance(value, basestring): if not isinstance(value, basestring):
@ -150,7 +153,11 @@ class IntField(BaseField):
super(IntField, self).__init__(**kwargs) super(IntField, self).__init__(**kwargs)
def to_python(self, value): def to_python(self, value):
return int(value) try:
value = int(value)
except ValueError:
pass
return value
def validate(self, value): def validate(self, value):
try: try:
@ -180,7 +187,11 @@ class FloatField(BaseField):
super(FloatField, self).__init__(**kwargs) super(FloatField, self).__init__(**kwargs)
def to_python(self, value): def to_python(self, value):
return float(value) try:
value = float(value)
except ValueError:
pass
return value
def validate(self, value): def validate(self, value):
if isinstance(value, int): if isinstance(value, int):
@ -212,9 +223,14 @@ class DecimalField(BaseField):
super(DecimalField, self).__init__(**kwargs) super(DecimalField, self).__init__(**kwargs)
def to_python(self, value): def to_python(self, value):
original_value = value
if not isinstance(value, basestring): if not isinstance(value, basestring):
value = unicode(value) value = unicode(value)
return decimal.Decimal(value) try:
value = decimal.Decimal(value)
except ValueError:
return original_value
return value
def to_mongo(self, value): def to_mongo(self, value):
return unicode(value) return unicode(value)
@ -242,7 +258,11 @@ class BooleanField(BaseField):
""" """
def to_python(self, value): def to_python(self, value):
return bool(value) try:
value = bool(value)
except ValueError:
pass
return value
def validate(self, value): def validate(self, value):
if not isinstance(value, bool): if not isinstance(value, bool):
@ -385,7 +405,11 @@ class ComplexDateTimeField(StringField):
'ComplexDateTimeField') 'ComplexDateTimeField')
def to_python(self, value): def to_python(self, value):
return self._convert_from_string(value) original_value = value
try:
return self._convert_from_string(value)
except:
return original_value
def to_mongo(self, value): def to_mongo(self, value):
return self._convert_from_datetime(value) return self._convert_from_datetime(value)
@ -1340,9 +1364,13 @@ class UUIDField(BaseField):
def to_python(self, value): def to_python(self, value):
if not self._binary: if not self._binary:
if not isinstance(value, basestring): original_value = value
value = unicode(value) try:
return uuid.UUID(value) if not isinstance(value, basestring):
value = unicode(value)
return uuid.UUID(value)
except:
return original_value
return value return value
def to_mongo(self, value): def to_mongo(self, value):