Compare commits

...

26 Commits

Author SHA1 Message Date
Sam 87ba86fcd8
Merge 3c3c19716d into 9cabbbd193 2024-05-04 04:03:27 +05:30
Sam 3c3c19716d
Merge branch 'master' into issue1799 2024-05-04 04:03:24 +05:30
Sam 49bfe55777
Merge branch 'borgbase:master' into issue1799 2024-04-01 23:08:44 +05:30
yfprojects 978304fe89
Merge branch 'master' into issue1799 2024-04-01 12:58:37 +00:00
Sam 41ea359cab fix for remote repos 2024-02-25 12:54:21 +05:30
Sam 88cb2dcb8e
Merge branch 'borgbase:master' into issue1799 2024-02-22 15:53:26 +05:30
Sam d3320428bb
Merge branch 'borgbase:master' into issue1799 2024-01-11 15:17:56 +05:30
Manu 115ec2864e
Merge branch 'master' into issue1799 2024-01-09 08:10:17 +00:00
Sam 75f276e195
Merge branch 'borgbase:master' into issue1799 2023-11-17 18:38:33 +05:30
Sam 1b57400085
Merge branch 'borgbase:master' into issue1799 2023-11-08 15:35:54 +05:30
real-yfprojects cff9e3a26d
Pass is_remote_repo attribute between the dialog.
Now when the `AddRepoWindow` with the values from `ExistingRepoWindow` the `is_remote_repo` attribute will be restored,
preventing an error message when trying to add the repository.

* src/vorta/views/repo_add_dialog.py
2023-10-20 19:40:31 +02:00
real-yfprojects f71c8f8675
Store full error (log) messages for borg jobs and fix new feature.
This allows accessing `msgid` from `ExistingRepoWindow`.

* src/vorta/application.py
* src/vorta/borg/borg_job.py
* src/vorta/views/repo_add_dialog.py
* tests/unit/test_repo.py
2023-10-06 19:08:42 +02:00
real-yfprojects 45176f8b4a
Simplify code, make it more modular.
This improves the code that open the `AddRepoWindow` when one tries to add an existing repo although it doesn't exist.

* src/vorta/views/repo_add_dialog.py
2023-10-06 18:32:06 +02:00
Sam b0ec304cc0
Merge branch 'borgbase:master' into issue1799 2023-10-05 06:10:36 +00:00
Sam 0ec083e88f
Merge branch 'borgbase:master' into issue1799 2023-09-29 21:16:26 +05:30
Sam 92cc9aeae8
Merge branch 'borgbase:master' into issue1799 2023-09-20 17:02:46 +05:30
Sam 780082e3b8 shortened 2023-09-19 18:14:35 +05:30
Sam 7023ab6959 added differentiation for adding repo via folder and remote, implementing setting of values from the values method 2023-09-15 19:14:30 +05:30
Sam 44639daafe added differentiation for adding repo via folder and remote, implementing setting of values from the values method 2023-09-15 18:17:57 +05:30
Sam e8afe15466 added qmessagebox 2023-09-12 23:52:46 +05:30
Sam 690d837dee added qmessagebox for an extra alert 2023-09-12 23:26:41 +05:30
Sam 55ede38e5d some enhancements to ExistingRepoWindow: to allow creation of a new repo in case the addition of an existing one fails/its not initialized 2023-09-09 17:01:11 +05:30
Sam b4f2e64662
Merge branch 'borgbase:master' into master 2023-09-09 14:26:04 +05:30
Sam 5f07abd8d0
Merge branch 'borgbase:master' into master 2023-09-06 19:48:42 +05:30
Sam 7b800661c2 removed peewee from requirements: not necessary 2023-09-06 11:57:06 +05:30
Sam 6abd0f5862 added peewee to requirements.d/dev.txt 2023-09-01 23:13:17 +05:30
4 changed files with 68 additions and 6 deletions

View File

@ -312,8 +312,8 @@ class VortaApp(QtSingleApplication):
# extract data from the params for the borg job
repo_url = result['params']['repo_url']
returncode = result['returncode']
errors: List[Tuple[int, str]] = result['errors']
error_message = errors[0][1] if errors else ''
errors: List[Tuple[int, dict]] = result['errors']
error_message = errors[0]['message'] if errors else ''
# Switch over returncodes
if returncode == 0:

View File

@ -264,7 +264,7 @@ class BorgJob(JobInterface, BackupProfileMixin):
if stderr:
for line in stderr.split('\n'):
try:
parsed = json.loads(line)
parsed: dict = json.loads(line)
if parsed['type'] == 'log_message':
context = {
@ -281,7 +281,8 @@ class BorgJob(JobInterface, BackupProfileMixin):
if level_int >= logging.WARNING:
# Append log to list of error messages
error_messages.append((level_int, parsed["message"]))
parsed['level'] = level_int
error_messages.append(parsed)
elif parsed['type'] == 'file_status':
self.app.backup_log_event.emit(

View File

@ -7,6 +7,7 @@ from PyQt6.QtWidgets import (
QDialogButtonBox,
QFormLayout,
QLabel,
QMessageBox,
QSizePolicy,
)
@ -124,11 +125,28 @@ class RepoWindow(AddRepoBase, AddRepoUI):
repo_name=self.repoName.text(),
password=self.passwordInput.get_password(),
extra_borg_arguments=self.extraBorgArgumentsLineEdit.text(),
is_remote_repo=self.is_remote_repo,
)
return out
@classmethod
def from_values(cls, values: dict):
"""Instantiate window from a values dict as returned by values property."""
window = cls()
window.sshComboBox.setCurrentIndex(window.sshComboBox.findData(values['ssh_key']))
window.repoURL.setText(values['repo_url'])
window.repoName.setText(values['repo_name'])
window.passwordInput.passwordLineEdit.setText(values['password'])
# do not set confirmLineEdit, let user confirm password
window._set_status("Autofilled password from previous window.")
window.extraBorgArgumentsLineEdit.setText(values['extra_borg_arguments'])
window.is_remote_repo = values['is_remote_repo']
return window
class AddRepoWindow(RepoWindow):
"""Dialog for initializing a new repository and adding it."""
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowTitle("Add New Repository")
@ -163,6 +181,14 @@ class AddRepoWindow(RepoWindow):
out['encryption'] = self.encryptionComboBox.currentData()
return out
@classmethod
def from_values(cls, values: dict):
"""Instantiate window from a values dict as returned by values property."""
window = super().from_values(values)
if 'encryption' in values:
window.encryptionComboBox.setCurrentIndex(window.encryptionComboBox.findData(values['encryption']))
return window
def init_encryption(self):
if borg_compat.check('V2'):
encryption_algos = [
@ -224,6 +250,8 @@ class AddRepoWindow(RepoWindow):
class ExistingRepoWindow(RepoWindow):
"""Dialog for adding an existing repository."""
def __init__(self):
super().__init__()
self.title.setText(self.tr('Connect to existing Repository'))
@ -234,12 +262,45 @@ class ExistingRepoWindow(RepoWindow):
self.repoDataFormLayout.addRow(self.passwordLabel, self.passwordInput)
def set_password(self, URL):
'''Autofill password from keyring only if current entry is empty'''
"""Autofill password from keyring only if current entry is empty"""
password = VortaKeyring.get_keyring().get_password('vorta-repo', URL)
if password and self.passwordInput.get_password() == "":
self._set_status(self.tr("Autofilled password from password manager."))
self.passwordInput.setText(password)
def run_result(self, result):
"""Handle result of BorgInfoRepoJob."""
self.saveButton.setEnabled(True)
if result['returncode'] == 0:
self.added_repo.emit(result)
self.accept()
else:
self._set_status(self.tr('Unable to add your repository.'))
for error in result['errors']:
if 'msgid' in error and error['msgid'] in [
'Repository.DoesNotExist',
'Repository.InvalidRepository',
'InvalidRepository',
]:
self.init_new_repo()
break
def init_new_repo(self):
"""Ask user if they want to initialize a new repository instead."""
answer = QMessageBox.question(
self,
'Add new Repository instead',
self.tr("This repository doesn't seem to exist. Do you want to initialize a new repository?"),
QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No,
)
if answer == QMessageBox.StandardButton.Yes:
init_dialog = AddRepoWindow.from_values(self.values)
repo_tab = self.parent()
init_dialog.setParent(repo_tab, QtCore.Qt.WindowType.Sheet)
init_dialog.added_repo.connect(repo_tab.process_new_repo)
init_dialog.open()
self.close()
def run(self):
if self.validate():
params = BorgInfoRepoJob.prepare(self.values)

View File

@ -289,7 +289,7 @@ def test_repo_check_failed_response(qapp, qtbot, mocker, response):
mock_result: Dict[str, Any] = {
'params': {'repo_url': 'test_repo_url'},
'returncode': response["return_code"],
'errors': [(0, 'test_error_message')] if response["return_code"] not in [0, 130] else None,
'errors': [{'level': 0, 'message': 'test_error_message'}] if response["return_code"] not in [0, 130] else None,
}
mock_exec = mocker.patch.object(QMessageBox, "exec")