Merge pull request #1026 from MRigal/fix/497-sequence-field-with-abstract-classes
SequenceField for abstract classes now have a proper name
This commit is contained in:
commit
2062fe7a08
@ -672,7 +672,7 @@ class BaseDocument(object):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def _get_collection_name(cls):
|
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)
|
return cls._meta.get('collection', None)
|
||||||
|
|
||||||
|
@ -424,7 +424,6 @@ class TopLevelDocumentMetaclass(DocumentMetaclass):
|
|||||||
return id_name, id_db_name
|
return id_name, id_db_name
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class MetaDict(dict):
|
class MetaDict(dict):
|
||||||
|
|
||||||
"""Custom dictionary for meta classes.
|
"""Custom dictionary for meta classes.
|
||||||
|
@ -145,7 +145,7 @@ class Document(BaseDocument):
|
|||||||
my_metaclass = TopLevelDocumentMetaclass
|
my_metaclass = TopLevelDocumentMetaclass
|
||||||
__metaclass__ = TopLevelDocumentMetaclass
|
__metaclass__ = TopLevelDocumentMetaclass
|
||||||
|
|
||||||
__slots__ = ('__objects')
|
__slots__ = ('__objects',)
|
||||||
|
|
||||||
def pk():
|
def pk():
|
||||||
"""Primary key alias
|
"""Primary key alias
|
||||||
@ -174,10 +174,10 @@ class Document(BaseDocument):
|
|||||||
db = cls._get_db()
|
db = cls._get_db()
|
||||||
collection_name = cls._get_collection_name()
|
collection_name = cls._get_collection_name()
|
||||||
# Create collection as a capped collection if specified
|
# 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
|
# Get max document limit and max byte size from meta
|
||||||
max_size = cls._meta['max_size'] or 10000000 # 10MB default
|
max_size = cls._meta.get('max_size') or 10000000 # 10MB default
|
||||||
max_documents = cls._meta['max_documents']
|
max_documents = cls._meta.get('max_documents')
|
||||||
|
|
||||||
if collection_name in db.collection_names():
|
if collection_name in db.collection_names():
|
||||||
cls._collection = db[collection_name]
|
cls._collection = db[collection_name]
|
||||||
|
@ -1694,7 +1694,7 @@ class SequenceField(BaseField):
|
|||||||
self.sequence_name = sequence_name
|
self.sequence_name = sequence_name
|
||||||
self.value_decorator = (callable(value_decorator) and
|
self.value_decorator = (callable(value_decorator) and
|
||||||
value_decorator or self.VALUE_DECORATOR)
|
value_decorator or self.VALUE_DECORATOR)
|
||||||
return super(SequenceField, self).__init__(*args, **kwargs)
|
super(SequenceField, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
"""
|
"""
|
||||||
@ -1740,7 +1740,7 @@ class SequenceField(BaseField):
|
|||||||
if self.sequence_name:
|
if self.sequence_name:
|
||||||
return self.sequence_name
|
return self.sequence_name
|
||||||
owner = self.owner_document
|
owner = self.owner_document
|
||||||
if issubclass(owner, Document):
|
if issubclass(owner, Document) and not owner._meta.get('abstract'):
|
||||||
return owner._get_collection_name()
|
return owner._get_collection_name()
|
||||||
else:
|
else:
|
||||||
return ''.join('_%s' % c if c.isupper() else c
|
return ''.join('_%s' % c if c.isupper() else c
|
||||||
|
@ -39,6 +39,7 @@ class FieldTest(unittest.TestCase):
|
|||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
self.db.drop_collection('fs.files')
|
self.db.drop_collection('fs.files')
|
||||||
self.db.drop_collection('fs.chunks')
|
self.db.drop_collection('fs.chunks')
|
||||||
|
self.db.drop_collection('mongoengine.counters')
|
||||||
|
|
||||||
def test_default_values_nothing_set(self):
|
def test_default_values_nothing_set(self):
|
||||||
"""Ensure that default field values are used when creating a document.
|
"""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(1, post.comments[0].id)
|
||||||
self.assertEqual(2, post.comments[1].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):
|
def test_generic_embedded_document(self):
|
||||||
class Car(EmbeddedDocument):
|
class Car(EmbeddedDocument):
|
||||||
name = StringField()
|
name = StringField()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user