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
|
import json
from odoo.tools import pycompat
from odoo.exceptions import Warning
from odoo import http
from odoo.http import request
from odoo.addons.web.controllers.main import ExportFormat, GroupExportXlsxWriter, ExportXlsxWriter, serialize_exception, clean_action
class Export(ExportFormat, http.Controller):
@http.route('/web/export/xlsx', type='http', auth="public", csrf=False)
@serialize_exception
def export_xlsx(self, data, token, **kw):
data_obj = json.loads(data)
model = data_obj['model']
can_export = request.env.user.check_access(model, 'export')
if not can_export:
raise Warning('You are not allowed to export')
return self.base(data, token)
@property
def content_type(self):
return 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
def filename(self, base):
return base + '.xlsx'
def from_group_data(self, fields, groups):
with GroupExportXlsxWriter(fields, groups.count) as xlsx_writer:
x, y = 1, 0
for group_name, group in groups.children.items():
x, y = xlsx_writer.write_group(x, y, group_name, group)
return xlsx_writer.value
def from_data(self, fields, rows):
with ExportXlsxWriter(fields, len(rows)) as xlsx_writer:
for row_index, row in enumerate(rows):
for cell_index, cell_value in enumerate(row):
if isinstance(cell_value, (list, tuple)):
cell_value = pycompat.to_text(cell_value)
xlsx_writer.write_cell(row_index + 1, cell_index, cell_value)
return xlsx_writer.value
|