diff --git a/docs/changelog.rst b/docs/changelog.rst index 070083e7..3a55bc84 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -4,6 +4,7 @@ Changelog Changes in 0.7.X ================= +- Add flexibility for fields handling bad data (MongoEngine/mongoengine#78) - Embedded Documents no longer handle meta definitions - Use weakref proxies in base lists / dicts (MongoEngine/mongoengine#74) - Improved queryset filtering (hmarr/mongoengine#554) diff --git a/mongoengine/document.py b/mongoengine/document.py index 23f3a23b..1b55e433 100644 --- a/mongoengine/document.py +++ b/mongoengine/document.py @@ -207,7 +207,6 @@ class Document(BaseDocument): else: object_id = doc['_id'] updates, removals = self._delta() - # Need to add shard key to query, or you get an error select_dict = {'_id': object_id} shard_key = self.__class__._meta.get('shard_key', tuple()) diff --git a/mongoengine/fields.py b/mongoengine/fields.py index 42025134..e6c65f55 100644 --- a/mongoengine/fields.py +++ b/mongoengine/fields.py @@ -49,8 +49,11 @@ class StringField(BaseField): def to_python(self, value): if isinstance(value, unicode): return value - else: - return value.decode('utf-8') + try: + value = value.decode('utf-8') + except: + pass + return value def validate(self, value): if not isinstance(value, basestring): @@ -150,7 +153,11 @@ class IntField(BaseField): super(IntField, self).__init__(**kwargs) def to_python(self, value): - return int(value) + try: + value = int(value) + except ValueError: + pass + return value def validate(self, value): try: @@ -180,7 +187,11 @@ class FloatField(BaseField): super(FloatField, self).__init__(**kwargs) def to_python(self, value): - return float(value) + try: + value = float(value) + except ValueError: + pass + return value def validate(self, value): if isinstance(value, int): @@ -212,9 +223,14 @@ class DecimalField(BaseField): super(DecimalField, self).__init__(**kwargs) def to_python(self, value): + original_value = value if not isinstance(value, basestring): value = unicode(value) - return decimal.Decimal(value) + try: + value = decimal.Decimal(value) + except ValueError: + return original_value + return value def to_mongo(self, value): return unicode(value) @@ -242,7 +258,11 @@ class BooleanField(BaseField): """ def to_python(self, value): - return bool(value) + try: + value = bool(value) + except ValueError: + pass + return value def validate(self, value): if not isinstance(value, bool): @@ -385,7 +405,11 @@ class ComplexDateTimeField(StringField): 'ComplexDateTimeField') 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): return self._convert_from_datetime(value) @@ -1340,9 +1364,13 @@ class UUIDField(BaseField): def to_python(self, value): if not self._binary: - if not isinstance(value, basestring): - value = unicode(value) - return uuid.UUID(value) + original_value = value + try: + if not isinstance(value, basestring): + value = unicode(value) + return uuid.UUID(value) + except: + return original_value return value def to_mongo(self, value):