From e0e60208679dcb2601798f3236a1c57e67d7232f Mon Sep 17 00:00:00 2001 From: Divyansh Singh Date: Mon, 19 Jun 2023 01:31:55 +0530 Subject: [PATCH 1/3] feat: add a column to the archive table that shows whether an archive was created by the scheduler or by the user manually --- src/vorta/assets/UI/archivetab.ui | 5 +++++ src/vorta/borg/create.py | 1 + src/vorta/store/connection.py | 2 +- src/vorta/store/migrations.py | 11 +++++++++++ src/vorta/store/models.py | 1 + src/vorta/views/archive_tab.py | 3 +++ 6 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/vorta/assets/UI/archivetab.ui b/src/vorta/assets/UI/archivetab.ui index 3e3b0b4c5..e13f76a96 100644 --- a/src/vorta/assets/UI/archivetab.ui +++ b/src/vorta/assets/UI/archivetab.ui @@ -173,6 +173,11 @@ Name + + + Trigger + + diff --git a/src/vorta/borg/create.py b/src/vorta/borg/create.py index 167a87b13..2934bc41f 100644 --- a/src/vorta/borg/create.py +++ b/src/vorta/borg/create.py @@ -28,6 +28,7 @@ def process_result(self, result): 'repo': result['params']['repo_id'], 'duration': result['data']['archive']['duration'], 'size': result['data']['archive']['stats']['deduplicated_size'], + 'trigger': result['params'].get('category', 'user'), }, ) new_archive.save() diff --git a/src/vorta/store/connection.py b/src/vorta/store/connection.py index 21e6ec258..dcddcd88d 100644 --- a/src/vorta/store/connection.py +++ b/src/vorta/store/connection.py @@ -21,7 +21,7 @@ ) from .settings import get_misc_settings -SCHEMA_VERSION = 20 +SCHEMA_VERSION = 21 @signals.post_save(sender=SettingsModel) diff --git a/src/vorta/store/migrations.py b/src/vorta/store/migrations.py index 160addc87..cf4ddd5a7 100644 --- a/src/vorta/store/migrations.py +++ b/src/vorta/store/migrations.py @@ -228,6 +228,17 @@ def run_migrations(current_schema, db_connection): migrator.add_column(SettingsModel._meta.table_name, 'tooltip', pw.CharField(default='')), ) + if current_schema.version < 21: + _apply_schema_update( + current_schema, + 21, + migrator.add_column( + ArchiveModel._meta.table_name, + 'trigger', + pw.CharField(null=True), + ), + ) + def _apply_schema_update(current_schema, version_after, *operations): with DB.atomic(): diff --git a/src/vorta/store/models.py b/src/vorta/store/models.py index f0c32938a..bda3cfd95 100644 --- a/src/vorta/store/models.py +++ b/src/vorta/store/models.py @@ -132,6 +132,7 @@ class ArchiveModel(BaseModel): time = pw.DateTimeField() duration = pw.FloatField(null=True) size = pw.IntegerField(null=True) + trigger = pw.CharField(null=True) def formatted_time(self): return diff --git a/src/vorta/views/archive_tab.py b/src/vorta/views/archive_tab.py index f5b92c8ee..2eb6a2809 100644 --- a/src/vorta/views/archive_tab.py +++ b/src/vorta/views/archive_tab.py @@ -280,6 +280,9 @@ def populate_from_profile(self): self.archiveTable.setItem(row, 4, QTableWidgetItem(archive.name)) + if archive.trigger: + self.archiveTable.setItem(row, 5, QTableWidgetItem(archive.trigger.capitalize())) + self.archiveTable.setRowCount(len(archives)) self.archiveTable.setSortingEnabled(sorting) item = self.archiveTable.item(0, 0) From db7a0a872fd77265ab6d6ed7c94db02fc64cb945 Mon Sep 17 00:00:00 2001 From: Divyansh Singh Date: Mon, 19 Jun 2023 02:30:55 +0530 Subject: [PATCH 2/3] use icons instead of text --- src/vorta/assets/UI/archivetab.ui | 3 --- src/vorta/assets/icons/user.svg | 1 + src/vorta/views/archive_tab.py | 24 +++++++++++++++++++++--- 3 files changed, 22 insertions(+), 6 deletions(-) create mode 100644 src/vorta/assets/icons/user.svg diff --git a/src/vorta/assets/UI/archivetab.ui b/src/vorta/assets/UI/archivetab.ui index e13f76a96..6fc6d586b 100644 --- a/src/vorta/assets/UI/archivetab.ui +++ b/src/vorta/assets/UI/archivetab.ui @@ -142,9 +142,6 @@ false - - true - false diff --git a/src/vorta/assets/icons/user.svg b/src/vorta/assets/icons/user.svg new file mode 100644 index 000000000..0a751e335 --- /dev/null +++ b/src/vorta/assets/icons/user.svg @@ -0,0 +1 @@ + diff --git a/src/vorta/views/archive_tab.py b/src/vorta/views/archive_tab.py index 2eb6a2809..8aa4e8728 100644 --- a/src/vorta/views/archive_tab.py +++ b/src/vorta/views/archive_tab.py @@ -14,6 +14,7 @@ QLayout, QMenu, QMessageBox, + QStyledItemDelegate, QTableView, QTableWidgetItem, QWidget, @@ -57,6 +58,13 @@ SIZE_DECIMAL_DIGITS = 1 +# from https://stackoverflow.com/questions/63177587/pyqt-tableview-align-icons-to-center +class IconDelegate(QStyledItemDelegate): + def initStyleOption(self, option, index): + super().initStyleOption(option, index) + option.decorationSize = option.rect.size() - QtCore.QSize(0, 10) + + class ArchiveTab(ArchiveTabBase, ArchiveTabUI, BackupProfileMixin): prune_intervals = ['hour', 'day', 'week', 'month', 'year'] @@ -83,7 +91,10 @@ def __init__(self, parent=None, app=None): header.setSectionResizeMode(2, QHeaderView.ResizeMode.ResizeToContents) header.setSectionResizeMode(3, QHeaderView.ResizeMode.Interactive) header.setSectionResizeMode(4, QHeaderView.ResizeMode.Stretch) - header.setStretchLastSection(True) + header.setSectionResizeMode(5, QHeaderView.ResizeMode.ResizeToContents) + + delegate = IconDelegate(self.archiveTable) + self.archiveTable.setItemDelegateForColumn(5, delegate) if sys.platform != 'darwin': self._set_status('') # Set platform-specific hints. @@ -280,8 +291,15 @@ def populate_from_profile(self): self.archiveTable.setItem(row, 4, QTableWidgetItem(archive.name)) - if archive.trigger: - self.archiveTable.setItem(row, 5, QTableWidgetItem(archive.trigger.capitalize())) + if archive.trigger == 'scheduled': + item = QTableWidgetItem(get_colored_icon('clock-o'), '') + item.setToolTip(self.tr('Scheduled')) + self.archiveTable.setItem(row, 5, item) + elif archive.trigger == 'user': + item = QTableWidgetItem(get_colored_icon('user'), '') + item.setToolTip(self.tr('User initiated')) + item.setTextAlignment(Qt.AlignmentFlag.AlignRight) + self.archiveTable.setItem(row, 5, item) self.archiveTable.setRowCount(len(archives)) self.archiveTable.setSortingEnabled(sorting) From 1e029881ab0960b1ed25ca25a6614f3a7a7c9edc Mon Sep 17 00:00:00 2001 From: Divyansh Singh Date: Mon, 19 Jun 2023 02:42:53 +0530 Subject: [PATCH 3/3] hide mount point when no archive is mounted --- src/vorta/views/archive_tab.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/vorta/views/archive_tab.py b/src/vorta/views/archive_tab.py index 8aa4e8728..71d74bb43 100644 --- a/src/vorta/views/archive_tab.py +++ b/src/vorta/views/archive_tab.py @@ -266,6 +266,12 @@ def populate_from_profile(self): self.toolBox.setItemText(0, self.tr('Archives for %s') % profile.repo.url) archives = [s for s in profile.repo.archives.select().order_by(ArchiveModel.time.desc())] + # if no archive's name can be found in self.mount_points, then hide the mount point column + if not any(a.name in self.mount_points for a in archives): + self.archiveTable.hideColumn(3) + else: + self.archiveTable.showColumn(3) + sorting = self.archiveTable.isSortingEnabled() self.archiveTable.setSortingEnabled(False) best_unit = find_best_unit_for_sizes((a.size for a in archives), precision=SIZE_DECIMAL_DIGITS)