import orthancInterface import orthancDatabaseBrowser import json import time import datetime def getStatus(jobStatus): return jobStatus['State'] def isComplete(jobStatus): return getStatus(jobStatus)=='Success' class orthancPeers: def __init__(self,net): self.net=net def addPeer(self,name,url,username,password): v={"Url":url,"Username":username,"Password":password} jsonData=json.dumps(v) apiUrl=self.net.getCoreURL() apiUrl+=f'/peers/{name}' response=self.net.put(apiUrl,jsonData,'json') #empty response def deletePeer(self,name): apiUrl=self.net.getCoreURL() apiUrl+=f'/peers/{name}' response=self.net.delete(apiUrl) #empty response def createSendJob(self,name,orthancId): #returns jobDescription as JSON (ID,Path) apiUrl=self.net.getCoreURL() apiUrl+=f'/peers/{name}/store' #response=self.net.post(apiUrl,orthancId,'text') v={"Resources":[f'{orthancId}'],"Synchronous":False} jsonData=json.dumps(v) response=self.net.post(apiUrl,jsonData,'json') return orthancDatabaseBrowser.extractJSON(response.data) def checkJobStatus(self,jobId): #returns jobStatus as JSON (ErrorCode, ErrorDescription, ErrorDetails, Progress, State) apiUrl=self.net.getCoreURL() apiUrl+=f'/jobs/{jobId}' response=self.net.get(apiUrl) return orthancDatabaseBrowser.extractJSON(response.data) def test(self,name): apiUrl=self.net.getCoreURL() apiUrl+=f'/peers/{name}/system' response=self.net.get(apiUrl) return orthancDatabaseBrowser.extractJSON(response.data) def list(self): apiUrl=self.net.getCoreURL() apiUrl+=f'/peers?expand' response=self.net.get(apiUrl) return orthancDatabaseBrowser.extractJSON(response.data) def sendResource(self,name,orthancId): jobDescription=self.createSendJob(name,orthancId) jobId=jobDescription['ID'] self.monitorProgress(jobId) def monitorProgress(self,jobId,tSleepGuess=10): dateFormat='%Y%m%dT%H%M%S.%f' tSleep=tSleepGuess while True: #wait 10 s time.sleep(tSleep) jobStatus=self.checkJobStatus(jobId) if jobStatus['State']=="Success": print('Job succeeded') return True if jobStatus['State']=="Failure": print('Job failed') return False try: eta=datetime.datetime.strptime(jobStatus['EstimatedTimeOfArrival'],dateFormat) except KeyError: continue t0=datetime.datetime.strptime(jobStatus['Timestamp'],dateFormat) delta=eta-t0 tSleep=0.05*delta.seconds tSleep=max(tSleep,tSleepGuess) print('Working: {}/100, ETA: {} s, next check {} s'.format(jobStatus['Progress'],delta.seconds,tSleep))