~unifield-team/unifield-wm/us-671-homere

« back to all changes in this revision

Viewing changes to spreadsheet_xml/spreadsheet_xml_write.py

  • Committer: jf
  • Date: 2012-04-17 15:29:16 UTC
  • mfrom: (631.3.7 UF_828)
  • Revision ID: jf@tempo4-20120417152916-svm6ioq8ur2bi5tu
UF-955 [DEV] Reporting (Month-end) - 2 remaining reports
lp:~unifield-team/unifield-wm/UF_955

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# -*- coding: utf-8 -*-
2
 
 
3
 
from lxml import etree
4
 
from mx import DateTime
5
 
from tools.translate import _
6
 
from tools.misc import file_open
7
 
from osv import osv
8
 
from report_webkit.webkit_report import WebKitParser
9
 
from report import report_sxw
10
 
import os
11
 
import netsvc
12
 
import pooler
13
 
from mako.template import Template
14
 
from mako import exceptions
15
 
from mako.runtime import Context
16
 
 
17
 
from tools.misc import file_open
18
 
import pooler
19
 
import addons
20
 
import time
21
 
import zipfile
22
 
import tempfile
23
 
import codecs
24
 
 
25
 
class SpreadsheetReport(WebKitParser):
26
 
    _fields_process = {
27
 
        'date': report_sxw._date_format,
28
 
        'datetime': report_sxw._dttime_format
29
 
    }
30
 
 
31
 
 
32
 
    def __init__(self, name, table, rml=False, parser=report_sxw.rml_parse, header='external', store=False):
33
 
        if not rml:
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
38
 
 
39
 
    def sheet_name(self, default_name=False, context=None):
40
 
        sheet_max_size = 31
41
 
        if not default_name:
42
 
            default_name = 'Sheet %s' % (self.total_sheet_number, )
43
 
 
44
 
        default_name = default_name[0:sheet_max_size].replace('/','_')
45
 
 
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)
48
 
 
49
 
        self.sheet_name_used.append(default_name)
50
 
        self.total_sheet_number += 1
51
 
        return default_name
52
 
 
53
 
    def create_single_pdf(self, cr, uid, ids, data, report_xml, context=None):
54
 
        if context is None:
55
 
            context = {}
56
 
        if report_xml.report_type != 'webkit':
57
 
            return super(WebKitParser,self).create_single_pdf(cr, uid, ids, data, report_xml, context=context)
58
 
 
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)
62
 
 
63
 
        if not context.get('splitbrowse'):
64
 
            objs = self.getObjects(cr, uid, ids, context)
65
 
        else:
66
 
            objs = []
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)
70
 
 
71
 
        template = False
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()
76
 
 
77
 
        if self.tmpl:
78
 
            f = file_open(self.tmpl)
79
 
            template = f.read()
80
 
            f.close()
81
 
 
82
 
        if not template:
83
 
            raise osv.except_osv(_('Error!'), _('Webkit Report template not found !'))
84
 
 
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})
88
 
 
89
 
 
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'])
93
 
        try:
94
 
            mako_ctx = Context(fileout, _=self.translate_call, **self.parser_instance.localcontext)
95
 
            body_mako_tpl.render_context(mako_ctx)
96
 
            fileout.close()
97
 
        except Exception, e:
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)
101
 
 
102
 
        # circular reference on parse_instance, force memory free
103
 
        del self.parser_instance
104
 
 
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)
109
 
            zf.close()
110
 
            out = file(tmpzipname, 'rb').read()
111
 
            os.close(null1)
112
 
            os.close(null)
113
 
            os.unlink(tmpzipname)
114
 
            os.unlink(tmpname)
115
 
            return (out, 'zip')
116
 
 
117
 
        out = file(tmpname, 'rb').read()
118
 
        os.close(null)
119
 
        os.unlink(tmpname)
120
 
        return (out, 'xls')
121
 
 
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)
128
 
 
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')
135
 
        return a
136
 
 
137
 
class SpreadsheetCreator(object):
138
 
    def __init__(self, title, headers, datas):
139
 
        self.headers = headers
140
 
        self.datas = datas
141
 
        self.title = title
142
 
 
143
 
    def get_xml(self, default_filters=[]):
144
 
        f, filename = file_open('addons/spreadsheet_xml/report/spreadsheet_writer_xls.mako', pathinfo=True)
145
 
        f[0].close()
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)