Skip to content

Commit 615bb81

Browse files
committed
RDBC-812 Adjustments and test for docs loaded as dicts
1 parent fb7aa30 commit 615bb81

File tree

3 files changed

+36
-5
lines changed

3 files changed

+36
-5
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: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,3 +80,29 @@ def test_preserve_id_field(self):
8080
company = session.load("companies/222", Company)
8181
self.assertEqual("companies/222", company.Id)
8282
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"])

0 commit comments

Comments
 (0)