commit
5edfeb2e29
@ -13,6 +13,7 @@ import pymongo.binary
|
|||||||
import datetime, time
|
import datetime, time
|
||||||
import decimal
|
import decimal
|
||||||
import gridfs
|
import gridfs
|
||||||
|
import uuid
|
||||||
|
|
||||||
|
|
||||||
__all__ = ['StringField', 'IntField', 'FloatField', 'BooleanField',
|
__all__ = ['StringField', 'IntField', 'FloatField', 'BooleanField',
|
||||||
@ -21,7 +22,7 @@ __all__ = ['StringField', 'IntField', 'FloatField', 'BooleanField',
|
|||||||
'DecimalField', 'ComplexDateTimeField', 'URLField',
|
'DecimalField', 'ComplexDateTimeField', 'URLField',
|
||||||
'GenericReferenceField', 'FileField', 'BinaryField',
|
'GenericReferenceField', 'FileField', 'BinaryField',
|
||||||
'SortedListField', 'EmailField', 'GeoPointField',
|
'SortedListField', 'EmailField', 'GeoPointField',
|
||||||
'SequenceField', 'GenericEmbeddedDocumentField']
|
'SequenceField', 'UUIDField', 'GenericEmbeddedDocumentField']
|
||||||
|
|
||||||
RECURSIVE_REFERENCE_CONSTANT = 'self'
|
RECURSIVE_REFERENCE_CONSTANT = 'self'
|
||||||
|
|
||||||
@ -984,3 +985,30 @@ class SequenceField(IntField):
|
|||||||
if value is None:
|
if value is None:
|
||||||
value = self.generate_new_value()
|
value = self.generate_new_value()
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
|
||||||
|
class UUIDField(BaseField):
|
||||||
|
"""A UUID field.
|
||||||
|
|
||||||
|
.. versionadded:: 0.6
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, **kwargs):
|
||||||
|
super(UUIDField, self).__init__(**kwargs)
|
||||||
|
|
||||||
|
def to_python(self, value):
|
||||||
|
if not isinstance(value, basestring):
|
||||||
|
value = unicode(value)
|
||||||
|
return uuid.UUID(value)
|
||||||
|
|
||||||
|
def to_mongo(self, value):
|
||||||
|
return unicode(value)
|
||||||
|
|
||||||
|
def validate(self, value):
|
||||||
|
if not isinstance(value, uuid.UUID):
|
||||||
|
if not isinstance(value, basestring):
|
||||||
|
value = str(value)
|
||||||
|
try:
|
||||||
|
value = uuid.UUID(value)
|
||||||
|
except Exception, exc:
|
||||||
|
raise ValidationError('Could not convert to UUID: %s' % exc)
|
||||||
|
@ -1,9 +1,7 @@
|
|||||||
import unittest
|
import unittest
|
||||||
import datetime
|
import datetime
|
||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
|
import uuid
|
||||||
import pymongo
|
|
||||||
import gridfs
|
|
||||||
|
|
||||||
from mongoengine import *
|
from mongoengine import *
|
||||||
from mongoengine.connection import _get_db
|
from mongoengine.connection import _get_db
|
||||||
@ -175,6 +173,26 @@ class FieldTest(unittest.TestCase):
|
|||||||
person.admin = 'Yes'
|
person.admin = 'Yes'
|
||||||
self.assertRaises(ValidationError, person.validate)
|
self.assertRaises(ValidationError, person.validate)
|
||||||
|
|
||||||
|
def test_uuid_validation(self):
|
||||||
|
"""Ensure that invalid values cannot be assigned to UUID fields.
|
||||||
|
"""
|
||||||
|
class Person(Document):
|
||||||
|
api_key = UUIDField()
|
||||||
|
|
||||||
|
person = Person()
|
||||||
|
# any uuid type is valid
|
||||||
|
person.api_key = uuid.uuid4()
|
||||||
|
person.validate()
|
||||||
|
person.api_key = uuid.uuid1()
|
||||||
|
person.validate()
|
||||||
|
|
||||||
|
# last g cannot belong to an hex number
|
||||||
|
person.api_key = '9d159858-549b-4975-9f98-dd2f987c113g'
|
||||||
|
self.assertRaises(ValidationError, person.validate)
|
||||||
|
# short strings don't validate
|
||||||
|
person.api_key = '9d159858-549b-4975-9f98-dd2f987c113'
|
||||||
|
self.assertRaises(ValidationError, person.validate)
|
||||||
|
|
||||||
def test_datetime_validation(self):
|
def test_datetime_validation(self):
|
||||||
"""Ensure that invalid values cannot be assigned to datetime fields.
|
"""Ensure that invalid values cannot be assigned to datetime fields.
|
||||||
"""
|
"""
|
||||||
|
Loading…
x
Reference in New Issue
Block a user