|
@@ -27,8 +27,10 @@ class MethodRequest(urllib2.Request):
|
|
|
return self._method
|
|
|
return urllib2.Request.get_method(self, *args, **kwargs)
|
|
|
|
|
|
-class slicerNetwork:
|
|
|
- def __init__(self, *args, **kwargs):
|
|
|
+class slicerNetwork(slicer.ScriptedLoadableModule.ScriptedLoadableModule):
|
|
|
+ def __init__(self, parent):
|
|
|
+ slicer.ScriptedLoadableModule.ScriptedLoadableModule.__init__(self,parent)
|
|
|
+ self.parent.title="slicerNetwork"
|
|
|
pass
|
|
|
|
|
|
class labkeyURIHandler(slicer.vtkURIHandler):
|
|
@@ -115,7 +117,9 @@ class labkeyURIHandler(slicer.vtkURIHandler):
|
|
|
return localPath
|
|
|
|
|
|
def StageFileRead(self,source,dest):
|
|
|
- print "labkeyURIHandler::StageFileRead({0},{1})".format(source,dest)
|
|
|
+ debug=False
|
|
|
+ if debug:
|
|
|
+ print "labkeyURIHandler::StageFileRead({0},{1})".format(source,dest)
|
|
|
labkeyPath=re.sub('labkey://','',source)
|
|
|
remote=self.readFile(self.hostname,labkeyPath)
|
|
|
#make all necessary directories
|
|
@@ -126,14 +130,16 @@ class labkeyURIHandler(slicer.vtkURIHandler):
|
|
|
local=open(dest,'wb')
|
|
|
#make sure we are at the begining of the file
|
|
|
|
|
|
- #check file size
|
|
|
- remote.seek(0,2)
|
|
|
- sz=remote.tell()
|
|
|
- print "Remote size: {0}".format(sz)
|
|
|
+ #check file size
|
|
|
+ if debug:
|
|
|
+ remote.seek(0,2)
|
|
|
+ sz=remote.tell()
|
|
|
+ print "Remote size: {0}".format(sz)
|
|
|
|
|
|
- remote.seek(0)
|
|
|
+ remote.seek(0)
|
|
|
shutil.copyfileobj(remote,local)
|
|
|
- print "Local size: {0}".format(local.tell())
|
|
|
+ if debug:
|
|
|
+ print "Local size: {0}".format(local.tell())
|
|
|
local.close()
|
|
|
|
|
|
def StageFileWrite(self,source,dest):
|
|
@@ -144,28 +150,28 @@ class labkeyURIHandler(slicer.vtkURIHandler):
|
|
|
return ('VolumeFile','SegmentationFile','TransformFile')
|
|
|
|
|
|
#mimic slicer.util.loadNodeFromFile
|
|
|
- def loadNodeFromFile(self, filename, filetype, properties={}, returnNode=False):
|
|
|
- #this is the only relevant part - file must be downloaded to cache
|
|
|
- localPath=self.GetFile(filename)
|
|
|
- slicer.util.loadNodeFromFile(localPath,filetype,properties,returnNode)
|
|
|
- #remove retrieved file
|
|
|
- try:
|
|
|
- if not(properties['keepCachedFile']) :
|
|
|
- os.remove(localPath)
|
|
|
- except:
|
|
|
- pass
|
|
|
-
|
|
|
-
|
|
|
- def loadVolume(self,filename, properties={}, returnNode=False):
|
|
|
- filetype = 'VolumeFile'
|
|
|
- #redirect to self.loadNodeFromFile first to get the cached file
|
|
|
- return self.loadNodeFromFile(filename,filetype, properties,returnNode)
|
|
|
-
|
|
|
- def loadSegmentation(self,filename,properties={},returnNode=False):
|
|
|
- filetype='SegmentationFile'
|
|
|
- #redirect to self.loadNodeFromFile first to get the cached file
|
|
|
- return self.loadNodeFromFile(filename,filetype, properties,returnNode)
|
|
|
- #add others if needed
|
|
|
+ # def loadNodeFromFile(self, filename, filetype, properties={}, returnNode=False):
|
|
|
+ # #this is the only relevant part - file must be downloaded to cache
|
|
|
+ # localPath=self.GetFile(filename)
|
|
|
+ # slicer.util.loadNodeFromFile(localPath,filetype,properties,returnNode)
|
|
|
+ # #remove retrieved file
|
|
|
+ # try:
|
|
|
+ # if not(properties['keepCachedFile']) :
|
|
|
+ # os.remove(localPath)
|
|
|
+ # except:
|
|
|
+ # pass
|
|
|
+
|
|
|
+
|
|
|
+ # def loadVolume(self,filename, properties={}, returnNode=False):
|
|
|
+ # filetype = 'VolumeFile'
|
|
|
+ # #redirect to self.loadNodeFromFile first to get the cached file
|
|
|
+ # return self.loadNodeFromFile(filename,filetype, properties,returnNode)
|
|
|
+ #
|
|
|
+ # def loadSegmentation(self,filename,properties={},returnNode=False):
|
|
|
+ # filetype='SegmentationFile'
|
|
|
+ # #redirect to self.loadNodeFromFile first to get the cached file
|
|
|
+ # return self.loadNodeFromFile(filename,filetype, properties,returnNode)
|
|
|
+ # #add others if needed
|
|
|
|
|
|
## setup & initialization routines
|
|
|
|
|
@@ -181,23 +187,6 @@ class labkeyURIHandler(slicer.vtkURIHandler):
|
|
|
self.mode="https"
|
|
|
|
|
|
|
|
|
- def connectRemote(self,serverUrl,uname,pwd):
|
|
|
- https_handler=urllib2.HTTPSHandler(context=self.ctx)
|
|
|
- self.SetHostName(serverUrl)
|
|
|
- #cookie part
|
|
|
- cj=cookielib.CookieJar()
|
|
|
- cookie_handler=urllib2.HTTPCookieProcessor(cj)
|
|
|
- self.opener=urllib2.build_opener(https_handler,cookie_handler)
|
|
|
- loginUrl=serverUrl+"/labkey/login/login.post"
|
|
|
- r=urllib2.Request(str(loginUrl))
|
|
|
- print "Connecting to {0}".format(loginUrl)
|
|
|
- r.add_header('ContentType','application/x-www-form-urlencoded')
|
|
|
- data="email="+uname+"&password="+pwd
|
|
|
- #print "Data: '{0}".format(data)
|
|
|
- r.add_data(data)
|
|
|
-
|
|
|
- self.opener.open(r)
|
|
|
-
|
|
|
def initRemote(self):
|
|
|
if self.mode=="https":
|
|
|
http_handler=urllib2.HTTPSHandler(context=self.ctx)
|
|
@@ -233,8 +222,10 @@ class labkeyURIHandler(slicer.vtkURIHandler):
|
|
|
|
|
|
def get(self,url):
|
|
|
|
|
|
- print "GET: {0}".format(url)
|
|
|
- print "as {0}".format(self.auth_name)
|
|
|
+ debug=False
|
|
|
+ if debug:
|
|
|
+ print "GET: {0}".format(url)
|
|
|
+ print "as {0}".format(self.auth_name)
|
|
|
r=urllib2.Request(url)
|
|
|
base64string = base64.b64encode('%s:%s' % (self.auth_name, self.auth_pass))
|
|
|
r.add_header("Authorization", "Basic %s" % base64string)
|
|
@@ -320,6 +311,38 @@ class labkeyURIHandler(slicer.vtkURIHandler):
|
|
|
status,dirs=self.listRemoteDir(dirUrl)
|
|
|
return dirs
|
|
|
|
|
|
+ def isDir(self, remotePath):
|
|
|
+ r=MethodRequest(remotePath,method="PROPFIND")
|
|
|
+ PROPFIND=u"""<?xml version="1.0" encoding="utf-8"?>\n
|
|
|
+ <a:propfind xmlns:a="DAV:">\n
|
|
|
+ <a:prop>\n
|
|
|
+ <a:resourcetype/>\n
|
|
|
+ </a:prop>\n
|
|
|
+ </a:propfind>"""
|
|
|
+ r.add_header('content-type','text/xml; charset="utf-8"')
|
|
|
+ r.add_header('content-length',str(len(PROPFIND)))
|
|
|
+ r.add_header('Depth','0')
|
|
|
+ r.add_data(PROPFIND)
|
|
|
+ base64string = base64.b64encode('%s:%s' % (self.auth_name, self.auth_pass))
|
|
|
+ r.add_header("Authorization", "Basic %s" % base64string)
|
|
|
+ print "PROPFIND: {0}".format(remotePath)
|
|
|
+ dirs=[]
|
|
|
+ try:
|
|
|
+ f=self.opener.open(r)
|
|
|
+ except:
|
|
|
+ return False
|
|
|
+ tree=ET.XML(f.read())
|
|
|
+ try:
|
|
|
+ rps=tree.find('{DAV:}response').find('{DAV:}propstat')
|
|
|
+ rps=rps.find('{DAV:}prop')
|
|
|
+ rps=rps.find('{DAV:}resourcetype').find('{DAV:}collection')
|
|
|
+ if rps != None:
|
|
|
+ return True
|
|
|
+ else:
|
|
|
+ return False
|
|
|
+ except:
|
|
|
+ return False
|
|
|
+
|
|
|
def listRemoteDir(self,dirUrl):
|
|
|
r=MethodRequest(dirUrl,method="PROPFIND")
|
|
|
PROPFIND=u"""<?xml version="1.0" encoding="utf-8"?>\n
|
|
@@ -387,6 +410,24 @@ class labkeyURIHandler(slicer.vtkURIHandler):
|
|
|
remotePath=self.GetLabkeyWebdavUrl()+'/'+labkeyPath
|
|
|
self.put(remotePath,data)
|
|
|
|
|
|
+ def copyFileToRemote(self,localPath, remotePath):
|
|
|
+ #get upstream directories sorted out
|
|
|
+
|
|
|
+ labkeyDir=os.path.dirname(remotePath)
|
|
|
+ if not self.remoteDirExists(labkeyDir):
|
|
|
+ if not self.mkdirs(labkeyDir):
|
|
|
+ errorCode="UploadFile: Could not create directory {}"
|
|
|
+ print errorCode.format(labkeyDir)
|
|
|
+ return False
|
|
|
+
|
|
|
+ #make an URL request
|
|
|
+ if (self.isDir(remotePath)):
|
|
|
+ remotePath=remotePath+'/'+os.path.basename(localPath)
|
|
|
+
|
|
|
+ with open(localPath, 'r') as f:
|
|
|
+ data=f.read()
|
|
|
+ self.put(remotePath,data)
|
|
|
+
|
|
|
def loadDir(self, path):
|
|
|
#dirURL=serverUrl+"/labkey/_webdav/"+path
|
|
|
files=self.listDir(path)
|
|
@@ -397,7 +438,7 @@ class labkeyURIHandler(slicer.vtkURIHandler):
|
|
|
fdir=os.path.dirname(self.GetFile(f))
|
|
|
except:
|
|
|
#fails if there is a subdirectory; go recursively
|
|
|
- self.readDir(f)
|
|
|
+ print "self.readDir(f) not implemented"
|
|
|
return fdir
|
|
|
|
|
|
def loadDataset(self,project,dataset):
|
|
@@ -405,6 +446,16 @@ class labkeyURIHandler(slicer.vtkURIHandler):
|
|
|
url+='/query-selectRows.api?schemaName=study&query.queryName='+dataset
|
|
|
return json.load(self.get(url))
|
|
|
|
|
|
+ def filterDataset(self,project,dataset,variable,value,oper="eq"):
|
|
|
+ debug=True
|
|
|
+ url=self.GetLabkeyUrl()+'/'+project
|
|
|
+ url+='/query-selectRows.api?schemaName=study&query.queryName='+dataset
|
|
|
+ url+="&query."+variable+"~"+oper+"="+value
|
|
|
+ if debug:
|
|
|
+ print "Sending {}".format(url)
|
|
|
+ return json.load(self.get(url))
|
|
|
+
|
|
|
+
|
|
|
def modifyDataset(self,method,project,dataset,rows):
|
|
|
#method can be insert or update
|
|
|
data={}
|