diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2019-08-30 10:44:51 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2019-08-30 10:44:51 +0200 |
commit | 1ef1e7b3235b928b1aee228443f4b7a1d340e549 (patch) | |
tree | 6c9b6842bafe5e3ea3a7240c53a1d0a171608f8f /ishtar_common/utils_secretary.py | |
parent | 927755b5e3503af92a7eb38dd592edb1b381c134 (diff) | |
download | Ishtar-1ef1e7b3235b928b1aee228443f4b7a1d340e549.tar.bz2 Ishtar-1ef1e7b3235b928b1aee228443f4b7a1d340e549.zip |
Secretary patch to fix error report. General catch of secretary errors to display an error page.
Diffstat (limited to 'ishtar_common/utils_secretary.py')
-rw-r--r-- | ishtar_common/utils_secretary.py | 46 |
1 files changed, 45 insertions, 1 deletions
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') |