2
from report.report_sxw import *
3
from osv import osv,fields
7
from DocumentConverter import DocumentConverter
8
converter=DocumentConverter()
10
print "ERROR: failed to create document converter:",e
13
class report_xml(osv.osv):
14
_inherit="ir.actions.report.xml"
16
"report_odt_path": fields.char("ODT path",size=128),
17
"odt_convert": fields.selection([("pdf","PDF"),("doc","MS Word 97"),("rtf","Rich Text Format"),("html","HTML"),("txt","Text")],"Convert ODT"),
25
cr.execute("SELECT * FROM ir_act_report_xml WHERE auto=%s ORDER BY id", (True,))
26
result = cr.dictfetchall()
29
if netsvc.service_exist('report.'+r['report_name']):
31
if r['report_rml'] or r['report_rml_content_data'] or r['report_odt_path']:
32
report_sxw('report.'+r['report_name'], r['model'],
33
opj('addons',r['report_rml'] or '/'), header=r['header'])
35
report_rml('report.'+r['report_name'], r['model'],
36
opj('addons',r['report_xml']),
37
r['report_xsl'] and opj('addons',r['report_xsl']))
38
report.interface.register_all=register_all
40
def create_single_odt(self, cr, uid, ids, data, report_xml, context={}):
41
print "create_single_odt"
42
context = context.copy()
43
report_type = report_xml.report_type
44
context['parents'] = sxw_parents
45
if report_xml.report_odt_path:
46
sxw_in = file("addons/"+report_xml.report_odt_path,'r')
48
sxw_in = StringIO.StringIO(report_xml.report_sxw_content)
49
sxw_zin = zipfile.ZipFile(sxw_in, mode='r')
50
rml = sxw_zin.read('content.xml')
51
meta = sxw_zin.read('meta.xml')
53
rml_parser = self.parser(cr, uid, self.name2, context)
54
rml_parser.parents = sxw_parents
55
rml_parser.tag = sxw_tag
56
objs = self.getObjects(cr, uid, ids, context)
57
rml_parser.set_context(objs, data, ids,report_xml.report_type)
59
rml_dom_meta = node = etree.XML(meta)
60
elements = node.findall(rml_parser.localcontext['name_space']["meta"]+"user-defined")
62
if pe.get(rml_parser.localcontext['name_space']["meta"]+"name"):
63
if pe.get(rml_parser.localcontext['name_space']["meta"]+"name") == "Info 3":
64
pe.getchildren()[0].text=data['id']
65
if pe.get(rml_parser.localcontext['name_space']["meta"]+"name") == "Info 4":
66
pe.getchildren()[0].text=data['model']
67
meta = etree.tostring(rml_dom_meta)
69
rml_dom = etree.XML(rml)
70
file("/tmp/odt1.xml","w").write(etree.tostring(rml_dom,pretty_print=True))
71
rml_dom = self.preprocess_rml(rml_dom,report_type)
72
file("/tmp/odt2.xml","w").write(etree.tostring(rml_dom,pretty_print=True))
73
create_doc = self.generators[report_type]
74
odt_dom=create_doc(rml_dom, rml_parser.localcontext)
75
file("/tmp/odt3.xml","w").write(etree.tostring(odt_dom,pretty_print=True))
76
odt = etree.tostring(odt_dom)
78
sxw_out = StringIO.StringIO()
79
sxw_zout = zipfile.ZipFile(sxw_out, mode='a')
80
sxw_zout.writestr('content.xml', "<?xml version='1.0' encoding='UTF-8'?>" + \
82
sxw_zout.writestr('meta.xml', "<?xml version='1.0' encoding='UTF-8'?>" + \
85
#if report_xml.header:
87
#Add corporate header/footer
88
rml = tools.file_open(os.path.join('base', 'report', 'corporate_%s_header.xml' % report_type)).read()
89
rml_parser = self.parser(cr, uid, self.name2, context)
90
rml_parser.parents = sxw_parents
91
rml_parser.tag = sxw_tag
92
objs = self.getObjects(cr, uid, ids, context)
93
rml_parser.set_context(objs, data, ids, report_xml.report_type)
94
rml_dom = self.preprocess_rml(etree.XML(rml),report_type)
95
create_doc = self.generators[report_type]
96
odt = create_doc(rml_dom,rml_parser.localcontext)
98
rml_parser._add_header(odt)
99
odt = etree.tostring(odt)
100
sxw_zout.writestr('styles.xml',"<?xml version='1.0' encoding='UTF-8'?>" + \
103
# copy all other files
104
out_files=set(sxw_zout.namelist())
105
for zf in sxw_zin.namelist():
109
sxw_zout.writestr(zf,buf)
114
final_op = sxw_out.getvalue()
117
if report_xml.odt_convert:
118
final_op=convert_odt(final_op,report_xml.odt_convert)
119
report_type=report_xml.odt_convert
120
return (final_op, report_type)
121
report_sxw.create_single_odt=create_single_odt
123
def convert_odt(odt,ext):
124
print "convert_odt",ext
126
print "error: ODT converter not available"
128
f1=os.tmpnam()+".odt"
129
f2=os.tmpnam()+"."+ext
130
file(f1,"w").write(odt)
131
converter.convert(f1,f2)
137
odt_parents = ['{urn:oasis:names:tc:opendocument:xmlns:table:1.0}table-row','{urn:oasis:names:tc:opendocument:xmlns:office:1.0}body','{urn:oasis:names:tc:opendocument:xmlns:text:1.0}section']
138
report.preprocess.sxw_parents+=odt_parents