Skip to content
Extraits de code Groupes Projets
main.py 4,62 ko
Newer Older
  • Learn to ignore specific revisions
  • # 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, 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),
    
                domain += [('date_export', '=', False)]
    
            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)
    
            # 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)