From d0125d893d75df7ba7be5a9d61a3e68051a42b7c Mon Sep 17 00:00:00 2001 From: Xavier ALT Date: Mon, 16 Jul 2012 09:52:17 +0200 Subject: [PATCH] [MERGE] OPW 51167: report: fix header pageCount always zero + add automatic per-story pageCount (v6.0 forward-port) bzr revid: xal@openerp.com-20120716075217-kpwcotmrhpl4pj60 --- openerp/report/render/rml2pdf/trml2pdf.py | 40 ++++++++++++++++++----- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/openerp/report/render/rml2pdf/trml2pdf.py b/openerp/report/render/rml2pdf/trml2pdf.py index e03d643e74d..e8119fa2b93 100644 --- a/openerp/report/render/rml2pdf/trml2pdf.py +++ b/openerp/report/render/rml2pdf/trml2pdf.py @@ -118,15 +118,19 @@ class NumberedCanvas(canvas.Canvas): self._doc.SaveToFile(self._filename, self) class PageCount(platypus.Flowable): + def __init__(self, story_count=0): + platypus.Flowable.__init__(self) + self.story_count = story_count + def draw(self): - self.canv.beginForm("pageCount") + self.canv.beginForm("pageCount%d" % (self.story_count)) self.canv.setFont("Helvetica", utils.unit_get(str(8))) self.canv.drawString(0, 0, str(self.canv.getPageNumber())) self.canv.endForm() class PageReset(platypus.Flowable): def draw(self): - self.canv._pageNumber = 0 + self.canv._doPageReset = True class _rml_styles(object,): def __init__(self, nodes, localcontext): @@ -343,7 +347,7 @@ class _rml_canvas(object): if n.tag == 'pageCount': if x or y: self.canvas.translate(x,y) - self.canvas.doForm('pageCount') + self.canvas.doForm('pageCount%s' % (self.canvas._storyCount,)) if x or y: self.canvas.translate(-x,-y) if n.tag == 'pageNumber': @@ -878,6 +882,13 @@ class EndFrameFlowable(ActionFlowable): ActionFlowable.__init__(self,('frameEnd',resume)) class TinyDocTemplate(platypus.BaseDocTemplate): + + def beforeDocument(self): + # Store some useful value directly inside canvas, so it's available + # on flowable drawing (needed for proper PageCount handling) + self.canv._doPageReset = False + self.canv._storyCount = 0 + def ___handle_pageBegin(self): self.page = self.page + 1 self.pageTemplate.beforeDrawPage(self.canv,self) @@ -893,12 +904,24 @@ class TinyDocTemplate(platypus.BaseDocTemplate): self.frame = f break self.handle_frameBegin() - def afterFlowable(self, flowable): - if isinstance(flowable, PageReset): - self.canv._pageCount=self.page - self.page=0 - self.canv._flag=True + + def afterPage(self): + if self.canv._doPageReset: + # Following a tag: + # - we reset page number to 0 + # - we add an new PageCount flowable (relative to the current + # story number), but not for NumeredCanvas at is handle page + # count itself) + # NOTE: _rml_template render() method add a PageReset flowable at end + # of each story, so we're sure to pass here at least once per story. + if not isinstance(self.canv, NumberedCanvas): + self.handle_flowable([ PageCount(story_count=self.canv._storyCount) ]) + self.canv._pageCount = self.page + self.page = 0 + self.canv._flag = True self.canv._pageNumber = 0 + self.canv._doPageReset = False + self.canv._storyCount += 1 class _rml_template(object): def __init__(self, localcontext, out, node, doc, images=None, path='.', title=None): @@ -965,7 +988,6 @@ class _rml_template(object): self.doc_tmpl.afterFlowable(fis) self.doc_tmpl.build(fis,canvasmaker=NumberedCanvas) else: - fis.append(PageCount()) self.doc_tmpl.build(fis) def parseNode(rml, localcontext=None, fout=None, images=None, path='.', title=None):