Compare commits

..

4 Commits
v0.5 ... v0.5.1

Author SHA1 Message Date
Ross Lawley
591149b1f0 Bumped version for 0.5.1 release 2011-10-08 07:31:24 -07:00
Ross Lawley
9a0a0b1bd4 Ported bugfix for circular references regression
Refs #294
2011-10-08 07:29:12 -07:00
Ross Lawley
89c44cd14e Added missing fields to the api documentation 2011-09-11 08:09:16 +01:00
Ross Lawley
8105bfd8b3 Updated changelog for 0.5 release 2011-09-10 13:00:34 +01:00
6 changed files with 85 additions and 32 deletions

View File

@@ -15,12 +15,12 @@ Documents
.. attribute:: objects .. attribute:: objects
A :class:`~mongoengine.queryset.QuerySet` object that is created lazily A :class:`~mongoengine.queryset.QuerySet` object that is created lazily
on access. on access.
.. autoclass:: mongoengine.EmbeddedDocument .. autoclass:: mongoengine.EmbeddedDocument
:members: :members:
.. autoclass:: mongoengine.document.MapReduceDocument .. autoclass:: mongoengine.document.MapReduceDocument
:members: :members:
@@ -31,46 +31,31 @@ Querying
:members: :members:
.. automethod:: mongoengine.queryset.QuerySet.__call__ .. automethod:: mongoengine.queryset.QuerySet.__call__
.. autofunction:: mongoengine.queryset.queryset_manager .. autofunction:: mongoengine.queryset.queryset_manager
Fields Fields
====== ======
.. autoclass:: mongoengine.StringField .. autoclass:: mongoengine.StringField
.. autoclass:: mongoengine.URLField .. autoclass:: mongoengine.URLField
.. autoclass:: mongoengine.EmailField .. autoclass:: mongoengine.EmailField
.. autoclass:: mongoengine.IntField .. autoclass:: mongoengine.IntField
.. autoclass:: mongoengine.FloatField .. autoclass:: mongoengine.FloatField
.. autoclass:: mongoengine.DecimalField .. autoclass:: mongoengine.DecimalField
.. autoclass:: mongoengine.BooleanField
.. autoclass:: mongoengine.DateTimeField .. autoclass:: mongoengine.DateTimeField
.. autoclass:: mongoengine.ComplexDateTimeField .. autoclass:: mongoengine.ComplexDateTimeField
.. autoclass:: mongoengine.EmbeddedDocumentField
.. autoclass:: mongoengine.DictField
.. autoclass:: mongoengine.ListField .. autoclass:: mongoengine.ListField
.. autoclass:: mongoengine.SortedListField .. autoclass:: mongoengine.SortedListField
.. autoclass:: mongoengine.DictField
.. autoclass:: mongoengine.BinaryField .. autoclass:: mongoengine.MapField
.. autoclass:: mongoengine.ObjectIdField .. autoclass:: mongoengine.ObjectIdField
.. autoclass:: mongoengine.ReferenceField .. autoclass:: mongoengine.ReferenceField
.. autoclass:: mongoengine.GenericReferenceField .. autoclass:: mongoengine.GenericReferenceField
.. autoclass:: mongoengine.EmbeddedDocumentField
.. autoclass:: mongoengine.GenericEmbeddedDocumentField
.. autoclass:: mongoengine.BooleanField
.. autoclass:: mongoengine.FileField .. autoclass:: mongoengine.FileField
.. autoclass:: mongoengine.BinaryField
.. autoclass:: mongoengine.GeoPointField .. autoclass:: mongoengine.GeoPointField
.. autoclass:: mongoengine.SequenceField

View File

@@ -2,8 +2,13 @@
Changelog Changelog
========= =========
Changes in dev Changes in v0.5.1
============== =================
- Circular reference bugfix
Changes in v0.5
===============
- Added InvalidDocumentError - so Document core methods can't be overwritten - Added InvalidDocumentError - so Document core methods can't be overwritten
- Added GenericEmbeddedDocument - so you can embed any type of embeddable document - Added GenericEmbeddedDocument - so you can embed any type of embeddable document

View File

@@ -14,7 +14,7 @@ __all__ = (document.__all__ + fields.__all__ + connection.__all__ +
__author__ = 'Harry Marr' __author__ = 'Harry Marr'
VERSION = (0, 5, 0) VERSION = (0, 5, 1)
def get_version(): def get_version():

View File

@@ -33,13 +33,15 @@ class DeReference(object):
items = [i for i in items] items = [i for i in items]
self.max_depth = max_depth self.max_depth = max_depth
doc_type = None doc_type = None
if instance and instance._fields: if instance and instance._fields:
doc_type = instance._fields[name].field doc_type = instance._fields[name].field
if isinstance(doc_type, ReferenceField): if isinstance(doc_type, ReferenceField):
doc_type = doc_type.document_type doc_type = doc_type.document_type
if all([i.__class__ == doc_type for i in items]):
return items
self.reference_map = self._find_references(items) self.reference_map = self._find_references(items)
self.object_map = self._fetch_objects(doc_type=doc_type) self.object_map = self._fetch_objects(doc_type=doc_type)

View File

@@ -920,9 +920,11 @@ class GeoPointField(BaseField):
class SequenceField(IntField): class SequenceField(IntField):
"""Provides a sequental counter. """Provides a sequental counter (see http://www.mongodb.org/display/DOCS/Object+IDs#ObjectIDs-SequenceNumbers)
..note:: Although traditional databases often use increasing sequence .. note::
Although traditional databases often use increasing sequence
numbers for primary keys. In MongoDB, the preferred approach is to numbers for primary keys. In MongoDB, the preferred approach is to
use Object IDs instead. The concept is that in a very large use Object IDs instead. The concept is that in a very large
cluster of machines, it is easier to create an object ID than have cluster of machines, it is easier to create an object ID than have

View File

@@ -129,6 +129,65 @@ class FieldTest(unittest.TestCase):
self.assertEquals(employee.friends, friends) self.assertEquals(employee.friends, friends)
self.assertEqual(q, 2) self.assertEqual(q, 2)
def test_circular_reference(self):
"""Ensure you can handle circular references
"""
class Person(Document):
name = StringField()
relations = ListField(EmbeddedDocumentField('Relation'))
def __repr__(self):
return "<Person: %s>" % self.name
class Relation(EmbeddedDocument):
name = StringField()
person = ReferenceField('Person')
Person.drop_collection()
mother = Person(name="Mother")
daughter = Person(name="Daughter")
mother.save()
daughter.save()
daughter_rel = Relation(name="Daughter", person=daughter)
mother.relations.append(daughter_rel)
mother.save()
mother_rel = Relation(name="Daughter", person=mother)
self_rel = Relation(name="Self", person=daughter)
daughter.relations.append(mother_rel)
daughter.relations.append(self_rel)
daughter.save()
self.assertEquals("[<Person: Mother>, <Person: Daughter>]", "%s" % Person.objects())
def test_circular_reference_on_self(self):
"""Ensure you can handle circular references
"""
class Person(Document):
name = StringField()
relations = ListField(ReferenceField('self'))
def __repr__(self):
return "<Person: %s>" % self.name
Person.drop_collection()
mother = Person(name="Mother")
daughter = Person(name="Daughter")
mother.save()
daughter.save()
mother.relations.append(daughter)
mother.save()
daughter.relations.append(mother)
daughter.relations.append(daughter)
daughter.save()
self.assertEquals("[<Person: Mother>, <Person: Daughter>]", "%s" % Person.objects())
def test_generic_reference(self): def test_generic_reference(self):
class UserA(Document): class UserA(Document):