From 6c3b983c5f37338d8d5093b9c5a62bce06211312 Mon Sep 17 00:00:00 2001 From: Danny Hermes Date: Thu, 23 Oct 2014 14:49:14 -0700 Subject: [PATCH] Only using 'id' OR 'name' from pb path in datastore.Entity.save. This was introduced in #289 and discovered while rebasing those changes into #281. The datastore backend fails if both 'id' and 'name' are set on a key, so this only copies the parts of the saved pb key that are actually set. --- gcloud/datastore/entity.py | 9 ++++++--- gcloud/datastore/test_entity.py | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/gcloud/datastore/entity.py b/gcloud/datastore/entity.py index a81adaf7fc6f..5c939493c9d6 100644 --- a/gcloud/datastore/entity.py +++ b/gcloud/datastore/entity.py @@ -222,9 +222,12 @@ def save(self): transaction.add_auto_id_entity(self) if isinstance(key_pb, datastore_pb.Key): - path = [ - {'kind': element.kind, 'id': element.id, 'name': element.name} - for element in key_pb.path_element] + path = [] + for element in key_pb.path_element: + key_part = {} + for descriptor, value in element._fields.items(): + key_part[descriptor.name] = value + path.append(key_part) # Update the path (which may have been altered). self._key = key.path(path) diff --git a/gcloud/datastore/test_entity.py b/gcloud/datastore/test_entity.py index d4c135086eb7..d53f32e6e7d0 100644 --- a/gcloud/datastore/test_entity.py +++ b/gcloud/datastore/test_entity.py @@ -182,7 +182,7 @@ def test_save_w_returned_key(self): self.assertEqual(entity['foo'], 'Foo') self.assertEqual(connection._saved, (_DATASET_ID, 'KEY', {'foo': 'Foo'})) - self.assertEqual(key._path, [{'kind': _KIND, 'id': _ID, 'name': ''}]) + self.assertEqual(key._path, [{'kind': _KIND, 'id': _ID}]) def test_delete_no_key(self): from gcloud.datastore.entity import NoKey