From 162c4f11dd36daa89c699834ce2bdddcdfbfd2cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gina=20H=C3=A4u=C3=9Fge?= Date: Thu, 19 Nov 2015 19:08:10 +0100 Subject: [PATCH] Moved jinja ExceptionHandlerExtension to octoprint.util.jinja (cherry picked from commit 3d0fc8d) --- src/octoprint/server/util/jinja.py | 60 ------------------------------ src/octoprint/util/jinja.py | 53 ++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 60 deletions(-) delete mode 100644 src/octoprint/server/util/jinja.py diff --git a/src/octoprint/server/util/jinja.py b/src/octoprint/server/util/jinja.py deleted file mode 100644 index 40208d04..00000000 --- a/src/octoprint/server/util/jinja.py +++ /dev/null @@ -1,60 +0,0 @@ -# coding=utf-8 -from __future__ import absolute_import - -__author__ = "Gina Häußge " -__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' -__copyright__ = "Copyright (C) 2015 The OctoPrint Project - Released under terms of the AGPLv3 License" - -from jinja2 import nodes -from jinja2.ext import Extension - -import logging - -class ExceptionHandlerExtension(Extension): - tags = {"try"} - - def __init__(self, environment): - super(ExceptionHandlerExtension, self).__init__(environment) - self._logger = logging.getLogger(__name__) - - def parse(self, parser): - token = parser.stream.next() - lineno = token.lineno - filename = parser.name - error = parser.parse_expression() - - args = [error, nodes.Const(filename), nodes.Const(lineno)] - try: - body = parser.parse_statements(["name:endtry"], drop_needle=True) - node = nodes.CallBlock(self.call_method("_handle_body", args), - [], [], body).set_lineno(lineno) - except Exception as e: - # that was expected - self._logger.exception("Caught exception while parsing template") - node = nodes.CallBlock(self.call_method("_handle_error", [nodes.Const(self._format_error(error, e, filename, lineno))]), - [], [], []).set_lineno(lineno) - - return node - - def _handle_body(self, error, filename, lineno, caller): - try: - return caller() - except Exception as e: - self._logger.exception("Caught exception while compiling template {filename} at line {lineno}".format(**locals())) - error_string = self._format_error(error, e, filename, lineno) - return error_string if error_string else "" - - def _handle_error(self, error, caller): - return error if error else "" - - def _format_error(self, error, exception, filename, lineno): - if not error: - return "" - - try: - return error.format(exception=exception, filename=filename, lineno=lineno) - except: - self._logger.exception("Error while compiling exception output for template {filename} at line {lineno}".format(**locals())) - return "Unknown error" - -trycatch = ExceptionHandlerExtension diff --git a/src/octoprint/util/jinja.py b/src/octoprint/util/jinja.py index ac2d01ba..1eb31126 100644 --- a/src/octoprint/util/jinja.py +++ b/src/octoprint/util/jinja.py @@ -4,8 +4,11 @@ from __future__ import absolute_import __license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' __copyright__ = "Copyright (C) 2015 The OctoPrint Project - Released under terms of the AGPLv3 License" +import logging import os +from jinja2 import nodes +from jinja2.ext import Extension from jinja2.loaders import FileSystemLoader, PrefixLoader, ChoiceLoader, \ TemplateNotFound, split_template_path @@ -106,3 +109,53 @@ def get_all_asset_paths(env): # intentionally ignored pass return result + + +class ExceptionHandlerExtension(Extension): + tags = {"try"} + + def __init__(self, environment): + super(ExceptionHandlerExtension, self).__init__(environment) + self._logger = logging.getLogger(__name__) + + def parse(self, parser): + token = parser.stream.next() + lineno = token.lineno + filename = parser.name + error = parser.parse_expression() + + args = [error, nodes.Const(filename), nodes.Const(lineno)] + try: + body = parser.parse_statements(["name:endtry"], drop_needle=True) + node = nodes.CallBlock(self.call_method("_handle_body", args), + [], [], body).set_lineno(lineno) + except Exception as e: + # that was expected + self._logger.exception("Caught exception while parsing template") + node = nodes.CallBlock(self.call_method("_handle_error", [nodes.Const(self._format_error(error, e, filename, lineno))]), + [], [], []).set_lineno(lineno) + + return node + + def _handle_body(self, error, filename, lineno, caller): + try: + return caller() + except Exception as e: + self._logger.exception("Caught exception while compiling template {filename} at line {lineno}".format(**locals())) + error_string = self._format_error(error, e, filename, lineno) + return error_string if error_string else "" + + def _handle_error(self, error, caller): + return error if error else "" + + def _format_error(self, error, exception, filename, lineno): + if not error: + return "" + + try: + return error.format(exception=exception, filename=filename, lineno=lineno) + except: + self._logger.exception("Error while compiling exception output for template {filename} at line {lineno}".format(**locals())) + return "Unknown error" + +trycatch = ExceptionHandlerExtension