Skip to content

Commit d8cf57d

Browse files
authored
Merge pull request #6454 from ales-erjavec/owsave-auto-save-disable-warning
[ENH] owsavebase: Display a warning when auto save is disabled
2 parents 78a8d71 + d6aa613 commit d8cf57d

File tree

3 files changed

+41
-5
lines changed

3 files changed

+41
-5
lines changed

Orange/canvas/run.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,14 @@
1414
# Imported to make webwidget addons work
1515
from Orange.widgets.utils.webview import WebviewWidget # pylint: disable=unused-import
1616

17+
LOG_LEVELS = [
18+
logging.CRITICAL + 10,
19+
logging.CRITICAL,
20+
logging.ERROR,
21+
logging.WARN,
22+
logging.INFO,
23+
logging.DEBUG
24+
]
1725

1826
def main(argv=None):
1927
app = QApplication(list(argv) if argv else [])
@@ -28,13 +36,13 @@ def main(argv=None):
2836
)
2937
)
3038
parser.add_argument("--log-level", "-l", metavar="LEVEL", type=int,
31-
default=logging.CRITICAL, dest="log_level")
39+
default=3, dest="log_level")
3240
parser.add_argument("--config", default="Orange.canvas.config.Config",
3341
type=str)
3442
parser.add_argument("file")
3543
args = parser.parse_args(argv[1:])
3644

37-
log_level = args.log_level
45+
log_level = LOG_LEVELS[args.log_level]
3846
filename = args.file
3947
logging.basicConfig(level=log_level)
4048

@@ -71,6 +79,9 @@ def on_finished():
7179
if msg.contents and msg.severity == msg.Error:
7280
print(msg.contents, msg.message_id, file=sys.stderr)
7381
severity = msg.Error
82+
elif msg.contents and msg.severity == msg.Warning and \
83+
log_level <= logging.WARNING:
84+
print(msg.contents, file=sys.stderr)
7485
if severity == UserMessage.Error:
7586
app.exit(1)
7687
else:

Orange/widgets/utils/save/owsavebase.py

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,14 @@ class OWSaveBase(widget.OWWidget, openclass=True):
4141
class Information(widget.OWWidget.Information):
4242
empty_input = widget.Msg("Empty input; nothing was saved.")
4343

44+
class Warning(widget.OWWidget.Warning):
45+
auto_save_disabled = widget.Msg(
46+
"Auto save disabled.\n"
47+
"Due to security reasons auto save is only restored for paths "
48+
"that are in the same directory as the workflow file or in a "
49+
"subtree of that directory."
50+
)
51+
4452
class Error(widget.OWWidget.Error):
4553
no_file_name = widget.Msg("File name is not set.")
4654
unsupported_format = widget.Msg("File format is unsupported.\n{}")
@@ -59,7 +67,7 @@ class Error(widget.OWWidget.Error):
5967
# workflow).
6068
stored_path = Setting("")
6169
stored_name = Setting("", schema_only=True) # File name, without path
62-
auto_save = Setting(False)
70+
auto_save = Setting(False, schema_only=True)
6371

6472
filters = []
6573

@@ -77,6 +85,7 @@ def __init__(self, start_row=0):
7785
"""
7886
super().__init__()
7987
self.data = None
88+
self.__show_auto_save_disabled = False
8089
self._absolute_path = self._abs_path_from_setting()
8190

8291
# This cannot be done outside because `filters` is defined by subclass
@@ -88,7 +97,7 @@ def __init__(self, start_row=0):
8897
grid.addWidget(
8998
gui.checkBox(
9099
None, self, "auto_save", "Autosave when receiving new data",
91-
callback=self.update_messages),
100+
callback=self._on_auto_save_toggled),
92101
start_row, 0, 1, 2)
93102
self.bt_save = gui.button(
94103
self.buttonsArea, self,
@@ -129,7 +138,7 @@ def _abs_path_from_setting(self):
129138
workflow_dir = self.workflowEnv().get("basedir")
130139
if os.path.isabs(self.stored_path):
131140
if os.path.exists(self.stored_path):
132-
self.auto_save = False
141+
self._disable_auto_save_and_warn()
133142
return self.stored_path
134143
elif workflow_dir is not None:
135144
return os.path.normpath(
@@ -139,6 +148,15 @@ def _abs_path_from_setting(self):
139148
self.auto_save = False
140149
return self.stored_path
141150

151+
def _disable_auto_save_and_warn(self):
152+
if self.auto_save:
153+
self.__show_auto_save_disabled = True
154+
self.auto_save = False
155+
156+
def _on_auto_save_toggled(self):
157+
self.__show_auto_save_disabled = False
158+
self.update_messages()
159+
142160
@property
143161
def filename(self):
144162
if self.stored_name:
@@ -264,6 +282,7 @@ def update_messages(self):
264282
"""
265283
self.Error.no_file_name(shown=not self.filename and self.auto_save)
266284
self.Information.empty_input(shown=self.filename and self.data is None)
285+
self.Warning.auto_save_disabled(shown=self.__show_auto_save_disabled)
267286

268287
def update_status(self):
269288
"""

Orange/widgets/utils/save/tests/test_owsavebase.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ def test_open_moved_workflow(self):
157157
self.assertPathEqual(w.last_dir, "/home/u/orange/a/b")
158158
self.assertPathEqual(w.filename, "/home/u/orange/a/b/c.foo")
159159
self.assertTrue(w.auto_save)
160+
self.assertFalse(w.Warning.auto_save_disabled.is_shown())
160161

161162
w = self.create_widget(
162163
self.OWSaveMockWriter,
@@ -166,6 +167,7 @@ def test_open_moved_workflow(self):
166167
self.assertPathEqual(w.last_dir, "/home/u/orange/a/b")
167168
self.assertPathEqual(w.filename, "/home/u/orange/a/b/c.foo")
168169
self.assertFalse(w.auto_save)
170+
self.assertFalse(w.Warning.auto_save_disabled.is_shown())
169171

170172
w = self.create_widget(
171173
self.OWSaveMockWriter,
@@ -175,6 +177,7 @@ def test_open_moved_workflow(self):
175177
self.assertPathEqual(w.last_dir, "/home/u/orange/a/d")
176178
self.assertPathEqual(w.filename, "/home/u/orange/a/d/c.foo")
177179
self.assertTrue(w.auto_save)
180+
self.assertFalse(w.Warning.auto_save_disabled.is_shown())
178181

179182
w = self.create_widget(
180183
self.OWSaveMockWriter,
@@ -184,6 +187,7 @@ def test_open_moved_workflow(self):
184187
self.assertPathEqual(w.last_dir, "/home/u/orange/")
185188
self.assertPathEqual(w.filename, "/home/u/orange/c.foo")
186189
self.assertFalse(w.auto_save)
190+
self.assertFalse(w.Warning.auto_save_disabled.is_shown())
187191

188192
w = self.create_widget(
189193
self.OWSaveMockWriter,
@@ -193,6 +197,7 @@ def test_open_moved_workflow(self):
193197
self.assertPathEqual(w.last_dir, "/home/u/orange/")
194198
self.assertPathEqual(w.filename, "/home/u/orange/c.foo")
195199
self.assertTrue(w.auto_save)
200+
self.assertFalse(w.Warning.auto_save_disabled.is_shown())
196201

197202
w = self.create_widget(
198203
self.OWSaveMockWriter,
@@ -202,6 +207,7 @@ def test_open_moved_workflow(self):
202207
self.assertPathEqual(w.last_dir, "/home/u/orange/")
203208
self.assertPathEqual(w.filename, "/home/u/orange/c.foo")
204209
self.assertTrue(w.auto_save)
210+
self.assertFalse(w.Warning.auto_save_disabled.is_shown())
205211

206212
def test_move_workflow(self):
207213
"""Widget correctly stores relative paths"""

0 commit comments

Comments
 (0)