Skip to content

Commit 9f2aa43

Browse files
committed
fix: finalize/ephermalize job when upload finishes when widget not visible
1 parent 26ace34 commit 9f2aa43

5 files changed

Lines changed: 34 additions & 8 deletions

File tree

CHANGELOG

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
- fix: missing .rtdc resource files in filter view
44
- fix: error handling when connection to server fails on download (#75)
55
- fix: '_condensed' suffix for file stem randomly missing in downloads
6+
- fix: finalize/ephermalize job when upload finishes when widget not visible
67
- enh: display DCOR instance title in search bar
78
- enh: make icons "grayer" so they work in dark themes as well
89
- enh: add `SQLiteKeyJSONDatabase` for persistent metadata storage

dcoraid/gui/main.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,9 @@ def __init__(self, *args, **kwargs):
109109
self.panel_my_data.request_download.connect(
110110
self.panel_download.download_resource)
111111

112+
# Signal for dataset upload or modification
113+
self.panel_upload.upload_finished.connect(self.on_dataset_changed)
114+
112115
QtWidgets.QApplication.processEvents(
113116
QtCore.QEventLoop.ProcessEventsFlag.AllEvents, 300)
114117

@@ -295,6 +298,10 @@ def on_action_software(self):
295298
"Software",
296299
sw_text)
297300

301+
@QtCore.pyqtSlot(dict)
302+
def on_dataset_changed(self, ds_dict):
303+
self.database.update_dataset(ds_dict)
304+
298305
@QtCore.pyqtSlot()
299306
def on_wizard(self):
300307
self.wizard = SetupWizard(self)

dcoraid/gui/panel_uploads/widget_upload.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424

2525

2626
class UploadWidget(QtWidgets.QWidget):
27-
upload_finished = QtCore.pyqtSignal()
27+
upload_finished = QtCore.pyqtSignal(dict)
2828

2929
def __init__(self, *args, **kwargs):
3030
"""Manage running uploads
@@ -369,7 +369,7 @@ def prepare_quit(self):
369369

370370

371371
class UploadTableWidget(QtWidgets.QTableWidget):
372-
upload_finished = QtCore.pyqtSignal()
372+
upload_finished = QtCore.pyqtSignal(dict)
373373
job_selected = QtCore.pyqtSignal(object)
374374

375375
def __init__(self, *args, **kwargs):
@@ -450,12 +450,25 @@ def on_upload_finished(self, dataset_id):
450450
if dataset_id not in self._finished_uploads:
451451
self._finished_uploads.append(dataset_id)
452452
self.jobs.jobs_eternal.set_job_done(dataset_id)
453-
self.upload_finished.emit()
453+
api = get_ckan_api()
454+
try:
455+
ds_dict = api.get("package_show",
456+
id=dataset_id,
457+
timeout=3)
458+
self.upload_finished.emit(ds_dict)
459+
except BaseException:
460+
self.logger.error(tb.format_exc())
454461

455462
@QtCore.pyqtSlot()
456463
def update_job_status(self):
457464
"""Update UI with information from self.jobs (UploadJobList)"""
465+
# Let everyone know when a job is done
466+
for job in self.jobs:
467+
if job.state == "done":
468+
self.on_upload_finished(job.dataset_id)
469+
458470
if not self.isVisible() or not self.jobs:
471+
# Don't update the UI if nobody is looking anyway.
459472
return
460473
# disable updates
461474
self.setUpdatesEnabled(False)
@@ -471,8 +484,6 @@ def update_job_status(self):
471484
self.set_label_item(row, 2, status["state"])
472485
self.set_label_item(row, 3, job.get_progress_string())
473486
self.set_label_item(row, 4, job.get_rate_string())
474-
if status["state"] == "done":
475-
self.on_upload_finished(job.dataset_id)
476487
self.set_actions_item(row, 5, job)
477488

478489
# spacing (did not work in __init__)

tests/common.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,8 @@ def make_upload_task(task_id=True, # tester may pass `None` to disable
192192

193193

194194
def wait_for_job(upload_queue, dataset_id, wait_time=60,
195-
wait_for_resource_metadata=False):
195+
wait_for_resource_metadata=False,
196+
set_job_done=True):
196197
uq = upload_queue
197198
uj = uq.get_job(dataset_id)
198199
# wait for the upload to finish
@@ -210,7 +211,7 @@ def wait_for_job(upload_queue, dataset_id, wait_time=60,
210211
if not complete:
211212
break
212213
if complete:
213-
if uq.jobs_eternal:
214+
if set_job_done and uq.jobs_eternal:
214215
# TODO:
215216
# We do this manually here. Actually, a better solution
216217
# would be to implement a signal-slot type of workflow

tests/test_gui.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,13 @@ def test_gui_upload_simple(mw, qtbot):
237237
assert dlg.dataset_id is not None
238238

239239
common.wait_for_job(upload_queue=mw.panel_upload.jobs,
240-
dataset_id=dlg.dataset_id)
240+
dataset_id=dlg.dataset_id,
241+
set_job_done=False)
242+
243+
mw.panel_upload.widget_jobs.update_job_status()
244+
QtWidgets.QApplication.processEvents(
245+
QtCore.QEventLoop.ProcessEventsFlag.AllEvents, 500)
246+
assert mw.database.get_dataset_dictionary(dlg.dataset_id)
241247

242248

243249
def test_gui_upload_task(mw, qtbot):

0 commit comments

Comments
 (0)