~almacom/openobject-addons/ac_addons

« back to all changes in this revision

Viewing changes to ac_report_odt/odt.py

  • Committer: almacom
  • Date: 2009-06-07 18:57:08 UTC
  • Revision ID: almacom@cat1-20090607185708-cslu11yvpjo6mfaz
payment flow

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
import report
 
2
from report.report_sxw import *
 
3
from osv import osv,fields
 
4
import os
 
5
 
 
6
try:
 
7
    from DocumentConverter import DocumentConverter
 
8
    converter=DocumentConverter()
 
9
except Exception,e:
 
10
    print "ERROR: failed to create document converter:",e
 
11
    converter=None
 
12
 
 
13
class report_xml(osv.osv):
 
14
    _inherit="ir.actions.report.xml"
 
15
    _columns={
 
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"),
 
18
    }
 
19
report_xml()
 
20
 
 
21
def register_all(db):
 
22
    print "register_all"
 
23
    opj = os.path.join
 
24
    cr = db.cursor()
 
25
    cr.execute("SELECT * FROM ir_act_report_xml WHERE auto=%s ORDER BY id", (True,))
 
26
    result = cr.dictfetchall()
 
27
    cr.close()
 
28
    for r in result:
 
29
        if netsvc.service_exist('report.'+r['report_name']):
 
30
            continue
 
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'])
 
34
        if r['report_xsl']:
 
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
 
39
 
 
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')
 
47
    else:
 
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')
 
52
 
 
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)
 
58
 
 
59
    rml_dom_meta = node = etree.XML(meta)
 
60
    elements = node.findall(rml_parser.localcontext['name_space']["meta"]+"user-defined")
 
61
    for pe in elements:
 
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)
 
68
 
 
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)
 
77
 
 
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'?>" + \
 
81
            odt)
 
82
    sxw_zout.writestr('meta.xml', "<?xml version='1.0' encoding='UTF-8'?>" + \
 
83
            meta)
 
84
 
 
85
    #if report_xml.header:
 
86
    if 0:
 
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)
 
97
        if report_xml.header:
 
98
            rml_parser._add_header(odt)
 
99
        odt = etree.tostring(odt)
 
100
        sxw_zout.writestr('styles.xml',"<?xml version='1.0' encoding='UTF-8'?>" + \
 
101
                odt)
 
102
 
 
103
    # copy all other files
 
104
    out_files=set(sxw_zout.namelist())
 
105
    for zf in sxw_zin.namelist():
 
106
        if zf in out_files:
 
107
            continue
 
108
        buf=sxw_zin.read(zf)
 
109
        sxw_zout.writestr(zf,buf)
 
110
    sxw_zin.close()
 
111
    sxw_in.close()
 
112
 
 
113
    sxw_zout.close()
 
114
    final_op = sxw_out.getvalue()
 
115
    sxw_out.close()
 
116
 
 
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
 
122
 
 
123
def convert_odt(odt,ext):
 
124
    print "convert_odt",ext
 
125
    if not converter:
 
126
        print "error: ODT converter not available"
 
127
        return None
 
128
    f1=os.tmpnam()+".odt"
 
129
    f2=os.tmpnam()+"."+ext
 
130
    file(f1,"w").write(odt)
 
131
    converter.convert(f1,f2)
 
132
    res=file(f2).read()
 
133
    os.unlink(f1)
 
134
    os.unlink(f2)
 
135
    return res
 
136
 
 
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