From 3b4df4615add363febff12c814529633ca0d70d4 Mon Sep 17 00:00:00 2001 From: Harry Marr Date: Sat, 17 Apr 2010 21:45:11 +0100 Subject: [PATCH] Fixed MRO error that occured on document inheritance --- mongoengine/base.py | 21 +++++++++++---------- tests/document.py | 5 +++++ 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/mongoengine/base.py b/mongoengine/base.py index bd3f11ad..83faa92e 100644 --- a/mongoengine/base.py +++ b/mongoengine/base.py @@ -187,19 +187,20 @@ class DocumentMetaclass(type): for field in new_class._fields.values(): field.owner_document = new_class - module = attrs.pop('__module__') + module = attrs.get('__module__') - new_class.add_to_class('DoesNotExist', subclass_exception('DoesNotExist', - tuple(x.DoesNotExist - for k,x in superclasses.items()) - or (DoesNotExist,), module)) + base_excs = tuple(base.DoesNotExist for base in bases + if hasattr(base, 'DoesNotExist')) or (DoesNotExist,) + exc = subclass_exception('DoesNotExist', base_excs, module) + new_class.add_to_class('DoesNotExist', exc) - new_class.add_to_class('MultipleObjectsReturned', subclass_exception('MultipleObjectsReturned', - tuple(x.MultipleObjectsReturned - for k,x in superclasses.items()) - or (MultipleObjectsReturned,), module)) - return new_class + base_excs = tuple(base.MultipleObjectsReturned for base in bases + if hasattr(base, 'MultipleObjectsReturned')) + base_excs = base_excs or (MultipleObjectsReturned,) + exc = subclass_exception('MultipleObjectsReturned', base_excs, module) + new_class.add_to_class('MultipleObjectsReturned', exc) + return new_class def add_to_class(self, name, value): setattr(self, name, value) diff --git a/tests/document.py b/tests/document.py index a17aebdc..a753fa71 100644 --- a/tests/document.py +++ b/tests/document.py @@ -127,6 +127,11 @@ class DocumentTest(unittest.TestCase): self.assertEqual(Employee._meta['collection'], self.Person._meta['collection']) + # Ensure that MRO error is not raised + class A(Document): pass + class B(A): pass + class C(B): pass + def test_allow_inheritance(self): """Ensure that inheritance may be disabled on simple classes and that _cls and _types will not be used.