From 3093175f544e9f976caada8d4dbe6dc2f99a0108 Mon Sep 17 00:00:00 2001 From: Matthieu Rigal Date: Fri, 12 Jun 2015 11:03:52 +0200 Subject: [PATCH] SequenceField for abstract classes now have a proper name --- mongoengine/base/document.py | 2 +- mongoengine/base/metaclasses.py | 1 - mongoengine/document.py | 8 ++--- mongoengine/fields.py | 4 +-- tests/fields/fields.py | 52 +++++++++++++++++++++++++++++++++ 5 files changed, 59 insertions(+), 8 deletions(-) diff --git a/mongoengine/base/document.py b/mongoengine/base/document.py index 9357fde2..1049eabd 100644 --- a/mongoengine/base/document.py +++ b/mongoengine/base/document.py @@ -672,7 +672,7 @@ class BaseDocument(object): @classmethod def _get_collection_name(cls): - """Returns the collection name for this class. + """Returns the collection name for this class. None for abstract class """ return cls._meta.get('collection', None) diff --git a/mongoengine/base/metaclasses.py b/mongoengine/base/metaclasses.py index 16e6bd29..d4c26bfe 100644 --- a/mongoengine/base/metaclasses.py +++ b/mongoengine/base/metaclasses.py @@ -424,7 +424,6 @@ class TopLevelDocumentMetaclass(DocumentMetaclass): return id_name, id_db_name - class MetaDict(dict): """Custom dictionary for meta classes. diff --git a/mongoengine/document.py b/mongoengine/document.py index 7b05ef8c..885f7eed 100644 --- a/mongoengine/document.py +++ b/mongoengine/document.py @@ -145,7 +145,7 @@ class Document(BaseDocument): my_metaclass = TopLevelDocumentMetaclass __metaclass__ = TopLevelDocumentMetaclass - __slots__ = ('__objects') + __slots__ = ('__objects',) def pk(): """Primary key alias @@ -174,10 +174,10 @@ class Document(BaseDocument): db = cls._get_db() collection_name = cls._get_collection_name() # Create collection as a capped collection if specified - if cls._meta['max_size'] or cls._meta['max_documents']: + if cls._meta.get('max_size') or cls._meta.get('max_documents'): # Get max document limit and max byte size from meta - max_size = cls._meta['max_size'] or 10000000 # 10MB default - max_documents = cls._meta['max_documents'] + max_size = cls._meta.get('max_size') or 10000000 # 10MB default + max_documents = cls._meta.get('max_documents') if collection_name in db.collection_names(): cls._collection = db[collection_name] diff --git a/mongoengine/fields.py b/mongoengine/fields.py index 9176828c..94f41d28 100644 --- a/mongoengine/fields.py +++ b/mongoengine/fields.py @@ -1694,7 +1694,7 @@ class SequenceField(BaseField): self.sequence_name = sequence_name self.value_decorator = (callable(value_decorator) and value_decorator or self.VALUE_DECORATOR) - return super(SequenceField, self).__init__(*args, **kwargs) + super(SequenceField, self).__init__(*args, **kwargs) def generate(self): """ @@ -1740,7 +1740,7 @@ class SequenceField(BaseField): if self.sequence_name: return self.sequence_name owner = self.owner_document - if issubclass(owner, Document): + if issubclass(owner, Document) and not owner._meta.get('abstract'): return owner._get_collection_name() else: return ''.join('_%s' % c if c.isupper() else c diff --git a/tests/fields/fields.py b/tests/fields/fields.py index fd083c73..9f9bf1dd 100644 --- a/tests/fields/fields.py +++ b/tests/fields/fields.py @@ -39,6 +39,7 @@ class FieldTest(unittest.TestCase): def tearDown(self): self.db.drop_collection('fs.files') self.db.drop_collection('fs.chunks') + self.db.drop_collection('mongoengine.counters') def test_default_values_nothing_set(self): """Ensure that default field values are used when creating a document. @@ -2954,6 +2955,57 @@ class FieldTest(unittest.TestCase): self.assertEqual(1, post.comments[0].id) self.assertEqual(2, post.comments[1].id) + def test_inherited_sequencefield(self): + class Base(Document): + name = StringField() + counter = SequenceField() + meta = {'abstract': True} + + class Foo(Base): + pass + + class Bar(Base): + pass + + bar = Bar(name='Bar') + bar.save() + + foo = Foo(name='Foo') + foo.save() + + self.assertTrue('base.counter' in + self.db['mongoengine.counters'].find().distinct('_id')) + self.assertFalse(('foo.counter' or 'bar.counter') in + self.db['mongoengine.counters'].find().distinct('_id')) + self.assertNotEqual(foo.counter, bar.counter) + self.assertEqual(foo._fields['counter'].owner_document, Base) + self.assertEqual(bar._fields['counter'].owner_document, Base) + + def test_no_inherited_sequencefield(self): + class Base(Document): + name = StringField() + meta = {'abstract': True} + + class Foo(Base): + counter = SequenceField() + + class Bar(Base): + counter = SequenceField() + + bar = Bar(name='Bar') + bar.save() + + foo = Foo(name='Foo') + foo.save() + + self.assertFalse('base.counter' in + self.db['mongoengine.counters'].find().distinct('_id')) + self.assertTrue(('foo.counter' and 'bar.counter') in + self.db['mongoengine.counters'].find().distinct('_id')) + self.assertEqual(foo.counter, bar.counter) + self.assertEqual(foo._fields['counter'].owner_document, Foo) + self.assertEqual(bar._fields['counter'].owner_document, Bar) + def test_generic_embedded_document(self): class Car(EmbeddedDocument): name = StringField()