Newer
Older
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
# Copyright 2020 Le Filament (<http://www.le-filament.com>)
# License AGPL-3 or later (http://www.gnu.org/licenses/agpl.html).
import csv
from datetime import date
from io import BytesIO, StringIO
from odoo import http
from odoo.http import request
from odoo.addons.web.controllers.main import serialize_exception
from odoo.addons.web.controllers.main import content_disposition
from odoo.tools.misc import xlwt
class JournalDatasExport(http.Controller):
# ------------------------------------------------------
# Routes
# ------------------------------------------------------
@http.route('/web/export_journal/', type='http', auth="user")
@serialize_exception
def export_journal(self, format, export, date_start, date_end, **kwargs):
"""
Sélectionne les account.move.line correspondants aux journaux
et à la plage de date définis
Crée le lignes de valeurs
:param format: xls/csv
:param export: id export.journal.type
:param date_start: date
:param date_end: date
:return: file
"""
export_id = request.env['export.journal.type'].browse(int(export))
export_line_ids = request.env['account.move.line'].search([
('date', '>=', date_start),
('date', '<=', date_end),
('journal_id', 'in', export_id.journal_ids.ids),
('company_id', '=', export_id.company_id.id),
])
lines_to_export = []
for line in export_line_ids:
row = []
for field in export_id.fields_ids:
value = eval(field.field_name)
row.append(value)
lines_to_export.append(row)
filename_ = (export_id.company_id.name.title().replace(' ', '')
+ date_start.replace('-', '')
+ '_' + date_end.replace('-', ''))
if format == 'csv':
return self.export_csv(export_id, lines_to_export, filename_)
elif format == 'xls':
return self.export_xls(export_id, lines_to_export, filename_)
# ------------------------------------------------------
# Common function
# ------------------------------------------------------
def export_csv(self, export_id, lines_to_export, filename_):
fp = StringIO()
export_file = csv.writer(fp, delimiter=';', quoting=csv.QUOTE_ALL)
# Add header line
if export_id.is_header:
row = []
for head in export_id.fields_ids.mapped('name'):
row.append(head)
export_file.writerow(row)
for line in lines_to_export:
# Format date value
line_values = [
value if not isinstance(value, date) else value.strftime(
export_id.csv_datestyle) for value in line]
export_file.writerow(line_values)
fp.seek(0)
data = fp.read()
fp.close()
filename = filename_ + '.csv'
csvhttpheaders = [
('Content-Type', 'text/csv;charset=utf8'),
('Content-Disposition', content_disposition(filename)),
]
return request.make_response(data, headers=csvhttpheaders)
def export_xls(self, export_id, lines_to_export, filename_):
workbook = xlwt.Workbook()
worksheet = workbook.add_sheet(filename_)
base_style = xlwt.easyxf('align: wrap yes')
date_style = xlwt.XFStyle()
date_style.num_format_str = export_id.xls_datestyle
if export_id.is_header:
for i, fieldname in enumerate(export_id.fields_ids.mapped('name')):
worksheet.write(0, i, fieldname)
worksheet.col(i).width = 4000 # around 220 pixels
for row_index, line in enumerate(lines_to_export):
for cell_index, value in enumerate(line):
cell_style = base_style
if isinstance(value, date):
cell_style = date_style
worksheet.write(row_index + 1, cell_index, value, cell_style)
fp = BytesIO()
workbook.save(fp)
fp.seek(0)
data = fp.read()
fp.close()
filename = filename_ + '.xls'
xlshttpheaders = [
('Content-Type', 'text/csv;charset=utf8'),
('Content-Disposition', content_disposition(filename)),
]
return request.make_response(data, headers=xlshttpheaders)