summaryrefslogtreecommitdiff
path: root/ishtar_common/utils_secretary.py
diff options
context:
space:
mode:
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
commiteace6aa5e6763e03c99c27be0e56da360076aa0d (patch)
tree6c9b6842bafe5e3ea3a7240c53a1d0a171608f8f /ishtar_common/utils_secretary.py
parente1a3d19f4b28c9b77bc711d7222e163b8f41a1ff (diff)
downloadIshtar-eace6aa5e6763e03c99c27be0e56da360076aa0d.tar.bz2
Ishtar-eace6aa5e6763e03c99c27be0e56da360076aa0d.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.py46
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')