forked from vaab/report_birt
-
Notifications
You must be signed in to change notification settings - Fork 0
/
birt_report.py
130 lines (98 loc) · 4.63 KB
/
birt_report.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# -*- coding: utf-8 -*-
import logging
import traceback
import netsvc
import pooler
import report_webkit
from report.report_sxw import *
from tools.translate import _
from osv.osv import except_osv
from osv.orm import except_orm
from tools.safe_eval import safe_eval as eval
from . import birt
##
##
## XXXvlab: Translation ?
def format_last_exception():
"""Format the last exception for display it in tests."""
return '\n'.join(
[" | " + line for line in traceback.format_exc().strip().split('\n')]
)
class BirtProxyFactory(report_webkit.webkit_report.WebKitParser):
"""Proxies the BIRT client viewer web service
Code partially taken from report webkit. Thanks guys :)
"""
def __init__(self, name, table, rml=False, parser=False,
header=True, store=False):
self._logger = logging.getLogger(self.__class__.__name__)
self.parser_instance = False
self.localcontext = {}
super(BirtProxyFactory, self).__init__(name, table, rml,
parser, header, store)
def generate_pdf(self, comm_path, report_birt, header, footer, html_list):
## should return the raw data of a pdf
return None
def _create_birt_report(self, cr, uid, ids, data, report_birt, context=None):
if len(ids) != 1:
raise NotImplementedError("Report on multiple object not implemented")
table_obj = pooler.get_pool(cr.dbname).get(self.table)
objs = table_obj.browse(cr, uid, ids, list_class=None, context=context, fields_process=None)
obj = objs[0]
fields_def = obj._table.fields_get(cr, uid, None, context)
report_file = report_birt.birt_report
format = report_birt.birt_format
local = dict((k, getattr(obj, k)) for k, v in fields_def.iteritems())
local.update(context)
local['user'] = pooler.get_pool(cr.dbname) \
.get('res.users') \
.browse(cr, uid, context['uid'], context=context)
params = dict((o['name'],
o['value'] if not o['eval'] else
eval(o['value'], globals(), local))
for o in report_birt.birt_report_params)
birt_factory = birt.BirtConnection(report_birt.birt_url)
return birt_factory(report_file, format, params)
# override needed to keep the attachments' storing procedure
def create_single_pdf(self, cr, uid, ids, data, report_birt, context=None):
"""Override of inherited function to divert it and generate the BIRT output
instead of PDF if report_type is 'birt'."""
if context is None:
context={}
if report_birt.report_type != 'birt':
return super(BirtProxyFactory, self).create_single_pdf(cr, uid, ids, data, report_birt, context=context)
return self.create_single_birt(cr, uid, ids, data, report_birt, context)
def create_single_birt(self, cr, uid, ids, data, report_birt, context=None):
"""generate the BIRT report"""
if context is None:
context={}
if report_birt.report_type != 'birt':
return super(BirtProxyFactory,self).create_single_pdf(
cr, uid, ids, data, report_birt, context=context)
return self._create_birt_report(cr, uid, ids, data, report_birt, context)
def create(self, cr, uid, ids, data, context=None):
"""We override the create function in order to handle generator
Code taken from report webkit. Thanks guys :) """
pool = pooler.get_pool(cr.dbname)
ir_obj = pool.get('ir.actions.report.xml')
report_xml_ids = ir_obj.search(cr, uid,
[('report_name', '=', self.name[7:])], context=context)
if report_xml_ids:
report_xml = ir_obj.browse(
cr,
uid,
report_xml_ids[0],
context=context
)
report_xml.report_rml = None
report_xml.report_rml_content = None
report_xml.report_sxw_content_data = None
report_rml.report_sxw_content = None
report_rml.report_sxw = None
else:
return super(BirtProxyFactory, self).create(cr, uid, ids, data, context)
if report_xml.report_type != 'birt' :
return super(BirtProxyFactory, self).create(cr, uid, ids, data, context)
result = self.create_source_pdf(cr, uid, ids, data, report_xml, context)
if not result:
return (False,False)
return result