Skip to content

Commit 879e73a

Browse files
author
jm
committed
fix: apply upstream bugfixes and add proxy support from the-library-code/dspace-rest-python
Backport critical bugfixes and improvements from upstream v0.1.14-v0.1.16. Bug fixes: - Fix User class field definitions with trailing commas creating tuples - Fix get_items() checking wrong _embedded key ('collections' vs 'items') - Fix InProgressSubmission step/type assignment bugs in __init__ - Fix EntityType type field overwriting label in __init__ Improvements: - Add proxy support (PROXY_DICT, proxies param, all HTTP methods) - Add params parameter to api_patch() signature - Add embedded attribute to HALResource for _embedded API data
1 parent 283e39c commit 879e73a

File tree

2 files changed

+33
-19
lines changed

2 files changed

+33
-19
lines changed

dspace_rest_client/client.py

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ class DSpaceClient:
7373
if 'USER_AGENT' in os.environ:
7474
USER_AGENT = os.environ['USER_AGENT']
7575
verbose = False
76+
ITER_PAGE_SIZE = 20
77+
PROXY_DICT = dict(http=os.environ["PROXY_URL"],https=os.environ["PROXY_URL"]) if "PROXY_URL" in os.environ else dict()
7678

7779
# Simple enum for patch operation types
7880
class PatchOperation:
@@ -82,7 +84,7 @@ class PatchOperation:
8284
MOVE = 'move'
8385

8486
def __init__(self, api_endpoint=API_ENDPOINT, username=USERNAME, password=PASSWORD, solr_endpoint=SOLR_ENDPOINT,
85-
solr_auth=SOLR_AUTH, fake_user_agent=False):
87+
solr_auth=SOLR_AUTH, fake_user_agent=False, proxies=PROXY_DICT):
8688
"""
8789
Accept optional API endpoint, username, password arguments using the OS environment variables as defaults
8890
:param api_endpoint: base path to DSpace REST API, eg. http://localhost:8080/server/api
@@ -95,6 +97,7 @@ def __init__(self, api_endpoint=API_ENDPOINT, username=USERNAME, password=PASSWO
9597
self.USERNAME = username
9698
self.PASSWORD = password
9799
self.SOLR_ENDPOINT = solr_endpoint
100+
self.proxies = proxies
98101
self.solr = None
99102
self._last_err = None
100103
try:
@@ -128,7 +131,8 @@ def authenticate(self, retry=False):
128131
# Set headers for requests made during authentication
129132
# Get and update CSRF token
130133
r = self.session.post(self.LOGIN_URL, data={'user': self.USERNAME, 'password': self.PASSWORD},
131-
headers=self.auth_request_headers)
134+
headers=self.auth_request_headers,
135+
proxies=self.proxies)
132136
self.update_token(r)
133137

134138
if r.status_code == 403:
@@ -203,7 +207,8 @@ def api_get(self, url, params=None, data=None, headers=None):
203207
self._last_err = None
204208
if headers is None:
205209
headers = self.request_headers
206-
r = self.session.get(url, params=params, data=data, headers=headers)
210+
r = self.session.get(url, params=params, data=data, headers=headers,
211+
proxies=self.proxies)
207212
self.update_token(r)
208213
return r
209214

@@ -218,7 +223,8 @@ def api_post(self, url, params, json, retry=False):
218223
@return: Response from API
219224
"""
220225
self._last_err = None
221-
r = self.session.post(url, json=json, params=params, headers=self.request_headers)
226+
r = self.session.post(url, json=json, params=params, headers=self.request_headers,
227+
proxies=self.proxies)
222228
self.update_token(r)
223229

224230
if r.status_code == 403:
@@ -262,7 +268,8 @@ def api_post_uri(self, url, params, uri_list, retry=False):
262268
@return: Response from API
263269
"""
264270
self._last_err = None
265-
r = self.session.post(url, data=uri_list, params=params, headers=self.list_request_headers)
271+
r = self.session.post(url, data=uri_list, params=params, headers=self.list_request_headers,
272+
proxies=self.proxies)
266273
self.update_token(r)
267274

268275
if r.status_code == 403:
@@ -291,7 +298,8 @@ def api_put(self, url, params, json, retry=False):
291298
@return: Response from API
292299
"""
293300
self._last_err = None
294-
r = self.session.put(url, params=params, json=json, headers=self.request_headers)
301+
r = self.session.put(url, params=params, json=json, headers=self.request_headers,
302+
proxies=self.proxies)
295303
self.update_token(r)
296304

297305
if r.status_code == 403:
@@ -321,7 +329,8 @@ def api_delete(self, url, params, retry=False):
321329
@return: Response from API
322330
"""
323331
self._last_err = None
324-
r = self.session.delete(url, params=params, headers=self.request_headers)
332+
r = self.session.delete(url, params=params, headers=self.request_headers,
333+
proxies=self.proxies)
325334
self.update_token(r)
326335

327336
if r.status_code == 403:
@@ -341,7 +350,7 @@ def api_delete(self, url, params, retry=False):
341350

342351
return r
343352

344-
def api_patch(self, url, operation, path, value, retry=False):
353+
def api_patch(self, url, operation, path, value, params=None, retry=False):
345354
"""
346355
@param url: DSpace REST API URL
347356
@param operation: 'add', 'remove', 'replace', or 'move' (see PatchOperation enumeration)
@@ -377,7 +386,8 @@ def api_patch(self, url, operation, path, value, retry=False):
377386

378387
# set headers
379388
# perform patch request
380-
r = self.session.patch(url, json=[data], headers=self.request_headers)
389+
r = self.session.patch(url, json=[data], params=params, headers=self.request_headers,
390+
proxies=self.proxies)
381391
self.update_token(r)
382392

383393
if r.status_code == 403:
@@ -922,7 +932,7 @@ def get_items(self, page=0, size=20):
922932
r = self.api_get(url, params=params)
923933
r_json = parse_json(response=r)
924934
if '_embedded' in r_json:
925-
if 'collections' in r_json['_embedded']:
935+
if 'items' in r_json['_embedded']:
926936
for item_resource in r_json['_embedded']['items']:
927937
items.append(Item(item_resource))
928938
elif 'uuid' in r_json:

dspace_rest_client/models.py

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class HALResource:
2121
Base class to represent HAL+JSON API resources
2222
"""
2323
links = {}
24+
embedded = {}
2425
type = None
2526

2627
def __init__(self, api_resource=None):
@@ -29,6 +30,7 @@ def __init__(self, api_resource=None):
2930
@param api_resource: optional API resource (JSON) from a GET response or successful POST can populate instance
3031
"""
3132
self._from_d = None
33+
self.embedded = {}
3234
if api_resource is not None:
3335
self._from_d = api_resource
3436
if 'type' in api_resource:
@@ -37,6 +39,8 @@ def __init__(self, api_resource=None):
3739
self.links = api_resource['_links'].copy()
3840
else:
3941
self.links = {'self': {'href': None}}
42+
if '_embedded' in api_resource:
43+
self.embedded = api_resource['_embedded'].copy()
4044

4145
class AddressableHALResource(HALResource):
4246
id = None
@@ -421,12 +425,12 @@ class User(SimpleDSpaceObject):
421425
Extends DSpaceObject to implement specific attributes and methods for users (aka. EPersons)
422426
"""
423427
type = 'user'
424-
name = None,
425-
netid = None,
426-
lastActive = None,
427-
canLogIn = False,
428-
email = None,
429-
requireCertificate = False,
428+
name = None
429+
netid = None
430+
lastActive = None
431+
canLogIn = False
432+
email = None
433+
requireCertificate = False
430434
selfRegistered = False
431435

432436
def __init__(self, api_resource=None):
@@ -473,11 +477,11 @@ def __init__(self, api_resource):
473477
if 'lastModified' in api_resource:
474478
self.lastModified = api_resource['lastModified']
475479
if 'step' in api_resource:
476-
self.step = api_resource['lastModified']
480+
self.step = api_resource['step']
477481
if 'sections' in api_resource:
478482
self.sections = api_resource['sections'].copy()
479483
if 'type' in api_resource:
480-
self.lastModified = api_resource['lastModified']
484+
self.type = api_resource['type']
481485

482486
def as_dict(self):
483487
parent_dict = super(InProgressSubmission, self).as_dict()
@@ -508,7 +512,7 @@ def __init__(self, api_resource):
508512
if 'label' in api_resource:
509513
self.label = api_resource['label']
510514
if 'type' in api_resource:
511-
self.label = api_resource['type']
515+
self.type = api_resource['type']
512516

513517
class RelationshipType(AddressableHALResource):
514518
"""

0 commit comments

Comments
 (0)