diff --git a/octoprint_klipper/__init__.py b/octoprint_klipper/__init__.py index 5a41737..3a68e11 100644 --- a/octoprint_klipper/__init__.py +++ b/octoprint_klipper/__init__.py @@ -215,7 +215,7 @@ class KlipperPlugin( settings.set(["probe", "points"], points_new) settings.remove(["probePoints"]) - def migrate_settings(self, settings, old, new, new2="") -> None: + def migrate_settings(self, settings, old, new, new2=""): """migrate setting to setting with additional group Args: diff --git a/octoprint_klipper/cfgUtils.py b/octoprint_klipper/cfgUtils.py index 7ce6f2d..07b8481 100644 --- a/octoprint_klipper/cfgUtils.py +++ b/octoprint_klipper/cfgUtils.py @@ -1,6 +1,7 @@ from __future__ import absolute_import, division, print_function, unicode_literals import glob import os, time, sys +import io import flask from . import util, logger @@ -16,7 +17,7 @@ if sys.version_info[0] < 3: import StringIO -def list_cfg_files(self, path: str) -> list: +def list_cfg_files(self, path): """Generate list of config files. Args: @@ -77,22 +78,33 @@ def get_cfg(self, file): if util.file_exist(self, file): logger.log_debug(self, "get_cfg_files Path: " + file) try: - with open(file, "r") as f: + with io.open(file, "r", encoding='utf-8') as f: response['config'] = f.read() except IOError as Err: logger.log_error( self, - "Error: Klipper config file not found at: {}".format(file) - + "\n IOError: {}".format(Err) + gettext("Error: Klipper config file not found at:") + + " {}".format(file) + + "\n" + + gettext("IOError:") + " {}".format(Err) + ) + response['text'] = Err + return response + except UnicodeDecodeError as Err: + logger.log_error( + self, + gettext("Decode Error:") + +"\n" + + "{}".format(Err) + + "\n\n" + + gettext("Please convert your config files to utf-8!") + + "\n" + + gettext("Or you can also paste your config \ninto the Editor and save it.") ) response['text'] = Err return response else: - if sys.version_info[0] < 3: - response['config'] = response.config.decode('utf-8') return response - finally: - f.close() else: response['text'] = gettext("File not found!") return response @@ -114,8 +126,6 @@ def save_cfg(self, content, filename): "Save klipper config" ) - if sys.version_info[0] < 3: - content = content.encode('utf-8') configpath = os.path.expanduser(self._settings.get(["configuration", "configpath"])) if filename == "": @@ -127,7 +137,7 @@ def save_cfg(self, content, filename): logger.log_debug(self, "Writing Klipper config to {}".format(filepath)) try: - with open(filepath, "w") as f: + with io.open(filepath, "w", encoding='utf-8') as f: f.write(content) except IOError: logger.log_error(self, "Error: Couldn't open Klipper config file: {}".format(filepath)) @@ -136,7 +146,6 @@ def save_cfg(self, content, filename): logger.log_debug(self, "Written Klipper config to {}".format(filepath)) return True finally: - f.close() copy_cfg_to_backup(self, filepath) @@ -290,4 +299,3 @@ def copy_cfg_to_backup(self, src): else: logger.log_debug(self, "CfgBackup " + dst + " written") return True - diff --git a/octoprint_klipper/static/js/klipper_backup.js b/octoprint_klipper/static/js/klipper_backup.js index dbf1010..1e35c7a 100644 --- a/octoprint_klipper/static/js/klipper_backup.js +++ b/octoprint_klipper/static/js/klipper_backup.js @@ -119,7 +119,7 @@ $(function () { }; showConfirmationDialog( - _.sprintf(gettext('You are about to delete backuped config file "%(name)s".'), { + _.sprintf(gettext('You are about to delete backed config file "%(name)s".'), { name: _.escape(backup), }), perform @@ -165,7 +165,7 @@ $(function () { }; showConfirmationDialog( - _.sprintf(gettext("You are about to restore %(count)d backuped config files."), { + _.sprintf(gettext("You are about to restore %(count)d backed config files."), { count: self.markedForFileRestore().length, }), perform @@ -180,7 +180,7 @@ $(function () { }; showConfirmationDialog( - _.sprintf(gettext("You are about to delete %(count)d backuped config files."), { + _.sprintf(gettext("You are about to delete %(count)d backed config files."), { count: self.markedForFileRestore().length, }), perform @@ -192,7 +192,7 @@ $(function () { title = gettext("Restoring klipper config files"); self.klipperViewModel.consoleMessage("debug", title); - message = _.sprintf(gettext("Restoring %(count)d backuped config files..."), { + message = _.sprintf(gettext("Restoring %(count)d backed config files..."), { count: files.length, }); @@ -246,7 +246,7 @@ $(function () { var title, message, handler; title = gettext("Deleting backup files"); - message = _.sprintf(gettext("Deleting %(count)d backup files..."), { + message = _.sprintf(gettext("Deleting %(count)d backed files..."), { count: files.length, }); diff --git a/octoprint_klipper/static/js/klipper_editor.js b/octoprint_klipper/static/js/klipper_editor.js index bf1d67e..8e34c34 100644 --- a/octoprint_klipper/static/js/klipper_editor.js +++ b/octoprint_klipper/static/js/klipper_editor.js @@ -215,39 +215,18 @@ $(function () { var options = options || {}; var closing = options.closing || false; - if (editor.session) { - self.klipperViewModel.consoleMessage("debug", "SaveCfg start"); + if (self.CfgFilename() != "") { + if (editor.session) { + if (self.settings.settings.plugins.klipper.configuration.parse_check() == true) { - var saveRequest = function () { - OctoPrint.plugins.klipper.saveCfg(editor.session.getValue(), self.CfgFilename()) - .done(function (response) { - - if (response.saved === true) { - self.klipperViewModel.showPopUp("success", gettext("Save Config"), gettext("File saved.")); - self.loadedConfig = editor.session.getValue(); //set loaded config to current for resetting dirtyEditor - if (closing) { - editordialog.modal('hide'); - } - if (self.settings.settings.plugins.klipper.configuration.restart_onsave() == true) { - self.klipperViewModel.requestRestart(); - } - } else { - showMessageDialog( - gettext('File not saved!'), - { - title: gettext("Save Config"), - onclose: function () { self.editorFocusDelay(1000); } - } - ); - } - }); - }; - - if (self.settings.settings.plugins.klipper.configuration.parse_check() == true) { - self.checkSyntax().then((syntaxOK) => { + // check Syntax and wait for response + self.checkSyntax().then((syntaxOK) => { if (syntaxOK === false) { + + // Ask if we should save a faulty config anyway self.askSaveFaulty().then((areWeSaving) => { if (areWeSaving === false) { + // Not saving showMessageDialog( gettext('Faulty config not saved!'), { @@ -256,16 +235,26 @@ $(function () { } ); } else { - saveRequest(); + // Save anyway + self.saveRequest(closing); } }); } else { - saveRequest(); + // Syntax is ok + self.saveRequest(closing); } }); - } else { - saveRequest(); + } else { + self.saveRequest(closing); + } } + } else { + showMessageDialog( + gettext("No filename set"), + { + title: gettext("Save Config") + } + ); } }; @@ -305,7 +294,8 @@ $(function () { }; self.reloadFromFile = function () { - OctoPrint.plugins.klipper.getCfg(self.CfgFilename()) + if (self.CfgFilename() != "") { + OctoPrint.plugins.klipper.getCfg(self.CfgFilename()) .done(function (response) { self.klipperViewModel.consoleMessage("debug", "reloadFromFile done"); if (response.response.text != "") { @@ -334,9 +324,16 @@ $(function () { } ); }); + } else { + showMessageDialog( + gettext("No filename set"), + { + title: gettext("Reload File") + } + ); + } }; - self.onStartup = function () { ace.config.set("basePath", "plugin/klipper/static/js/lib/ace/"); editor = ace.edit("plugin-klipper-config"); @@ -365,6 +362,32 @@ $(function () { } ); }; + + self.saveRequest = function (closing) { + self.klipperViewModel.consoleMessage("debug", "SaveCfg start"); + + OctoPrint.plugins.klipper.saveCfg(editor.session.getValue(), self.CfgFilename()) + .done(function (response) { + if (response.saved === true) { + self.klipperViewModel.showPopUp("success", gettext("Save Config"), gettext("File saved.")); + self.loadedConfig = editor.session.getValue(); //set loaded config to current for resetting dirtyEditor + if (closing) { + editordialog.modal('hide'); + } + if (self.settings.settings.plugins.klipper.configuration.restart_onsave() == true) { + self.klipperViewModel.requestRestart(); + } + } else { + showMessageDialog( + gettext('File not saved!'), + { + title: gettext("Save Config"), + onclose: function () { self.editorFocusDelay(1000); } + } + ); + } + }); + }; } OCTOPRINT_VIEWMODELS.push({ diff --git a/octoprint_klipper/static/js/klipper_settings.js b/octoprint_klipper/static/js/klipper_settings.js index f8de6e4..b14a945 100644 --- a/octoprint_klipper/static/js/klipper_settings.js +++ b/octoprint_klipper/static/js/klipper_settings.js @@ -85,7 +85,7 @@ $(function () { OctoPrint.plugins.klipper.listCfg().done(function (response) { self.klipperViewModel.consoleMessage("debug", "listCfgFiles done"); self.configs.updateItems(response.files); - self.PathToConfigs("Path: "+ response.path); + self.PathToConfigs(gettext("Path: ") + response.path); self.configs.resetPage(); }); }; diff --git a/octoprint_klipper/templates/klipper_settings.jinja2 b/octoprint_klipper/templates/klipper_settings.jinja2 index a2ce00f..8930d21 100644 --- a/octoprint_klipper/templates/klipper_settings.jinja2 +++ b/octoprint_klipper/templates/klipper_settings.jinja2 @@ -264,7 +264,6 @@ -