diff options
Diffstat (limited to 'addons/web_graph/controllers/main.py')
| -rw-r--r-- | addons/web_graph/controllers/main.py | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/addons/web_graph/controllers/main.py b/addons/web_graph/controllers/main.py new file mode 100644 index 00000000000..320758e0950 --- /dev/null +++ b/addons/web_graph/controllers/main.py @@ -0,0 +1,88 @@ +from openerp import http +import simplejson +from openerp.http import request, serialize_exception as _serialize_exception +from cStringIO import StringIO +from collections import deque + +try: + import xlwt +except ImportError: + xlwt = None + +class TableExporter(http.Controller): + + @http.route('/web_graph/check_xlwt', type='json', auth='none') + def check_xlwt(self): + return xlwt is not None + + + @http.route('/web_graph/export_xls', type='http', auth="user") + def export_xls(self, data, token): + jdata = simplejson.loads(data) + nbr_measures = jdata['nbr_measures'] + workbook = xlwt.Workbook() + worksheet = workbook.add_sheet(jdata['title']) + header_bold = xlwt.easyxf("font: bold on; pattern: pattern solid, fore_colour gray25;") + header_plain = xlwt.easyxf("pattern: pattern solid, fore_colour gray25;") + bold = xlwt.easyxf("font: bold on;") + + # Step 1: writing headers + headers = jdata['headers'] + + # x,y: current coordinates + # carry: queue containing cell information when a cell has a >= 2 height + # and the drawing code needs to add empty cells below + x, y, carry = 1, 0, deque() + for i, header_row in enumerate(headers): + worksheet.write(i,0, '', header_plain) + for header in header_row: + while (carry and carry[0]['x'] == x): + cell = carry.popleft() + for i in range(nbr_measures): + worksheet.write(y, x+i, '', header_plain) + if cell['height'] > 1: + carry.append({'x': x, 'height':cell['height'] - 1}) + x = x + nbr_measures + style = header_plain if 'expanded' in header else header_bold + for i in range(header['width']): + worksheet.write(y, x + i, header['title'] if i == 0 else '', style) + if header['height'] > 1: + carry.append({'x': x, 'height':header['height'] - 1}) + x = x + header['width']; + while (carry and carry[0]['x'] == x): + cell = carry.popleft() + for i in range(nbr_measures): + worksheet.write(y, x+i, '', header_plain) + if cell['height'] > 1: + carry.append({'x': x, 'height':cell['height'] - 1}) + x = x + nbr_measures + x, y = 1, y + 1 + + # Step 2: measure row + if nbr_measures > 1: + worksheet.write(y,0, '', header_plain) + for measure in jdata['measure_row']: + style = header_bold if measure['is_bold'] else header_plain + worksheet.write(y, x, measure['text'], style); + x = x + 1 + y = y + 1 + + # Step 3: writing data + x = 0 + for row in jdata['rows']: + worksheet.write(y, x, row['indent'] * ' ' + row['title'], header_plain) + for cell in row['cells']: + x = x + 1 + if cell.get('is_bold', False): + worksheet.write(y, x, cell['value'], bold) + else: + worksheet.write(y, x, cell['value']) + x, y = 0, y + 1 + + response = request.make_response(None, + headers=[('Content-Type', 'application/vnd.ms-excel'), + ('Content-Disposition', 'attachment; filename=table.xls;')], + cookies={'fileToken': token}) + workbook.save(response.stream) + + return response |
