From eace6aa5e6763e03c99c27be0e56da360076aa0d Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Fri, 30 Aug 2019 10:44:51 +0200 Subject: Secretary patch to fix error report. General catch of secretary errors to display an error page. --- ishtar_common/utils_secretary.py | 46 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) (limited to 'ishtar_common/utils_secretary.py') diff --git a/ishtar_common/utils_secretary.py b/ishtar_common/utils_secretary.py index b66ae4760..2266c38c3 100644 --- a/ishtar_common/utils_secretary.py +++ b/ishtar_common/utils_secretary.py @@ -1,7 +1,11 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -from secretary import Renderer +from secretary import Renderer, parseString + +from xml.parsers.expat import ExpatError, ErrorString + + from datetime import datetime import locale @@ -73,5 +77,45 @@ class IshtarSecretaryRenderer(Renderer): ) return image_file, mime + def _render_xml(self, xml_document, **kwargs): + # Prepare the xml object to be processed by jinja2 + self.log.debug('Rendering XML object') + template_string = "" + + try: + self.template_images = dict() + self._prepare_document_tags(xml_document) + xml_source = xml_document.toxml() + xml_source = xml_source.encode('ascii', 'xmlcharrefreplace') + jinja_template = self.environment.from_string( + self._unescape_entities(xml_source.decode('utf-8')) + ) + + result = jinja_template.render(**kwargs) + result = self._encode_escape_chars(result) + + final_xml = parseString(result.encode('ascii', 'xmlcharrefreplace')) + if self.template_images: + self.replace_images(final_xml) + + return final_xml + except ExpatError as e: + if not 'result' in locals(): + result = xml_source + ### changes + try: + near = result.split('\n')[e.lineno -1][e.offset-200:e.offset+200] + except IndexError: + near = "..." + ### endchanges + raise ExpatError('ExpatError "%s" at line %d, column %d\nNear of: "[...]%s[...]"' % \ + (ErrorString(e.code), e.lineno, e.offset, near)) + except: + self.log.error('Error rendering template:\n%s', + xml_document.toprettyxml(), exc_info=True) + self.log.error('Unescaped template was:\n{0}'.format(template_string)) + raise + finally: + self.log.debug('Rendering xml object finished') -- cgit v1.2.3