mirror of https://github.com/borgbase/vorta
feat: editor for pre and post backup cmd
This commit is contained in:
parent
384c57af57
commit
2b55cd9866
|
@ -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">
|
||||
|
|
|
@ -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>
|
|
@ -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.
|
||||
|
|
|
@ -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()
|
Loading…
Reference in New Issue