Commit d1e760d07520a41842b80cfbc1703cbe718d93e6

Authored by ruppert
Committed by Thiago Franco de Moraes
1 parent db7ede7c
Exists in beta4 and in 1 other branch beta3

ENH: updater added

invesalius/constants.py
@@ -24,6 +24,7 @@ import wx @@ -24,6 +24,7 @@ import wx
24 24
25 from project import Project 25 from project import Project
26 26
  27 +INVESALIUS_VERSION = "3.0 beta 3"
27 28
28 #--------------- 29 #---------------
29 30
invesalius/control.py
@@ -59,9 +59,6 @@ class Controller(): @@ -59,9 +59,6 @@ class Controller():
59 59
60 Publisher.sendMessage('Load Preferences') 60 Publisher.sendMessage('Load Preferences')
61 61
62 - # Check for updates  
63 - #subprocess.Popen([sys.executable, 'update.py' ,ses.Session().language])  
64 -  
65 def __bind_events(self): 62 def __bind_events(self):
66 Publisher.subscribe(self.OnImportMedicalImages, 'Import directory') 63 Publisher.subscribe(self.OnImportMedicalImages, 'Import directory')
67 Publisher.subscribe(self.OnShowDialogImportDirectory, 64 Publisher.subscribe(self.OnShowDialogImportDirectory,
invesalius/invesalius.py
@@ -55,6 +55,7 @@ import utils @@ -55,6 +55,7 @@ import utils
55 55
56 # ------------------------------------------------------------------ 56 # ------------------------------------------------------------------
57 57
  58 +
58 class InVesalius(wx.App): 59 class InVesalius(wx.App):
59 """ 60 """
60 InVesalius wxPython application class. 61 InVesalius wxPython application class.
@@ -299,6 +300,12 @@ if __name__ == '__main__': @@ -299,6 +300,12 @@ if __name__ == '__main__':
299 # import modules as they were on root invesalius folder 300 # import modules as they were on root invesalius folder
300 sys.path.append(".") 301 sys.path.append(".")
301 302
  303 + # Check for updates
  304 + from multiprocessing import Process
  305 + p = Process(target=utils.UpdateCheck, args=())
  306 + p.daemon=True
  307 + p.start()
  308 +
302 # Init application 309 # Init application
303 main() 310 main()
304 311
invesalius/project.py
@@ -210,7 +210,7 @@ class Project(object): @@ -210,7 +210,7 @@ class Project(object):
210 project = { 210 project = {
211 # Format info 211 # Format info
212 "format_version": 1, 212 "format_version": 1,
213 - "invesalius_version": "invesalius3b3", 213 + "invesalius_version": const.INVESALIUS_VERSION,
214 "date": datetime.datetime.now().isoformat(), 214 "date": datetime.datetime.now().isoformat(),
215 215
216 # case info 216 # case info
invesalius/session.py
@@ -28,6 +28,7 @@ import time @@ -28,6 +28,7 @@ import time
28 from wx.lib.pubsub import pub as Publisher 28 from wx.lib.pubsub import pub as Publisher
29 29
30 from utils import Singleton, debug 30 from utils import Singleton, debug
  31 +from random import randint
31 32
32 class Session(object): 33 class Session(object):
33 # Only one session will be initialized per time. Therefore, we use 34 # Only one session will be initialized per time. Therefore, we use
@@ -63,6 +64,9 @@ class Session(object): @@ -63,6 +64,9 @@ class Session(object):
63 # GUI language 64 # GUI language
64 self.language = "" # "pt_BR", "es" 65 self.language = "" # "pt_BR", "es"
65 66
  67 + self.random_id = randint(0,pow(10,16))
  68 + print self.random_id
  69 +
66 # Recent projects list 70 # Recent projects list
67 self.recent_projects = [(const.SAMPLE_DIR, "Cranium.inv3")] 71 self.recent_projects = [(const.SAMPLE_DIR, "Cranium.inv3")]
68 self.last_dicom_folder = '' 72 self.last_dicom_folder = ''
@@ -151,6 +155,7 @@ class Session(object): @@ -151,6 +155,7 @@ class Session(object):
151 config.set('session', 'status', self.project_status) 155 config.set('session', 'status', self.project_status)
152 config.set('session','debug', self.debug) 156 config.set('session','debug', self.debug)
153 config.set('session', 'language', self.language) 157 config.set('session', 'language', self.language)
  158 + config.set('session', 'random_id', self.random_id)
154 config.set('session', 'surface_interpolation', self.surface_interpolation) 159 config.set('session', 'surface_interpolation', self.surface_interpolation)
155 config.set('session', 'rendering', self.rendering) 160 config.set('session', 'rendering', self.rendering)
156 161
@@ -194,6 +199,12 @@ class Session(object): @@ -194,6 +199,12 @@ class Session(object):
194 def SetLanguage(self, language): 199 def SetLanguage(self, language):
195 self.language = language 200 self.language = language
196 201
  202 + def GetRandomId(self):
  203 + return self.random_id
  204 +
  205 + def SetRandomId(self, random_id):
  206 + self.random_id = random_id
  207 +
197 def GetLastDicomFolder(self): 208 def GetLastDicomFolder(self):
198 return self.last_dicom_folder 209 return self.last_dicom_folder
199 210
@@ -214,6 +225,19 @@ class Session(object): @@ -214,6 +225,19 @@ class Session(object):
214 ConfigParser.MissingSectionHeaderError): 225 ConfigParser.MissingSectionHeaderError):
215 return False 226 return False
216 227
  228 + def ReadRandomId(self):
  229 + config = ConfigParser.ConfigParser()
  230 + home_path = os.path.expanduser('~')
  231 + path = os.path.join(home_path ,'.invesalius', 'config.cfg')
  232 + try:
  233 + config.read(path)
  234 + self.random_id = config.get('session','random_id')
  235 + return self.random_id
  236 + except (ConfigParser.NoSectionError,
  237 + ConfigParser.NoOptionError,
  238 + ConfigParser.MissingSectionHeaderError):
  239 + return False
  240 +
217 def ReadSession(self): 241 def ReadSession(self):
218 config = ConfigParser.ConfigParser() 242 config = ConfigParser.ConfigParser()
219 home_path = os.path.expanduser('~') 243 home_path = os.path.expanduser('~')
@@ -224,6 +248,7 @@ class Session(object): @@ -224,6 +248,7 @@ class Session(object):
224 self.project_status = config.get('session', 'status') 248 self.project_status = config.get('session', 'status')
225 self.debug = config.get('session','debug') 249 self.debug = config.get('session','debug')
226 self.language = config.get('session','language') 250 self.language = config.get('session','language')
  251 + self.random_id = config.get('session','random_id')
227 252
228 self.recent_projects = eval(config.get('project','recent_projects')) 253 self.recent_projects = eval(config.get('project','recent_projects'))
229 self.homedir = config.get('paths','homedir') 254 self.homedir = config.get('paths','homedir')
@@ -248,7 +273,8 @@ class Session(object): @@ -248,7 +273,8 @@ class Session(object):
248 #Added to fix new version compatibility 273 #Added to fix new version compatibility
249 self.surface_interpolation = 0 274 self.surface_interpolation = 0
250 self.rendering = 0 275 self.rendering = 0
251 - 276 + self.random_id = randint(0,pow(10,16))
  277 +
252 self.CreateSessionFile() 278 self.CreateSessionFile()
253 return True 279 return True
254 280
@@ -281,6 +307,7 @@ class WriteSession(Thread): @@ -281,6 +307,7 @@ class WriteSession(Thread):
281 config.set('session', 'status', self.session.project_status) 307 config.set('session', 'status', self.session.project_status)
282 config.set('session','debug', self.session.debug) 308 config.set('session','debug', self.session.debug)
283 config.set('session', 'language', self.session.language) 309 config.set('session', 'language', self.session.language)
  310 + config.set('session', 'random_id', self.session.random_id)
284 config.set('session', 'surface_interpolation', self.session.surface_interpolation) 311 config.set('session', 'surface_interpolation', self.session.surface_interpolation)
285 config.set('session', 'rendering', self.session.rendering) 312 config.set('session', 'rendering', self.session.rendering)
286 313
invesalius/utils.py
@@ -366,4 +366,55 @@ def get_system_encoding(): @@ -366,4 +366,55 @@ def get_system_encoding():
366 366
367 367
368 368
  369 +def UpdateCheck():
  370 + import urllib
  371 + import urllib2
  372 + print "Checking updates..."
  373 +
  374 + # Check if there is a language set
  375 + import i18n
  376 + import session as ses
  377 + session = ses.Session()
  378 + install_lang = 0
  379 + if session.ReadLanguage():
  380 + lang = session.GetLanguage()
  381 + if (lang != "False"):
  382 + _ = i18n.InstallLanguage(lang)
  383 + install_lang = 1
  384 + if (install_lang==0):
  385 + return
  386 + if session.ReadRandomId():
  387 + random_id = session.GetRandomId()
  388 +
  389 + # Fetch update data from server
  390 + import constants as const
  391 + url = "http://www.cti.gov.br/dt3d/invesalius/update/checkupdate.php"
  392 + headers = { 'User-Agent' : 'Mozilla/5.0 (compatible; MSIE 5.5; Windows NT)' }
  393 + data = {'update_protocol_version' : '1',
  394 + 'invesalius_version' : const.INVESALIUS_VERSION,
  395 + 'platform' : sys.platform,
  396 + 'architecture' : platform.architecture()[0],
  397 + 'language' : lang,
  398 + 'random_id' : random_id }
  399 + data = urllib.urlencode(data)
  400 + req = urllib2.Request(url, data, headers)
  401 + response = urllib2.urlopen(req)
  402 + last = response.readline().rstrip()
  403 + url = response.readline().rstrip()
  404 + if (last!=const.INVESALIUS_VERSION+"1"):
  405 + print " ...New update found!!! -> version:", last #, ", url=",url
  406 + from time import sleep
  407 + sleep(2)
  408 + import wx
  409 + app=wx.App()
  410 + import i18n
  411 + _ = i18n.InstallLanguage(lang)
  412 + msg=_("A new version of InVesalius is available. Do you want to open the download website now?")
  413 + title=_("Invesalius Update")
  414 + msgdlg = wx.MessageDialog(None,msg,title, wx.YES_NO | wx.ICON_INFORMATION)
  415 + if (msgdlg.ShowModal()==wx.ID_YES):
  416 + wx.LaunchDefaultBrowser(url)
  417 + msgdlg.Destroy()
  418 + app.MainLoop()
  419 +
369 420