forked from hendrixcosta/report_py3o
-
Notifications
You must be signed in to change notification settings - Fork 0
/
py3o_report_modif.py
146 lines (118 loc) · 4.89 KB
/
py3o_report_modif.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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
from base64 import b64decode
from tempfile import NamedTemporaryFile as tempfile
from openerp import pooler
from openerp.report.report_sxw import *
from openerp.tools.translate import _
from openerp.osv.osv import except_osv
from py3o.template import Template
from oe_json_serializer import OESerializer
import json
import requests
import os
class py3o_report(report_sxw):
# def __init__(self, name, table):
# super(py3o_report, self).__init__(name, table)
def get_values(self, cr, uid, ids, data, context):
''' Override this function to customize the dictionary given to the
py3o.template renderer. '''
return {
'lang': self.get_lang(cr, uid, context),
'objects': self.getObjects(cr, uid, ids, context),
}
def get_lang(self, cr, uid, context):
pool = pooler.get_pool(cr.dbname)
lang_obj = pool.get('res.lang')
user_obj = pool.get('res.users')
lang_code = user_obj.browse(cr, uid, uid, context=context).lang
lang = lang_obj.search(cr, uid,
[('code', '=', lang_code)],
context=context)[0]
return lang_obj.browse(cr, uid, lang, context=context)
def format_date(self, date, values):
''' Return a date formatted according to the language extracted from
the "values" argument (which should be the result of get_values). '''
return date.strftime(values['lang'].date_format)
def create(self, cr, uid, ids, data, context=None):
# Find the report definition to get its settings.
pool = pooler.get_pool(cr.dbname)
report_xml_obj = pool.get('ir.actions.report.xml')
report_xml_ids = report_xml_obj.search(cr, uid,
[('report_name', '=', self.name[7:])], # Ignore "report."
context=context)
if not report_xml_ids:
return super(py3o_report, self).create(cr, uid, ids, data,
context=context)
report_xml = report_xml_obj.browse(cr, uid,
report_xml_ids[0],
context=context)
template = report_xml.py3o_template_id
filetype = report_xml.py3o_fusion_filetype
#Try to request fusion server:
fusion_server_obj = pool['py3o.server']
#TODO: Raise a message if no config found
fusion_server_id = fusion_server_obj.search(
cr, uid, [], context=context
)[0]
fusion_server = fusion_server_obj.browse(cr, uid, fusion_server_id)
# py3o.template operates on filenames so create temporary files.
in_temp = tempfile(suffix='.odt', prefix='py3o-template-')
in_temp.write(b64decode(template.py3o_template_data))
in_temp.seek(0)
out_temp = tempfile(suffix='.odt', prefix='py3o-report-')
# We need to get the variables used in the template
#TODO: Find a way to avoid calling Template
t = Template(in_temp.name, out_temp.name)
# Remove 'py3o.'
user_variable = [x[5:] for x in t.get_all_user_python_expression()]
print user_variable
values = self.get_values(cr, uid, ids, data, context)
t.render(values)
print values
#WARNING: We rely on the fact that there is a for loop on the report
# on objects (for object in objects) due to lack of time
val_dict = {}
for val in values:
if val == 'objects':
o = []
for obj in values[val]:
x = OESerializer.serialize(
obj,
[
v[len('object') + 1:]
for v in user_variable
if v.startswith('object')
]
)
o.append(x)
val_dict.update({val: o})
continue
x = OESerializer.serialize(
values[val],
[
v[len(val) + 1:]
for v in user_variable
if v.startswith(val)
]
)
val_dict.update({val: x})
import pprint
pprint.pprint(val_dict)
val_json = json.dumps(val_dict)
fields = {
'targetformat': filetype.fusion_ext,
'datadict': val_json,
'image_mapping': '{}',
}
print fields
r = requests.post(
fusion_server.url, data=fields, files={'tmpl_file': in_temp}
)
in_temp.close()
if r.status_code == 400:
raise Exception("Problem with fusion server: %s" % r.json())
chunk_size = 1024
ext = filetype.human_ext
for chunk in r.iter_content(chunk_size):
out_temp.write(chunk)
out_temp.seek(0)
return out_temp.read(), ext