Skip to content

Commit 68a63dd

Browse files
abjonnesp2
authored andcommitted
Fix relative reference resolution within bundles (#53)
1 parent 4455e0b commit 68a63dd

File tree

6 files changed

+38
-24
lines changed

6 files changed

+38
-24
lines changed

fhir-parser-resources/fhirabstractresource.py

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,20 @@ def relativePath(self):
5858
# MARK: - Server Connection
5959

6060
@property
61-
def server(self):
61+
def origin_server(self):
6262
""" Walks the owner hierarchy until it finds an owner with a server.
6363
"""
64-
if self._server is None:
65-
owningRes = self.owningResource()
66-
self._server = owningRes.server if owningRes is not None else None
67-
return self._server
64+
server = self._server
65+
owner = self._owner
66+
while server is None and owner is not None:
67+
server = getattr(owner, '_server', None)
68+
owner = owner._owner
69+
return server
70+
71+
@origin_server.setter
72+
def origin_server(self, server):
73+
""" Sets the server on an element. """
74+
self._server = server
6875

6976
@classmethod
7077
def read(cls, rem_id, server):
@@ -101,7 +108,7 @@ def read_from(cls, path, server):
101108

102109
ret = server.request_json(path)
103110
instance = cls(jsondict=ret)
104-
instance._server = server
111+
instance.origin_server = server
105112
return instance
106113

107114
def create(self, server):
@@ -111,7 +118,7 @@ def create(self, server):
111118
:param FHIRServer server: The server to create the receiver on
112119
:returns: None or the response JSON on success
113120
"""
114-
srv = server or self.server
121+
srv = server or self.origin_server
115122
if srv is None:
116123
raise Exception("Cannot create a resource without a server")
117124
if self.id:
@@ -130,7 +137,7 @@ def update(self, server=None):
130137
optional, will use the instance's `server` if needed.
131138
:returns: None or the response JSON on success
132139
"""
133-
srv = server or self.server
140+
srv = server or self.origin_server
134141
if srv is None:
135142
raise Exception("Cannot update a resource that does not have a server")
136143
if not self.id:
@@ -148,7 +155,7 @@ def delete(self, server=None):
148155
optional, will use the instance's `server` if needed.
149156
:returns: None or the response JSON on success
150157
"""
151-
srv = server or self.server
158+
srv = server or self.origin_server
152159
if srv is None:
153160
raise Exception("Cannot delete a resource that does not have a server")
154161
if not self.id:

fhir-parser-resources/fhirreference.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ def resolved(self, klass):
5757
if bundle.entry is not None:
5858
fullUrl = self.reference
5959
if ref_is_relative:
60-
base = bundle.server.base_uri if bundle.server else ''
60+
base = bundle.origin_server.base_uri if bundle.origin_server else ''
6161
fullUrl = base + self.reference
6262

6363
for entry in bundle.entry:
@@ -72,7 +72,7 @@ def resolved(self, klass):
7272
# relative references, use the same server
7373
server = None
7474
if ref_is_relative:
75-
server = owning_resource.server if owning_resource else None
75+
server = owning_resource.origin_server if owning_resource else None
7676

7777
# TODO: instantiate server for absolute resource
7878
if server is None:

fhir-parser-resources/fhirsearch.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ def perform(self, server):
6363
from . import bundle
6464
res = server.request_json(self.construct())
6565
bundle = bundle.Bundle(res)
66-
bundle._server = server
66+
bundle.origin_server = server
6767
return bundle
6868

6969
def perform_resources(self, server):

fhirclient/models/fhirabstractresource.py

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,20 @@ def relativePath(self):
5858
# MARK: - Server Connection
5959

6060
@property
61-
def server(self):
61+
def origin_server(self):
6262
""" Walks the owner hierarchy until it finds an owner with a server.
6363
"""
64-
if self._server is None:
65-
owningRes = self.owningResource()
66-
self._server = owningRes.server if owningRes is not None else None
67-
return self._server
64+
server = self._server
65+
owner = self._owner
66+
while server is None and owner is not None:
67+
server = getattr(owner, '_server', None)
68+
owner = owner._owner
69+
return server
70+
71+
@origin_server.setter
72+
def origin_server(self, server):
73+
""" Sets the server on an element. """
74+
self._server = server
6875

6976
@classmethod
7077
def read(cls, rem_id, server):
@@ -101,7 +108,7 @@ def read_from(cls, path, server):
101108

102109
ret = server.request_json(path)
103110
instance = cls(jsondict=ret)
104-
instance._server = server
111+
instance.origin_server = server
105112
return instance
106113

107114
def create(self, server):
@@ -111,7 +118,7 @@ def create(self, server):
111118
:param FHIRServer server: The server to create the receiver on
112119
:returns: None or the response JSON on success
113120
"""
114-
srv = server or self.server
121+
srv = server or self.origin_server
115122
if srv is None:
116123
raise Exception("Cannot create a resource without a server")
117124
if self.id:
@@ -130,7 +137,7 @@ def update(self, server=None):
130137
optional, will use the instance's `server` if needed.
131138
:returns: None or the response JSON on success
132139
"""
133-
srv = server or self.server
140+
srv = server or self.origin_server
134141
if srv is None:
135142
raise Exception("Cannot update a resource that does not have a server")
136143
if not self.id:
@@ -148,7 +155,7 @@ def delete(self, server=None):
148155
optional, will use the instance's `server` if needed.
149156
:returns: None or the response JSON on success
150157
"""
151-
srv = server or self.server
158+
srv = server or self.origin_server
152159
if srv is None:
153160
raise Exception("Cannot delete a resource that does not have a server")
154161
if not self.id:

fhirclient/models/fhirreference.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ def resolved(self, klass):
5757
if bundle.entry is not None:
5858
fullUrl = self.reference
5959
if ref_is_relative:
60-
base = bundle.server.base_uri if bundle.server else ''
60+
base = bundle.origin_server.base_uri if bundle.origin_server else ''
6161
fullUrl = base + self.reference
6262

6363
for entry in bundle.entry:
@@ -72,7 +72,7 @@ def resolved(self, klass):
7272
# relative references, use the same server
7373
server = None
7474
if ref_is_relative:
75-
server = owning_resource.server if owning_resource else None
75+
server = owning_resource.origin_server if owning_resource else None
7676

7777
# TODO: instantiate server for absolute resource
7878
if server is None:

fhirclient/models/fhirsearch.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ def perform(self, server):
6363
from . import bundle
6464
res = server.request_json(self.construct())
6565
bundle = bundle.Bundle(res)
66-
bundle._server = server
66+
bundle.origin_server = server
6767
return bundle
6868

6969
def perform_resources(self, server):

0 commit comments

Comments
 (0)