diff --git a/mongoengine/base.py b/mongoengine/base.py index 327c22118..8434121cc 100644 --- a/mongoengine/base.py +++ b/mongoengine/base.py @@ -297,6 +297,11 @@ def __new__(cls, name, bases, attrs): # DocumentMetaclass before instantiating CollectionManager object new_class = super_new(cls, name, bases, attrs) + # Allow dynamically-generated collection names. Pass the newly + # created class so the callee has access to __module__, etc. + if callable(meta['collection']): + new_class._meta['collection'] = meta['collection'](new_class) + # Provide a default queryset unless one has been manually provided if not hasattr(new_class, 'objects'): new_class.objects = QuerySetManager() diff --git a/tests/document.py b/tests/document.py index 7bfbc7fe0..c172111fb 100644 --- a/tests/document.py +++ b/tests/document.py @@ -61,6 +61,23 @@ class Person(Document): # Ensure Document isn't treated like an actual document self.assertFalse(hasattr(Document, '_fields')) + def test_dynamic_collection_naming(self): + + def create_collection_name(cls): + return "PERSON" + + class DynamicPerson(Document): + name = StringField() + age = IntField() + + meta = {'collection': create_collection_name} + + collection = DynamicPerson._get_collection_name() + self.assertEquals(collection, 'PERSON') + + DynamicPerson(name='Test User', age=30).save() + self.assertTrue(collection in self.db.collection_names()) + def test_get_superclasses(self): """Ensure that the correct list of superclasses is assembled. """