Skip to content

Commit 1dbd814

Browse files
committed
RDBC-839 Test for custom find identity property
1 parent e580153 commit 1dbd814

File tree

2 files changed

+51
-3
lines changed

2 files changed

+51
-3
lines changed

ravendb/documents/conventions.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ def __init__(self):
6868

6969
# Utilities
7070
self.document_id_generator: Optional[Callable[[str, object], str]] = None
71-
self._get_identity_property_name: Callable[[Type[Any]], str] = lambda type_: "Id"
71+
self._find_identity_property_name: Callable[[Type[Any]], str] = lambda type_: "Id"
7272
self._id_property_name_cache: Dict[Type, str] = {}
7373
self._find_python_class: Optional[Callable[[str, Dict], str]] = None
7474
self._find_collection_name: Callable[[Type], str] = self.default_get_collection_name
@@ -225,6 +225,14 @@ def disable_atomic_document_writes_in_cluster_wide_transaction(self, value: bool
225225
self._assert_not_frozen()
226226
self._disable_atomic_document_writes_in_cluster_wide_transaction = value
227227

228+
@property
229+
def find_identity_property_name(self) -> Callable[[Type[Any]], str]:
230+
return self._find_identity_property_name
231+
232+
@find_identity_property_name.setter
233+
def find_identity_property_name(self, find_identity_property_name_function: Callable[[Type[Any]], str]):
234+
self._find_identity_property_name = find_identity_property_name_function
235+
228236
@staticmethod
229237
def json_default(o):
230238
if o is None:
@@ -376,7 +384,7 @@ def clone(self) -> DocumentConventions:
376384
cloned._save_enums_as_integers = self._save_enums_as_integers
377385
cloned.identity_parts_separator = self.identity_parts_separator
378386
cloned.disable_topology_updates = self.disable_topology_updates
379-
cloned._get_identity_property_name = self._get_identity_property_name
387+
cloned._find_identity_property_name = self._find_identity_property_name
380388

381389
cloned.document_id_generator = self.document_id_generator
382390

@@ -397,7 +405,7 @@ def get_identity_property_name(self, object_type: Type[Any]) -> Optional[str]:
397405
if object_type in self._id_property_name_cache:
398406
return self._id_property_name_cache[object_type]
399407

400-
id_property_name = self._get_identity_property_name(object_type)
408+
id_property_name = self.find_identity_property_name(object_type)
401409

402410
# Cache the result
403411
self._id_property_name_cache[object_type] = id_property_name
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
from typing import Type, Any
2+
3+
from ravendb import DocumentStore
4+
from ravendb.infrastructure.orders import Company
5+
from ravendb.tests.test_base import TestBase
6+
7+
8+
class TestConventions(TestBase):
9+
def setUp(self):
10+
super().setUp()
11+
12+
def test_custom_find_identity_property_name(self):
13+
store = DocumentStore(self.store.urls, self.store.database)
14+
15+
class MyUniqueCompany(Company):
16+
def __init__(self, name: str = None, Id: str = None):
17+
super().__init__(Id=Id, name=name)
18+
self.special_identity_field: str = "MySpecialCompanies/unique"
19+
20+
def _find_identity_property_name(object_type: Type[Any]) -> str:
21+
if object_type is MyUniqueCompany:
22+
return "special_identity_field"
23+
return "Id"
24+
25+
store.conventions.find_identity_property_name = _find_identity_property_name
26+
store.initialize()
27+
28+
with store.open_session() as session:
29+
session.store(MyUniqueCompany(name="Borpa Corp", Id="PerfectlyRelevantDocumentId/1"))
30+
session.store(Company(name="Poissoncorp", Id="companies/1"))
31+
session.save_changes()
32+
33+
with store.open_session() as session:
34+
non_existing_company = session.load("PerfectlyRelevantDocumentId/1", MyUniqueCompany)
35+
custom_id_field_company = session.load("MySpecialCompanies/unique", MyUniqueCompany)
36+
regular_company = session.load("companies/1", Company)
37+
38+
self.assertIsNone(non_existing_company)
39+
self.assertEqual("Borpa Corp", custom_id_field_company.name)
40+
self.assertEqual("Poissoncorp", regular_company.name)

0 commit comments

Comments
 (0)