mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-06-04 11:14:21 +08:00
Copy preferences under Linux to add them to backup, notification messages
This commit is contained in:
parent
0723a6a63f
commit
30d66fb8de
@ -7,7 +7,11 @@ import shutil
|
|||||||
from typing import Optional
|
from typing import Optional
|
||||||
from zipfile import ZipFile, ZIP_DEFLATED, BadZipfile
|
from zipfile import ZipFile, ZIP_DEFLATED, BadZipfile
|
||||||
|
|
||||||
|
from UM import i18nCatalog
|
||||||
from UM.Logger import Logger
|
from UM.Logger import Logger
|
||||||
|
from UM.Message import Message
|
||||||
|
from UM.Platform import Platform
|
||||||
|
from UM.Preferences import Preferences
|
||||||
from UM.Resources import Resources
|
from UM.Resources import Resources
|
||||||
from cura.CuraApplication import CuraApplication
|
from cura.CuraApplication import CuraApplication
|
||||||
|
|
||||||
@ -21,6 +25,9 @@ class Backup:
|
|||||||
# These files should be ignored when making a backup.
|
# These files should be ignored when making a backup.
|
||||||
IGNORED_FILES = {"cura.log", "cache"}
|
IGNORED_FILES = {"cura.log", "cache"}
|
||||||
|
|
||||||
|
# Re-use translation catalog.
|
||||||
|
catalog = i18nCatalog("cura")
|
||||||
|
|
||||||
def __init__(self, zip_file: bytes = None, meta_data: dict = None):
|
def __init__(self, zip_file: bytes = None, meta_data: dict = None):
|
||||||
self.zip_file = zip_file # type: Optional[bytes]
|
self.zip_file = zip_file # type: Optional[bytes]
|
||||||
self.meta_data = meta_data # type: Optional[dict]
|
self.meta_data = meta_data # type: Optional[dict]
|
||||||
@ -31,10 +38,15 @@ class Backup:
|
|||||||
"""
|
"""
|
||||||
cura_release = CuraApplication.getInstance().getVersion()
|
cura_release = CuraApplication.getInstance().getVersion()
|
||||||
version_data_dir = Resources.getDataStoragePath()
|
version_data_dir = Resources.getDataStoragePath()
|
||||||
|
preferences_file_name = CuraApplication.getInstance().getApplicationName()
|
||||||
|
preferences_file = Resources.getPath(Resources.Preferences, "{}.cfg".format(preferences_file_name))
|
||||||
|
|
||||||
Logger.log("d", "Creating backup for Cura %s, using folder %s", cura_release, version_data_dir)
|
Logger.log("d", "Creating backup for Cura %s, using folder %s", cura_release, version_data_dir)
|
||||||
|
|
||||||
# TODO: support preferences file in backup under Linux (is in different directory).
|
# We copy the preferences file to the user data directory in Linux as it's in a different location there.
|
||||||
|
# When restoring a backup on Linux, we copy it back.
|
||||||
|
if Platform.isLinux():
|
||||||
|
shutil.copyfile(preferences_file, os.path.join(version_data_dir, "{}.cfg".format(preferences_file_name)))
|
||||||
|
|
||||||
# Ensure all current settings are saved.
|
# Ensure all current settings are saved.
|
||||||
CuraApplication.getInstance().saveSettings()
|
CuraApplication.getInstance().saveSettings()
|
||||||
@ -86,9 +98,15 @@ class Backup:
|
|||||||
return archive
|
return archive
|
||||||
except (IOError, OSError, BadZipfile) as error:
|
except (IOError, OSError, BadZipfile) as error:
|
||||||
Logger.log("e", "Could not create archive from user data directory: %s", error)
|
Logger.log("e", "Could not create archive from user data directory: %s", error)
|
||||||
# TODO: show message.
|
self._showMessage(
|
||||||
|
self.catalog.i18nc("@info:backup_failed",
|
||||||
|
"Could not create archive from user data directory: {}".format(error)))
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def _showMessage(self, message: str) -> None:
|
||||||
|
"""Show a UI message"""
|
||||||
|
Message(message, title=self.catalog.i18nc("@info:title", "Backup"), lifetime=30).show()
|
||||||
|
|
||||||
def restore(self) -> bool:
|
def restore(self) -> bool:
|
||||||
"""
|
"""
|
||||||
Restore this backups
|
Restore this backups
|
||||||
@ -97,16 +115,23 @@ class Backup:
|
|||||||
if not self.zip_file or not self.meta_data or not self.meta_data.get("cura_release", None):
|
if not self.zip_file or not self.meta_data or not self.meta_data.get("cura_release", None):
|
||||||
# We can restore without the minimum required information.
|
# We can restore without the minimum required information.
|
||||||
Logger.log("w", "Tried to restore a Cura backup without having proper data or meta data.")
|
Logger.log("w", "Tried to restore a Cura backup without having proper data or meta data.")
|
||||||
# TODO: show message.
|
self._showMessage(
|
||||||
|
self.catalog.i18nc("@info:backup_failed",
|
||||||
|
"Tried to restore a Cura backup without having proper data or meta data."))
|
||||||
return False
|
return False
|
||||||
|
|
||||||
# TODO: handle restoring older data version.
|
# TODO: handle restoring older data version.
|
||||||
# TODO: support preferences file in backup under Linux (is in different directory).
|
|
||||||
# global_data_dir = os.path.dirname(version_data_dir)
|
|
||||||
|
|
||||||
version_data_dir = Resources.getDataStoragePath()
|
version_data_dir = Resources.getDataStoragePath()
|
||||||
archive = ZipFile(io.BytesIO(self.zip_file), "r")
|
archive = ZipFile(io.BytesIO(self.zip_file), "r")
|
||||||
extracted = self._extractArchive(archive, version_data_dir)
|
extracted = self._extractArchive(archive, version_data_dir)
|
||||||
|
|
||||||
|
# Under Linux, preferences are stored elsewhere, so we copy the file to there.
|
||||||
|
preferences_file_name = CuraApplication.getInstance().getApplicationName()
|
||||||
|
preferences_file = Resources.getPath(Resources.Preferences, "{}.cfg".format(preferences_file_name))
|
||||||
|
if Platform.isLinux():
|
||||||
|
shutil.move(os.path.join(version_data_dir, "{}.cfg".format(preferences_file)), preferences_file)
|
||||||
|
|
||||||
return extracted
|
return extracted
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
Loading…
x
Reference in New Issue
Block a user