Skip to content

Commit 367dd30

Browse files
committed
Canvas: Upon startup, check for updates
1 parent 9a2b237 commit 367dd30

3 files changed

Lines changed: 74 additions & 24 deletions

File tree

Orange/canvas/__main__.py

Lines changed: 65 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import sys
88
import gc
99
import re
10+
import time
1011
import logging
1112
from logging.handlers import RotatingFileHandler
1213
import optparse
@@ -85,6 +86,67 @@ def make_sql_logger(level=logging.INFO):
8586
sql_log.addHandler(handler)
8687

8788

89+
def show_survey():
90+
# If run for the first time, open a browser tab with a survey
91+
settings = QSettings()
92+
show_survey = settings.value("startup/show-survey", True, type=bool)
93+
if show_survey:
94+
question = QMessageBox(
95+
QMessageBox.Question,
96+
'Orange Survey',
97+
'We would like to know more about how our software is used.\n\n'
98+
'Would you care to fill our short 1-minute survey?',
99+
QMessageBox.Yes | QMessageBox.No)
100+
question.setDefaultButton(QMessageBox.Yes)
101+
later = question.addButton('Ask again later', QMessageBox.NoRole)
102+
question.setEscapeButton(later)
103+
104+
def handle_response(result):
105+
if result == QMessageBox.Yes:
106+
success = QDesktopServices.openUrl(
107+
QUrl("https://orange.biolab.si/survey/short.html"));
108+
settings.setValue("startup/show-survey", not success)
109+
else:
110+
settings.setValue("startup/show-survey", result != QMessageBox.No)
111+
112+
question.finished.connect(handle_response)
113+
question.show()
114+
return question
115+
116+
117+
def check_for_updates():
118+
settings = QSettings()
119+
check_updates = settings.value('startup/check-updates', True, type=bool)
120+
last_check_time = settings.value('startup/last-update-check-time', 0, type=int)
121+
ONE_DAY = 86400
122+
if check_updates and time.time() - last_check_time > ONE_DAY:
123+
settings.setValue('startup/last-update-check-time', int(time.time()))
124+
from urllib.request import urlopen
125+
from distutils.version import LooseVersion
126+
from Orange.version import version as current
127+
try:
128+
latest = urlopen('https://orange.biolab.si/version', timeout=2).read().decode()
129+
except OSError:
130+
log.exception('Failed to check for updates')
131+
else:
132+
if LooseVersion(latest) > LooseVersion(current):
133+
question = QMessageBox(
134+
QMessageBox.Information,
135+
'Orange Update Available',
136+
'A newer version of Orange is available.<br><br>'
137+
'<b>Current version:</b> {}<br>'
138+
'<b>Latest version:</b> {}'.format(current, latest),
139+
textFormat=Qt.RichText,
140+
accepted=lambda: QDesktopServices.openUrl(
141+
QUrl("https://orange.biolab.si/download/")))
142+
question.setDefaultButton(
143+
question.addButton('Download Now', question.AcceptRole))
144+
question.setEscapeButton(
145+
question.addButton('Remind Later', question.RejectRole))
146+
question.show()
147+
return question
148+
149+
88150
def main(argv=None):
89151
if argv is None:
90152
argv = sys.argv
@@ -328,29 +390,9 @@ def show_message(message):
328390
open_requests[-1])
329391
canvas_window.load_scheme(open_requests[-1].toLocalFile())
330392

331-
# If run for the first time, open a browser tab with a survey
332-
show_survey = settings.value("startup/show-survey", True, type=bool)
333-
if show_survey:
334-
question = QMessageBox(
335-
QMessageBox.Question,
336-
'Orange Survey',
337-
'We would like to know more about how our software is used.\n\n'
338-
'Would you care to fill our short 1-minute survey?',
339-
QMessageBox.Yes | QMessageBox.No)
340-
question.setDefaultButton(QMessageBox.Yes)
341-
later = question.addButton('Ask again later', QMessageBox.NoRole)
342-
question.setEscapeButton(later)
343-
344-
def handle_response(result):
345-
if result == QMessageBox.Yes:
346-
success = QDesktopServices.openUrl(
347-
QUrl("http://orange.biolab.si/survey/short.html"));
348-
settings.setValue("startup/show-survey", not success)
349-
else:
350-
settings.setValue("startup/show-survey", result != QMessageBox.No)
351-
352-
question.finished.connect(handle_response)
353-
question.show()
393+
# local references prevent destruction
394+
_ = show_survey()
395+
__ = check_for_updates()
354396

355397
# Tee stdout and stderr into Output dock
356398
log_view = canvas_window.log_view()

Orange/canvas/application/settings.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,13 +303,18 @@ def __setupUi(self):
303303
objectName="show-splash-screen")
304304

305305
cb_welcome = QCheckBox(self.tr("Show welcome screen"), self,
306-
objectName="show-welcome-screen")
306+
objectName="show-welcome-screen")
307+
308+
cb_updates = QCheckBox(self.tr("Check for updates"), self,
309+
objectName="check-updates")
307310

308311
self.bind(cb_splash, "checked", "startup/show-splash-screen")
309312
self.bind(cb_welcome, "checked", "startup/show-welcome-screen")
313+
self.bind(cb_updates, "checked", "startup/check-updates")
310314

311315
startup.layout().addWidget(cb_splash)
312316
startup.layout().addWidget(cb_welcome)
317+
startup.layout().addWidget(cb_updates)
313318

314319
form.addRow(self.tr("On startup"), startup)
315320

Orange/canvas/config.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ def init():
5555
("startup/show-welcome-screen", bool, True,
5656
"Show Welcome screen at startup"),
5757

58+
("startup/check-updates", bool, True,
59+
"Check for updates"),
60+
5861
("stylesheet", str, "orange",
5962
"QSS stylesheet to use"),
6063

0 commit comments

Comments
 (0)