From 6792d85b440b47bf581dc996edea3c0d55a3546e Mon Sep 17 00:00:00 2001 From: Denis Ledoux Date: Tue, 12 Nov 2013 14:04:12 +0100 Subject: [PATCH] [FIX]report: rml2pdf raise exception if cell is too long to be printed (instead of infinite loop). Workaround for reportlab issue #15: https://bitbucket.org/rptlab/reportlab/issue/15/infinite-pages-produced-when-splitting bzr revid: dle@openerp.com-20131112130412-mbdonb9g7n63w84r --- openerp/report/render/rml2pdf/trml2pdf.py | 27 ++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/openerp/report/render/rml2pdf/trml2pdf.py b/openerp/report/render/rml2pdf/trml2pdf.py index 2052b128ad9..6a35e3a3806 100644 --- a/openerp/report/render/rml2pdf/trml2pdf.py +++ b/openerp/report/render/rml2pdf/trml2pdf.py @@ -631,6 +631,18 @@ class _rml_Illustration(platypus.flowables.Flowable): drw = _rml_draw(self.localcontext ,self.node,self.styles, images=self.self2.images, path=self.self2.path, title=self.self2.title) drw.render(self.canv, None) +# Workaround for issue #15: https://bitbucket.org/rptlab/reportlab/issue/15/infinite-pages-produced-when-splitting +original_pto_split = platypus.flowables.PTOContainer.split +def split(self, availWidth, availHeight): + res = original_pto_split(self, availWidth, availHeight) + if len(res) > 2 and len(self._content) > 0: + header = self._content[0]._ptoinfo.header + trailer = self._content[0]._ptoinfo.trailer + if isinstance(res[-2], platypus.flowables.UseUpSpace) and len(header + trailer) == len(res[:-2]): + return [] + return res +platypus.flowables.PTOContainer.split = split + class _rml_flowable(object): def __init__(self, doc, localcontext, images=None, path='.', title=None, canvas=None): if images is None: @@ -1012,11 +1024,16 @@ class _rml_template(object): # Reset Page Number with new story tag fis.append(PageReset()) story_cnt += 1 - if self.localcontext and self.localcontext.get('internal_header',False): - self.doc_tmpl.afterFlowable(fis) - self.doc_tmpl.build(fis,canvasmaker=NumberedCanvas) - else: - self.doc_tmpl.build(fis) + try: + if self.localcontext and self.localcontext.get('internal_header',False): + self.doc_tmpl.afterFlowable(fis) + self.doc_tmpl.build(fis,canvasmaker=NumberedCanvas) + else: + self.doc_tmpl.build(fis) + except platypus.doctemplate.LayoutError, e: + e.name = 'Print Error' + e.value = 'The document you are trying to print contains a table row that does not fit on one page. Please try to split it in smaller rows or contact your administrator.' + raise def parseNode(rml, localcontext=None, fout=None, images=None, path='.', title=None): node = etree.XML(rml)