Skip to content

Commit a2f85f2

Browse files
authored
Merge pull request #211 from poissoncorp/RDBC-812
RDBC-812 Don't send 'Id' property to the server
2 parents fe2c056 + 615bb81 commit a2f85f2

File tree

7 files changed

+85
-10
lines changed

7 files changed

+85
-10
lines changed

ravendb/documents/identity/hilo.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ def try_set_identity(self, entity: object, key: str, is_projection: bool = False
4646
self.__try_set_identity_internal(entity, key, is_projection)
4747

4848
def __try_set_identity_internal(self, entity: Union[object, dict], key: str, is_projection: bool = False) -> None:
49-
identity_property = "Id" # todo: make sure it's ok, create get_identity_property...
49+
identity_property = "Id" # todo: get_identity_property...
5050

5151
if identity_property is None:
5252
return
@@ -55,7 +55,7 @@ def __try_set_identity_internal(self, entity: Union[object, dict], key: str, is_
5555
# identity property was already set
5656
return
5757

58-
if type(entity) == dict:
58+
if isinstance(entity, dict):
5959
entity[identity_property] = key
6060
return
6161
entity.__setattr__(identity_property, key)

ravendb/documents/session/entity_to_json.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def convert_entity_to_json(self, entity: object, document_info: DocumentInfo) ->
3838
self._session.before_conversion_to_document_invoke(
3939
BeforeConversionToDocumentEventArgs(document_info.key, entity, self._session)
4040
)
41-
document = EntityToJson._convert_entity_to_json_internal(self, entity, document_info)
41+
document = EntityToJson._convert_entity_to_json_internal(self, entity, document_info, True)
4242
if document_info is not None:
4343
self._session.after_conversion_to_document_invoke(
4444
AfterConversionToDocumentEventArgs(self._session, document_info.key, entity, document)
@@ -192,9 +192,10 @@ def convert_to_entity_static(
192192
BeforeConversionToEntityEventArgs(session_hook, key, object_type, document_deepcopy)
193193
)
194194

195-
# 1.1 Check if passed object type (or extracted from metadata) is a dictionary
196-
if object_type == dict or type_from_metadata == "builtins.dict":
195+
# 1.1 Check if passed object type (or extracted from metadata) is a dictionary and if document isn't a dict
196+
if object_type == dict or (object_type is None and type_from_metadata == "builtins.dict"):
197197
EntityToJson._invoke_after_conversion_to_entity_event(session_hook, key, object_type, document_deepcopy)
198+
# todo: document_deepcopy["Id"] = metadata.get("@id", None) - consider adding id property
198199
return document_deepcopy
199200

200201
# 1.2 If there's no object type in metadata
@@ -211,8 +212,12 @@ def convert_to_entity_static(
211212
# 2. There was a type in the metadata
212213
else:
213214
object_from_metadata = Utils.import_class(type_from_metadata)
215+
216+
# 2.0 Check if the user wants to cast dict to type
217+
if object_from_metadata == dict and object_type != dict:
218+
pass
214219
# 2.1 Import was successful
215-
if object_from_metadata is not None:
220+
elif object_from_metadata is not None:
216221
# 2.1.1 Set object_type to successfully imported type/ from metadata inherits from passed object_type
217222
if object_type is None or Utils.is_inherit(object_type, object_from_metadata):
218223
object_type = object_from_metadata

ravendb/tests/issue_tests/test_issue_198.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from ravendb.infrastructure.orders import Company
2+
from ravendb.primitives import constants
13
from ravendb.tests.test_base import TestBase
24

35

@@ -22,6 +24,28 @@ def test_create_document_with_server_generated_guid(self):
2224
with self.store.open_session() as session:
2325
product = session.load(guid_from_server)
2426
self.assertEqual("Test", product.name)
27+
metadata_id = session.advanced.get_metadata_for(product)["@id"]
28+
identity = session.advanced.get_document_id(product)
29+
id_prop = product.Id
30+
31+
self.assertEqual(id_prop, identity)
32+
self.assertEqual(id_prop, metadata_id)
33+
self.assertEqual(id_prop, guid_from_server)
34+
35+
with self.store.open_session() as session:
36+
product = session.load(guid_from_server)
37+
product.Id = ""
38+
session.save_changes()
39+
40+
with self.store.open_session() as session:
41+
product = session.load(guid_from_server)
42+
metadata_id1 = session.advanced.get_metadata_for(product)[constants.Documents.Metadata.ID]
43+
identity1 = session.advanced.get_document_id(product)
44+
id_prop1 = product.Id
45+
46+
self.assertEqual(id_prop, id_prop1)
47+
self.assertEqual(id_prop, metadata_id1)
48+
self.assertEqual(id_prop, identity1)
2549

2650
def test_can_create_multiple_documents_with_server_generated_guid(self):
2751
with self.store.open_session() as session:
@@ -45,3 +69,40 @@ def test_can_create_multiple_documents_with_server_generated_guid(self):
4569

4670
product3 = session.load(guid_from_server3)
4771
self.assertEqual("Test3", product3.name)
72+
73+
def test_preserve_id_field(self):
74+
with self.store.open_session() as session:
75+
company = Company(Id="companies/222", name="Apple Inc.")
76+
session.store(company)
77+
session.save_changes()
78+
79+
with self.store.open_session() as session:
80+
company = session.load("companies/222", Company)
81+
self.assertEqual("companies/222", company.Id)
82+
self.assertEqual("Apple Inc.", company.name)
83+
84+
def test_docs_loaded_as_dictionary_dont_have_id_entry_and_its_id_is_available_via_metadata(self):
85+
with self.store.open_session() as session:
86+
company = Company(Id="companies/1", name="A Inc.")
87+
company_dict = {"Id": "companies/dict", "name": "Dict Inc."}
88+
session.store(company)
89+
session.store(company_dict)
90+
session.save_changes()
91+
92+
with self.store.open_session() as session:
93+
company = session.load("companies/1", Company)
94+
company_dict = session.load("companies/dict", dict)
95+
96+
self.assertNotIn("Id", company_dict)
97+
self.assertEqual("companies/dict", session.advanced.get_document_id(company_dict))
98+
self.assertEqual("companies/dict", session.advanced.get_metadata_for(company_dict)["@id"])
99+
100+
self.assertEqual("companies/1", company.Id)
101+
self.assertEqual("companies/1", session.advanced.get_document_id(company))
102+
self.assertEqual("companies/1", session.advanced.get_metadata_for(company)["@id"])
103+
104+
with self.store.open_session() as session:
105+
company_dict_as_company_object = session.load("companies/dict", Company)
106+
self.assertEqual("companies/dict", company_dict_as_company_object.Id)
107+
self.assertEqual("companies/dict", session.advanced.get_document_id(company_dict_as_company_object))
108+
self.assertEqual("companies/dict", session.advanced.get_metadata_for(company_dict_as_company_object)["@id"])

ravendb/tests/jvm_migrated_tests/crud_tests/test_basic_document.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ def setUp(self):
1313
super(TestBasicDocument, self).setUp()
1414

1515
def test_get(self):
16-
dummy = {"name": None, "age": None, "Id": None}
16+
dummy = {"name": None, "age": None}
1717
with self.store.open_session() as session:
1818
user1 = User("jacus", None)
1919
user2 = User("arek", None)

ravendb/tests/jvm_migrated_tests/issues_tests/test_RDBC_387.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,5 @@ def test_should_store_single_id(self):
2525
self.assertIsNone(session_user.get("id", None))
2626
self.assertIsNone(bulk_insert_user.get("id", None))
2727

28-
self.assertIsNotNone(session_user.get("Id", None))
28+
self.assertIsNone(session_user.get("Id", None))
2929
self.assertIsNone(bulk_insert_user.get("Id", None))

ravendb/tests/jvm_migrated_tests/server_tests/patching/test_advanced_patching.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ def to_json(self) -> Dict[str, Any]:
4646
@classmethod
4747
def from_json(cls, json_dict: Dict[str, Any]) -> CustomType:
4848
return cls(
49-
json_dict["Id"],
49+
json_dict["Id"] if "Id" in json_dict else None,
5050
json_dict["owner"],
5151
json_dict["value"],
5252
json_dict["comments"],

ravendb/tools/utils.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -450,7 +450,16 @@ def fill_with_nested_object_types(entity: object, nested_object_types: Dict[str,
450450
@staticmethod
451451
def initialize_object(obj: dict, object_type: Type[_T], convert_to_snake_case: bool = None) -> _T:
452452
initialize_dict, set_needed = Utils.make_initialize_dict(obj, object_type.__init__, convert_to_snake_case)
453-
o = object_type(**initialize_dict)
453+
try:
454+
o = object_type(**initialize_dict)
455+
except Exception as e:
456+
if "Id" not in initialize_dict:
457+
initialize_dict["Id"] = None
458+
o = object_type(**initialize_dict)
459+
else:
460+
raise TypeError(
461+
f"Couldn't initialize object of type '{object_type.__name__}' using dict '{obj}'"
462+
) from e
454463
if set_needed:
455464
for key, value in obj.items():
456465
setattr(o, key, value)

0 commit comments

Comments
 (0)