From 8f03e49c636a2b0a9ad47e4dd1ead72bc8d8ad05 Mon Sep 17 00:00:00 2001 From: sbejaoui Date: Tue, 26 Sep 2023 22:36:00 +0200 Subject: [PATCH] [16.0][IMP] report_csv: support attachment use --- report_csv/models/ir_report.py | 47 +++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/report_csv/models/ir_report.py b/report_csv/models/ir_report.py index 4a5ad6adf0..d11904fe90 100644 --- a/report_csv/models/ir_report.py +++ b/report_csv/models/ir_report.py @@ -1,7 +1,13 @@ # Copyright 2019 Creu Blanca # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +import logging + from odoo import api, fields, models +from odoo.exceptions import AccessError +from odoo.tools.safe_eval import safe_eval, time + +_logger = logging.getLogger(__name__) class ReportAction(models.Model): @@ -11,14 +17,53 @@ class ReportAction(models.Model): selection_add=[("csv", "csv")], ondelete={"csv": "set default"} ) + def _create_csv_attachment(self, record, data): + attachment_name = safe_eval(self.attachment, {"object": record, "time": time}) + # Unable to compute a name for the attachment. + if not attachment_name: + return + if record and data: + attachment = { + "name": attachment_name, + "raw": data, + "res_model": self.model, + "res_id": record.id, + "type": "binary", + } + try: + self.env["ir.attachment"].create(attachment) + except AccessError: + _logger.info( + "Cannot save csv report %r as attachment", attachment["name"] + ) + else: + _logger.info( + "The csv document %s is now saved in the database", + attachment["name"], + ) + @api.model def _render_csv(self, report_ref, docids, data): report_sudo = self._get_report(report_ref) report_model_name = "report.%s" % report_sudo.report_name report_model = self.env[report_model_name] - return report_model.with_context( + + res_id = len(docids) == 1 and docids[0] + record = self.env[report_sudo.model].browse(res_id) + if not report_sudo.attachment or not report_sudo.attachment_use: + return report_model.with_context( + active_model=report_sudo.model + ).create_csv_report(docids, data) + + attachment = report_sudo.retrieve_attachment(record) + if attachment: + return attachment.raw, "csv" + + data, ext = report_model.with_context( active_model=report_sudo.model ).create_csv_report(docids, data) + report_sudo._create_csv_attachment(record, data) + return data, ext @api.model def _get_report_from_name(self, report_name):