Преглед изворни кода

Merge branch 'SlicerExtensionIndex' of wiscigt.powertheword.com:andrej.studen/SlicerLabkeyExtension into SlicerExtensionIndex

NIX User пре 4 година
родитељ
комит
8964538d71
2 измењених фајлова са 117 додато и 12 уклоњено
  1. 64 7
      labkeyBrowser/labkeyBrowser.py
  2. 53 5
      labkeyBrowser/slicerNetwork.py

+ 64 - 7
labkeyBrowser/labkeyBrowser.py

@@ -51,7 +51,7 @@ class labkeyBrowserWidget(ScriptedLoadableModuleWidget):
 
 
     connectionFormLayout = qt.QFormLayout(connectionCollapsibleButton)
     connectionFormLayout = qt.QFormLayout(connectionCollapsibleButton)
 
 
-    self.configDir=os.path.join(getHomeDir(),".labkey")
+    self.configDir=os.path.join(os.path.expanduser('~'),".labkey")
 
 
     self.serverURL=qt.QLineEdit("https://merlin.fmf.uni-lj.si")
     self.serverURL=qt.QLineEdit("https://merlin.fmf.uni-lj.si")
     self.serverURL.textChanged.connect(self.updateServerURL)
     self.serverURL.textChanged.connect(self.updateServerURL)
@@ -59,7 +59,7 @@ class labkeyBrowserWidget(ScriptedLoadableModuleWidget):
     #copy initial setting
     #copy initial setting
     self.updateServerURL(self.serverURL.text);
     self.updateServerURL(self.serverURL.text);
 
 
-    self.startDir=os.path.join(getHomeDir(),"temp/crt")
+    self.startDir=os.path.join(os.path.expanduser('~'),"temp/crt")
 
 
     self.userCertButton=qt.QPushButton("Load")
     self.userCertButton=qt.QPushButton("Load")
     self.userCertButton.toolTip="Load user certificate (crt)"
     self.userCertButton.toolTip="Load user certificate (crt)"
@@ -83,8 +83,13 @@ class labkeyBrowserWidget(ScriptedLoadableModuleWidget):
     self.loadConfigButton=qt.QPushButton("Load configuration")
     self.loadConfigButton=qt.QPushButton("Load configuration")
     self.loadConfigButton.toolTip="Load configuration"
     self.loadConfigButton.toolTip="Load configuration"
     self.loadConfigButton.connect('clicked(bool)',self.onLoadConfigButtonClicked)
     self.loadConfigButton.connect('clicked(bool)',self.onLoadConfigButtonClicked)
-    connectionFormLayout.addRow("Connection:",self.loadConfigButton)
+    connectionFormLayout.addRow("Configuration:",self.loadConfigButton)
 
 
+    self.saveConfigButton=qt.QPushButton("Save configuration")
+    self.saveConfigButton.toolTip="Save configuration"
+    self.saveConfigButton.clicked.connect(self.onSaveConfigButtonClicked)
+    connectionFormLayout.addRow("Configuration:",self.saveConfigButton)
+    
     self.initButton=qt.QPushButton("Init")
     self.initButton=qt.QPushButton("Init")
     self.initButton.toolTip="Initialize connection to the server"
     self.initButton.toolTip="Initialize connection to the server"
     self.initButton.connect('clicked(bool)',self.onInitButtonClicked)
     self.initButton.connect('clicked(bool)',self.onInitButtonClicked)
@@ -99,6 +104,9 @@ class labkeyBrowserWidget(ScriptedLoadableModuleWidget):
     self.authPass.textChanged.connect(self.updateAuthPass)
     self.authPass.textChanged.connect(self.updateAuthPass)
     connectionFormLayout.addRow("Labkey password: ", self.authPass)
     connectionFormLayout.addRow("Labkey password: ", self.authPass)
 
 
+    
+
+
     fileDialogCollapsibleButton = ctk.ctkCollapsibleButton()
     fileDialogCollapsibleButton = ctk.ctkCollapsibleButton()
     fileDialogCollapsibleButton.text = "Remote files"
     fileDialogCollapsibleButton.text = "Remote files"
     self.layout.addWidget(fileDialogCollapsibleButton)
     self.layout.addWidget(fileDialogCollapsibleButton)
@@ -240,12 +248,57 @@ class labkeyBrowserWidget(ScriptedLoadableModuleWidget):
   def onLoadConfigButtonClicked(self):
   def onLoadConfigButtonClicked(self):
        filename=qt.QFileDialog.getOpenFileName(None,'Open configuration file (JSON)',
        filename=qt.QFileDialog.getOpenFileName(None,'Open configuration file (JSON)',
             self.configDir, '*.json')
             self.configDir, '*.json')
-       self.network.parseConfig(filename)
-       self.serverURL.setText(self.network.hostname)
-       self.authName.setText(self.network.auth_name)
-       self.authPass.setText(self.network.auth_pass)
+       self.network.parseConfig(filename,self)
+       #self.serverURL.setText(self.network.hostname)
+       #self.authName.setText(self.network.auth_name)
+       #self.authPass.setText(self.network.auth_pass)
 
 
        self.loadConfigButton.setText(os.path.basename(filename))
        self.loadConfigButton.setText(os.path.basename(filename))
+  
+  def onSaveConfigButtonClicked(self):
+      connectionConfig={}
+       
+       #setup SSL
+      if self.privateKeyButton.text=="Load" or\
+        self.userCertButton.text=="Load" or\
+        self.caCertButton.text=="Load":
+            #no ssl
+            pass
+      else:
+            sslSetup={}
+            sslSetup['user']=self.userCertButton.text
+            sslSetup['key']=self.privateKeyButton.text
+            sslSetup['ca']=self.caCertButton.text
+            sslSetup['keyPwd']=self.pwd
+            connectionConfig['SSL']=sslSetup
+      connectionConfig["host"]=self.serverURL.text
+      connectionConfig["context"]="labkey"
+      labkeySetup={}
+      labkeySetup['user']=self.authName.text
+      labkeySetup['password']=self.authPass.text
+      connectionConfig['labkey']=labkeySetup
+
+      orthancSetup={}
+      if self.serverURL.text.find('merlin')>-1:
+            orthancSetup['server']='https://orthanc.fmf.uni-lj.si'
+      if self.serverURL.text.find('onko-nix')>-1:
+            orthancSetup['server']='http://onko-nix.onko-i.si:8042'
+      orthancSetup['user']='ask'
+      orthancSetup['password']='askPassword'
+      connectionConfig['orthanc']=orthancSetup
+
+
+      fhome=os.path.expanduser('~')
+      labkeyDir=os.path.join(fhome,".labkey")
+      if not os.path.isdir(labkeyDir):
+          os.mkdir(labkeyDir)
+      fconfig=os.path.join(labkeyDir,'network.json')
+
+      with open(fconfig,'w') as f:
+            json.dump(connectionConfig,f,indent=3)
+
+      print("Done")
+
 
 
   def onInitButtonClicked(self):
   def onInitButtonClicked(self):
       if self.serverURL.text.find("https")==0:
       if self.serverURL.text.find("https")==0:
@@ -260,6 +313,10 @@ class labkeyBrowserWidget(ScriptedLoadableModuleWidget):
         
         
 
 
       self.network.initRemote()
       self.network.initRemote()
+      if self.network.getCSRF()==None:
+          self.initButton.setStyleSheet("background-color: red")
+      else:
+          self.initButton.setStyleSheet("background-color: green")
 
 
   def updateAuthName(self,txt):
   def updateAuthName(self,txt):
       self.network.auth_name=txt
       self.network.auth_name=txt

+ 53 - 5
labkeyBrowser/slicerNetwork.py

@@ -118,7 +118,7 @@ class labkeyURIHandler(slicer.vtkURIHandler):
             return
             return
         self.initRemote()
         self.initRemote()
 
 
-    def parseConfig(self,fname):
+    def parseConfig(self,fname,parent=None):
         try:
         try:
             f=open(fname)
             f=open(fname)
         except OSError as e:
         except OSError as e:
@@ -134,9 +134,20 @@ class labkeyURIHandler(slicer.vtkURIHandler):
                 dt['SSL']['keyPwd'],
                 dt['SSL']['keyPwd'],
                 dt['SSL']['ca']
                 dt['SSL']['ca']
                 )
                 )
+            if not parent==None:
+                parent.userCertButton.setText(dt['SSL']['user'])
+                parent.caCertButton.setText(dt['SSL']['ca'])
+                parent.privateKeyButton.setText(dt['SSL']['key'])
+                parent.pwd=dt['SSL']['keyPwd']
+
+
         self.hostname=dt['host']
         self.hostname=dt['host']
         self.auth_name=dt['labkey']['user']
         self.auth_name=dt['labkey']['user']
         self.auth_pass=dt['labkey']['password']
         self.auth_pass=dt['labkey']['password']
+        if not parent==None:
+            parent.serverURL.setText(dt['host'])
+            parent.authName.setText(dt['labkey']['user'])
+            parent.authPass.setText(dt['labkey']['password'])
 
 
 
 
     #path convention
     #path convention
@@ -220,6 +231,29 @@ class labkeyURIHandler(slicer.vtkURIHandler):
             print e.code
             print e.code
             print e.read()
             print e.read()
             return e
             return e
+        except urllib2.URLError as e:
+            print("Handling URLError")
+            print e
+            return None
+    
+    #a HEAD request
+    def head(self,url):
+    
+        debug=False
+        if debug:
+            print("HEAD: {0}").format(url)
+            print("as {0}").format(self.auth_name)
+        r=MethodRequest(url.encode('utf-8'),method="HEAD")
+        base64string = base64.b64encode('%s:%s' % (self.auth_name, self.auth_pass))
+        r.add_header("Authorization", "Basic %s" % base64string)
+        try:
+            return self.opener.open(r)
+        #f contains json as a return value
+        except urllib2.HTTPError as e:
+            print e.code
+            print e.read()
+            return e
+
 
 
     def post(self,url,data):
     def post(self,url,data):
 
 
@@ -265,7 +299,12 @@ class labkeyURIHandler(slicer.vtkURIHandler):
 
 
     def getCSRF(self):
     def getCSRF(self):
         url=self.GetLabkeyUrl()+'/login/whoAmI.view'
         url=self.GetLabkeyUrl()+'/login/whoAmI.view'
-        jsonData=json.load(self.get(url))
+        try:
+            jsonData=json.load(self.get(url))
+        except AttributeError:
+            print("Failed")
+            return None
+        
         return jsonData["CSRF"]
         return jsonData["CSRF"]
 
 
 
 
@@ -317,17 +356,26 @@ class labkeyURIHandler(slicer.vtkURIHandler):
         return ('VolumeFile','SegmentationFile','TransformFile')
         return ('VolumeFile','SegmentationFile','TransformFile')
 
 
     #mimic slicer.util.loadNodeFromFile
     #mimic slicer.util.loadNodeFromFile
-    def loadNode(self, relativeName, filetype, properties={},returnNode=False):
+    def loadNode(self, relativeName, filetype, properties={},returnNode=False, keepCached=True):
          #this is the only relevant part - file must be downloaded to cache
          #this is the only relevant part - file must be downloaded to cache
          #labkeyName is just the relative part (from labkey onwards)
          #labkeyName is just the relative part (from labkey onwards)
+         
          localPath=self.DownloadFileToCache(relativeName)
          localPath=self.DownloadFileToCache(relativeName)
-         print localPath
+         
          if not returnNode:
          if not returnNode:
              slicer.util.loadNodeFromFile(localPath,filetype,properties,returnNode=False)
              slicer.util.loadNodeFromFile(localPath,filetype,properties,returnNode=False)
+             if not keepCached:
+                 os.remove(localPath)
              return
              return
+         
          ok,node=slicer.util.loadNodeFromFile(localPath,filetype,properties,returnNode=True)
          ok,node=slicer.util.loadNodeFromFile(localPath,filetype,properties,returnNode=True)
          if ok:
          if ok:
-            return node
+             if not keepCached:
+                 os.remove(localPath)
+             return node
+         
+
+         os.remove(localPath)
          return None
          return None
     #     #remove retrieved file
     #     #remove retrieved file