import urllib3 import xml.etree.ElementTree as ET import shutil class labkeyFileBrowser: def __init__(self,net): self.net=net def GetRootUrl(self): return self.net.GetLabkeyUrl()+"/_webdav" def listRemoteDir(self,url): #input is remoteDir, result are remoteDirs #r=MethodRequest(dirUrl,method="PROPFIND") PROPFIND=u"""\n \n \n \n \n """ headers=urllib3.util.make_headers(basic_auth=self.net.getBasicAuth()) headers["Content-Type"]='text/xml; charset="utf-8"' headers['content-length']=str(len(PROPFIND)) headers['Depth']='1' #add csrf headers["X-LABKEY-CSRF"]=self.net.getCSRF() try: f=self.net.http.request('PROPFIND',url,headers=headers,body=PROPFIND) #f contains json as a return value except urllib3.exceptions.HTTPError as e: print(e) return False,dirs tree=ET.XML(f.data) rps=tree.findall('{DAV:}response') dirs=[] for r in rps: hr=r.find('{DAV:}href') dirent=hr.text #dirent=re.sub('/labkey/_webdav/','',dirent) dirent=self.net.connectionConfig['host']+dirent dirs.append(dirent) del dirs[0] return True,dirs def readFileToBuffer(self, url): return self.net.get(url,binary=True) def readFileToFile(self,url,path): response=self.readFileToBuffer(url) with open(path,'wb') as out_file: shutil.copyfileobj(response,out_file) response.release_conn() def writeFileToFile(self,path,url): with open(path,'rb') as f: data=f.read() self.net.put(url,data) def formatPathURL(self,project,path): url=self.GetRootUrl()+'/'+project+'/@files' if len(path)==0: return url return url+'/'+path