From 5a504243dfda358cb6d0a74deaa6d874e633cdf6 Mon Sep 17 00:00:00 2001 From: Eric Callahan Date: Fri, 10 Feb 2023 16:48:03 -0500 Subject: [PATCH] app: use Jinja2 to render the welcome landing page Read the template using the "source_info" utility, which uses a zip-safe method to read a file. Signed-off-by: Eric Callahan --- moonraker/app.py | 30 +++++++++++++++++++++--------- moonraker/assets/__init__.py | 1 + moonraker/assets/welcome.html | 14 +++++++------- 3 files changed, 29 insertions(+), 16 deletions(-) create mode 100644 moonraker/assets/__init__.py diff --git a/moonraker/app.py b/moonraker/app.py index f3754a0..cf87f8a 100644 --- a/moonraker/app.py +++ b/moonraker/app.py @@ -22,7 +22,7 @@ from tornado.escape import url_unescape, url_escape from tornado.routing import Rule, PathMatches, AnyMatches from tornado.http1connection import HTTP1Connection from tornado.log import access_log -from .utils import ServerError +from .utils import ServerError, source_info from .websockets import ( WebRequest, WebsocketManager, @@ -57,6 +57,7 @@ if TYPE_CHECKING: from .components.machine import Machine from io import BufferedReader from .components.authorization import Authorization + from .components.template import TemplateFactory, JinjaTemplate MessageDelgate = Optional[tornado.httputil.HTTPMessageDelegate] AuthComp = Optional[Authorization] APICallback = Callable[[WebRequest], Coroutine] @@ -69,7 +70,6 @@ EXCLUDED_ARGS = ["_", "token", "access_token", "connection_id"] AUTHORIZED_EXTS = [".png", ".jpg"] DEFAULT_KLIPPY_LOG_PATH = "/tmp/klippy.log" ALL_TRANSPORTS = ["http", "websocket", "mqtt", "internal"] -ASSET_PATH = pathlib.Path(__file__).parent.joinpath("assets") class MutableRouter(tornado.web.ReversibleRuleRouter): def __init__(self, application: MoonrakerApp) -> None: @@ -173,6 +173,7 @@ class MoonrakerApp: self.http_server: Optional[HTTPServer] = None self.secure_server: Optional[HTTPServer] = None self.api_cache: Dict[str, APIDefinition] = {} + self.template_cache: Dict[str, JinjaTemplate] = {} self.registered_base_handlers: List[str] = [] self.max_upload_size = config.getint('max_upload_size', 1024) self.max_upload_size *= 1024 * 1024 @@ -304,9 +305,6 @@ class MoonrakerApp: def get_server(self) -> Server: return self.server - def get_asset_path(self) -> pathlib.Path: - return ASSET_PATH - def https_enabled(self) -> bool: return self.cert_path.exists() and self.key_path.exists() @@ -465,6 +463,20 @@ class MoonrakerApp: self.api_cache[endpoint] = api_def return api_def + async def load_template(self, asset_name: str) -> JinjaTemplate: + if asset_name in self.template_cache: + return self.template_cache[asset_name] + eventloop = self.server.get_event_loop() + asset = await eventloop.run_in_thread( + source_info.read_asset, asset_name + ) + if asset is None: + raise tornado.web.HTTPError(404, "Asset Not Found") + template: TemplateFactory = self.server.lookup_component("template") + asset_tmpl = template.create_ui_template(asset) + self.template_cache[asset_name] = asset_tmpl + return asset_tmpl + class AuthorizedRequestHandler(tornado.web.RequestHandler): def initialize(self) -> None: self.server: Server = self.settings['server'] @@ -1084,7 +1096,7 @@ class WelcomeHandler(tornado.web.RequestHandler): "service_name": svc_info.get("unit_name", "unknown"), "hostname": self.server.get_host_info()["hostname"], } - self.render("welcome.html", **context) - - def get_template_path(self) -> Optional[str]: - return str(ASSET_PATH) + app: MoonrakerApp = self.server.lookup_component("application") + welcome_template = await app.load_template("welcome.html") + ret = await welcome_template.render_async(context) + self.finish(ret) diff --git a/moonraker/assets/__init__.py b/moonraker/assets/__init__.py new file mode 100644 index 0000000..d2c26f8 --- /dev/null +++ b/moonraker/assets/__init__.py @@ -0,0 +1 @@ +# Assets Package Definition diff --git a/moonraker/assets/welcome.html b/moonraker/assets/welcome.html index b918ff6..407d13b 100644 --- a/moonraker/assets/welcome.html +++ b/moonraker/assets/welcome.html @@ -328,10 +328,10 @@
{% for item in summary %}
{{ item }}
- {% end %} + {% endfor %}
- {% end %} + {% endif %} {% if announcements %}

Announcements

@@ -346,20 +346,20 @@ - {% end %} + {% endfor %}
- {% end %} + {% endif %} {% if warnings %}

Warnings

{% for warn in warnings %}
{{ warn }}
- {% end %} + {% endfor %}
- {% end %} + {% endif %}