Commit 5dfc22d66d8fa7234eb10ee8093def4ad17295f4

Authored by ruppert
1 parent d6cdcade

ENH: updater added

invesalius/constants.py
... ... @@ -24,6 +24,7 @@ import wx
24 24  
25 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 59  
60 60 Publisher.sendMessage('Load Preferences')
61 61  
62   - # Check for updates
63   - #subprocess.Popen([sys.executable, 'update.py' ,ses.Session().language])
64   -
65 62 def __bind_events(self):
66 63 Publisher.subscribe(self.OnImportMedicalImages, 'Import directory')
67 64 Publisher.subscribe(self.OnShowDialogImportDirectory,
... ...
invesalius/invesalius.py
... ... @@ -55,6 +55,7 @@ import utils
55 55  
56 56 # ------------------------------------------------------------------
57 57  
  58 +
58 59 class InVesalius(wx.App):
59 60 """
60 61 InVesalius wxPython application class.
... ... @@ -299,6 +300,12 @@ if __name__ == '__main__':
299 300 # import modules as they were on root invesalius folder
300 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 309 # Init application
303 310 main()
304 311  
... ...
invesalius/project.py
... ... @@ -210,7 +210,7 @@ class Project(object):
210 210 project = {
211 211 # Format info
212 212 "format_version": 1,
213   - "invesalius_version": "invesalius3b3",
  213 + "invesalius_version": const.INVESALIUS_VERSION,
214 214 "date": datetime.datetime.now().isoformat(),
215 215  
216 216 # case info
... ...
invesalius/session.py
... ... @@ -28,6 +28,7 @@ import time
28 28 from wx.lib.pubsub import pub as Publisher
29 29  
30 30 from utils import Singleton, debug
  31 +from random import randint
31 32  
32 33 class Session(object):
33 34 # Only one session will be initialized per time. Therefore, we use
... ... @@ -63,6 +64,9 @@ class Session(object):
63 64 # GUI language
64 65 self.language = "" # "pt_BR", "es"
65 66  
  67 + self.random_id = randint(0,pow(10,16))
  68 + print self.random_id
  69 +
66 70 # Recent projects list
67 71 self.recent_projects = [(const.SAMPLE_DIR, "Cranium.inv3")]
68 72 self.last_dicom_folder = ''
... ... @@ -151,6 +155,7 @@ class Session(object):
151 155 config.set('session', 'status', self.project_status)
152 156 config.set('session','debug', self.debug)
153 157 config.set('session', 'language', self.language)
  158 + config.set('session', 'random_id', self.random_id)
154 159 config.set('session', 'surface_interpolation', self.surface_interpolation)
155 160 config.set('session', 'rendering', self.rendering)
156 161  
... ... @@ -194,6 +199,12 @@ class Session(object):
194 199 def SetLanguage(self, language):
195 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 208 def GetLastDicomFolder(self):
198 209 return self.last_dicom_folder
199 210  
... ... @@ -214,6 +225,19 @@ class Session(object):
214 225 ConfigParser.MissingSectionHeaderError):
215 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 241 def ReadSession(self):
218 242 config = ConfigParser.ConfigParser()
219 243 home_path = os.path.expanduser('~')
... ... @@ -224,6 +248,7 @@ class Session(object):
224 248 self.project_status = config.get('session', 'status')
225 249 self.debug = config.get('session','debug')
226 250 self.language = config.get('session','language')
  251 + self.random_id = config.get('session','random_id')
227 252  
228 253 self.recent_projects = eval(config.get('project','recent_projects'))
229 254 self.homedir = config.get('paths','homedir')
... ... @@ -248,7 +273,8 @@ class Session(object):
248 273 #Added to fix new version compatibility
249 274 self.surface_interpolation = 0
250 275 self.rendering = 0
251   -
  276 + self.random_id = randint(0,pow(10,16))
  277 +
252 278 self.CreateSessionFile()
253 279 return True
254 280  
... ... @@ -281,6 +307,7 @@ class WriteSession(Thread):
281 307 config.set('session', 'status', self.session.project_status)
282 308 config.set('session','debug', self.session.debug)
283 309 config.set('session', 'language', self.session.language)
  310 + config.set('session', 'random_id', self.session.random_id)
284 311 config.set('session', 'surface_interpolation', self.session.surface_interpolation)
285 312 config.set('session', 'rendering', self.session.rendering)
286 313  
... ...
invesalius/utils.py
... ... @@ -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  
... ...