@@ -44,7 +44,7 @@ def parse_json(response):
4444 try :
4545 response_json = response .json ()
4646 except ValueError as err :
47- logging .error (f 'Error parsing response JSON: { err } . Body text: { response .text } ' )
47+ logging .error ('Error parsing response JSON: %s . Body text: %s' , err , response .text )
4848 return response_json
4949
5050
@@ -170,7 +170,7 @@ def authenticate(self, retry=False):
170170 # After speaking in #dev it seems that these do need occasional refreshes but I suspect
171171 # it's happening too often for me, so check for accidentally triggering it
172172 if retry :
173- logging .error (f 'Too many retries updating token: { r .status_code } : { r .text } ' )
173+ logging .error ('Too many retries updating token: %s: %s' , r .status_code , r .text )
174174 return False
175175 else :
176176 logging .debug ("Retrying request with updated CSRF token" )
@@ -179,7 +179,7 @@ def authenticate(self, retry=False):
179179 if r .status_code == 401 :
180180 # 401 Unauthorized
181181 # If we get a 401, this means a general authentication failure
182- logging .error (f 'Authentication failure: invalid credentials for user { self .USERNAME } ' )
182+ logging .error ('Authentication failure: invalid credentials for user %s' , self .USERNAME )
183183 return False
184184
185185 # Update headers with new bearer token if present
@@ -191,7 +191,7 @@ def authenticate(self, retry=False):
191191 if r .status_code == 200 :
192192 r_json = parse_json (r )
193193 if 'authenticated' in r_json and r_json ['authenticated' ] is True :
194- logging .info (f 'Authenticated successfully as { self .USERNAME } ' )
194+ logging .info ('Authenticated successfully as %s' , self .USERNAME )
195195 return r_json ['authenticated' ]
196196
197197 # Default, return false
@@ -241,7 +241,7 @@ def api_post(self, url, params, json, retry=False):
241241 r_json = parse_json (r )
242242 if 'message' in r_json and 'CSRF token' in r_json ['message' ]:
243243 if retry :
244- logging .warning (f 'Too many retries updating token: { r .status_code } : { r .text } ' )
244+ logging .warning ('Too many retries updating token: %s: %s' , r .status_code , r .text )
245245 else :
246246 logging .debug ("Retrying request with updated CSRF token" )
247247 return self .api_post (url , params = params , json = json , retry = True )
@@ -269,7 +269,7 @@ def api_post_uri(self, url, params, uri_list, retry=False):
269269 r_json = r .json ()
270270 if 'message' in r_json and 'CSRF token' in r_json ['message' ]:
271271 if retry :
272- logging .warning (f 'Too many retries updating token: { r .status_code } : { r .text } ' )
272+ logging .warning ('Too many retries updating token: %s: %s' , r .status_code , r .text )
273273 else :
274274 logging .debug ("Retrying request with updated CSRF token" )
275275 return self .api_post_uri (url , params = params , uri_list = uri_list , retry = True )
@@ -299,7 +299,7 @@ def api_put(self, url, params, json, retry=False):
299299 r_json = parse_json (r )
300300 if 'message' in r_json and 'CSRF token' in r_json ['message' ]:
301301 if retry :
302- logging .warning (f 'Too many retries updating token: { r .status_code } : { r .text } ' )
302+ logging .warning ('Too many retries updating token: %s: %s' , r .status_code , r .text )
303303 else :
304304 logging .debug ("Retrying request with updated CSRF token" )
305305 return self .api_put (url , params = params , json = json , retry = True )
@@ -328,7 +328,7 @@ def api_delete(self, url, params, retry=False):
328328 r_json = parse_json (r )
329329 if 'message' in r_json and 'CSRF token' in r_json ['message' ]:
330330 if retry :
331- logging .warning (f 'Too many retries updating token: { r .status_code } : { r .text } ' )
331+ logging .warning ('Too many retries updating token: %s: %s' , r .status_code , r .text )
332332 else :
333333 logging .debug ("Retrying request with updated CSRF token" )
334334 return self .api_delete (url , params = params , retry = True )
@@ -346,15 +346,15 @@ def api_patch(self, url, operation, path, value, retry=False):
346346 @see https://github.com/DSpace/RestContract/blob/main/metadata-patch.md
347347 """
348348 if url is None :
349- logging .error (f 'Missing required URL argument' )
349+ logging .error ('Missing required URL argument' )
350350 return None
351351 if path is None :
352- logging .error (f 'Need valid path eg. /withdrawn or /metadata/dc.title/0/language' )
352+ logging .error ('Need valid path eg. /withdrawn or /metadata/dc.title/0/language' )
353353 return None
354354 if (operation == self .PatchOperation .ADD or operation == self .PatchOperation .REPLACE
355355 or operation == self .PatchOperation .MOVE ) and value is None :
356356 # missing value required for add/replace/move operations
357- logging .error (f 'Missing required "value" argument for add/replace/move operations' )
357+ logging .error ('Missing required "value" argument for add/replace/move operations' )
358358 return None
359359
360360 # compile patch data
@@ -382,13 +382,13 @@ def api_patch(self, url, operation, path, value, retry=False):
382382 r_json = parse_json (r )
383383 if 'message' in r_json and 'CSRF token' in r_json ['message' ]:
384384 if retry :
385- logging .warning (f 'Too many retries updating token: { r .status_code } : { r .text } ' )
385+ logging .warning ('Too many retries updating token: %s: %s' , r .status_code , r .text )
386386 else :
387387 logging .debug ("Retrying request with updated CSRF token" )
388388 return self .api_patch (url , operation , path , value , True )
389389 elif r .status_code == 200 :
390390 # 200 Success
391- logging .info (f 'successful patch update to { r .json ()["type" ]} { r .json ()["id" ]} ' )
391+ logging .info ('successful patch update to %s %s' , r .json ()["type" ], r .json ()["id" ])
392392
393393 # Return the raw API response
394394 return r
@@ -435,7 +435,7 @@ def search_objects(self, query=None, scope=None, filters=None, page=0, size=20,
435435 dso = SimpleDSpaceObject (resource )
436436 dsos .append (dso )
437437 except (TypeError , ValueError ) as err :
438- logging .error (f 'error parsing search result json { err } ' )
438+ logging .error ('error parsing search result json %s' , err )
439439
440440 return dsos
441441
@@ -479,7 +479,7 @@ def fetch_resource(self, url, params=None):
479479 """
480480 r = self .api_get (url , params , None )
481481 if r .status_code != 200 :
482- logging .error (f 'Error encountered fetching resource: { r .text } ' )
482+ logging .error ('Error encountered fetching resource: %s' , r .text )
483483 return None
484484 # ValueError / JSON handling moved to static method
485485 return parse_json (r )
@@ -498,7 +498,7 @@ def get_dso(self, url, uuid):
498498 url = f'{ url } /{ uuid } '
499499 return self .api_get (url , None , None )
500500 except ValueError :
501- logging .error (f 'Invalid DSO UUID: { uuid } ' )
501+ logging .error ('Invalid DSO UUID: %s' , uuid )
502502 return None
503503
504504 def create_dso (self , url , params , data ):
@@ -515,9 +515,9 @@ def create_dso(self, url, params, data):
515515 if r .status_code == 201 :
516516 # 201 Created - success!
517517 new_dso = parse_json (r )
518- logging .info (f' { new_dso ["type" ]} { new_dso ["uuid" ]} created successfully!' )
518+ logging .info ('%s %s created successfully!' , new_dso ["type" ], new_dso ["uuid" ])
519519 else :
520- logging .error (f 'create operation failed: { r .status_code } : { r .text } ( { url } )' )
520+ logging .error ('create operation failed: %s: %s (%s)' , r .status_code , r .text , url )
521521 return r
522522
523523 def update_dso (self , dso , params = None ):
@@ -533,8 +533,8 @@ def update_dso(self, dso, params=None):
533533 return None
534534 dso_type = type (dso )
535535 if not isinstance (dso , SimpleDSpaceObject ):
536- logging .error (f 'Only SimpleDSpaceObject types (eg Item, Collection, Community) '
537- f 'are supported by generic update_dso PUT.' )
536+ logging .error ('Only SimpleDSpaceObject types (eg Item, Collection, Community) '
537+ 'are supported by generic update_dso PUT.' )
538538 return dso
539539 try :
540540 # Get self URI from HAL links
@@ -558,13 +558,13 @@ def update_dso(self, dso, params=None):
558558 if r .status_code == 200 :
559559 # 200 OK - success!
560560 updated_dso = dso_type (parse_json (r ))
561- logging .info (f' { updated_dso .type } { updated_dso .uuid } updated sucessfully!' )
561+ logging .info ('%s %s updated successfully!' , updated_dso .type , updated_dso .uuid )
562562 return updated_dso
563563 else :
564- logging .error (f 'update operation failed: { r .status_code } : { r .text } ( { url } )' )
564+ logging .error ('update operation failed: %s: %s (%s)' , r .status_code , r .text , url )
565565 return None
566566
567- except ValueError as e :
567+ except ValueError :
568568 logging .error ("Error parsing DSO response" , exc_info = True )
569569 return None
570570
@@ -580,12 +580,12 @@ def delete_dso(self, dso=None, url=None, params=None):
580580 """
581581 if dso is None :
582582 if url is None :
583- logging .error (f 'Need a DSO or a URL to delete' )
583+ logging .error ('Need a DSO or a URL to delete' )
584584 return None
585585 else :
586586 if not isinstance (dso , SimpleDSpaceObject ):
587- logging .error (f 'Only SimpleDSpaceObject types (eg Item, Collection, Community, EPerson) '
588- f 'are supported by generic update_dso PUT.' )
587+ logging .error ('Only SimpleDSpaceObject types (eg Item, Collection, Community, EPerson) '
588+ 'are supported by generic update_dso PUT.' )
589589 return dso
590590 # Get self URI from HAL links
591591 url = dso .links ['self' ]['href' ]
@@ -594,13 +594,13 @@ def delete_dso(self, dso=None, url=None, params=None):
594594 r = self .api_delete (url , params = params )
595595 if r .status_code == 204 :
596596 # 204 No Content - success!
597- logging .info (f' { url } was deleted sucessfully!' )
597+ logging .info ('%s was deleted successfully!' , url )
598598 return r
599599 else :
600- logging .error (f 'update operation failed: { r .status_code } : { r .text } ( { url } )' )
600+ logging .error ('update operation failed: %s: %s (%s)' , r .status_code , r .text , url )
601601 return None
602602 except ValueError as e :
603- logging .error (f 'Error deleting DSO { dso .uuid } : { e } ' )
603+ logging .error ('Error deleting DSO %s: %s' , dso .uuid , e )
604604 return None
605605
606606 # PAGINATION
@@ -639,7 +639,7 @@ def get_bundles(self, parent=None, uuid=None, page=0, size=20, sort=None):
639639 for resource in resources :
640640 bundles .append (Bundle (resource ))
641641 except ValueError as err :
642- logging .error (f 'error parsing bundle results: { err } ' )
642+ logging .error ('error parsing bundle results: %s' , err )
643643
644644 return bundles
645645
@@ -690,7 +690,7 @@ def get_bitstreams(self, uuid=None, bundle=None, page=0, size=20, sort=None):
690690 url = bundle .links ['bitstreams' ]['href' ]
691691 else :
692692 url = f'{ self .API_ENDPOINT } /core/bundles/{ bundle .uuid } /bitstreams'
693- logging .warning (f 'Cannot find bundle bitstream links, will try to construct manually: { url } ' )
693+ logging .warning ('Cannot find bundle bitstream links, will try to construct manually: %s' , url )
694694 # Perform the actual request. By now, our URL and parameter should be properly set
695695 params = {}
696696 if size is not None :
@@ -718,7 +718,7 @@ def get_bitstreams_iter(do_paginate, self, bundle, sort=None):
718718 url = bundle .links ['bitstreams' ]['href' ]
719719 else :
720720 url = f'{ self .API_ENDPOINT } /core/bundles/{ bundle .uuid } /bitstreams'
721- logging .warning (f 'Cannot find bundle bitstream links, will try to construct manually: { url } ' )
721+ logging .warning ('Cannot find bundle bitstream links, will try to construct manually: %s' , url )
722722 params = {}
723723 if sort is not None :
724724 params ['sort' ] = sort
@@ -759,7 +759,7 @@ def create_bitstream(self, bundle=None, name=None, path=None, mime=None, metadat
759759 r = self .session .send (prepared_req )
760760 if 'DSPACE-XSRF-TOKEN' in r .headers :
761761 t = r .headers ['DSPACE-XSRF-TOKEN' ]
762- logging .debug ('Updating token to ' + t )
762+ logging .debug ('Updating token to %s' , t )
763763 self .session .headers .update ({'X-XSRF-Token' : t })
764764 self .session .cookies .update ({'X-XSRF-Token' : t })
765765 if r .status_code == 403 :
@@ -775,7 +775,7 @@ def create_bitstream(self, bundle=None, name=None, path=None, mime=None, metadat
775775 # Success
776776 return Bitstream (api_resource = parse_json (r ))
777777 else :
778- logging .error (f 'Error creating bitstream: { r .status_code } : { r .text } ' )
778+ logging .error ('Error creating bitstream: %s: %s' , r .status_code , r .text )
779779 return None
780780
781781 def download_bitstream (self , uuid = None ):
@@ -816,14 +816,14 @@ def get_communities(self, uuid=None, page=0, size=20, sort=None, top=False):
816816 url = f'{ url } /{ uuid } '
817817 params = None
818818 except ValueError :
819- logging .error (f 'Invalid community UUID: { uuid } ' )
819+ logging .error ('Invalid community UUID: %s' , uuid )
820820 return None
821821
822822 if top :
823823 # Set new URL
824824 url = f'{ url } /search/top'
825825
826- logging .debug (f 'Performing get on { url } ' )
826+ logging .debug ('Performing get on %s' , url )
827827 # Perform actual get
828828 r_json = self .fetch_resource (url , params )
829829 # Empty list
@@ -897,7 +897,7 @@ def get_collections(self, uuid=None, community=None, page=0, size=20, sort=None)
897897 url = f'{ url } /{ uuid } '
898898 params = None
899899 except ValueError :
900- logging .error (f 'Invalid collection UUID: { uuid } ' )
900+ logging .error ('Invalid collection UUID: %s' , uuid )
901901 return None
902902
903903 if community is not None :
@@ -964,7 +964,7 @@ def get_item(self, uuid):
964964 url = f'{ url } /{ uuid } '
965965 return self .api_get (url , None , None )
966966 except ValueError :
967- logging .error (f 'Invalid item UUID: { uuid } ' )
967+ logging .error ('Invalid item UUID: %s' , uuid )
968968 return None
969969
970970 def get_items (self ):
@@ -1030,11 +1030,11 @@ def create_item_version(self, item_uuid, summary=None):
10301030 if response .status_code == 201 :
10311031 # 201 Created - Success
10321032 new_version = parse_json (response )
1033- logging .info (f "Created new version for item { item_uuid } " )
1033+ logging .info ("Created new version for item %s" , item_uuid )
10341034 return new_version
10351035 else :
10361036 logging .error (
1037- f "Error creating item version: { response .status_code } { response .text } "
1037+ "Error creating item version: %s %s" , response .status_code , response .text
10381038 )
10391039
10401040 return None
@@ -1106,7 +1106,7 @@ def create_user(self, user, token=None):
11061106
11071107 def delete_user (self , user ):
11081108 if not isinstance (user , User ):
1109- logging .error (f 'Must be a valid user' )
1109+ logging .error ('Must be a valid user' )
11101110 return None
11111111 return self .delete_dso (user )
11121112
@@ -1181,7 +1181,7 @@ def update_token(self, r):
11811181 self .session = requests .Session ()
11821182 if 'DSPACE-XSRF-TOKEN' in r .headers :
11831183 t = r .headers ['DSPACE-XSRF-TOKEN' ]
1184- logging .debug (f 'Updating XSRF token to { t } ' )
1184+ logging .debug ('Updating XSRF token to %s' , t )
11851185 # Update headers and cookies
11861186 self .session .headers .update ({'X-XSRF-Token' : t })
11871187 self .session .cookies .update ({'X-XSRF-Token' : t })
0 commit comments