1
0
Fork 0
mirror of https://github.com/borgbase/vorta synced 2024-12-21 23:33:13 +00:00

Remove duplicate sources on profile import. By @shivansh02 (#2017)

This commit is contained in:
Shivansh Singh 2024-07-01 19:45:45 +05:30 committed by GitHub
parent 449b95e1b6
commit 22a21f0898
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 40 additions and 2 deletions

View file

@ -130,6 +130,8 @@ def to_db(self, overwrite_profile=False, overwrite_settings=True):
# Set the profile ids to be match new profile # Set the profile ids to be match new profile
for source in self._profile_dict['SourceFileModel']: for source in self._profile_dict['SourceFileModel']:
source['profile'] = self.id source['profile'] = self.id
# Delete existing Sources to avoid duplicates
SourceFileModel.delete().where(SourceFileModel.profile == self.id).execute()
SourceFileModel.insert_many(self._profile_dict['SourceFileModel']).execute() SourceFileModel.insert_many(self._profile_dict['SourceFileModel']).execute()
# Delete added dictionaries to make it match BackupProfileModel # Delete added dictionaries to make it match BackupProfileModel

View file

@ -1,6 +1,9 @@
import tempfile
from PyQt6 import QtCore from PyQt6 import QtCore
from PyQt6.QtWidgets import QDialogButtonBox, QMessageBox, QToolTip from PyQt6.QtWidgets import QDialogButtonBox, QFileDialog, QMessageBox, QToolTip
from vorta.store.models import BackupProfileModel from vorta.store.models import BackupProfileModel, SourceFileModel
from vorta.views.export_window import ExportWindow
def test_profile_add_delete(qapp, qtbot, mocker): def test_profile_add_delete(qapp, qtbot, mocker):
@ -47,3 +50,36 @@ def test_profile_edit(qapp, qtbot):
assert BackupProfileModel.get_or_none(name='Default') is None assert BackupProfileModel.get_or_none(name='Default') is None
assert BackupProfileModel.get_or_none(name='Test Profile') is not None assert BackupProfileModel.get_or_none(name='Test Profile') is not None
assert main.profileSelector.currentItem().text() == 'Test Profile' assert main.profileSelector.currentItem().text() == 'Test Profile'
def test_profile_import_no_duplicate_sources(qapp, qtbot, mocker):
"""Tests importing an existing profile and choosing to overwrite does not add duplicate sources."""
main = qapp.main_window
# Create a new profile and add sources
profile = BackupProfileModel.create(name='Test Profile')
sources = ['/path/to/source1', '/path/to/source2']
for source_path in sources:
SourceFileModel.create(dir=source_path, path=source_path, profile=profile)
# Export the profile
with tempfile.NamedTemporaryFile(suffix=".json", delete=False) as temp_file:
temp_file_path = temp_file.name
export_window = ExportWindow(profile)
mocker.patch.object(QFileDialog, 'getSaveFileName', return_value=(temp_file_path, 'JSON (*.json)'))
export_window.run()
# Mock the QMessageBox to return 'Yes' to overwrite the profile
mocker.patch.object(QMessageBox, 'question', return_value=QMessageBox.StandardButton.Yes)
# Mock the QFileDialog to return the name of the temporary file
mocker.patch.object(QFileDialog, 'getOpenFileName', return_value=(temp_file_path, 'JSON (*.json)'))
# Import the profile and choose to overwrite
main.profile_import_action()
# Check that the sources in the profile are the same as before and that there are no duplicates
imported_sources = [source.dir for source in SourceFileModel.select().where(SourceFileModel.profile == profile)]
assert set(imported_sources) == set(sources)
assert len(imported_sources) == len(sources)