Newer
Older
# Copyright 2020 Le Filament (<http://www.le-filament.com>)
# License AGPL-3 or later (http://www.gnu.org/licenses/agpl.html).
import re
from datetime import date, datetime
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, type, 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))
('date', '>=', date_start),
('date', '<=', date_end),
('journal_id', 'in', export_id.journal_ids.ids),
]
if type == 'empty':
export_line_ids = request.env['account.move.line'].search(domain)
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)
line.write({
'date_export': datetime.now()
})
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_):
if export_id.csv_quote_all:
quote = csv.QUOTE_ALL
else:
quote = csv.QUOTE_NONE
export_file = csv.writer(
fp,
delimiter=export_id.delimiter,
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# 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)