Commit 5dfc22d66d8fa7234eb10ee8093def4ad17295f4
1 parent
d6cdcade
Exists in
master
and in
65 other branches
ENH: updater added
Showing
6 changed files
with
88 additions
and
5 deletions
Show diff stats
invesalius/constants.py
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 | ... | ... |