Skip to content

Commit 1293f45

Browse files
Masterchen09phanak-sap
authored andcommitted
service: fix navigation in EntityProxy
1 parent c5510d0 commit 1293f45

File tree

2 files changed

+72
-1
lines changed

2 files changed

+72
-1
lines changed

pyodata/v2/service.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -878,14 +878,40 @@ def nav(self, nav_property):
878878
navigation_entity_set = self._service.schema.entity_set(end.entity_set_name)
879879

880880
if navigation_property.to_role.multiplicity != model.EndRole.MULTIPLICITY_ZERO_OR_MORE:
881-
return NavEntityProxy(self, nav_property, navigation_entity_set.entity_type, {})
881+
return self._get_nav_entity(nav_property, navigation_entity_set)
882882

883883
return EntitySetProxy(
884884
self._service,
885885
self._service.schema.entity_set(navigation_entity_set.name),
886886
nav_property,
887887
self._entity_set.name + self._entity_key.to_key_string())
888888

889+
def _get_nav_entity(self, nav_property, navigation_entity_set):
890+
"""Get entity based on Navigation property name"""
891+
892+
def get_entity_handler(parent, nav_property, navigation_entity_set, response):
893+
"""Gets entity from HTTP response"""
894+
895+
if response.status_code != HTTP_CODE_OK:
896+
raise HttpError('HTTP GET for Entity {0} failed with status code {1}'
897+
.format(self._name, response.status_code), response)
898+
899+
entity = response.json()['d']
900+
901+
return NavEntityProxy(parent, nav_property, navigation_entity_set.entity_type, entity)
902+
903+
self._logger.info(
904+
'Getting the nav property %s of the entity %s for the key %s',
905+
nav_property,
906+
self._entity_set,
907+
self.entity_key)
908+
909+
return NavEntityGetRequest(
910+
partial(get_entity_handler, self, nav_property, navigation_entity_set),
911+
self.entity_key,
912+
getattr(self._service.entity_sets, self.entity_set.name),
913+
nav_property)
914+
889915
def get_path(self):
890916
"""Returns this entity's relative path - e.g. EntitySet(KEY)"""
891917

tests/test_service_v2.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1103,6 +1103,51 @@ def test_navigation_1on1(service):
11031103
assert idpic_proxy.Content == 'DEADBEAF'
11041104

11051105

1106+
@responses.activate
1107+
def test_navigation_1on1_from_entity_proxy(service):
1108+
"""Check getting entity via navigation property"""
1109+
1110+
# pylint: disable=redefined-outer-name
1111+
1112+
responses.add(
1113+
responses.GET,
1114+
f"{service.url}/Cars('Hadraplan')",
1115+
headers={'Content-type': 'application/json'},
1116+
json = { 'd': {
1117+
'Name': 'Hadraplan',
1118+
}
1119+
},
1120+
status=200)
1121+
1122+
responses.add(
1123+
responses.GET,
1124+
f"{service.url}/Cars('Hadraplan')/IDPic",
1125+
headers={'Content-type': 'application/json'},
1126+
json = { 'd': {
1127+
'CarName': 'Hadraplan',
1128+
'Content': 'DEADBEAF',
1129+
}
1130+
},
1131+
status=200)
1132+
1133+
request = service.entity_sets.Cars.get_entity('Hadraplan')
1134+
assert isinstance(request, pyodata.v2.service.EntityGetRequest)
1135+
1136+
car_proxy = request.execute()
1137+
assert isinstance(car_proxy, pyodata.v2.service.EntityProxy)
1138+
1139+
assert car_proxy.Name == 'Hadraplan'
1140+
1141+
idpic_proxy = car_proxy.nav('IDPic').execute()
1142+
assert isinstance(idpic_proxy, pyodata.v2.service.NavEntityProxy)
1143+
1144+
assert idpic_proxy.entity_set._name == 'Cars'
1145+
assert idpic_proxy._entity_type.name == 'CarIDPic'
1146+
1147+
assert idpic_proxy.CarName == 'Hadraplan'
1148+
assert idpic_proxy.Content == 'DEADBEAF'
1149+
1150+
11061151
@responses.activate
11071152
def test_navigation_1on1_get_value_without_proxy(service):
11081153
"""Check getting $value via navigation property"""

0 commit comments

Comments
 (0)