From 1ef1e7b3235b928b1aee228443f4b7a1d340e549 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/models.py | 2 ++ ishtar_common/templates/error.html | 3 +++ ishtar_common/utils_secretary.py | 46 +++++++++++++++++++++++++++++++++++++- ishtar_common/views.py | 3 ++- 4 files changed, 52 insertions(+), 2 deletions(-) (limited to 'ishtar_common') diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 176559934..35c35e97b 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -3378,6 +3378,8 @@ class DocumentTemplate(models.Model): raise TemplateSyntaxError(str(e), e.lineno) except UndefinedError as e: raise TemplateSyntaxError(str(e), 0) + except Exception as e: + raise TemplateSyntaxError(str(e), 0) output = open(output_name, 'wb') output.write(result) return output_name diff --git a/ishtar_common/templates/error.html b/ishtar_common/templates/error.html index 069796184..ba334da5a 100644 --- a/ishtar_common/templates/error.html +++ b/ishtar_common/templates/error.html @@ -3,4 +3,7 @@ {% block error %}

{{error_title}}

{{error}}

+{% if back_url %} +

{% trans "Back to your page" %}

+{% endif %} {% endblock %} 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') diff --git a/ishtar_common/views.py b/ishtar_common/views.py index 5a3f90da6..2af082a0a 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -1950,7 +1950,8 @@ def gen_generate_doc(model): except TemplateSyntaxError as e: dct = { "error_title": _("Error on your template"), - "error": str(e) + "error": str(e), + "back_url": reverse("display-item", args=[item.SLUG, pk]) } template = loader.get_template("error.html") return HttpResponse(template.render(dct, request)) -- cgit v1.2.3