diff --git a/src/octoprint/server/__init__.py b/src/octoprint/server/__init__.py index 6f9e5f19..0f6ea217 100644 --- a/src/octoprint/server/__init__.py +++ b/src/octoprint/server/__init__.py @@ -135,7 +135,7 @@ def index(): preferred_stylesheet = settings().get(["devel", "stylesheet"]) locales = dict((l.language, dict(language=l.language, display=l.display_name, english=l.english_name)) for l in LOCALES) -#~~ prepare assets + #~~ prepare assets supported_stylesheets = ("css", "less") assets = dict( @@ -198,15 +198,67 @@ def index(): ##~~ prepare templates - templates = dict( - navbar=dict(order=[], entries=dict()), - sidebar=dict(order=[], entries=dict()), - tab=dict(order=[], entries=dict()), - settings=dict(order=[], entries=dict()), - usersettings=dict(order=[], entries=dict()), - generic=dict(order=[], entries=dict()) + templates = defaultdict(lambda: dict(order=[], entries=dict())) + + # rules for transforming template configs to template entries + template_rules = dict( + navbar=dict(div=lambda x: "navbar_plugin_" + x, template=lambda x: x + "_navbar.jinja2", to_entry=lambda data: data), + sidebar=dict(div=lambda x: "sidebar_plugin_" + x, template=lambda x: x + "_sidebar.jinja2", to_entry=lambda data: (data["name"], data)), + tab=dict(div=lambda x: "tab_plugin_" + x, template=lambda x: x + "_tab.jinja2", to_entry=lambda data: (data["name"], data)), + settings=dict(div=lambda x: "settings_plugin_" + x, template=lambda x: x + "_settings.jinja2", to_entry=lambda data: (data["name"], data)), + usersettings=dict(div=lambda x: "usersettings_plugin_" + x, template=lambda x: x + "_usersettings.jinja2", to_entry=lambda data: (data["name"], data)), + generic=dict(template=lambda x: x + ".jinja2", to_entry=lambda data: data) ) - template_types = templates.keys() + + # sorting orders + template_sorting = dict( + navbar=dict(add="prepend", key=None), + sidebar=dict(add="append", key="name"), + tab=dict(add="append", key="name"), + settings=dict(add="custom_append", key="name", custom_add_entries=lambda missing: dict(section_plugins=(gettext("Plugins"), None)), custom_add_order=lambda missing: ["section_plugins"] + missing), + usersettings=dict(add="append", key="name"), + generic=dict(add="append", key=None) + ) + + hooks = pluginManager.get_hooks("octoprint.ui.web.templatetypes") + for name, hook in hooks.items(): + try: + result = hook(dict(template_rules)) + except: + # TODO + pass + else: + if not isinstance(result, list): + continue + + for entry in result: + if not isinstance(entry, tuple) or not len(entry) == 3: + continue + + key, order, rule = entry + + # order defaults + if "add" not in order: + order["add"] = "prepend" + if "key" not in order: + order["key"] = "name" + + # rule defaults + if "div" not in rule: + # default div name: __plugin_ + div = "{name}_{key}_plugin_".format(**locals()) + rule["div"] = lambda x: div + x + if "template" not in rule: + # default template name: _plugin__