labkeyFileBrowser.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import urllib3
  2. import xml.etree.ElementTree as ET
  3. import shutil
  4. class labkeyFileBrowser:
  5. def __init__(self,net):
  6. self.net=net
  7. def GetRootUrl(self):
  8. return self.net.GetLabkeyUrl()+"/_webdav"
  9. def listRemoteDir(self,url):
  10. #input is remoteDir, result are remoteDirs
  11. #r=MethodRequest(dirUrl,method="PROPFIND")
  12. PROPFIND=u"""<?xml version="1.0" encoding="utf-8"?>\n
  13. <propfind xmlns="DAV:">\n
  14. <prop>\n
  15. <getetag/>\n
  16. </prop>\n
  17. </propfind>"""
  18. headers=urllib3.util.make_headers(basic_auth=self.net.getBasicAuth())
  19. headers["Content-Type"]='text/xml; charset="utf-8"'
  20. headers['content-length']=str(len(PROPFIND))
  21. headers['Depth']='1'
  22. #add csrf
  23. headers["X-LABKEY-CSRF"]=self.net.getCSRF()
  24. try:
  25. f=self.net.http.request('PROPFIND',url,headers=headers,body=PROPFIND)
  26. #f contains json as a return value
  27. except urllib3.exceptions.HTTPError as e:
  28. print(e)
  29. return False,dirs
  30. tree=ET.XML(f.data)
  31. rps=tree.findall('{DAV:}response')
  32. dirs=[]
  33. for r in rps:
  34. hr=r.find('{DAV:}href')
  35. dirent=hr.text
  36. #dirent=re.sub('/labkey/_webdav/','',dirent)
  37. dirent=self.net.connectionConfig['host']+dirent
  38. dirs.append(dirent)
  39. del dirs[0]
  40. return True,dirs
  41. def readFileToBuffer(self, url):
  42. return self.net.get(url,binary=True)
  43. def readFileToFile(self,url,path):
  44. response=self.readFileToBuffer(url)
  45. with open(path,'wb') as out_file:
  46. shutil.copyfileobj(response,out_file)
  47. response.release_conn()
  48. def writeFileToFile(self,path,url):
  49. with open(path,'rb') as f:
  50. data=f.read()
  51. self.net.put(url,data)
  52. def formatPathURL(self,project,path):
  53. url=self.GetRootUrl()+'/'+project+'/@files'
  54. if len(path)==0:
  55. return url
  56. return url+'/'+path
  57. def mkdir(self,url):
  58. self.net.mkcol(url)