Merge lp:~numerigraphe/openobject-server/5.0-bug516966-wrong-pageCount-pageNumber into lp:openobject-server/5.0

Proposed by Numérigraphe
Status: Needs review
Proposed branch: lp:~numerigraphe/openobject-server/5.0-bug516966-wrong-pageCount-pageNumber
Merge into: lp:openobject-server/5.0
Diff against target: 100 lines (+34/-8)
1 file modified
bin/report/render/rml2pdf/trml2pdf.py (+34/-8)
To merge this branch: bzr merge lp:~numerigraphe/openobject-server/5.0-bug516966-wrong-pageCount-pageNumber
Reviewer Review Type Date Requested Status
OpenERP Core Team Pending
Anup(SerpentCS) Pending
Xavier ALT Pending
Review via email: mp+82402@code.launchpad.net

This proposal supersedes a proposal from 2010-05-20.

Description of the change

Contributions from Xavier ALT (AJM) and Numérigraphe to fix Bug #516966: report_sxw: wrong pageCount and pageNumber when attachments are not kept.

If this can't make it in 5.0 I personally won't mind if you reject this merge, but please let us know.
Lionel

To post a comment you must log in.
Revision history for this message
Xavier ALT (dex-phx) wrote : Posted in a previous version of this proposal

Hi Lionel,

I've check with your modifications, all goods for me. Now pageCount is ok with or without the presence of <pageNumberReset/> tag.

Test 1 - 1 Invoice - 1 page
Test 2 - 1 Invoice - 2 pages
Test 3 - 5 Invoice - 1 page for all invoice
Test 4 - 5 Invoice - different number of pages for each invoices
Test 5 - report containing <pageNumberReset/> - different number of pages records

review: Approve

Unmerged revisions

2053. By Numerigraphe - Lionel Sausin <email address hidden>

[FIX] report: PageReset should be before PageBreak in new story

2052. By Numerigraphe - Lionel Sausin <email address hidden>

[FIX] report: reset page count in each story

2051. By Xavier ALT (AJM)

[FIX] report: fix <pageNumberReset>

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'bin/report/render/rml2pdf/trml2pdf.py'
2--- bin/report/render/rml2pdf/trml2pdf.py 2011-09-05 09:41:08 +0000
3+++ bin/report/render/rml2pdf/trml2pdf.py 2011-11-16 14:34:27 +0000
4@@ -40,15 +40,19 @@
5 encoding = 'utf-8'
6
7 class PageCount(platypus.Flowable):
8+ def __init__(self, page_count=1):
9+ platypus.Flowable.__init__(self)
10+ self.page_count = page_count
11+
12 def draw(self):
13- self.canv.beginForm("pageCount")
14+ self.canv.beginForm("pageCount%s" % (self.page_count))
15 self.canv.setFont("Helvetica", utils.unit_get(str(8)))
16 self.canv.drawString(0, 0, str(self.canv.getPageNumber()))
17 self.canv.endForm()
18
19 class PageReset(platypus.Flowable):
20 def draw(self):
21- self.canv._pageNumber = 0
22+ self.canv._doPageReset = True
23
24 class _rml_styles(object,):
25 def __init__(self, nodes, localcontext):
26@@ -205,6 +209,7 @@
27 pt_obj.render(el)
28 else:
29 self.canvas = canvas.Canvas(out)
30+ self.canvas.page_count = 1
31 pd = self.etree.find('pageDrawing')[0]
32 pd_obj = _rml_canvas(self.canvas, self.localcontext, None, self, self.images, path=self.path, title=self.title)
33 pd_obj.render(pd)
34@@ -236,7 +241,7 @@
35 if n.tag == 'pageCount':
36 if x or y:
37 self.canvas.translate(x,y)
38- self.canvas.doForm('pageCount')
39+ self.canvas.doForm('pageCount%s' % (self.canvas.page_count))
40 if x or y:
41 self.canvas.translate(-x,-y)
42 if n.tag == 'pageNumber':
43@@ -717,6 +722,13 @@
44 ActionFlowable.__init__(self,('frameEnd',resume))
45
46 class TinyDocTemplate(platypus.BaseDocTemplate):
47+
48+ def beforeDocument(self):
49+ # Store some useful value directly inside canvas, so it's available
50+ # on flowable drawing
51+ self.canv.page_count = 1
52+ self.canv._doPageReset = False
53+
54 def ___handle_pageBegin(self):
55 self.page = self.page + 1
56 self.pageTemplate.beforeDrawPage(self.canv,self)
57@@ -732,9 +744,15 @@
58 self.frame = f
59 break
60 self.handle_frameBegin()
61- def afterFlowable(self, flowable):
62- if isinstance(flowable, PageReset):
63+
64+ def afterPage(self):
65+ if self.canv._doPageReset:
66+ # Following a <pageNumberReset/> tag, we reset page number to 0
67+ # and increment story count (so that page count is specific to
68+ # the story
69 self.canv._pageNumber = 0
70+ self.canv._doPageReset = False
71+ self.canv.page_count += 1
72
73 class _rml_template(object):
74 def __init__(self, localcontext, out, node, doc, images={}, path='.', title=None):
75@@ -776,14 +794,22 @@
76 def render(self, node_stories):
77 fis = []
78 r = _rml_flowable(self.doc,self.localcontext, images=self.images, path=self.path, title=self.title)
79- story_cnt = 0
80+ story_cnt = 0 # story counter
81+ page_cnt = 0 # page number counter (can differ from story_cnt if PageReset is used)
82 for node_story in node_stories:
83 if story_cnt > 0:
84+ fis.append(PageReset())
85 fis.append(platypus.PageBreak())
86 fis += r.render(node_story)
87 story_cnt += 1
88- if self.localcontext:
89- fis.append(PageCount())
90+ page_cnt += 1
91+
92+ for (st, _n) in etree.iterwalk(node_story, tag='pageBreak'):
93+ fis.append(PageCount(page_count=page_cnt))
94+ page_cnt += 1
95+ if self.localcontext:
96+ # 1 PageCount for each story or pageNumberReset
97+ fis.append(PageCount(page_count=page_cnt))
98 self.doc_tmpl.build(fis)
99
100 def parseNode(rml, localcontext = {},fout=None, images={}, path='.',title=None):