From 42549de806c0e5fc53bbc26b2d72a290da8b92f0 Mon Sep 17 00:00:00 2001 From: Aryaman Date: Wed, 13 Mar 2024 22:40:16 +0530 Subject: [PATCH] storing last status for BackupProfiles --- src/vorta/application.py | 6 +++--- src/vorta/borg/borg_job.py | 4 +++- src/vorta/borg/break_lock.py | 7 +++++-- src/vorta/borg/check.py | 11 ++++++++--- src/vorta/borg/compact.py | 9 ++++++--- src/vorta/borg/create.py | 14 +++++++++----- src/vorta/borg/delete.py | 8 ++++++-- src/vorta/borg/diff.py | 6 ++++-- src/vorta/borg/extract.py | 4 ++-- src/vorta/borg/info_archive.py | 8 ++++++-- src/vorta/borg/list_archive.py | 6 ++++-- src/vorta/borg/list_repo.py | 8 ++++++-- src/vorta/borg/prune.py | 8 ++++++-- src/vorta/store/models.py | 1 + src/vorta/views/main_window.py | 13 ++++++++++--- 15 files changed, 79 insertions(+), 34 deletions(-) diff --git a/src/vorta/application.py b/src/vorta/application.py index 8857a51e..40714d5b 100644 --- a/src/vorta/application.py +++ b/src/vorta/application.py @@ -40,7 +40,7 @@ class VortaApp(QtSingleApplication): backup_finished_event = QtCore.pyqtSignal(dict) backup_cancelled_event = QtCore.pyqtSignal() backup_log_event = QtCore.pyqtSignal(str, dict) - backup_progress_event = QtCore.pyqtSignal(str) + backup_progress_event = QtCore.pyqtSignal(int, str) check_failed_event = QtCore.pyqtSignal(dict) def __init__(self, args_raw, single_app=False): @@ -121,7 +121,7 @@ class VortaApp(QtSingleApplication): translate('messages', msg['message']), level='error', ) - self.backup_progress_event.emit(f"[{profile.name}] {translate('messages', msg['message'])}") + self.backup_progress_event.emit(profile.id, f"[{profile.name}] {translate('messages', msg['message'])}") return None def open_main_window_action(self): @@ -257,7 +257,7 @@ class VortaApp(QtSingleApplication): def break_lock(self, profile): params = BorgBreakJob.prepare(profile) if not params['ok']: - self.backup_progress_event.emit(f"[{profile.name}] {params['message']}") + self.backup_progress_event.emit(profile.id, f"[{profile.name}] {params['message']}") return job = BorgBreakJob(params['cmd'], params) self.jobs_manager.add_job(job) diff --git a/src/vorta/borg/borg_job.py b/src/vorta/borg/borg_job.py index 9cf6a155..d0af78ec 100644 --- a/src/vorta/borg/borg_job.py +++ b/src/vorta/borg/borg_job.py @@ -296,7 +296,9 @@ class BorgJob(JobInterface, BackupProfileMixin): # f"{translate('BorgJob','Compressed')}: {pretty_bytes(parsed['compressed_size'])}, " f"{translate('BorgJob','Deduplicated')}: {pretty_bytes(parsed['deduplicated_size'])}" # noqa: E501 ) - self.app.backup_progress_event.emit(f"[{self.params['profile_name']}] {msg}") + self.app.backup_progress_event.emit( + self.params['profile_id'], f"[{self.params['profile_name']}] {msg}" + ) except json.decoder.JSONDecodeError: msg = line.strip() if msg: # Log only if there is something to log. diff --git a/src/vorta/borg/break_lock.py b/src/vorta/borg/break_lock.py index 0184b655..91a20ec4 100644 --- a/src/vorta/borg/break_lock.py +++ b/src/vorta/borg/break_lock.py @@ -4,12 +4,15 @@ from .borg_job import BorgJob class BorgBreakJob(BorgJob): def started_event(self): self.app.backup_started_event.emit() - self.app.backup_progress_event.emit(f"[{self.params['profile_name']}] {self.tr('Breaking repository lock…')}") + self.app.backup_progress_event.emit( + self.params['profile_id'], f"[{self.params['profile_name']}] {self.tr('Breaking repository lock…')}" + ) def finished_event(self, result): self.app.backup_finished_event.emit(result) self.app.backup_progress_event.emit( - f"[{self.params['profile_name']}] {self.tr('Repository lock broken. Please redo your last action.')}" + self.params['profile_id'], + f"[{self.params['profile_name']}] {self.tr('Repository lock broken. Please redo your last action.')}", ) self.result.emit(result) diff --git a/src/vorta/borg/check.py b/src/vorta/borg/check.py index e25443fd..cf67db63 100644 --- a/src/vorta/borg/check.py +++ b/src/vorta/borg/check.py @@ -10,7 +10,9 @@ from .borg_job import BorgJob class BorgCheckJob(BorgJob): def started_event(self): self.app.backup_started_event.emit() - self.app.backup_progress_event.emit(f"[{self.params['profile_name']}] {self.tr('Starting consistency check…')}") + self.app.backup_progress_event.emit( + self.params['profile_id'], f"[{self.params['profile_name']}] {self.tr('Starting consistency check…')}" + ) def finished_event(self, result: Dict[str, Any]): """ @@ -25,14 +27,17 @@ class BorgCheckJob(BorgJob): self.result.emit(result) if result['returncode'] != 0: self.app.backup_progress_event.emit( + self.params['profile_id'], f"[{self.params['profile_name']}] " + translate('RepoCheckJob', 'Repo check failed. See the logs for details.').format( config.LOG_DIR.as_uri() - ) + ), ) self.app.check_failed_event.emit(result) else: - self.app.backup_progress_event.emit(f"[{self.params['profile_name']}] {self.tr('Check completed.')}") + self.app.backup_progress_event.emit( + self.params['profile_id'], f"[{self.params['profile_name']}] {self.tr('Check completed.')}" + ) @classmethod def prepare(cls, profile): diff --git a/src/vorta/borg/compact.py b/src/vorta/borg/compact.py index 12bc160c..75b17497 100644 --- a/src/vorta/borg/compact.py +++ b/src/vorta/borg/compact.py @@ -11,7 +11,7 @@ class BorgCompactJob(BorgJob): def started_event(self): self.app.backup_started_event.emit() self.app.backup_progress_event.emit( - f"[{self.params['profile_name']} {self.tr('Starting repository compaction...')}]" + self.params['profile_id'], f"[{self.params['profile_name']} {self.tr('Starting repository compaction...')}]" ) def finished_event(self, result: Dict[str, Any]): @@ -27,13 +27,16 @@ class BorgCompactJob(BorgJob): self.result.emit(result) if result['returncode'] != 0: self.app.backup_progress_event.emit( + self.params['profile_id'], f"[{self.params['profile_name']}] " + translate( 'BorgCompactJob', 'Errors during compaction. See the logs for details.' - ).format(config.LOG_DIR.as_uri()) + ).format(config.LOG_DIR.as_uri()), ) else: - self.app.backup_progress_event.emit(f"[{self.params['profile_name']}] {self.tr('Compaction completed.')}") + self.app.backup_progress_event.emit( + self.params['profile_id'], f"[{self.params['profile_name']}] {self.tr('Compaction completed.')}" + ) @classmethod def prepare(cls, profile): diff --git a/src/vorta/borg/create.py b/src/vorta/borg/create.py index 4b2e8b84..a9f0f000 100644 --- a/src/vorta/borg/create.py +++ b/src/vorta/borg/create.py @@ -43,22 +43,26 @@ class BorgCreateJob(BorgJob): if result['returncode'] == 1: self.app.backup_progress_event.emit( + self.params['profile_id'], f"[{self.params['profile_name']}] " + translate( 'BorgCreateJob', 'Backup finished with warnings. See the logs for details.', - ).format(config.LOG_DIR.as_uri()) + ).format(config.LOG_DIR.as_uri()), ) else: - self.app.backup_log_event.emit('', {}) - self.app.backup_progress_event.emit(f"[{self.params['profile_name']}] {self.tr('Backup finished.')}") + self.app.backup_progress_event.emit( + self.params['profile_id'], f"[{self.params['profile_name']}] {self.tr('Backup finished.')}" + ) def progress_event(self, fmt): - self.app.backup_progress_event.emit(f"[{self.params['profile_name']}] {fmt}") + self.app.backup_progress_event.emit(self.params['profile_id'], f"[{self.params['profile_name']}] {fmt}") def started_event(self): self.app.backup_started_event.emit() - self.app.backup_progress_event.emit(f"[{self.params['profile_name']}] {self.tr('Backup started.')}") + self.app.backup_progress_event.emit( + self.params['profile_id'], f"[{self.params['profile_name']}] {self.tr('Backup started.')}" + ) def finished_event(self, result): self.app.backup_finished_event.emit(result) diff --git a/src/vorta/borg/delete.py b/src/vorta/borg/delete.py index 5b1fe72f..b7690be5 100644 --- a/src/vorta/borg/delete.py +++ b/src/vorta/borg/delete.py @@ -9,7 +9,9 @@ from .borg_job import BorgJob class BorgDeleteJob(BorgJob): def started_event(self): self.app.backup_started_event.emit() - self.app.backup_progress_event.emit(f"[{self.params['profile_name']}] {self.tr('Deleting archive…')}") + self.app.backup_progress_event.emit( + self.params['profile_id'], f"[{self.params['profile_name']}] {self.tr('Deleting archive…')}" + ) def finished_event(self, result): # set repo stats to N/A @@ -22,7 +24,9 @@ class BorgDeleteJob(BorgJob): self.app.backup_finished_event.emit(result) self.result.emit(result) - self.app.backup_progress_event.emit(f"[{self.params['profile_name']}] {self.tr('Archive deleted.')}") + self.app.backup_progress_event.emit( + self.params['profile_id'], f"[{self.params['profile_name']}] {self.tr('Archive deleted.')}" + ) @classmethod def prepare(cls, profile, archives: List[str]): diff --git a/src/vorta/borg/diff.py b/src/vorta/borg/diff.py index cd09ff81..6a34c525 100644 --- a/src/vorta/borg/diff.py +++ b/src/vorta/borg/diff.py @@ -7,13 +7,15 @@ class BorgDiffJob(BorgJob): def started_event(self): self.app.backup_started_event.emit() self.app.backup_progress_event.emit( - f"[{self.params['profile_name']}] {self.tr('Requesting differences between archives…')}" + self.params['profile_id'], + f"[{self.params['profile_name']}] {self.tr('Requesting differences between archives…')}", ) def finished_event(self, result): self.app.backup_finished_event.emit(result) self.app.backup_progress_event.emit( - f"[{self.params['profile_name']}] {self.tr('Obtained differences between archives.')}" + self.params['profile_id'], + f"[{self.params['profile_name']}] {self.tr('Obtained differences between archives.')}", ) self.result.emit(result) diff --git a/src/vorta/borg/extract.py b/src/vorta/borg/extract.py index 41108721..d2cd7e15 100644 --- a/src/vorta/borg/extract.py +++ b/src/vorta/borg/extract.py @@ -13,14 +13,14 @@ class BorgExtractJob(BorgJob): def started_event(self): self.app.backup_started_event.emit() self.app.backup_progress_event.emit( - f"[{self.params['profile_name']}] {self.tr('Downloading files from archive…')}" + self.params['profile_id'], f"[{self.params['profile_name']}] {self.tr('Downloading files from archive…')}" ) def finished_event(self, result): self.app.backup_finished_event.emit(result) self.result.emit(result) self.app.backup_progress_event.emit( - f"[{self.params['profile_name']}] {self.tr('Restored files from archive.')}" + self.params['profile_id'], f"[{self.params['profile_name']}] {self.tr('Restored files from archive.')}" ) @classmethod diff --git a/src/vorta/borg/info_archive.py b/src/vorta/borg/info_archive.py index afb94b2f..9b124c37 100644 --- a/src/vorta/borg/info_archive.py +++ b/src/vorta/borg/info_archive.py @@ -7,12 +7,16 @@ from .borg_job import BorgJob class BorgInfoArchiveJob(BorgJob): def started_event(self): self.app.backup_started_event.emit() - self.app.backup_progress_event.emit(f"[{self.params['profile_name']}] {self.tr('Refreshing archive…')}") + self.app.backup_progress_event.emit( + self.params['profile_id'], f"[{self.params['profile_name']}] {self.tr('Refreshing archive…')}" + ) def finished_event(self, result): self.app.backup_finished_event.emit(result) self.result.emit(result) - self.app.backup_progress_event.emit(f"[{self.params['profile_name']}] {self.tr('Refreshing archive done.')}") + self.app.backup_progress_event.emit( + self.params['profile_id'], f"[{self.params['profile_name']}] {self.tr('Refreshing archive done.')}" + ) @classmethod def prepare(cls, profile, archive_name): diff --git a/src/vorta/borg/list_archive.py b/src/vorta/borg/list_archive.py index ef00a013..a544592b 100644 --- a/src/vorta/borg/list_archive.py +++ b/src/vorta/borg/list_archive.py @@ -6,12 +6,14 @@ from .borg_job import BorgJob class BorgListArchiveJob(BorgJob): def started_event(self): self.app.backup_started_event.emit() - self.app.backup_progress_event.emit(f"[{self.params['profile_name']}] {self.tr('Getting archive content…')}") + self.app.backup_progress_event.emit( + self.params['profile_id'], f"[{self.params['profile_name']}] {self.tr('Getting archive content…')}" + ) def finished_event(self, result): self.app.backup_finished_event.emit(result) self.app.backup_progress_event.emit( - f"[{self.params['profile_name']}] {self.tr('Done getting archive content.')}" + self.params['profile_id'], f"[{self.params['profile_name']}] {self.tr('Done getting archive content.')}" ) self.result.emit(result) diff --git a/src/vorta/borg/list_repo.py b/src/vorta/borg/list_repo.py index 664778d6..90a9c48b 100644 --- a/src/vorta/borg/list_repo.py +++ b/src/vorta/borg/list_repo.py @@ -9,12 +9,16 @@ from .borg_job import BorgJob class BorgListRepoJob(BorgJob): def started_event(self): self.app.backup_started_event.emit() - self.app.backup_progress_event.emit(f"[{self.params['profile_name']}] {self.tr('Refreshing archives…')}") + self.app.backup_progress_event.emit( + self.params['profile_id'], f"[{self.params['profile_name']}] {self.tr('Refreshing archives…')}" + ) def finished_event(self, result): self.app.backup_finished_event.emit(result) self.result.emit(result) - self.app.backup_progress_event.emit(f"[{self.params['profile_name']}] {self.tr('Refreshing archives done.')}") + self.app.backup_progress_event.emit( + self.params['profile_id'], f"[{self.params['profile_name']}] {self.tr('Refreshing archives done.')}" + ) @classmethod def prepare(cls, profile): diff --git a/src/vorta/borg/prune.py b/src/vorta/borg/prune.py index aba888fb..47bafbd9 100644 --- a/src/vorta/borg/prune.py +++ b/src/vorta/borg/prune.py @@ -7,7 +7,9 @@ from .borg_job import BorgJob class BorgPruneJob(BorgJob): def started_event(self): self.app.backup_started_event.emit() - self.app.backup_progress_event.emit(f"[{self.params['profile_name']}] {self.tr('Pruning old archives…')}") + self.app.backup_progress_event.emit( + self.params['profile_id'], f"[{self.params['profile_name']}] {self.tr('Pruning old archives…')}" + ) def finished_event(self, result): # set repo stats to N/A @@ -20,7 +22,9 @@ class BorgPruneJob(BorgJob): self.app.backup_finished_event.emit(result) self.result.emit(result) - self.app.backup_progress_event.emit(f"[{self.params['profile_name']}] {self.tr('Pruning done.')}") + self.app.backup_progress_event.emit( + self.params['profile_id'], f"[{self.params['profile_name']}] {self.tr('Pruning done.')}" + ) @classmethod def prepare(cls, profile): diff --git a/src/vorta/store/models.py b/src/vorta/store/models.py index 400299fb..214887e5 100644 --- a/src/vorta/store/models.py +++ b/src/vorta/store/models.py @@ -102,6 +102,7 @@ class BackupProfileModel(BaseModel): pre_backup_cmd = pw.CharField(default='') post_backup_cmd = pw.CharField(default='') dont_run_on_metered_networks = pw.BooleanField(default=True) + last_status = pw.CharField(default='', null=True) def refresh(self): return type(self).get(self._pk_expr()) diff --git a/src/vorta/views/main_window.py b/src/vorta/views/main_window.py index a3c24b8d..39a1dc49 100644 --- a/src/vorta/views/main_window.py +++ b/src/vorta/views/main_window.py @@ -135,9 +135,11 @@ class MainWindow(MainWindowBase, MainWindowUI): self.profileDeleteButton.setIcon(get_colored_icon('minus')) self.miscButton.setIcon(get_colored_icon('settings_wheel')) - def set_progress(self, text=''): - profile = extract_profile_name(text) - if profile == self.current_profile.name: + def set_progress(self, profile_id, text=''): + profile = BackupProfileModel.get_by_id(profile_id) + profile.last_status = text + profile.save() + if profile.name == self.current_profile.name: self.progressText.setText(text) self.progressText.repaint() @@ -146,6 +148,9 @@ class MainWindow(MainWindowBase, MainWindowUI): if profile == self.current_profile.name: self.logText.setText(text) self.logText.repaint() + else: + self.logText.setText('') + self.logText.repaint() def _toggle_buttons(self, create_enabled=True): if create_enabled: @@ -192,6 +197,8 @@ class MainWindow(MainWindowBase, MainWindowUI): SettingsModel.key == 'previous_profile_id' ).execute() self.archiveTab.toggle_compact_button_visibility() + self.app.backup_progress_event.emit(self.current_profile.id, self.current_profile.last_status) + self.app.backup_log_event.emit("", {}) def profile_clicked_action(self): if self.miscWidget.isVisible():