orthancPeers.py 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import orthancInterface
  2. import orthancDatabaseBrowser
  3. import json
  4. import time
  5. import datetime
  6. def getStatus(jobStatus):
  7. return jobStatus['State']
  8. def isComplete(jobStatus):
  9. return getStatus(jobStatus)=='Success'
  10. class orthancPeers:
  11. def __init__(self,net):
  12. self.net=net
  13. def addPeer(self,name,url,username,password):
  14. v={"Url":url,"Username":username,"Password":password}
  15. jsonData=json.dumps(v)
  16. apiUrl=self.net.getCoreURL()
  17. apiUrl+=f'/peers/{name}'
  18. response=self.net.put(apiUrl,jsonData,'json')
  19. #empty response
  20. def deletePeer(self,name):
  21. apiUrl=self.net.getCoreURL()
  22. apiUrl+=f'/peers/{name}'
  23. response=self.net.delete(apiUrl)
  24. #empty response
  25. def createSendJob(self,name,orthancId):
  26. #returns jobDescription as JSON (ID,Path)
  27. apiUrl=self.net.getCoreURL()
  28. apiUrl+=f'/peers/{name}/store'
  29. #response=self.net.post(apiUrl,orthancId,'text')
  30. v={"Resources":[f'{orthancId}'],"Synchronous":False}
  31. jsonData=json.dumps(v)
  32. response=self.net.post(apiUrl,jsonData,'json')
  33. return orthancDatabaseBrowser.extractJSON(response.data)
  34. def checkJobStatus(self,jobId):
  35. #returns jobStatus as JSON (ErrorCode, ErrorDescription, ErrorDetails, Progress, State)
  36. apiUrl=self.net.getCoreURL()
  37. apiUrl+=f'/jobs/{jobId}'
  38. response=self.net.get(apiUrl)
  39. return orthancDatabaseBrowser.extractJSON(response.data)
  40. def test(self,name):
  41. apiUrl=self.net.getCoreURL()
  42. apiUrl+=f'/peers/{name}/system'
  43. response=self.net.get(apiUrl)
  44. return orthancDatabaseBrowser.extractJSON(response.data)
  45. def list(self):
  46. apiUrl=self.net.getCoreURL()
  47. apiUrl+=f'/peers?expand'
  48. response=self.net.get(apiUrl)
  49. return orthancDatabaseBrowser.extractJSON(response.data)
  50. def sendResource(self,name,orthancId):
  51. jobDescription=self.createSendJob(name,orthancId)
  52. jobId=jobDescription['ID']
  53. self.monitorProgress(jobId)
  54. def monitorProgress(self,jobId,tSleepGuess=10):
  55. dateFormat='%Y%m%dT%H%M%S.%f'
  56. tSleep=tSleepGuess
  57. while True:
  58. #wait 10 s
  59. time.sleep(tSleep)
  60. jobStatus=self.checkJobStatus(jobId)
  61. if jobStatus['State']=="Success":
  62. print('Job succeeded')
  63. return
  64. if jobStatus['State']=="Failure":
  65. print('Job failed')
  66. return
  67. try:
  68. eta=datetime.datetime.strptime(jobStatus['EstimatedTimeOfArrival'],dateFormat)
  69. except KeyError:
  70. continue
  71. t0=datetime.datetime.strptime(jobStatus['Timestamp'],dateFormat)
  72. delta=eta-t0
  73. tSleep=0.05*delta.seconds
  74. tSleep=max(tSleep,tSleepGuess)
  75. print('Working: {}/100, ETA: {} s, next check {} s'.format(jobStatus['Progress'],delta.seconds,tSleep))