feat: editor for pre and post backup cmd

This commit is contained in:
Sam 2024-03-03 01:25:54 +05:30
parent 384c57af57
commit 2b55cd9866
4 changed files with 159 additions and 0 deletions

View File

@ -725,6 +725,20 @@
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="preBackupScriptEditorButton">
<property name="toolTip">
<string> Open Pre-backup script editor</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset>
<normaloff>:/icons/edit.svg</normaloff>:/icons/edit.svg</iconset>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="chooseLocalPreBackupScriptButton">
<property name="toolTip">
@ -778,6 +792,20 @@
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="postBackupScriptEditorButton">
<property name="toolTip">
<string> Open Post-backup script editor</string>
</property>
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset>
<normaloff>:/icons/edit.svg</normaloff>:/icons/edit.svg</iconset>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="chooseLocalPostBackupScriptButton">
<property name="toolTip">

View File

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ScriptEdit</class>
<widget class="QDialog" name="ScriptEdit">
<property name="windowTitle">
<string>Edit Script</string>
</property>
<property name="modal">
<bool>true</bool>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="verticalSpacing">
<number>0</number>
</property>
<item row="0" column="0">
<layout class="QGridLayout" name="gridLayout_2">
<item row="2" column="1">
<widget class="QPushButton" name="saveScriptButton">
<property name="text">
<string>Save</string>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QTextEdit" name="scriptEdit">
<property name="font">
<font>
<family>Monospace</family>
</font>
</property>
</widget>
</item>
<item row="3" column="1">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="0">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Custom Pre/Post backup script:</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -13,6 +13,7 @@ from vorta.i18n import get_locale
from vorta.scheduler import ScheduleStatusType
from vorta.store.models import BackupProfileMixin, EventLogModel, WifiSettingModel
from vorta.utils import choose_file_dialog, get_asset, get_sorted_wifis
from vorta.views.script_edit_dialog import ScriptEditWindow
from vorta.views.utils import get_colored_icon
uifile = get_asset('UI/scheduletab.ui')
@ -83,6 +84,8 @@ class ScheduleTab(ScheduleBase, ScheduleUI, BackupProfileMixin):
self.scheduleFixedTime.timeChanged.connect(self.on_scheduler_change)
self.chooseLocalPreBackupScriptButton.clicked.connect(lambda: self.choose_local_script(context="pre"))
self.chooseLocalPostBackupScriptButton.clicked.connect(lambda: self.choose_local_script(context="post"))
self.preBackupScriptEditorButton.clicked.connect(lambda: self.launch_script_editor(context="pre"))
self.postBackupScriptEditorButton.clicked.connect(lambda: self.launch_script_editor(context="post"))
# Network and shell commands events
self.meteredNetworksCheckBox.stateChanged.connect(
@ -139,6 +142,8 @@ class ScheduleTab(ScheduleBase, ScheduleUI, BackupProfileMixin):
self.toolBox.setItemIcon(3, get_colored_icon('terminal'))
self.chooseLocalPreBackupScriptButton.setIcon(get_colored_icon('file'))
self.chooseLocalPostBackupScriptButton.setIcon(get_colored_icon('file'))
self.preBackupScriptEditorButton.setIcon(get_colored_icon('edit'))
self.postBackupScriptEditorButton.setIcon(get_colored_icon('edit'))
def populate_from_profile(self):
"""Populate current view with data from selected profile."""
@ -261,3 +266,8 @@ class ScheduleTab(ScheduleBase, ScheduleUI, BackupProfileMixin):
self, self.tr('Choose Script'), want_folder=False, file_filter='*.sh', single_selection=True
)
dialog.open(receive)
def launch_script_editor(self, context: str) -> None:
edit_window = ScriptEditWindow(context, profile=self.profile())
edit_window.exec()
self.populate_from_profile() # Refresh the view after the script has been edited.

View File

@ -0,0 +1,49 @@
from PyQt6 import QtCore, uic
from vorta.store.models import BackupProfileMixin
from vorta.utils import get_asset
uifile = get_asset("UI/scriptedit.ui")
ScriptEditUI, ScriptEditBase = uic.loadUiType(uifile)
class ScriptEditWindow(ScriptEditUI, ScriptEditBase, BackupProfileMixin):
def __init__(self, context: str, profile, parent=None) -> None:
super().__init__(parent)
self.setupUi(self)
self.setAttribute(QtCore.Qt.WidgetAttribute.WA_DeleteOnClose)
self.context = context
if context == "pre":
self.setWindowTitle(self.tr("Edit Pre-Backup Script"))
elif context == "post":
self.setWindowTitle(self.tr("Edit Post-Backup Script"))
self.profile = profile
self.saveScriptButton.clicked.connect(self.save_script)
# Populate data from profile
self.populate_from_profile()
def populate_from_profile(self):
"""Populate the script editor with the current profile's script."""
profile = self.profile
if self.context == "pre":
self.scriptEdit.setPlainText(profile.pre_backup_cmd)
elif self.context == "post":
self.scriptEdit.setPlainText(profile.post_backup_cmd)
def save_profile_attr(self, attr, new_value):
profile = self.profile
setattr(profile, attr, new_value)
profile.save()
def save_script(self):
script = self.scriptEdit.toPlainText()
profile = self.profile
if self.context == "pre":
self.save_profile_attr("pre_backup_cmd", script)
elif self.context == "post":
self.save_profile_attr("post_backup_cmd", script)
profile.save()
self.close()