diff --git a/bin/addons/base/report/custom_default_printscreen.xsl b/bin/addons/base/report/custom_default_printscreen.xsl index 46bcb0b843a..b8b30222953 100644 --- a/bin/addons/base/report/custom_default_printscreen.xsl +++ b/bin/addons/base/report/custom_default_printscreen.xsl @@ -9,8 +9,6 @@ - - / 1.3cm 19.3cm 28.5cm 19.3cm diff --git a/bin/addons/base/res/res_company.py b/bin/addons/base/res/res_company.py index 6d78062a0e9..426731348f2 100644 --- a/bin/addons/base/res/res_company.py +++ b/bin/addons/base/res/res_company.py @@ -211,9 +211,6 @@ class res_company(osv.osv): [[ formatLang(time.strftime("%Y-%m-%d"), date=True) ]] [[ time.strftime("%H:%M") ]] [[ company.partner_id.name ]] - - / - 25 720 1085 720 @@ -231,9 +228,6 @@ class res_company(osv.osv): [[ formatLang(time.strftime("%Y-%m-%d"), date=True) ]] [[ time.strftime("%H:%M") ]] [[ company.partner_id.name ]] - - / - 1.3cm 28.1cm 20cm 28.1cm diff --git a/bin/report/interface.py b/bin/report/interface.py index 0ee9f432883..703256d8fcd 100644 --- a/bin/report/interface.py +++ b/bin/report/interface.py @@ -70,6 +70,7 @@ class report_rml(report_int): def __init__(self, name, table, tmpl, xsl): super(report_rml, self).__init__(name) self.table = table + self.internal_header=False self.tmpl = tmpl self.xsl = xsl self.bin_datas = {} @@ -110,6 +111,7 @@ class report_rml(report_int): return self.post_process_xml_data(cr, uid, xml, context) def post_process_xml_data(self, cr, uid, xml, context=None): + if not context: context={} # find the position of the 3rd tag @@ -136,6 +138,8 @@ class report_rml(report_int): # TODO: The translation doesn't work for "textext textext" # def create_rml(self, cr, xml, uid, context=None): + if self.tmpl=='' and not self.internal_header: + self.internal_header=True if not context: context={} pool = pooler.get_pool(cr.dbname) @@ -174,6 +178,9 @@ class report_rml(report_int): return xml def create_pdf(self, rml, localcontext = None, logo=None, title=None): + if not localcontext: + localcontext={} + localcontext.update({'internal_header':self.internal_header}) if logo: self.bin_datas['logo'] = logo else: diff --git a/bin/report/render/rml2pdf/trml2pdf.py b/bin/report/render/rml2pdf/trml2pdf.py index 848b0f29215..c37aff7aab7 100644 --- a/bin/report/render/rml2pdf/trml2pdf.py +++ b/bin/report/render/rml2pdf/trml2pdf.py @@ -35,9 +35,58 @@ from lxml import etree import base64 from reportlab.platypus.doctemplate import ActionFlowable from tools.safe_eval import safe_eval as eval +from reportlab.lib.units import inch,cm,mm encoding = 'utf-8' +class NumberedCanvas(canvas.Canvas): + def __init__(self, *args, **kwargs): + canvas.Canvas.__init__(self, *args, **kwargs) + self._codes = [] + self._flag=False + self._pageCount=0 + self._currentPage =0 + self._pageCounter=0 + self.pages={} + + def showPage(self): + self._currentPage +=1 + if not self._flag: + self._pageCount += 1 + else: + self.pages.update({self._currentPage:self._pageCount}) + self._codes.append({'code': self._code, 'stack': self._codeStack}) + self._startPage() + self._flag=False + + def pageCount(self): + if self.pages.get(self._pageCounter,False): + self._pageNumber=0 + self._pageCounter +=1 + key=self._pageCounter + if not self.pages.get(key,False): + while not self.pages.get(key,False): + key = key + 1 + self.setFont("Helvetica", 8) + self.drawRightString((self._pagesize[0]-35), (self._pagesize[1]-43), + "Page %(this)i of %(total)i" % { + 'this': self._pageNumber+1, + 'total': self.pages.get(key,False), + } + ) + + def save(self): + """add page info to each page (page x of y)""" + # reset page counter + self._pageNumber = 0 + for code in self._codes: + self._code = code['code'] + self._codeStack = code['stack'] + self.pageCount() + canvas.Canvas.showPage(self) +# self.restoreState() + self._doc.SaveToFile(self._filename, self) + class PageCount(platypus.Flowable): def draw(self): self.canv.beginForm("pageCount") @@ -403,6 +452,7 @@ class _rml_canvas(object): else: args['height'] = sy * args['width'] / sx self.canvas.drawImage(img, **args) +# self.canvas._doc.SaveToFile(self.canvas._filename, self.canvas) def _path(self, node): self.path = self.canvas.beginPath() @@ -762,14 +812,20 @@ class TinyDocTemplate(platypus.BaseDocTemplate): self.handle_frameBegin() def afterFlowable(self, flowable): if isinstance(flowable, PageReset): + self.canv._pageCount=self.page + self.page=0 + self.canv._flag=True self.canv._pageNumber = 0 class _rml_template(object): def __init__(self, localcontext, out, node, doc, images={}, path='.', title=None): + if not localcontext: + localcontext={'internal_header':True} self.localcontext = localcontext self.images= images self.path = path self.title = title + if not node.get('pageSize'): pageSize = (utils.unit_get('21cm'), utils.unit_get('29.7cm')) else: @@ -780,6 +836,7 @@ class _rml_template(object): self.page_templates = [] self.styles = doc.styles self.doc = doc + self.image=[] pts = node.findall('pageTemplate') for pt in pts: frames = [] @@ -794,6 +851,7 @@ class _rml_template(object): except Exception: # FIXME: be even more specific, perhaps? gr='' if len(gr): +# self.image=[ n for n in utils._child_get(gr[0], self) if n.tag=='image' or not self.localcontext] drw = _rml_draw(self.localcontext,gr[0], self.doc, images=images, path=self.path, title=self.title) self.page_templates.append( platypus.PageTemplate(frames=frames, onPage=drw.render, **utils.attr_get(pt, [], {'id':'str'}) )) else: @@ -802,6 +860,8 @@ class _rml_template(object): self.doc_tmpl.addPageTemplates(self.page_templates) def render(self, node_stories): + if self.localcontext and not self.localcontext.get('internal_header',False): + del self.localcontext['internal_header'] fis = [] r = _rml_flowable(self.doc,self.localcontext, images=self.images, path=self.path, title=self.title) story_cnt = 0 @@ -812,9 +872,12 @@ class _rml_template(object): # Reset Page Number with new story tag fis.append(PageReset()) story_cnt += 1 - if self.localcontext: + if self.localcontext and self.localcontext.get('internal_header',False): + self.doc_tmpl.afterFlowable(fis) + self.doc_tmpl.build(fis,canvasmaker=NumberedCanvas) + else: fis.append(PageCount()) - self.doc_tmpl.build(fis) + self.doc_tmpl.build(fis) def parseNode(rml, localcontext = {},fout=None, images={}, path='.',title=None): node = etree.XML(rml) diff --git a/bin/report/render/rml2pdf/utils.py b/bin/report/render/rml2pdf/utils.py index 96df33c925f..0b2a898790d 100644 --- a/bin/report/render/rml2pdf/utils.py +++ b/bin/report/render/rml2pdf/utils.py @@ -42,6 +42,7 @@ from lxml import etree import copy import locale import traceback, sys +import tools from tools.safe_eval import safe_eval as eval import logging @@ -176,7 +177,7 @@ def attr_get(node, attrs, dict={}): for key in dict: if node.get(key): if dict[key]=='str': - res[key] = str(node.get(key)) + res[key] = tools.ustr(node.get(key)) elif dict[key]=='bool': res[key] = bool_get(node.get(key)) elif dict[key]=='int': diff --git a/bin/report/report_sxw.py b/bin/report/report_sxw.py index 3cd448eac58..ee23754bbfb 100644 --- a/bin/report/report_sxw.py +++ b/bin/report/report_sxw.py @@ -364,12 +364,17 @@ class report_sxw(report_rml, preprocess.report): self.parser = parser self.header = header self.store = store + self.internal_header=False + if header=='internal' or header=='internal landscape': + self.internal_header=True def getObjects(self, cr, uid, ids, context): table_obj = pooler.get_pool(cr.dbname).get(self.table) return table_obj.browse(cr, uid, ids, list_class=browse_record_list, context=context, fields_process=_fields_process) def create(self, cr, uid, ids, data, context=None): + if self.internal_header: + context.update({'internal_header':self.internal_header}) pool = pooler.get_pool(cr.dbname) ir_obj = pool.get('ir.actions.report.xml') report_xml_ids = ir_obj.search(cr, uid,