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),
('company_id', '=', export_id.company_id.id),
]
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_):
fp = StringIO()
export_file = csv.writer(
fp,
delimiter=export_id.delimiter,
quoting=csv.QUOTE_ALL)
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
116
117
118
119
120
121
122
123
124
125
126
# 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)