Przeglądaj źródła

Adding parseConfig to slicerNetwork for quick uploading of predefined server settings

Andrej Studen 6 lat temu
rodzic
commit
47cf27f4ac

+ 2 - 2
labkeySlicerPythonExtension/labkeySlicerPythonExtension.py

@@ -109,7 +109,7 @@ class labkeySlicerPythonExtensionWidget(ScriptedLoadableModuleWidget):
     fileDialogFormLayout = qt.QFormLayout(fileDialogCollapsibleButton)
 
     #add item list for each found file/directory
-    self.fileList=qt.QListWidget(parent=self)
+    self.fileList=qt.QListWidget()
     self.fileList.toolTip="Select remote file"
     self.fileList.itemDoubleClicked.connect(self.onFileListDoubleClicked)
     self.currentRemoteDir=''
@@ -121,7 +121,7 @@ class labkeySlicerPythonExtensionWidget(ScriptedLoadableModuleWidget):
     fileDialogFormLayout.addWidget(self.fileList)
 
     #add selected file display
-    self.selectedFile=qt.QLineEdit(parent=self)
+    self.selectedFile=qt.QLineEdit("")
     self.selectedFile.toolTip="Selected file"
 
     fileDialogFormLayout.addRow("Selected file :",self.selectedFile)

+ 61 - 18
labkeySlicerPythonExtension/slicerNetwork.py

@@ -10,6 +10,7 @@ import shutil
 import distutils
 import os
 import base64
+import json
 
 #see https://gist.github.com/logic/2715756, allow requests to do Put
 class MethodRequest(urllib2.Request):
@@ -27,9 +28,8 @@ class MethodRequest(urllib2.Request):
         return urllib2.Request.get_method(self, *args, **kwargs)
 
 class slicerNetwork:
-    def __init__(self,parent):
-        parent.title = "slicerNetwork"
-        self.parent=parent
+    def __init__(self, *args, **kwargs):
+        pass
 
 class labkeyURIHandler(slicer.vtkURIHandler):
     def __init__(self):
@@ -65,7 +65,10 @@ class labkeyURIHandler(slicer.vtkURIHandler):
         return self.localCacheDirectory
 
     def GetLabkeyUrl(self):
-        return self.hostname+"/labkey/_webdav"
+        return self.hostname+"/labkey"
+
+    def GetLabkeyWebdavUrl(self):
+        return self.GetLabkeyUrl()+"/_webdav"
 
     def GetLocalPath(self,source):
         debug=False
@@ -77,7 +80,7 @@ class labkeyURIHandler(slicer.vtkURIHandler):
         return os.path.join(self.localCacheDirectory,relativePath)
 
     def GetRemotePath(self,source):
-        return self.GetLabkeyUrl()+"/"+GetLabkeyPathFromLocalPath(source)
+        return self.GetLabkeyWebdavUrl()+"/"+GetLabkeyPathFromLocalPath(source)
 
     def GetLabkeyPathFromLocalPath(self,f):
         #report it with URL separator, forward-slash
@@ -95,7 +98,8 @@ class labkeyURIHandler(slicer.vtkURIHandler):
     def GetLabkeyPathFromRemotePath(self,f):
         #used to query labkey stuff, so URL separator is used
         f=re.sub('labkey://','',f)
-        f=re.sub(self.GetLabkeyUrl(),'',f)
+        f=re.sub(self.GetLabkeyWebdavUrl(),'',f)
+
         if f[0]=='/':
             f=f[1:len(f)]
         return f;
@@ -115,11 +119,9 @@ class labkeyURIHandler(slicer.vtkURIHandler):
         remote=self.readFile(self.hostname,labkeyPath)
         #make all necessary directories
         path=os.path.dirname(dest)
-        try:
+        if not os.path.isdir(path):
             os.makedirs(path)
-        except:
-            if not os.path.isdir(path):
-                raise
+
         local=open(dest,'wb')
         #make sure we are at the begining of the file
 
@@ -164,6 +166,7 @@ class labkeyURIHandler(slicer.vtkURIHandler):
         return self.loadNodeFromFile(filename,filetype, properties,returnNode)
     #add others if needed
 
+    ## setup & initialization routines
 
     def configureSSL(self,cert,key,pwd,cacert):
         #do this first
@@ -201,11 +204,33 @@ class labkeyURIHandler(slicer.vtkURIHandler):
         cookie_handler=urllib2.HTTPCookieProcessor(cj)
         self.opener=urllib2.build_opener(https_handler,cookie_handler)
 
+    def parseConfig(self,fname):
+        try:
+            f=open(fname)
+        except OSError as e:
+            print "Confgiuration error: OS error({0}): {1}".format(e.errno, e.strerror)
+            return
+
+        dt=json.load(f)
+        if dt.has_key('SSL'):
+            self.configureSSL(
+                dt['SSL']['user'],
+                dt['SSL']['key'],
+                dt['SSL']['keyPwd'],
+                dt['SSL']['ca']
+                )
+        self.hostname=dt['host']
+        self.auth_name=dt['labkey']['user']
+        self.auth_pass=dt['labkey']['password']
+        
+
+
     #cj in opener contains the cookies
 
     def get(self,url):
 
         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)
@@ -217,15 +242,18 @@ class labkeyURIHandler(slicer.vtkURIHandler):
         r=urllib2.Request(url)
         #makes it a post
         r.add_data(data)
-        r.add_header("content-type","application/json")
+        r.add_header("Content-Type","application/json")
         base64string = base64.b64encode('%s:%s' % (self.auth_name, self.auth_pass))
         r.add_header("Authorization", "Basic %s" % base64string)
-
-        f=self.opener.open(r)
+        print "{}: {}".format(r.get_method(),r.get_full_url())
+        print "data: {}".format(r.get_data())
+        print "Content-Type: {}".format(r.get_header('Content-Type'))
+        return self.opener.open(r)
         #f contains json as a return value
 
     def put(self,url,data):
 
+        print "PUT: {0}".format(url)
         r=MethodRequest(url,method="PUT")
         #makes it a post
         r.add_data(data)
@@ -233,7 +261,7 @@ class labkeyURIHandler(slicer.vtkURIHandler):
         base64string = base64.b64encode('%s:%s' % (self.auth_name, self.auth_pass))
         r.add_header("Authorization", "Basic %s" % base64string)
 
-        f=self.opener.open(r)
+        return self.opener.open(r)
         #f contains json as a return value
 
     def remoteDirExists(self,url):
@@ -261,7 +289,7 @@ class labkeyURIHandler(slicer.vtkURIHandler):
             if s1<0:
                 break
             path=labkeyPath[0:s1]
-            remotePath=self.GetLabkeyUrl()+'/'+path
+            remotePath=self.GetLabkeyWebdavUrl()+'/'+path
             dirExists=self.remoteDirExists(remotePath)
             if not dirExists:
                 if not self.mkdir(remotePath):
@@ -284,7 +312,7 @@ class labkeyURIHandler(slicer.vtkURIHandler):
 
     def listDir(self,dir):
         print "Listing for {0}".format(dir)
-        dirUrl=self.GetLabkeyUrl()+"/"+dir
+        dirUrl=self.GetLabkeyWebdavUrl()+"/"+dir
         status,dirs=self.listRemoteDir(dirUrl)
         return dirs
 
@@ -342,7 +370,7 @@ class labkeyURIHandler(slicer.vtkURIHandler):
             print errorCode.format(localPath)
             return False
         labkeyDir=labkeyPath[0:labkeyPath.rfind('/')]
-        remoteDir=self.GetLabkeyUrl()+'/'+labkeyDir
+        remoteDir=self.GetLabkeyWebdavUrl()+'/'+labkeyDir
         if not self.remoteDirExists(remoteDir):
             if not self.mkdirs(remoteDir):
                 errorCode="UploadFile: Could not create directory {}"
@@ -352,7 +380,7 @@ class labkeyURIHandler(slicer.vtkURIHandler):
         #make an URL request
         with open(localPath, 'r') as f:
             data=f.read()
-        remotePath=self.GetLabkeyUrl()+'/'+labkeyPath
+        remotePath=self.GetLabkeyWebdavUrl()+'/'+labkeyPath
         self.put(remotePath,data)
 
     def loadDir(self, path):
@@ -367,3 +395,18 @@ class labkeyURIHandler(slicer.vtkURIHandler):
                 #fails if there is a subdirectory; go recursively
                 self.readDir(f)
         return fdir
+
+    def loadDataset(self,project,dataset):
+        url=self.GetLabkeyUrl()+'/'+project
+        url+='/query-selectRows.api?schemaName=study&query.queryName='+dataset
+        return json.load(self.get(url))
+
+    def modifyDataset(self,method,project,dataset,rows):
+        #method can be insert or update
+        data={}
+        data['schemaName']='study'
+        data['queryName']=dataset
+        data['rows']=rows
+        url=self.GetLabkeyUrl()+'/'+project
+        url+='/query-'+method+'Rows.api?'
+        return self.post(url,json.dumps(data))