1
# -*- coding: utf-8 -*-
4
from mx import DateTime
5
from tools.translate import _
6
from tools.misc import file_open
8
from report_webkit.webkit_report import WebKitParser
9
from report import report_sxw
13
from mako.template import Template
14
from mako import exceptions
15
from mako.runtime import Context
17
from tools.misc import file_open
25
class SpreadsheetReport(WebKitParser):
27
'date': report_sxw._date_format,
28
'datetime': report_sxw._dttime_format
32
def __init__(self, name, table, rml=False, parser=report_sxw.rml_parse, header='external', store=False):
34
rml = 'addons/spreadsheet_xml/report/spreadsheet_xls.mako'
35
WebKitParser.__init__(self, name, table, rml=rml, parser=parser, header=header, store=store)
36
self.sheet_name_used = []
37
self.total_sheet_number = 1
39
def sheet_name(self, default_name=False, context=None):
42
default_name = 'Sheet %s' % (self.total_sheet_number, )
44
default_name = default_name[0:sheet_max_size].replace('/','_')
46
if default_name in self.sheet_name_used:
47
default_name = '%s %s'% (default_name[0:sheet_max_size - len('%s' % self.total_sheet_number) - 1], self.total_sheet_number)
49
self.sheet_name_used.append(default_name)
50
self.total_sheet_number += 1
53
def create_single_pdf(self, cr, uid, ids, data, report_xml, context=None):
56
if report_xml.report_type != 'webkit':
57
return super(WebKitParser,self).create_single_pdf(cr, uid, ids, data, report_xml, context=context)
59
self.report_xml = report_xml
60
self.parser_instance = self.parser(cr, uid, self.name2, context=context)
61
self.pool = pooler.get_pool(cr.dbname)
63
if not context.get('splitbrowse'):
64
objs = self.getObjects(cr, uid, ids, context)
67
self.parser_instance.localcontext['ids'] = ids
68
self.parser_instance.localcontext['context'] = context
69
self.parser_instance.set_context(objs, data, ids, report_xml.report_type)
72
if report_xml.report_file:
73
path = addons.get_module_resource(report_xml.report_file)
74
if path and os.path.exists(path):
75
template = file(path).read()
78
f = file_open(self.tmpl)
83
raise osv.except_osv(_('Error!'), _('Webkit Report template not found !'))
85
self.localcontext.update({'lang': context.get('lang')})
86
self.parser_instance.localcontext.update({'setLang':self.setLang})
87
self.parser_instance.localcontext.update({'formatLang':self.formatLang})
90
null, tmpname = tempfile.mkstemp()
91
fileout = codecs.open(tmpname, 'wb', 'utf8')
92
body_mako_tpl = Template(template, input_encoding='utf-8', default_filters=['unicode'])
94
mako_ctx = Context(fileout, _=self.translate_call, **self.parser_instance.localcontext)
95
body_mako_tpl.render_context(mako_ctx)
98
msg = exceptions.text_error_template().render()
99
netsvc.Logger().notifyChannel('Webkit render', netsvc.LOG_ERROR, msg)
100
raise osv.except_osv(_('Webkit render'), msg)
102
# circular reference on parse_instance, force memory free
103
del self.parser_instance
105
if context.get('zipit'):
106
null1, tmpzipname = tempfile.mkstemp()
107
zf = zipfile.ZipFile(tmpzipname, 'w')
108
zf.write(tmpname, 'export_result.xls', zipfile.ZIP_DEFLATED)
110
out = file(tmpzipname, 'rb').read()
113
os.unlink(tmpzipname)
117
out = file(tmpname, 'rb').read()
122
def getObjects(self, cr, uid, ids, context):
123
table_obj = pooler.get_pool(cr.dbname).get(self.table)
124
self.sheet_name_used = []
125
self.total_sheet_number = 1
126
self.parser_instance.localcontext['sheet_name'] = self.sheet_name
127
return table_obj.browse(cr, uid, ids, list_class=report_sxw.browse_record_list, context=context, fields_process=self._fields_process)
129
def create(self, cr, uid, ids, data, context=None):
130
a = super(SpreadsheetReport, self).create(cr, uid, ids, data, context)
131
# This permit to test XLS report generation with tools.tests_reports without given some warning
132
# Cf. tools/tests_reports.py:89
133
if context and context.get('from_yml', False) and context.get('from_yml') is True:
134
return (a[0], 'foobar')
137
class SpreadsheetCreator(object):
138
def __init__(self, title, headers, datas):
139
self.headers = headers
143
def get_xml(self, default_filters=[]):
144
f, filename = file_open('addons/spreadsheet_xml/report/spreadsheet_writer_xls.mako', pathinfo=True)
146
tmpl = Template(filename=filename, input_encoding='utf-8', output_encoding='utf-8', default_filters=default_filters)
147
return tmpl.render(objects=self.datas, headers=self.headers, title= self.title)