From aed6d2cb17c9df6bb33bfef23bc10310867ea46f Mon Sep 17 00:00:00 2001 From: Denis Roussel Date: Mon, 20 Dec 2021 10:49:34 +0100 Subject: [PATCH 1/6] [14.0][FIX] base_report_to_printer: Don't use safe_eval as module --- base_report_to_printer/models/ir_actions_report.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base_report_to_printer/models/ir_actions_report.py b/base_report_to_printer/models/ir_actions_report.py index 9ff6204..5ee1952 100644 --- a/base_report_to_printer/models/ir_actions_report.py +++ b/base_report_to_printer/models/ir_actions_report.py @@ -7,7 +7,7 @@ import time from odoo import _, api, exceptions, fields, models -from odoo.tools import safe_eval +from odoo.tools.safe_eval import safe_eval class IrActionsReport(models.Model): From af0f663caf1f60abd0a322d505bd061d3e03a495 Mon Sep 17 00:00:00 2001 From: Denis Roussel Date: Mon, 20 Dec 2021 10:50:03 +0100 Subject: [PATCH 2/6] [14.0][IMP] base_report_to_printer: Add Text render document to printer --- .../models/ir_actions_report.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/base_report_to_printer/models/ir_actions_report.py b/base_report_to_printer/models/ir_actions_report.py index 5ee1952..87627ae 100644 --- a/base_report_to_printer/models/ir_actions_report.py +++ b/base_report_to_printer/models/ir_actions_report.py @@ -160,3 +160,22 @@ class IrActionsReport(models.Model): ) return document, doc_format + + def _render_qweb_text(self, docids, data=None): + """Generate a TEXT file and returns it. + + If the action configured on the report is server, it prints the + generated document as well. + """ + document, doc_format = super()._render_qweb_text(docids=docids, data=data) + + behaviour = self.behaviour() + printer = behaviour.pop("printer", None) + can_print_report = self._can_print_report(behaviour, printer, document) + + if can_print_report: + printer.print_document( + self, document, doc_format=self.report_type, **behaviour + ) + + return document, doc_format From d7809c1a637c8b1699e3f4a8993af7ea6d42fced Mon Sep 17 00:00:00 2001 From: Denis Roussel Date: Tue, 28 Dec 2021 10:15:39 +0100 Subject: [PATCH 3/6] [14.0][FIX] base_report_to_printer: Import time from module --- base_report_to_printer/models/ir_actions_report.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base_report_to_printer/models/ir_actions_report.py b/base_report_to_printer/models/ir_actions_report.py index 87627ae..5073f84 100644 --- a/base_report_to_printer/models/ir_actions_report.py +++ b/base_report_to_printer/models/ir_actions_report.py @@ -4,7 +4,7 @@ # Copyright (C) 2011 Domsense srl () # Copyright (C) 2013-2014 Camptocamp () # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -import time +from time import time from odoo import _, api, exceptions, fields, models from odoo.tools.safe_eval import safe_eval From eca93e11b7dc1c665efbcead2ae610f696d6765c Mon Sep 17 00:00:00 2001 From: Denis Roussel Date: Wed, 29 Dec 2021 09:04:21 +0100 Subject: [PATCH 4/6] [14.0][FIX] base_report_to_printer: Manage text reports in js too --- base_report_to_printer/static/src/js/qweb_action_manager.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/base_report_to_printer/static/src/js/qweb_action_manager.js b/base_report_to_printer/static/src/js/qweb_action_manager.js index 0113bc8..649e8d0 100644 --- a/base_report_to_printer/static/src/js/qweb_action_manager.js +++ b/base_report_to_printer/static/src/js/qweb_action_manager.js @@ -9,7 +9,7 @@ odoo.define("base_report_to_printer.print", function (require) { _triggerDownload: function (action, options, type) { var self = this; var _super = this._super; - if (type === "pdf") { + if (type === "pdf" || "text") { this._rpc({ model: "ir.actions.report", method: "print_action_for_report_name", @@ -49,9 +49,9 @@ odoo.define("base_report_to_printer.print", function (require) { return _super.apply(self, [action, options, type]); } }); - } else { - return _super.apply(self, [action, options, type]); + return Promise.reject(); } + return _super.apply(self, [action, options, type]); }, }); }); From a716e134b96ae7e07fd591e1a1ab6c16220b226a Mon Sep 17 00:00:00 2001 From: Denis Roussel Date: Wed, 29 Dec 2021 09:05:33 +0100 Subject: [PATCH 5/6] [14.0][FIX] base_report_to_printer: Manage text print_document() --- .../models/ir_actions_report.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/base_report_to_printer/models/ir_actions_report.py b/base_report_to_printer/models/ir_actions_report.py index 5073f84..99f4172 100644 --- a/base_report_to_printer/models/ir_actions_report.py +++ b/base_report_to_printer/models/ir_actions_report.py @@ -9,6 +9,8 @@ from time import time from odoo import _, api, exceptions, fields, models from odoo.tools.safe_eval import safe_eval +REPORT_TYPES = {"qweb-pdf": "pdf", "qweb-text": "text"} + class IrActionsReport(models.Model): _inherit = "ir.actions.report" @@ -99,10 +101,17 @@ class IrActionsReport(models.Model): return result def print_document(self, record_ids, data=None): - """Print a document, do not return the document file""" - document, doc_format = self.with_context( - must_skip_send_to_printer=True - )._render_qweb_pdf(record_ids, data=data) + """ Print a document, do not return the document file """ + report_type = REPORT_TYPES.get(self.report_type) + if not report_type: + raise exceptions.UserError( + _("This report type (%s) is not supported by direct printing!") + % str(self.report_type) + ) + method_name = "_render_qweb_%s" % (report_type) + document, doc_format = getattr( + self.with_context(must_skip_send_to_printer=True), method_name + )(record_ids, data=data) behaviour = self.behaviour() printer = behaviour.pop("printer", None) From f7dd12d0a66499e7aecd941b66014b63ce20d904 Mon Sep 17 00:00:00 2001 From: Denis Roussel Date: Wed, 29 Dec 2021 09:10:46 +0100 Subject: [PATCH 6/6] [14.0][IMP] base_report_to_printer: Add tests for text documents --- .../models/ir_actions_report.py | 2 +- base_report_to_printer/tests/test_report.py | 26 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/base_report_to_printer/models/ir_actions_report.py b/base_report_to_printer/models/ir_actions_report.py index 99f4172..90f371f 100644 --- a/base_report_to_printer/models/ir_actions_report.py +++ b/base_report_to_printer/models/ir_actions_report.py @@ -101,7 +101,7 @@ class IrActionsReport(models.Model): return result def print_document(self, record_ids, data=None): - """ Print a document, do not return the document file """ + """Print a document, do not return the document file""" report_type = REPORT_TYPES.get(self.report_type) if not report_type: raise exceptions.UserError( diff --git a/base_report_to_printer/tests/test_report.py b/base_report_to_printer/tests/test_report.py index 876d5f1..381ad5b 100644 --- a/base_report_to_printer/tests/test_report.py +++ b/base_report_to_printer/tests/test_report.py @@ -43,6 +43,14 @@ class TestReport(common.HttpCase): "report_name": "base_report_to_printer.test", } ) + self.report_text = self.Model.create( + { + "name": "Test", + "report_type": "qweb-text", + "model": "res.partner", + "report_name": "base_report_to_printer.test", + } + ) self.partners = self.env["res.partner"] for n in range(5): self.partners += self.env["res.partner"].create({"name": "Test %d" % n}) @@ -109,6 +117,24 @@ class TestReport(common.HttpCase): tray=False, ) + def test_render_qweb_text_printable(self): + """It should print the report, only if it is printable""" + with mock.patch( + "odoo.addons.base_report_to_printer.models." + "printing_printer.PrintingPrinter." + "print_document" + ) as print_document: + self.report_text.property_printing_action_id.action_type = "server" + self.report_text.printing_printer_id = self.new_printer() + document = self.report_text._render_qweb_text(self.partners.ids) + print_document.assert_called_once_with( + self.report_text, + document[0], + action="server", + doc_format="qweb-text", + tray=False, + ) + def test_print_document_not_printable(self): """It should print the report, regardless of the defined behaviour""" self.report.printing_printer_id = self.new_printer()