From 8e1d701c277467f774ac8fb3857811bace29d5f7 Mon Sep 17 00:00:00 2001 From: Ross Lawley Date: Thu, 30 Jun 2011 10:32:05 +0100 Subject: [PATCH] Fixed infinite recursion bug in _geo_indices() Fixes #213 Thanks to joshink for the bug report --- mongoengine/base.py | 9 +++++++-- tests/document.py | 12 ++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/mongoengine/base.py b/mongoengine/base.py index 8101aa00..b83164aa 100644 --- a/mongoengine/base.py +++ b/mongoengine/base.py @@ -754,11 +754,16 @@ class BaseDocument(object): return set_data, unset_data @classmethod - def _geo_indices(cls): + def _geo_indices(cls, inspected_classes=None): + inspected_classes = inspected_classes or [] geo_indices = [] + inspected_classes.append(cls) for field in cls._fields.values(): if hasattr(field, 'document_type'): - geo_indices += field.document_type._geo_indices() + field_cls = field.document_type + if field_cls in inspected_classes: + continue + geo_indices += field_cls._geo_indices(inspected_classes) elif field._geo_index: geo_indices.append(field) return geo_indices diff --git a/tests/document.py b/tests/document.py index 82488cf1..c1abd463 100644 --- a/tests/document.py +++ b/tests/document.py @@ -662,6 +662,18 @@ class DocumentTest(unittest.TestCase): BlogPost.drop_collection() + def test_geo_indexes_recursion(self): + + class User(Document): + channel = ReferenceField('Channel') + location = GeoPointField() + + class Channel(Document): + user = ReferenceField('User') + location = GeoPointField() + + self.assertEquals(len(User._geo_indices()), 2) + def test_hint(self): class BlogPost(Document):