Preparing release of 1.3.2
This commit is contained in:
parent
1c132c39ad
commit
0a69dbeddb
12 changed files with 2327 additions and 766 deletions
44
CHANGELOG.md
44
CHANGELOG.md
|
|
@ -1,6 +1,12 @@
|
||||||
# OctoPrint Changelog
|
# OctoPrint Changelog
|
||||||
|
|
||||||
## 1.3.2rc1 (2017-03-10)
|
## 1.3.2 (2017-03-16)
|
||||||
|
|
||||||
|
### Note for plugin authors
|
||||||
|
|
||||||
|
**If you maintain a plugin that extends OctoPrint's [JavaScript Client Library](http://docs.octoprint.org/en/master/jsclientlib/index.html)** like demonstrated in e.g. the bundled Software Update Plugin you'll need to update the way you register your plugin to depend on `OctoPrintClient` and registering your extension as shown [here](https://github.com/foosel/OctoPrint/blob/6e793c2/src/octoprint/plugins/softwareupdate/static/js/softwareupdate.js#L1-L84) instead of directly writing to `OctoPrint.plugins` (like it was still done [here](https://github.com/foosel/OctoPrint/blob/23744cd/src/octoprint/plugins/softwareupdate/static/js/softwareupdate.js#L1-L81)). That way your extensions will be available on all instances of `OctoPrintClient`, not just the global instance `OctoPrint` that gets created on startup of the core web interface.
|
||||||
|
|
||||||
|
If all you plugin does with regards to JavaScript is registering a custom view model and you have no idea what I'm talking about regarding extending the client library, no action is necessary. This heads-up is really only relevant if you extended the JavaScript Client Library.
|
||||||
|
|
||||||
### Improvements
|
### Improvements
|
||||||
|
|
||||||
|
|
@ -8,6 +14,8 @@
|
||||||
`python setup.py clean` for better compatibility with packaging systems
|
`python setup.py clean` for better compatibility with packaging systems
|
||||||
- [#1506](https://github.com/foosel/OctoPrint/issues/1506) - Better handle really long "dwell"/`G4` commands on Repetier firmware (as for example apparently recommended to use with Wanhao D6 and similar printers for nozzle cooling) by actively stalling communication from OctoPrint's side as well. That way we no longer run into a communication timeout produced by a 5min dwell immediately happily acknowledged by the printer with an `ok`.
|
- [#1506](https://github.com/foosel/OctoPrint/issues/1506) - Better handle really long "dwell"/`G4` commands on Repetier firmware (as for example apparently recommended to use with Wanhao D6 and similar printers for nozzle cooling) by actively stalling communication from OctoPrint's side as well. That way we no longer run into a communication timeout produced by a 5min dwell immediately happily acknowledged by the printer with an `ok`.
|
||||||
- [#1542](https://github.com/foosel/OctoPrint/issues/1542) - Support for multi-extruder setups with a shared single nozzle and heater (e.g. E3D Cyclops, Diamond hotend, etc).
|
- [#1542](https://github.com/foosel/OctoPrint/issues/1542) - Support for multi-extruder setups with a shared single nozzle and heater (e.g. E3D Cyclops, Diamond hotend, etc).
|
||||||
|
- [#1676](https://github.com/foosel/OctoPrint/issues/1676) - Trigger line number reset when connected to printer and seeing `start` message. This should fix issues with printer communication when printer resets but reset goes otherwise undetected.
|
||||||
|
- [#1681](https://github.com/foosel/OctoPrint/issues/1681) - Support for connecting to multiple OctoPrint instances via the [JavaScript Client Library](http://docs.octoprint.org/en/master/jsclientlib/index.html).
|
||||||
- [#1712](https://github.com/foosel/OctoPrint/issues/1712) - Display current folder name in file list if in sub folder.
|
- [#1712](https://github.com/foosel/OctoPrint/issues/1712) - Display current folder name in file list if in sub folder.
|
||||||
- [#1723](https://github.com/foosel/OctoPrint/issues/1723) - Ignore leading `v` or `V` on plugin version numbers for version checks in plugin manager and software updater (see also [#1724](https://github.com/foosel/OctoPrint/pull/1724))
|
- [#1723](https://github.com/foosel/OctoPrint/issues/1723) - Ignore leading `v` or `V` on plugin version numbers for version checks in plugin manager and software updater (see also [#1724](https://github.com/foosel/OctoPrint/pull/1724))
|
||||||
- [#1770](https://github.com/foosel/OctoPrint/issues/1770) - Better resilience against null bytes received from the printer for whatever reason.
|
- [#1770](https://github.com/foosel/OctoPrint/issues/1770) - Better resilience against null bytes received from the printer for whatever reason.
|
||||||
|
|
@ -20,11 +28,19 @@
|
||||||
- CLI: Only offer `daemon` sub command on Linux (since that it's the only OS it works on)
|
- CLI: Only offer `daemon` sub command on Linux (since that it's the only OS it works on)
|
||||||
- Less throttling of analysis of GCODE files from the analysis backlog. Should still leave Pi and friends air to breathe but allow a slightly faster processing of the backlog.
|
- Less throttling of analysis of GCODE files from the analysis backlog. Should still leave Pi and friends air to breathe but allow a slightly faster processing of the backlog.
|
||||||
- Added an explanation of safe mode to the docs.
|
- Added an explanation of safe mode to the docs.
|
||||||
|
- Log OctoPrint version & plugin list when detecting log rollover.
|
||||||
|
- Allow `UiPlugin`s to define additional fields for ETag generation.
|
||||||
|
- Allow `UiPlugin`s utilizing OctoPrint's stock templates to filter out what they don't need.
|
||||||
|
- Locales contained in `translations` of plugins will now be registered with the system. That way it's possible to provide translations for the full application through plugins.
|
||||||
|
- Abort file analysis if file is about to be overwritten
|
||||||
|
- Software Update Plugin: Refresh cache on startup, prevent concurrent refresh
|
||||||
|
- More solid parsing of request line number for resend requests. Should improve compatibility with Teacup firmwares. Based on issue reported via PR [#300](https://github.com/foosel/OctoPrint/pull/300)
|
||||||
|
|
||||||
### Bug fixes
|
### Bug fixes
|
||||||
|
|
||||||
- [#733](https://github.com/foosel/OctoPrint/issues/733) - Fixed multiple event handler commands running concurrently. Now they run one after the other, as expected.
|
- [#733](https://github.com/foosel/OctoPrint/issues/733) - Fixed multiple event handler commands running concurrently. Now they run one after the other, as expected.
|
||||||
- [#1317](https://github.com/foosel/OctoPrint/issues/1317) - Fixed a color distortion issue when rendering timelapses from higher resolution source snapshots that also need to be rotated by adjusting `ffmpeg` parameters to avoid an unexpected behaviour when a pixel format and a filter chain are required for processing.
|
- [#1317](https://github.com/foosel/OctoPrint/issues/1317) - Fixed a color distortion issue when rendering timelapses from higher resolution source snapshots that also need to be rotated by adjusting `ffmpeg` parameters to avoid an unexpected behaviour when a pixel format and a filter chain are required for processing.
|
||||||
|
- [#1560](https://github.com/foosel/OctoPrint/issues/1560) - Make sure we don't try to use an empty `logging.yaml`
|
||||||
- [#1631](https://github.com/foosel/OctoPrint/issues/1631) - Disable "Slice" button in slice dialog if a print is ongoing and a slicer is selected that runs on the same device as OctoPrint. The server would already deny such requests (simply due to performance reasons), but the UI didn't properly reflect that yet.
|
- [#1631](https://github.com/foosel/OctoPrint/issues/1631) - Disable "Slice" button in slice dialog if a print is ongoing and a slicer is selected that runs on the same device as OctoPrint. The server would already deny such requests (simply due to performance reasons), but the UI didn't properly reflect that yet.
|
||||||
- [#1671](https://github.com/foosel/OctoPrint/issues/1671) - Removed "Hide empty folders" option from file list. Didn't really add value and caused usability issues.
|
- [#1671](https://github.com/foosel/OctoPrint/issues/1671) - Removed "Hide empty folders" option from file list. Didn't really add value and caused usability issues.
|
||||||
- [#1771](https://github.com/foosel/OctoPrint/issues/1771) - Fixed `_config_version` in plugin settings not being properly updated.
|
- [#1771](https://github.com/foosel/OctoPrint/issues/1771) - Fixed `_config_version` in plugin settings not being properly updated.
|
||||||
|
|
@ -35,6 +51,7 @@
|
||||||
- [#1792](https://github.com/foosel/OctoPrint/issues/1792) - Don't tell Safari we are "web-app-capable" because that means it will throw away all cookies and the user will have to constantly log in again when using a desktop shortcut for the OctoPrint instance.
|
- [#1792](https://github.com/foosel/OctoPrint/issues/1792) - Don't tell Safari we are "web-app-capable" because that means it will throw away all cookies and the user will have to constantly log in again when using a desktop shortcut for the OctoPrint instance.
|
||||||
- [#1812](https://github.com/foosel/OctoPrint/issues/1812) - Don't scroll up navigation in settings when switching between settings screens, very annoying on smaller resolutions (see also [#1814](https://github.com/foosel/OctoPrint/pull/1814))
|
- [#1812](https://github.com/foosel/OctoPrint/issues/1812) - Don't scroll up navigation in settings when switching between settings screens, very annoying on smaller resolutions (see also [#1814](https://github.com/foosel/OctoPrint/pull/1814))
|
||||||
- Fix settings helper not allowing to delete values for keys that are present in the local config but not in the defaults.
|
- Fix settings helper not allowing to delete values for keys that are present in the local config but not in the defaults.
|
||||||
|
- Fix wrong replacement value for `__progress` in registered command line or GCODE [event handlers](http://docs.octoprint.org/en/master/events/index.html).
|
||||||
- Various fixes in the Software Update Plugin:
|
- Various fixes in the Software Update Plugin:
|
||||||
- Don't remove manual software update configurations on settings migration.
|
- Don't remove manual software update configurations on settings migration.
|
||||||
- Properly delete old restart/reboot commands that are now defined globally since config version 4. An issue with the settings helper prevented us from properly deleting them during migration to version 4.
|
- Properly delete old restart/reboot commands that are now defined globally since config version 4. An issue with the settings helper prevented us from properly deleting them during migration to version 4.
|
||||||
|
|
@ -42,13 +59,36 @@
|
||||||
- Fixed update configs without a restart of any kind causing an issue due to an undefined variable.
|
- Fixed update configs without a restart of any kind causing an issue due to an undefined variable.
|
||||||
- Fixed broken doctests.
|
- Fixed broken doctests.
|
||||||
- Upgrade LESS.min.js from 2.7.1 to 2.7.2 to fix the broken contrast function
|
- Upgrade LESS.min.js from 2.7.1 to 2.7.2 to fix the broken contrast function
|
||||||
|
- Always create a new user session for requests with an API key
|
||||||
|
- Fixed an error when reading all user settings via the API
|
||||||
|
- Fixed a bunch of caching issues for the page, was not properly updated on change of snapshot URL presence, system menu entry presence, gcode viewer enabled/disabled, changes in access control availability.
|
||||||
|
- Fixed wrong bundling of core and plugin assets
|
||||||
|
- Software Update Plugin: Fixed wrong ETag calculation
|
||||||
|
- Disable external heatup detection until firmware is detected
|
||||||
|
- Fixed login dropdown not closing on click outside of it
|
||||||
|
- Fixed new user settings getting lost until restart
|
||||||
|
- Don't call `onUserLoggedIn`/`onUserLoggedOut` on user reload
|
||||||
|
|
||||||
([Commits](https://github.com/foosel/OctoPrint/compare/1.3.1...1.3.2rc1))
|
### More information
|
||||||
|
|
||||||
|
- [Commits](https://github.com/foosel/OctoPrint/compare/1.3.1...1.3.2)
|
||||||
|
- Release Candidates:
|
||||||
|
- [1.3.2rc1](https://github.com/foosel/OctoPrint/releases/tag/1.3.2rc1)
|
||||||
|
|
||||||
## 1.3.1 (2017-01-25)
|
## 1.3.1 (2017-01-25)
|
||||||
|
|
||||||
### Note for upgraders
|
### Note for upgraders
|
||||||
|
|
||||||
|
#### If you installed OctoPrint manually and used the included init script, you need to update that
|
||||||
|
|
||||||
|
The init script so far shipped with OctoPrint contained a [bug](https://github.com/foosel/OctoPrint/issues/1657) that causes issues with OctoPrint 1.3.0 and higher. Please update your init script to the fixed version OctoPrint now ships under `scripts`:
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo cp /path/to/OctoPrint/scripts/octoprint.init /etc/init.d/octoprint
|
||||||
|
```
|
||||||
|
|
||||||
|
If you are running OctoPi, this does **not** apply to you and you do not need to do anything here!
|
||||||
|
|
||||||
#### Change in stock terminal filter configuration
|
#### Change in stock terminal filter configuration
|
||||||
|
|
||||||
1.3.1 fixes an issue with the two terminal filters for suppressing temperature and SD status messages and adds a new filter for filtering out firmware `wait` messages. These changes will only be active automatically though for stock terminal filter configurations. If you have customized your terminal filters, you'll need to apply these changes manually under "Settings > Terminal filters":
|
1.3.1 fixes an issue with the two terminal filters for suppressing temperature and SD status messages and adds a new filter for filtering out firmware `wait` messages. These changes will only be active automatically though for stock terminal filter configurations. If you have customized your terminal filters, you'll need to apply these changes manually under "Settings > Terminal filters":
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,7 @@ thanks to everyone who contributed!
|
||||||
* Gary N McKinney
|
* Gary N McKinney
|
||||||
* George Robles
|
* George Robles
|
||||||
* James Seigel
|
* James Seigel
|
||||||
|
* Jamie R McGuigan
|
||||||
* Jamie van Dyke
|
* Jamie van Dyke
|
||||||
* Jeff Moe
|
* Jeff Moe
|
||||||
* Josh Daniels
|
* Josh Daniels
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,13 @@ Installing pybonjour
|
||||||
OctoPi versions 0.12.0 and later already come with pybonjour installed and ready to go,
|
OctoPi versions 0.12.0 and later already come with pybonjour installed and ready to go,
|
||||||
you don't need to perform these steps there.
|
you don't need to perform these steps there.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
Currently there are no releases for pybonjour available on the Python Package Index PyPI. The latest pybonjour
|
||||||
|
release is still available in the `Google Code Archive <https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/pybonjour/pybonjour-1.1.1.tar.gz>`_.
|
||||||
|
Since that URL is hilariously long though, a shortened version is provided with https://goo.gl/SxQZ06 and
|
||||||
|
used in the installation instructions below.
|
||||||
|
|
||||||
In order for the Zeroconf discovery to work, the
|
In order for the Zeroconf discovery to work, the
|
||||||
`pybonjour package <https://pypi.python.org/pypi/pybonjour>`_ needs to be available
|
`pybonjour package <https://pypi.python.org/pypi/pybonjour>`_ needs to be available
|
||||||
to the Python installation running OctoPrint.
|
to the Python installation running OctoPrint.
|
||||||
|
|
@ -52,7 +59,7 @@ into some folder ``~/OctoPrint``. You executed ``python setup.py install`` withi
|
||||||
virtualenv in the same folder called ``venv``. In order to install ``pybonjour``
|
virtualenv in the same folder called ``venv``. In order to install ``pybonjour``
|
||||||
so it will be available to OctoPrint you'll need to do the following::
|
so it will be available to OctoPrint you'll need to do the following::
|
||||||
|
|
||||||
venv/bin/pip install pybonjour
|
venv/bin/pip install https://goo.gl/SxQZ06
|
||||||
|
|
||||||
**Linux users:** You'll need to install an additional dependency for this to work, the
|
**Linux users:** You'll need to install an additional dependency for this to work, the
|
||||||
libdnssd compatibility layer for libavahi. On Debian/Ubuntu that can be achieved with::
|
libdnssd compatibility layer for libavahi. On Debian/Ubuntu that can be achieved with::
|
||||||
|
|
@ -71,7 +78,7 @@ The plugin supports the following configuration keys:
|
||||||
optional, if not set the port OctoPrint itself was started under will be used
|
optional, if not set the port OctoPrint itself was started under will be used
|
||||||
* ``pathPrefix``: Path prefix OctoPrint is running under, optional, if not
|
* ``pathPrefix``: Path prefix OctoPrint is running under, optional, if not
|
||||||
set ``/`` will be used
|
set ``/`` will be used
|
||||||
* ``useSsl``: ``true``if OctoPrint should be called via HTTPS, ``false`` otherwise
|
* ``useSsl``: ``true`` if OctoPrint should be called via HTTPS, ``false`` otherwise
|
||||||
* ``httpUsername``: HTTP Basic Auth username OctoPrint is reachable with, optional
|
* ``httpUsername``: HTTP Basic Auth username OctoPrint is reachable with, optional
|
||||||
* ``httpPassword``: HTTP Basic Auth password OctoPrint is reachable with, optional
|
* ``httpPassword``: HTTP Basic Auth password OctoPrint is reachable with, optional
|
||||||
* ``upnpUuid``: uPNP UUID used for SSDP service announcements, usually you will
|
* ``upnpUuid``: uPNP UUID used for SSDP service announcements, usually you will
|
||||||
|
|
|
||||||
|
|
@ -53,12 +53,12 @@ When OctoPrint is running in safe mode the following changes to its normal opera
|
||||||
* OctoPrint will still allow to uninstall third party plugins through the built-in Plugin Manager.
|
* OctoPrint will still allow to uninstall third party plugins through the built-in Plugin Manager.
|
||||||
* OctoPrint will still allow to disable (bundled) plugins that are still enabled.
|
* OctoPrint will still allow to disable (bundled) plugins that are still enabled.
|
||||||
* OctoPrint will not allow to enable third party plugins.
|
* OctoPrint will not allow to enable third party plugins.
|
||||||
* OctoPrint's web interface will display a persistent notification to remind you that it is running in
|
* OctoPrint's web interface will display a notification to remind you that it is running in
|
||||||
safe mode.
|
safe mode.
|
||||||
|
|
||||||
.. _fig-features-safemode-notification:
|
.. _fig-features-safemode-notification:
|
||||||
.. figure:: ../images/features-safemode-notification.png
|
.. figure:: ../images/features-safemode-notification.png
|
||||||
:align: center
|
:align: center
|
||||||
:alt: Persistent safe mode notification
|
:alt: Safe mode notification
|
||||||
|
|
||||||
Persistent safe mode notification
|
Safe mode notification
|
||||||
|
|
|
||||||
|
|
@ -1549,7 +1549,7 @@ class SettingsPlugin(OctoPrintPlugin):
|
||||||
path=dict(to=dict(never=dict(return="return"))))
|
path=dict(to=dict(never=dict(return="return"))))
|
||||||
|
|
||||||
def get_settings_restricted_path(self):
|
def get_settings_restricted_path(self):
|
||||||
return dict(admin=[["some", "admin_only", "path], ["another", "admin_only", "path"],
|
return dict(admin=[["some", "admin_only", "path"], ["another", "admin_only", "path"],
|
||||||
user=[["some", "user_only", "path"],],
|
user=[["some", "user_only", "path"],],
|
||||||
never=[["path", "to", "never", "return"],])
|
never=[["path", "to", "never", "return"],])
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -267,14 +267,14 @@ def _saveSettings(data):
|
||||||
# is changed, added or removed here
|
# is changed, added or removed here
|
||||||
|
|
||||||
if "api" in data.keys():
|
if "api" in data.keys():
|
||||||
if "enabled" in data["api"].keys(): s.setBoolean(["api", "enabled"], data["api"]["enabled"])
|
if "enabled" in data["api"]: s.setBoolean(["api", "enabled"], data["api"]["enabled"])
|
||||||
if "key" in data["api"].keys(): s.set(["api", "key"], data["api"]["key"], True)
|
if "key" in data["api"] and data["api"]["key"] and data["api"]["key"] != "n/a": s.set(["api", "key"], data["api"]["key"], True)
|
||||||
if "allowCrossOrigin" in data["api"].keys(): s.setBoolean(["api", "allowCrossOrigin"], data["api"]["allowCrossOrigin"])
|
if "allowCrossOrigin" in data["api"]: s.setBoolean(["api", "allowCrossOrigin"], data["api"]["allowCrossOrigin"])
|
||||||
|
|
||||||
if "appearance" in data.keys():
|
if "appearance" in data.keys():
|
||||||
if "name" in data["appearance"].keys(): s.set(["appearance", "name"], data["appearance"]["name"])
|
if "name" in data["appearance"]: s.set(["appearance", "name"], data["appearance"]["name"])
|
||||||
if "color" in data["appearance"].keys(): s.set(["appearance", "color"], data["appearance"]["color"])
|
if "color" in data["appearance"]: s.set(["appearance", "color"], data["appearance"]["color"])
|
||||||
if "colorTransparent" in data["appearance"].keys(): s.setBoolean(["appearance", "colorTransparent"], data["appearance"]["colorTransparent"])
|
if "colorTransparent" in data["appearance"]: s.setBoolean(["appearance", "colorTransparent"], data["appearance"]["colorTransparent"])
|
||||||
if "defaultLanguage" in data["appearance"]: s.set(["appearance", "defaultLanguage"], data["appearance"]["defaultLanguage"])
|
if "defaultLanguage" in data["appearance"]: s.set(["appearance", "defaultLanguage"], data["appearance"]["defaultLanguage"])
|
||||||
if "showFahrenheitAlso" in data["appearance"]: s.setBoolean(["appearance", "showFahrenheitAlso"], data["appearance"]["showFahrenheitAlso"])
|
if "showFahrenheitAlso" in data["appearance"]: s.setBoolean(["appearance", "showFahrenheitAlso"], data["appearance"]["showFahrenheitAlso"])
|
||||||
|
|
||||||
|
|
@ -282,31 +282,31 @@ def _saveSettings(data):
|
||||||
if "defaultExtrusionLength" in data["printer"]: s.setInt(["printerParameters", "defaultExtrusionLength"], data["printer"]["defaultExtrusionLength"])
|
if "defaultExtrusionLength" in data["printer"]: s.setInt(["printerParameters", "defaultExtrusionLength"], data["printer"]["defaultExtrusionLength"])
|
||||||
|
|
||||||
if "webcam" in data.keys():
|
if "webcam" in data.keys():
|
||||||
if "streamUrl" in data["webcam"].keys(): s.set(["webcam", "stream"], data["webcam"]["streamUrl"])
|
if "streamUrl" in data["webcam"]: s.set(["webcam", "stream"], data["webcam"]["streamUrl"])
|
||||||
if "snapshotUrl" in data["webcam"].keys(): s.set(["webcam", "snapshot"], data["webcam"]["snapshotUrl"])
|
if "snapshotUrl" in data["webcam"]: s.set(["webcam", "snapshot"], data["webcam"]["snapshotUrl"])
|
||||||
if "ffmpegPath" in data["webcam"].keys(): s.set(["webcam", "ffmpeg"], data["webcam"]["ffmpegPath"])
|
if "ffmpegPath" in data["webcam"]: s.set(["webcam", "ffmpeg"], data["webcam"]["ffmpegPath"])
|
||||||
if "bitrate" in data["webcam"].keys(): s.set(["webcam", "bitrate"], data["webcam"]["bitrate"])
|
if "bitrate" in data["webcam"]: s.set(["webcam", "bitrate"], data["webcam"]["bitrate"])
|
||||||
if "ffmpegThreads" in data["webcam"].keys(): s.setInt(["webcam", "ffmpegThreads"], data["webcam"]["ffmpegThreads"])
|
if "ffmpegThreads" in data["webcam"]: s.setInt(["webcam", "ffmpegThreads"], data["webcam"]["ffmpegThreads"])
|
||||||
if "watermark" in data["webcam"].keys(): s.setBoolean(["webcam", "watermark"], data["webcam"]["watermark"])
|
if "watermark" in data["webcam"]: s.setBoolean(["webcam", "watermark"], data["webcam"]["watermark"])
|
||||||
if "flipH" in data["webcam"].keys(): s.setBoolean(["webcam", "flipH"], data["webcam"]["flipH"])
|
if "flipH" in data["webcam"]: s.setBoolean(["webcam", "flipH"], data["webcam"]["flipH"])
|
||||||
if "flipV" in data["webcam"].keys(): s.setBoolean(["webcam", "flipV"], data["webcam"]["flipV"])
|
if "flipV" in data["webcam"]: s.setBoolean(["webcam", "flipV"], data["webcam"]["flipV"])
|
||||||
if "rotate90" in data["webcam"].keys(): s.setBoolean(["webcam", "rotate90"], data["webcam"]["rotate90"])
|
if "rotate90" in data["webcam"]: s.setBoolean(["webcam", "rotate90"], data["webcam"]["rotate90"])
|
||||||
|
|
||||||
if "feature" in data.keys():
|
if "feature" in data.keys():
|
||||||
if "gcodeViewer" in data["feature"].keys(): s.setBoolean(["gcodeViewer", "enabled"], data["feature"]["gcodeViewer"])
|
if "gcodeViewer" in data["feature"]: s.setBoolean(["gcodeViewer", "enabled"], data["feature"]["gcodeViewer"])
|
||||||
if "sizeThreshold" in data["feature"].keys(): s.setInt(["gcodeViewer", "sizeThreshold"], data["feature"]["sizeThreshold"])
|
if "sizeThreshold" in data["feature"]: s.setInt(["gcodeViewer", "sizeThreshold"], data["feature"]["sizeThreshold"])
|
||||||
if "mobileSizeThreshold" in data["feature"].keys(): s.setInt(["gcodeViewer", "mobileSizeThreshold"], data["feature"]["mobileSizeThreshold"])
|
if "mobileSizeThreshold" in data["feature"]: s.setInt(["gcodeViewer", "mobileSizeThreshold"], data["feature"]["mobileSizeThreshold"])
|
||||||
if "temperatureGraph" in data["feature"].keys(): s.setBoolean(["feature", "temperatureGraph"], data["feature"]["temperatureGraph"])
|
if "temperatureGraph" in data["feature"]: s.setBoolean(["feature", "temperatureGraph"], data["feature"]["temperatureGraph"])
|
||||||
if "waitForStart" in data["feature"].keys(): s.setBoolean(["feature", "waitForStartOnConnect"], data["feature"]["waitForStart"])
|
if "waitForStart" in data["feature"]: s.setBoolean(["feature", "waitForStartOnConnect"], data["feature"]["waitForStart"])
|
||||||
if "alwaysSendChecksum" in data["feature"].keys(): s.setBoolean(["feature", "alwaysSendChecksum"], data["feature"]["alwaysSendChecksum"])
|
if "alwaysSendChecksum" in data["feature"]: s.setBoolean(["feature", "alwaysSendChecksum"], data["feature"]["alwaysSendChecksum"])
|
||||||
if "neverSendChecksum" in data["feature"].keys(): s.setBoolean(["feature", "neverSendChecksum"], data["feature"]["neverSendChecksum"])
|
if "neverSendChecksum" in data["feature"]: s.setBoolean(["feature", "neverSendChecksum"], data["feature"]["neverSendChecksum"])
|
||||||
if "sdSupport" in data["feature"].keys(): s.setBoolean(["feature", "sdSupport"], data["feature"]["sdSupport"])
|
if "sdSupport" in data["feature"]: s.setBoolean(["feature", "sdSupport"], data["feature"]["sdSupport"])
|
||||||
if "sdRelativePath" in data["feature"].keys(): s.setBoolean(["feature", "sdRelativePath"], data["feature"]["sdRelativePath"])
|
if "sdRelativePath" in data["feature"]: s.setBoolean(["feature", "sdRelativePath"], data["feature"]["sdRelativePath"])
|
||||||
if "sdAlwaysAvailable" in data["feature"].keys(): s.setBoolean(["feature", "sdAlwaysAvailable"], data["feature"]["sdAlwaysAvailable"])
|
if "sdAlwaysAvailable" in data["feature"]: s.setBoolean(["feature", "sdAlwaysAvailable"], data["feature"]["sdAlwaysAvailable"])
|
||||||
if "swallowOkAfterResend" in data["feature"].keys(): s.setBoolean(["feature", "swallowOkAfterResend"], data["feature"]["swallowOkAfterResend"])
|
if "swallowOkAfterResend" in data["feature"]: s.setBoolean(["feature", "swallowOkAfterResend"], data["feature"]["swallowOkAfterResend"])
|
||||||
if "repetierTargetTemp" in data["feature"].keys(): s.setBoolean(["feature", "repetierTargetTemp"], data["feature"]["repetierTargetTemp"])
|
if "repetierTargetTemp" in data["feature"]: s.setBoolean(["feature", "repetierTargetTemp"], data["feature"]["repetierTargetTemp"])
|
||||||
if "externalHeatupDetection" in data["feature"].keys(): s.setBoolean(["feature", "externalHeatupDetection"], data["feature"]["externalHeatupDetection"])
|
if "externalHeatupDetection" in data["feature"]: s.setBoolean(["feature", "externalHeatupDetection"], data["feature"]["externalHeatupDetection"])
|
||||||
if "keyboardControl" in data["feature"].keys(): s.setBoolean(["feature", "keyboardControl"], data["feature"]["keyboardControl"])
|
if "keyboardControl" in data["feature"]: s.setBoolean(["feature", "keyboardControl"], data["feature"]["keyboardControl"])
|
||||||
if "pollWatched" in data["feature"]: s.setBoolean(["feature", "pollWatched"], data["feature"]["pollWatched"])
|
if "pollWatched" in data["feature"]: s.setBoolean(["feature", "pollWatched"], data["feature"]["pollWatched"])
|
||||||
if "ignoreIdenticalResends" in data["feature"]: s.setBoolean(["feature", "ignoreIdenticalResends"], data["feature"]["ignoreIdenticalResends"])
|
if "ignoreIdenticalResends" in data["feature"]: s.setBoolean(["feature", "ignoreIdenticalResends"], data["feature"]["ignoreIdenticalResends"])
|
||||||
if "modelSizeDetection" in data["feature"]: s.setBoolean(["feature", "modelSizeDetection"], data["feature"]["modelSizeDetection"])
|
if "modelSizeDetection" in data["feature"]: s.setBoolean(["feature", "modelSizeDetection"], data["feature"]["modelSizeDetection"])
|
||||||
|
|
@ -315,15 +315,15 @@ def _saveSettings(data):
|
||||||
if "blockWhileDwelling" in data["feature"]: s.setBoolean(["feature", "blockWhileDwelling"], data["feature"]["blockWhileDwelling"])
|
if "blockWhileDwelling" in data["feature"]: s.setBoolean(["feature", "blockWhileDwelling"], data["feature"]["blockWhileDwelling"])
|
||||||
|
|
||||||
if "serial" in data.keys():
|
if "serial" in data.keys():
|
||||||
if "autoconnect" in data["serial"].keys(): s.setBoolean(["serial", "autoconnect"], data["serial"]["autoconnect"])
|
if "autoconnect" in data["serial"]: s.setBoolean(["serial", "autoconnect"], data["serial"]["autoconnect"])
|
||||||
if "port" in data["serial"].keys(): s.set(["serial", "port"], data["serial"]["port"])
|
if "port" in data["serial"]: s.set(["serial", "port"], data["serial"]["port"])
|
||||||
if "baudrate" in data["serial"].keys(): s.setInt(["serial", "baudrate"], data["serial"]["baudrate"])
|
if "baudrate" in data["serial"]: s.setInt(["serial", "baudrate"], data["serial"]["baudrate"])
|
||||||
if "timeoutConnection" in data["serial"].keys(): s.setFloat(["serial", "timeout", "connection"], data["serial"]["timeoutConnection"])
|
if "timeoutConnection" in data["serial"]: s.setFloat(["serial", "timeout", "connection"], data["serial"]["timeoutConnection"])
|
||||||
if "timeoutDetection" in data["serial"].keys(): s.setFloat(["serial", "timeout", "detection"], data["serial"]["timeoutDetection"])
|
if "timeoutDetection" in data["serial"]: s.setFloat(["serial", "timeout", "detection"], data["serial"]["timeoutDetection"])
|
||||||
if "timeoutCommunication" in data["serial"].keys(): s.setFloat(["serial", "timeout", "communication"], data["serial"]["timeoutCommunication"])
|
if "timeoutCommunication" in data["serial"]: s.setFloat(["serial", "timeout", "communication"], data["serial"]["timeoutCommunication"])
|
||||||
if "timeoutTemperature" in data["serial"].keys(): s.setFloat(["serial", "timeout", "temperature"], data["serial"]["timeoutTemperature"])
|
if "timeoutTemperature" in data["serial"]: s.setFloat(["serial", "timeout", "temperature"], data["serial"]["timeoutTemperature"])
|
||||||
if "timeoutTemperatureTargetSet" in data["serial"].keys(): s.setFloat(["serial", "timeout", "temperatureTargetSet"], data["serial"]["timeoutTemperatureTargetSet"])
|
if "timeoutTemperatureTargetSet" in data["serial"]: s.setFloat(["serial", "timeout", "temperatureTargetSet"], data["serial"]["timeoutTemperatureTargetSet"])
|
||||||
if "timeoutSdStatus" in data["serial"].keys(): s.setFloat(["serial", "timeout", "sdStatus"], data["serial"]["timeoutSdStatus"])
|
if "timeoutSdStatus" in data["serial"]: s.setFloat(["serial", "timeout", "sdStatus"], data["serial"]["timeoutSdStatus"])
|
||||||
if "additionalPorts" in data["serial"] and isinstance(data["serial"]["additionalPorts"], (list, tuple)): s.set(["serial", "additionalPorts"], data["serial"]["additionalPorts"])
|
if "additionalPorts" in data["serial"] and isinstance(data["serial"]["additionalPorts"], (list, tuple)): s.set(["serial", "additionalPorts"], data["serial"]["additionalPorts"])
|
||||||
if "additionalBaudrates" in data["serial"] and isinstance(data["serial"]["additionalBaudrates"], (list, tuple)): s.set(["serial", "additionalBaudrates"], data["serial"]["additionalBaudrates"])
|
if "additionalBaudrates" in data["serial"] and isinstance(data["serial"]["additionalBaudrates"], (list, tuple)): s.set(["serial", "additionalBaudrates"], data["serial"]["additionalBaudrates"])
|
||||||
if "longRunningCommands" in data["serial"] and isinstance(data["serial"]["longRunningCommands"], (list, tuple)): s.set(["serial", "longRunningCommands"], data["serial"]["longRunningCommands"])
|
if "longRunningCommands" in data["serial"] and isinstance(data["serial"]["longRunningCommands"], (list, tuple)): s.set(["serial", "longRunningCommands"], data["serial"]["longRunningCommands"])
|
||||||
|
|
@ -338,7 +338,7 @@ def _saveSettings(data):
|
||||||
if "maxTimeoutsLong" in data["serial"]: s.setInt(["serial", "maxCommunicationTimeouts", "long"], data["serial"]["maxTimeoutsLong"])
|
if "maxTimeoutsLong" in data["serial"]: s.setInt(["serial", "maxCommunicationTimeouts", "long"], data["serial"]["maxTimeoutsLong"])
|
||||||
|
|
||||||
oldLog = s.getBoolean(["serial", "log"])
|
oldLog = s.getBoolean(["serial", "log"])
|
||||||
if "log" in data["serial"].keys(): s.setBoolean(["serial", "log"], data["serial"]["log"])
|
if "log" in data["serial"]: s.setBoolean(["serial", "log"], data["serial"]["log"])
|
||||||
if oldLog and not s.getBoolean(["serial", "log"]):
|
if oldLog and not s.getBoolean(["serial", "log"]):
|
||||||
# disable debug logging to serial.log
|
# disable debug logging to serial.log
|
||||||
logging.getLogger("SERIAL").debug("Disabling serial logging")
|
logging.getLogger("SERIAL").debug("Disabling serial logging")
|
||||||
|
|
@ -349,22 +349,22 @@ def _saveSettings(data):
|
||||||
logging.getLogger("SERIAL").debug("Enabling serial logging")
|
logging.getLogger("SERIAL").debug("Enabling serial logging")
|
||||||
|
|
||||||
if "folder" in data.keys():
|
if "folder" in data.keys():
|
||||||
if "uploads" in data["folder"].keys(): s.setBaseFolder("uploads", data["folder"]["uploads"])
|
if "uploads" in data["folder"]: s.setBaseFolder("uploads", data["folder"]["uploads"])
|
||||||
if "timelapse" in data["folder"].keys(): s.setBaseFolder("timelapse", data["folder"]["timelapse"])
|
if "timelapse" in data["folder"]: s.setBaseFolder("timelapse", data["folder"]["timelapse"])
|
||||||
if "timelapseTmp" in data["folder"].keys(): s.setBaseFolder("timelapse_tmp", data["folder"]["timelapseTmp"])
|
if "timelapseTmp" in data["folder"]: s.setBaseFolder("timelapse_tmp", data["folder"]["timelapseTmp"])
|
||||||
if "logs" in data["folder"].keys(): s.setBaseFolder("logs", data["folder"]["logs"])
|
if "logs" in data["folder"]: s.setBaseFolder("logs", data["folder"]["logs"])
|
||||||
if "watched" in data["folder"].keys(): s.setBaseFolder("watched", data["folder"]["watched"])
|
if "watched" in data["folder"]: s.setBaseFolder("watched", data["folder"]["watched"])
|
||||||
|
|
||||||
if "temperature" in data.keys():
|
if "temperature" in data.keys():
|
||||||
if "profiles" in data["temperature"].keys(): s.set(["temperature", "profiles"], data["temperature"]["profiles"])
|
if "profiles" in data["temperature"]: s.set(["temperature", "profiles"], data["temperature"]["profiles"])
|
||||||
if "cutoff" in data["temperature"].keys(): s.setInt(["temperature", "cutoff"], data["temperature"]["cutoff"])
|
if "cutoff" in data["temperature"]: s.setInt(["temperature", "cutoff"], data["temperature"]["cutoff"])
|
||||||
|
|
||||||
if "terminalFilters" in data.keys():
|
if "terminalFilters" in data.keys():
|
||||||
s.set(["terminalFilters"], data["terminalFilters"])
|
s.set(["terminalFilters"], data["terminalFilters"])
|
||||||
|
|
||||||
if "system" in data.keys():
|
if "system" in data.keys():
|
||||||
if "actions" in data["system"].keys(): s.set(["system", "actions"], data["system"]["actions"])
|
if "actions" in data["system"]: s.set(["system", "actions"], data["system"]["actions"])
|
||||||
if "events" in data["system"].keys(): s.set(["system", "events"], data["system"]["events"])
|
if "events" in data["system"]: s.set(["system", "events"], data["system"]["events"])
|
||||||
|
|
||||||
if "scripts" in data:
|
if "scripts" in data:
|
||||||
if "gcode" in data["scripts"] and isinstance(data["scripts"]["gcode"], dict):
|
if "gcode" in data["scripts"] and isinstance(data["scripts"]["gcode"], dict):
|
||||||
|
|
@ -375,9 +375,9 @@ def _saveSettings(data):
|
||||||
|
|
||||||
if "server" in data:
|
if "server" in data:
|
||||||
if "commands" in data["server"]:
|
if "commands" in data["server"]:
|
||||||
if "systemShutdownCommand" in data["server"]["commands"].keys(): s.set(["server", "commands", "systemShutdownCommand"], data["server"]["commands"]["systemShutdownCommand"])
|
if "systemShutdownCommand" in data["server"]["commands"]: s.set(["server", "commands", "systemShutdownCommand"], data["server"]["commands"]["systemShutdownCommand"])
|
||||||
if "systemRestartCommand" in data["server"]["commands"].keys(): s.set(["server", "commands", "systemRestartCommand"], data["server"]["commands"]["systemRestartCommand"])
|
if "systemRestartCommand" in data["server"]["commands"]: s.set(["server", "commands", "systemRestartCommand"], data["server"]["commands"]["systemRestartCommand"])
|
||||||
if "serverRestartCommand" in data["server"]["commands"].keys(): s.set(["server", "commands", "serverRestartCommand"], data["server"]["commands"]["serverRestartCommand"])
|
if "serverRestartCommand" in data["server"]["commands"]: s.set(["server", "commands", "serverRestartCommand"], data["server"]["commands"]["serverRestartCommand"])
|
||||||
if "diskspace" in data["server"]:
|
if "diskspace" in data["server"]:
|
||||||
if "warning" in data["server"]["diskspace"]: s.setInt(["server", "diskspace", "warning"], data["server"]["diskspace"]["warning"])
|
if "warning" in data["server"]["diskspace"]: s.setInt(["server", "diskspace", "warning"], data["server"]["diskspace"]["warning"])
|
||||||
if "critical" in data["server"]["diskspace"]: s.setInt(["server", "diskspace", "critical"], data["server"]["diskspace"]["critical"])
|
if "critical" in data["server"]["diskspace"]: s.setInt(["server", "diskspace", "critical"], data["server"]["diskspace"]["critical"])
|
||||||
|
|
|
||||||
|
|
@ -556,7 +556,8 @@ class Settings(object):
|
||||||
self._configfile = os.path.join(self._basedir, "config.yaml")
|
self._configfile = os.path.join(self._basedir, "config.yaml")
|
||||||
self.load(migrate=True)
|
self.load(migrate=True)
|
||||||
|
|
||||||
if self.get(["api", "key"]) is None:
|
apikey = self.get(["api", "key"])
|
||||||
|
if not apikey or apikey == "n/a":
|
||||||
self.set(["api", "key"], ''.join('%02X' % z for z in bytes(uuid.uuid4().bytes)))
|
self.set(["api", "key"], ''.join('%02X' % z for z in bytes(uuid.uuid4().bytes)))
|
||||||
self.save(force=True)
|
self.save(force=True)
|
||||||
|
|
||||||
|
|
|
||||||
Binary file not shown.
File diff suppressed because it is too large
Load diff
Binary file not shown.
File diff suppressed because it is too large
Load diff
|
|
@ -6,9 +6,9 @@
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: OctoPrint 1.3.2.dev103+g11b9600.dirty\n"
|
"Project-Id-Version: OctoPrint 1.3.2rc1.post1.dev0+g8f3602d\n"
|
||||||
"Report-Msgid-Bugs-To: i18n@octoprint.org\n"
|
"Report-Msgid-Bugs-To: i18n@octoprint.org\n"
|
||||||
"POT-Creation-Date: 2017-03-10 14:12+0100\n"
|
"POT-Creation-Date: 2017-03-16 11:53+0100\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue