New hook "octoprint.filemanager.extension_tree"

Allows extending the list of supported file extensions for the file manager.

See also discussion on #850
This commit is contained in:
Gina Häußge 2015-04-16 13:09:05 +02:00
parent 8ac375fc9b
commit 1d98135f58
3 changed files with 66 additions and 18 deletions

View file

@ -192,3 +192,38 @@ octoprint.comm.transport.serial.factory
:rtype: A serial instance implementing implementing the methods ``readline(...)``, ``write(...)``, ``close()`` and
optionally ``baudrate`` and ``timeout`` attributes as described above.
.. _sec-plugins-hook-filemanager-extensiontree:
octoprint.filemanager.extension_tree
------------------------------------
.. py:function:: hook()
Return additional entries for the tree of accepted file extensions for uploading/handling by the file manager.
Should return a dictionary to merge with the existing extension tree, adding additional extension groups to
``machinecode`` or ``model`` types.
**Example:**
The following handler would add a new file type "x3g" as accepted ``machinecode`` format, with extensions ``x3g``
and ``s3g``:
.. code-block:: python
:linenos:
def support_x3g_machinecode():
return dict(
machinecode=dict(
x3g=["x3g", "s3g"]
)
)
.. note::
This will only add the supplied extensions to the extension tree, allowing the files to be uploaded and managed
through the file manager. Plugins will need to add further steps to ensure that the files will be processable
in the rest of the system (e.g. handling/preprocessing new machine code file types for printing etc)!
:return: The partial extension tree to merge with the full extension tree.
:rtype: dict

View file

@ -9,6 +9,7 @@ import logging
import os
import octoprint.plugin
import octoprint.util
from octoprint.events import eventManager, Events
@ -17,19 +18,35 @@ from .analysis import QueueEntry, AnalysisQueue
from .storage import LocalFileStorage
extensions = dict(
# extensions for 3d model files
model=dict(
stl=["stl"]
),
# extensions for printable machine code
machinecode=dict(
gcode=["gcode", "gco", "g"]
)
)
def full_extension_tree():
result = dict(
# extensions for 3d model files
model=dict(
stl=["stl"]
),
# extensions for printable machine code
machinecode=dict(
gcode=["gcode", "gco", "g"]
)
)
extension_tree_hooks = octoprint.plugin.plugin_manager().get_hooks("octoprint.filemanager.extension_tree")
for name, hook in extension_tree_hooks.items():
try:
hook_result = hook()
if hook_result is None or not isinstance(hook_result, dict):
continue
result = octoprint.util.dict_merge(result, hook_result)
except:
logging.getLogger(__name__).exception("Exception while retrieving additional extension tree entries from hook {name}".format(name=name))
return result
def get_extensions(type, subtree=None):
if not subtree:
subtree = extensions
subtree = full_extension_tree()
for key, value in subtree.items():
if key == type:
@ -43,7 +60,7 @@ def get_extensions(type, subtree=None):
def get_all_extensions(subtree=None):
if not subtree:
subtree = extensions
subtree = full_extension_tree()
result = []
if isinstance(subtree, dict):
@ -58,7 +75,7 @@ def get_all_extensions(subtree=None):
def get_path_for_extension(extension, subtree=None):
if not subtree:
subtree = extensions
subtree = full_extension_tree()
for key, value in subtree.items():
if isinstance(value, (list, tuple)) and extension in value:
@ -70,11 +87,9 @@ def get_path_for_extension(extension, subtree=None):
return None
all_extensions = get_all_extensions()
def valid_extension(extension, type=None):
if not type:
return extension in all_extensions
return extension in get_all_extensions()
else:
extensions = get_extensions(type)
if extensions:

View file

@ -17,10 +17,8 @@ class GcodeWatchdogHandler(watchdog.events.PatternMatchingEventHandler):
Takes care of automatically "uploading" files that get added to the watched folder.
"""
patterns = map(lambda x: "*.%s" % x, octoprint.filemanager.get_all_extensions())
def __init__(self, file_manager, printer):
watchdog.events.PatternMatchingEventHandler.__init__(self)
watchdog.events.PatternMatchingEventHandler.__init__(self, patterns=map(lambda x: "*.%s" % x, octoprint.filemanager.get_all_extensions()))
self._logger = logging.getLogger(__name__)
@ -55,7 +53,7 @@ class GcodeWatchdogHandler(watchdog.events.PatternMatchingEventHandler):
futureFilename = self._file_manager.sanitize_name(octoprint.filemanager.FileDestinations.LOCAL, file_wrapper.filename)
except:
futureFilename = None
if futureFilename is None or (len(self._file_manager.registered_slicers) == 0 and not octoprint.filemanager.valid_file_type(futureFilename, type="gcode")):
if futureFilename is None or (len(self._file_manager.registered_slicers) == 0 and not octoprint.filemanager.valid_file_type(futureFilename)):
return
# prohibit overwriting currently selected file while it's being printed