Got EmbeddedDocumentFields working
Added validation on EmbeddedDocumentField, added tests for EmbeddedDocumentFields.
This commit is contained in:
		@@ -1,8 +1,9 @@
 | 
			
		||||
from document import Document
 | 
			
		||||
import document
 | 
			
		||||
from document import *
 | 
			
		||||
import fields
 | 
			
		||||
from fields import *
 | 
			
		||||
 | 
			
		||||
__all__ = fields.__all__  + ['Document']
 | 
			
		||||
__all__ = document.__all__ + fields.__all__
 | 
			
		||||
 | 
			
		||||
__author__ = 'Harry Marr'
 | 
			
		||||
__version__ = '0.1'
 | 
			
		||||
 
 | 
			
		||||
@@ -161,3 +161,8 @@ class BaseDocument(object):
 | 
			
		||||
        if name not in self._fields:
 | 
			
		||||
            raise KeyError(name)
 | 
			
		||||
        return setattr(self, name, value)
 | 
			
		||||
 | 
			
		||||
    def _to_mongo(self):
 | 
			
		||||
        """Return data dictionary ready for use with MongoDB.
 | 
			
		||||
        """
 | 
			
		||||
        return dict((k, v) for k, v in self._data.items() if v is not None)
 | 
			
		||||
 
 | 
			
		||||
@@ -2,6 +2,10 @@ from base import DocumentMetaclass, TopLevelDocumentMetaclass, BaseDocument
 | 
			
		||||
 | 
			
		||||
#import pymongo
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
__all__ = ['Document', 'EmbeddedDocument']
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class EmbeddedDocument(BaseDocument):
 | 
			
		||||
    
 | 
			
		||||
    __metaclass__ = DocumentMetaclass
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,8 @@ from document import EmbeddedDocument
 | 
			
		||||
import re
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
__all__ = ['StringField', 'IntField', 'ValidationError']
 | 
			
		||||
__all__ = ['StringField', 'IntField', 'EmbeddedDocumentField', 
 | 
			
		||||
           'ValidationError']
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class StringField(BaseField):
 | 
			
		||||
@@ -52,7 +53,15 @@ class EmbeddedDocumentField(BaseField):
 | 
			
		||||
 | 
			
		||||
    def __init__(self, document, **kwargs):
 | 
			
		||||
        if not issubclass(document, EmbeddedDocument):
 | 
			
		||||
            raise ValidationError('Invalid embedded document provided to an '
 | 
			
		||||
                                  'EmbeddedDocumentField')
 | 
			
		||||
            raise ValidationError('Invalid embedded document class provided '
 | 
			
		||||
                                  'to an EmbeddedDocumentField')
 | 
			
		||||
        self.document = document
 | 
			
		||||
        super(EmbeddedDocumentField, self).__init__(**kwargs)
 | 
			
		||||
    
 | 
			
		||||
    def _to_python(self, value):
 | 
			
		||||
        return value
 | 
			
		||||
 | 
			
		||||
    def _validate(self, value):
 | 
			
		||||
        if not isinstance(value, self.document):
 | 
			
		||||
            raise ValidationError('Invalid embedded document instance '
 | 
			
		||||
                                  'provided to an EmbeddedDocumentField')
 | 
			
		||||
 
 | 
			
		||||
@@ -65,6 +65,28 @@ class FieldTest(unittest.TestCase):
 | 
			
		||||
        self.assertRaises(ValidationError, person.__setattr__, 'age', 120)
 | 
			
		||||
        self.assertRaises(ValidationError, person.__setattr__, 'age', 'ten')
 | 
			
		||||
 | 
			
		||||
    def test_embedded_document_validation(self):
 | 
			
		||||
        """Ensure that invalid embedded documents cannot be assigned to
 | 
			
		||||
        embedded document fields.
 | 
			
		||||
        """
 | 
			
		||||
        class Comment(EmbeddedDocument):
 | 
			
		||||
            content = StringField()
 | 
			
		||||
 | 
			
		||||
        class PersonPreferences(EmbeddedDocument):
 | 
			
		||||
            food = StringField()
 | 
			
		||||
            number = IntField()
 | 
			
		||||
 | 
			
		||||
        class Person(Document):
 | 
			
		||||
            name = StringField()
 | 
			
		||||
            preferences = EmbeddedDocumentField(PersonPreferences)
 | 
			
		||||
 | 
			
		||||
        person = Person(name='Test User')
 | 
			
		||||
        self.assertRaises(ValidationError, person.__setattr__, 'preferences', 
 | 
			
		||||
                          'My preferences')
 | 
			
		||||
        self.assertRaises(ValidationError, person.__setattr__, 'preferences', 
 | 
			
		||||
                          Comment(content='Nice blog post...'))
 | 
			
		||||
        person.preferences = PersonPreferences(food='Cheese', number=47)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    unittest.main()
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user