Add new meta option to Document: allow_index_creation.
Defaults to True. If set to False then MongoEngine will not ensure indexes exist
This commit is contained in:
		| @@ -74,6 +74,11 @@ class Document(BaseDocument): | |||||||
|     names. Index direction may be specified by prefixing the field names with |     names. Index direction may be specified by prefixing the field names with | ||||||
|     a **+** or **-** sign. |     a **+** or **-** sign. | ||||||
|  |  | ||||||
|  |     Index creation can be disabled by specifying :attr:`index_allow_creation` in | ||||||
|  |     the :attr:`meta` dictionary. If this is set to True then indexes will not be | ||||||
|  |     created by MongoEngine. This is useful in production systems where index | ||||||
|  |     creation is performed as part of a deployment system. | ||||||
|  |  | ||||||
|     By default, _types will be added to the start of every index (that |     By default, _types will be added to the start of every index (that | ||||||
|     doesn't contain a list) if allow_inheritence is True. This can be |     doesn't contain a list) if allow_inheritence is True. This can be | ||||||
|     disabled by either setting types to False on the specific index or |     disabled by either setting types to False on the specific index or | ||||||
|   | |||||||
| @@ -481,21 +481,7 @@ class QuerySet(object): | |||||||
|         """Returns all documents.""" |         """Returns all documents.""" | ||||||
|         return self.__call__() |         return self.__call__() | ||||||
|  |  | ||||||
|     @property |     def _ensure_indexes_exist(self): | ||||||
|     def _collection(self): |  | ||||||
|         """Property that returns the collection object. This allows us to |  | ||||||
|         perform operations only if the collection is accessed. |  | ||||||
|         """ |  | ||||||
|         if self._document not in QuerySet.__already_indexed: |  | ||||||
|  |  | ||||||
|             # Ensure collection exists |  | ||||||
|             db = self._document._get_db() |  | ||||||
|             if self._collection_obj.name not in db.collection_names(): |  | ||||||
|                 self._document._collection = None |  | ||||||
|                 self._collection_obj = self._document._get_collection() |  | ||||||
|  |  | ||||||
|             QuerySet.__already_indexed.add(self._document) |  | ||||||
|  |  | ||||||
|         background = self._document._meta.get('index_background', False) |         background = self._document._meta.get('index_background', False) | ||||||
|         drop_dups = self._document._meta.get('index_drop_dups', False) |         drop_dups = self._document._meta.get('index_drop_dups', False) | ||||||
|         index_opts = self._document._meta.get('index_options', {}) |         index_opts = self._document._meta.get('index_options', {}) | ||||||
| @@ -543,6 +529,23 @@ class QuerySet(object): | |||||||
|             self._collection.ensure_index(index_spec, |             self._collection.ensure_index(index_spec, | ||||||
|                 background=background, **index_opts) |                 background=background, **index_opts) | ||||||
|  |  | ||||||
|  |     @property | ||||||
|  |     def _collection(self): | ||||||
|  |         """Property that returns the collection object. This allows us to | ||||||
|  |         perform operations only if the collection is accessed. | ||||||
|  |         """ | ||||||
|  |         if self._document not in QuerySet.__already_indexed: | ||||||
|  |             # Ensure collection exists | ||||||
|  |             db = self._document._get_db() | ||||||
|  |             if self._collection_obj.name not in db.collection_names(): | ||||||
|  |                 self._document._collection = None | ||||||
|  |                 self._collection_obj = self._document._get_collection() | ||||||
|  |  | ||||||
|  |             QuerySet.__already_indexed.add(self._document) | ||||||
|  |  | ||||||
|  |             if self._document._meta.get('index_allow_creation', True): | ||||||
|  |                 self._ensure_indexes_exist() | ||||||
|  |  | ||||||
|         return self._collection_obj |         return self._collection_obj | ||||||
|  |  | ||||||
|     @property |     @property | ||||||
|   | |||||||
| @@ -740,6 +740,28 @@ class DocumentTest(unittest.TestCase): | |||||||
|         self.assertEqual(info.keys(), ['_types_1_user_guid_1', '_id_', '_types_1_name_1']) |         self.assertEqual(info.keys(), ['_types_1_user_guid_1', '_id_', '_types_1_name_1']) | ||||||
|         Person.drop_collection() |         Person.drop_collection() | ||||||
|  |  | ||||||
|  |     def test_disable_index_creation(self): | ||||||
|  |         """Tests setting allow_index_creation to False on the connection will | ||||||
|  |         disable any index generation. | ||||||
|  |         """ | ||||||
|  |         class User(Document): | ||||||
|  |             meta = { | ||||||
|  |                 'indexes': ['user_guid'], | ||||||
|  |                 'index_allow_creation': False | ||||||
|  |             } | ||||||
|  |             user_guid = StringField(required=True) | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         User.drop_collection() | ||||||
|  |  | ||||||
|  |         u = User(user_guid='123') | ||||||
|  |         u.save() | ||||||
|  |  | ||||||
|  |         self.assertEquals(1, User.objects.count()) | ||||||
|  |         info = User.objects._collection.index_information() | ||||||
|  |         self.assertEqual(info.keys(), ['_id_']) | ||||||
|  |         User.drop_collection() | ||||||
|  |  | ||||||
|     def test_embedded_document_index(self): |     def test_embedded_document_index(self): | ||||||
|         """Tests settings an index on an embedded document |         """Tests settings an index on an embedded document | ||||||
|         """ |         """ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user