From 3e2f035400b4923db7086f676a97d3cf953bd568 Mon Sep 17 00:00:00 2001 From: Ross Lawley Date: Wed, 7 Dec 2011 02:15:50 -0800 Subject: [PATCH] Abstract documents can now declare indexes fixes #380 --- docs/changelog.rst | 1 + mongoengine/base.py | 9 +++++++-- tests/document.py | 29 +++++++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 003a59fd..7c9055da 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -5,6 +5,7 @@ Changelog Changes in dev ============== +- Fixed Abstract documents can now declare indexes - Added db_alias support to individual documents - Fixed GridFS documents can now be pickled - Added Now raises an InvalidDocumentError when declaring multiple fields with the same db_field diff --git a/mongoengine/base.py b/mongoengine/base.py index 38e528f6..5a07bdf1 100644 --- a/mongoengine/base.py +++ b/mongoengine/base.py @@ -586,6 +586,7 @@ class TopLevelDocumentMetaclass(DocumentMetaclass): collection = ''.join('_%s' % c if c.isupper() else c for c in name).strip('_').lower() id_field = None + abstract_base_indexes = [] base_indexes = [] base_meta = {} @@ -605,7 +606,10 @@ class TopLevelDocumentMetaclass(DocumentMetaclass): base_meta[key] = base._meta[key] id_field = id_field or base._meta.get('id_field') - base_indexes += base._meta.get('indexes', []) + if base._meta.get('abstract', False): + abstract_base_indexes += base._meta.get('indexes', []) + else: + base_indexes += base._meta.get('indexes', []) # Propagate 'allow_inheritance' if 'allow_inheritance' in base._meta: base_meta['allow_inheritance'] = base._meta['allow_inheritance'] @@ -651,8 +655,9 @@ class TopLevelDocumentMetaclass(DocumentMetaclass): meta['queryset_class'] = manager.queryset_class new_class.objects = manager + indicies = meta['indexes'] + abstract_base_indexes user_indexes = [QuerySet._build_index_spec(new_class, spec) - for spec in meta['indexes']] + base_indexes + for spec in indicies] + base_indexes new_class._meta['indexes'] = user_indexes unique_indexes = cls._unique_with_indexes(new_class) diff --git a/tests/document.py b/tests/document.py index faedb424..021addce 100644 --- a/tests/document.py +++ b/tests/document.py @@ -664,6 +664,35 @@ class DocumentTest(unittest.TestCase): BlogPost.drop_collection() + def test_abstract_index_inheritance(self): + + class UserBase(Document): + meta = { + 'abstract': True, + 'indexes': ['user_guid'] + } + + user_guid = StringField(required=True) + + + class Person(UserBase): + meta = { + 'indexes': ['name'], + } + + name = StringField() + + Person.drop_collection() + + p = Person(name="test", user_guid='123') + p.save() + + self.assertEquals(1, Person.objects.count()) + info = Person.objects._collection.index_information() + self.assertEqual(info.keys(), ['_types_1_user_guid_1', '_id_', '_types_1_name_1']) + Person.drop_collection() + + def test_embedded_document_index(self): """Tests settings an index on an embedded document """