From c56c6700ca48005bc77922ac9723a043780a0bae Mon Sep 17 00:00:00 2001 From: Divyansh Singh Date: Fri, 23 Jun 2023 18:51:54 +0530 Subject: [PATCH] Show trigger (user/scheduled) in Archive tab. By @diivi (#1732) --- src/vorta/assets/UI/archivetab.ui | 8 +++++--- src/vorta/assets/icons/user.svg | 1 + 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 | 29 ++++++++++++++++++++++++++++- 7 files changed, 48 insertions(+), 5 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 3e3b0b4c..6fc6d586 100644 --- a/src/vorta/assets/UI/archivetab.ui +++ b/src/vorta/assets/UI/archivetab.ui @@ -142,9 +142,6 @@ false - - true - false @@ -173,6 +170,11 @@ Name + + + Trigger + + diff --git a/src/vorta/assets/icons/user.svg b/src/vorta/assets/icons/user.svg new file mode 100644 index 00000000..0a751e33 --- /dev/null +++ b/src/vorta/assets/icons/user.svg @@ -0,0 +1 @@ + diff --git a/src/vorta/borg/create.py b/src/vorta/borg/create.py index 2e7b9196..69dc8b3f 100644 --- a/src/vorta/borg/create.py +++ b/src/vorta/borg/create.py @@ -28,6 +28,7 @@ class BorgCreateJob(BorgJob): '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 21e6ec25..dcddcd88 100644 --- a/src/vorta/store/connection.py +++ b/src/vorta/store/connection.py @@ -21,7 +21,7 @@ from .models import ( ) 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 160addc8..cf4ddd5a 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 f0c32938..bda3cfd9 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 f5b92c8e..71d74bb4 100644 --- a/src/vorta/views/archive_tab.py +++ b/src/vorta/views/archive_tab.py @@ -14,6 +14,7 @@ from PyQt6.QtWidgets import ( QLayout, QMenu, QMessageBox, + QStyledItemDelegate, QTableView, QTableWidgetItem, QWidget, @@ -57,6 +58,13 @@ logger = logging.getLogger(__name__) 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 @@ class ArchiveTab(ArchiveTabBase, ArchiveTabUI, BackupProfileMixin): 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. @@ -255,6 +266,12 @@ class ArchiveTab(ArchiveTabBase, ArchiveTabUI, BackupProfileMixin): 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) @@ -280,6 +297,16 @@ class ArchiveTab(ArchiveTabBase, ArchiveTabUI, BackupProfileMixin): self.archiveTable.setItem(row, 4, QTableWidgetItem(archive.name)) + 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) item = self.archiveTable.item(0, 0)