diff --git a/sdk/cosmos/azure-cosmos/azure/cosmos/_cosmos_client_connection.py b/sdk/cosmos/azure-cosmos/azure/cosmos/_cosmos_client_connection.py index f9183e739762..fabe08cf9161 100644 --- a/sdk/cosmos/azure-cosmos/azure/cosmos/_cosmos_client_connection.py +++ b/sdk/cosmos/azure-cosmos/azure/cosmos/_cosmos_client_connection.py @@ -1072,7 +1072,7 @@ def CreateItem(self, database_or_container_link, document, options=None, **kwarg # not each time the function is called (like it is in say, Ruby). This means # that if you use a mutable default argument and mutate it, you will and have # mutated that object for all future calls to the function as well. So, using - # a non-mutable deafult in this case(None) and assigning an empty dict(mutable) + # a non-mutable default in this case(None) and assigning an empty dict(mutable) # inside the method For more details on this gotcha, please refer # http://docs.python-guide.org/en/latest/writing/gotchas/ if options is None: @@ -1080,12 +1080,13 @@ def CreateItem(self, database_or_container_link, document, options=None, **kwarg # We check the link to be document collection link since it can be database # link in case of client side partitioning - if base.IsItemContainerLink(database_or_container_link): - options = self._AddPartitionKey(database_or_container_link, document, options) - collection_id, document, path = self._GetContainerIdWithPathForItem( database_or_container_link, document, options ) + + if base.IsItemContainerLink(database_or_container_link): + options = self._AddPartitionKey(database_or_container_link, document, options) + return self.Create(document, path, "docs", collection_id, None, options, **kwargs) def UpsertItem(self, database_or_container_link, document, options=None, **kwargs): diff --git a/sdk/cosmos/azure-cosmos/azure/cosmos/container.py b/sdk/cosmos/azure-cosmos/azure/cosmos/container.py index 4211937d0dc2..7286b2b8d0b4 100644 --- a/sdk/cosmos/azure-cosmos/azure/cosmos/container.py +++ b/sdk/cosmos/azure-cosmos/azure/cosmos/container.py @@ -485,6 +485,7 @@ def create_item( :param pre_trigger_include: trigger id to be used as pre operation trigger. :param post_trigger_include: trigger id to be used as post operation trigger. :param indexing_directive: Indicate whether the document should be omitted from indexing. + :keyword bool enable_automatic_id_generation: Enable automatic id generation if no id present. :keyword str session_token: Token for use with Session consistency. :keyword dict[str,str] initial_headers: Initial headers to be sent as part of the request. :keyword str etag: An ETag value, or the wildcard character (*). Used to check if the resource @@ -498,7 +499,7 @@ def create_item( request_options = build_options(kwargs) response_hook = kwargs.pop('response_hook', None) - request_options["disableAutomaticIdGeneration"] = True + request_options["disableAutomaticIdGeneration"] = not kwargs.pop('enable_automatic_id_generation', False) if populate_query_metrics: request_options["populateQueryMetrics"] = populate_query_metrics if pre_trigger_include is not None: diff --git a/sdk/cosmos/azure-cosmos/test/test_crud.py b/sdk/cosmos/azure-cosmos/test/test_crud.py index ab9e89d9522b..e34a1784c83c 100644 --- a/sdk/cosmos/azure-cosmos/test/test_crud.py +++ b/sdk/cosmos/azure-cosmos/test/test_crud.py @@ -770,6 +770,15 @@ def test_document_crud(self): # create a document before_create_documents_count = len(documents) + # create a document with auto ID generation + document_definition = {'name': 'sample document', + 'spam': 'eggs', + 'key': 'value'} + + created_document = created_collection.create_item(body=document_definition, enable_automatic_id_generation=True) + self.assertEqual(created_document.get('name'), + document_definition['name']) + document_definition = {'name': 'sample document', 'spam': 'eggs', 'key': 'value', @@ -790,7 +799,7 @@ def test_document_crud(self): documents = list(created_collection.read_all_items()) self.assertEqual( len(documents), - before_create_documents_count + 1, + before_create_documents_count + 2, 'create should increase the number of documents') # query documents documents = list(created_collection.query_items( diff --git a/sdk/cosmos/azure-cosmos/test/test_ttl.py b/sdk/cosmos/azure-cosmos/test/test_ttl.py index 699cae76be56..c62267fc77ea 100644 --- a/sdk/cosmos/azure-cosmos/test/test_ttl.py +++ b/sdk/cosmos/azure-cosmos/test/test_ttl.py @@ -156,7 +156,7 @@ def test_document_ttl_with_positive_defaultTtl(self): time.sleep(5) - # the created document should NOT be gone as it's ttl value is set to -1(never expire) which overrides the collections's defaultTtl value + # the created document should NOT be gone as its ttl value is set to -1(never expire) which overrides the collection's defaultTtl value read_document = created_collection.read_item(item=document_definition['id'], partition_key=document_definition['id']) self.assertEqual(created_document['id'], read_document['id']) @@ -166,7 +166,7 @@ def test_document_ttl_with_positive_defaultTtl(self): time.sleep(4) - # the created document should be gone now as it's ttl value is set to 2 which overrides the collections's defaultTtl value(5) + # the created document should be gone now as its ttl value is set to 2 which overrides the collection's defaultTtl value(5) self.__AssertHTTPFailureWithStatus( StatusCodes.NOT_FOUND, created_collection.read_item, @@ -180,7 +180,7 @@ def test_document_ttl_with_positive_defaultTtl(self): time.sleep(6) - # the created document should NOT be gone as it's ttl value is set to 8 which overrides the collections's defaultTtl value(5) + # the created document should NOT be gone as its ttl value is set to 8 which overrides the collection's defaultTtl value(5) read_document = created_collection.read_item(item=created_document['id'], partition_key=created_document['id']) self.assertEqual(created_document['id'], read_document['id']) @@ -221,7 +221,7 @@ def test_document_ttl_with_negative_one_defaultTtl(self): time.sleep(4) - # the created document should be gone now as it's ttl value is set to 2 which overrides the collections's defaultTtl value(-1) + # the created document should be gone now as it's ttl value is set to 2 which overrides the collection's defaultTtl value(-1) self.__AssertHTTPFailureWithStatus( StatusCodes.NOT_FOUND, created_collection.read_item, @@ -294,7 +294,7 @@ def test_document_ttl_misc(self): time.sleep(7) - # Upserted document still exists after 10 secs from document creation time(with collection's defaultTtl set to 8) since it's ttl was reset after 3 secs by upserting it + # Upserted document still exists after 10 secs from document creation time(with collection's defaultTtl set to 8) since its ttl was reset after 3 secs by upserting it read_document = created_collection.read_item(item=upserted_docment['id'], partition_key=upserted_docment['id']) self.assertEqual(upserted_docment['id'], read_document['id'])