Browse Source

Customization of report templates with a field to download/upload

pull/80/head
Houzefa Abbasbhay 11 years ago
parent
commit
e9c4d7c40b
  1. 1
      __init__.py
  2. 1
      __openerp__.py
  3. 46
      ir_report.py
  4. 26
      ir_report.xml
  5. 22
      py3o_report.py

1
__init__.py

@ -1 +1,2 @@
import ir_report
import py3o_report

1
__openerp__.py

@ -16,6 +16,7 @@ The py3o.template package is required; install it with:
'base'
],
'data': [
'ir_report.xml',
],
'installable': True,
}

46
ir_report.py

@ -0,0 +1,46 @@
from base64 import b64encode
from openerp import addons
from openerp.osv import fields, osv
from openerp.tools.translate import _
class report_xml(osv.osv):
''' Inherit from ir.actions.report.xml to allow customizing the template
file. By default, the file defined when registering the report is used;
but the user can download / upload a new one. '''
_inherit = 'ir.actions.report.xml'
def _get_filename(self, cr, uid, ids, field_name, arg, context):
return {
br.id: br.name + '.odt'
for br in self.browse(cr, uid, ids, context=context)
if br.report_type == 'py3o'
}
def _get_template_data(self, cr, uid, ids, field_name, arg, context):
''' Just return the data stored in the binary field, unless it is
empty; in that case, read the template file. '''
return {
br.id: (br.py3o_template_data if br.py3o_template_data
else b64encode(file(addons.get_module_resource(
*br.report_file.split('/')), 'rb').read()))
for br in self.browse(cr, uid, ids, context=context)
if br.report_type == 'py3o'
}
_columns = {
'py3o_filename': fields.function(_get_filename,
type='char',
method=True,
readonly=True),
'py3o_template': fields.function(_get_template_data,
type='binary',
method=True,
readonly=True),
'py3o_template_data': fields.binary(_('LibreOffice template')),
}

26
ir_report.xml

@ -0,0 +1,26 @@
<openerp>
<data>
<!-- Inherit from base.act_report_xml_view to add py3o-related settings. -->
<record id="py3o_report_view" model="ir.ui.view">
<field name="name">py3o_report_view</field>
<field name="model">ir.actions.report.xml</field>
<field name="inherit_id" ref="base.act_report_xml_view" />
<field name="arch" type="xml">
<xpath expr="//page[@string='Security']" position="before">
<page string="LibreOffice template"
attrs="{'invisible': [('report_type', '!=', 'py3o')]}">
<field name="py3o_filename" invisible="1" />
<field name="py3o_template" filename="py3o_filename" />
<field name="py3o_template_data" filename="py3o_filename" />
</page>
</xpath>
</field>
</record>
</data>
</openerp>

22
py3o_report.py

@ -1,6 +1,7 @@
from base64 import b64decode
from tempfile import NamedTemporaryFile
from openerp import addons, pooler
from openerp import pooler
from openerp.report.report_sxw import *
from openerp.tools.translate import _
from openerp.osv.osv import except_osv
@ -46,19 +47,20 @@ class py3o_report(report_sxw):
report_xml_ids[0],
context=context)
# Get the template file.
template_path = addons.get_module_resource(
*report_xml.report_file.split('/'))
# py3o.template operates on filenames so create temporary files.
with NamedTemporaryFile(suffix='.odt', prefix='py3o-template-') as \
in_temp, \
NamedTemporaryFile(suffix='.odt', prefix='py3o-report-') as \
out_temp:
# py3o.template operates on filenames so create a temporary file.
with NamedTemporaryFile(suffix='.odt', prefix='py3o-report-') as \
temp_file:
in_temp.write(b64decode(report_xml.py3o_template))
in_temp.flush()
template = Template(template_path, temp_file.name)
template = Template(in_temp.name, out_temp.name)
template.render(self.get_values(cr, uid, ids, data, context))
temp_file.seek(0)
return temp_file.read(), 'odt'
out_temp.seek(0)
return out_temp.read(), 'odt'
return False, False
Loading…
Cancel
Save