diff --git a/base_report_to_printer/README.rst b/base_report_to_printer/README.rst index 2f19149..afa482c 100644 --- a/base_report_to_printer/README.rst +++ b/base_report_to_printer/README.rst @@ -163,6 +163,11 @@ Contributors * Akim Juillerat * Jacques-Etienne Baudoux (BCIM) +* `Tecnativa `_: + + * Sergio Teruel + * David Vidal + Maintainers ~~~~~~~~~~~ diff --git a/base_report_to_printer/models/ir_actions_report.py b/base_report_to_printer/models/ir_actions_report.py index 0547709..395837f 100644 --- a/base_report_to_printer/models/ir_actions_report.py +++ b/base_report_to_printer/models/ir_actions_report.py @@ -3,9 +3,11 @@ # Copyright (C) 2011 Agile Business Group sagl () # Copyright (C) 2011 Domsense srl () # Copyright (C) 2013-2014 Camptocamp () +# Copyright 2024 Tecnativa - Sergio Teruel # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +import threading -from odoo import _, api, exceptions, fields, models +from odoo import _, api, exceptions, fields, models, registry from odoo.tools.safe_eval import safe_eval, time REPORT_TYPES = {"qweb-pdf": "pdf", "qweb-text": "text"} @@ -118,6 +120,29 @@ class IrActionsReport(models.Model): result["printer_exception"] = True return result + def print_document_client_action(self, record_ids, data=None): + behaviour = self.behaviour() + printer = behaviour.pop("printer", None) + if printer.multi_thread: + + @self.env.cr.postcommit.add + def _launch_print_thread(): + threaded_calculation = threading.Thread( + target=self.print_document_threaded, + args=(self.id, record_ids, data), + ) + threaded_calculation.start() + + return True + else: + return self.print_document(record_ids, data=data) + + def print_document_threaded(self, report_id, record_ids, data): + with registry(self._cr.dbname).cursor() as cr: + self = self.with_env(self.env(cr=cr)) + report = self.env["ir.actions.report"].browse(report_id) + report.print_document(record_ids, data) + def print_document(self, record_ids, data=None): """Print a document, do not return the document file""" report_type = REPORT_TYPES.get(self.report_type) diff --git a/base_report_to_printer/models/printing_printer.py b/base_report_to_printer/models/printing_printer.py index 845dc1e..efd04e0 100644 --- a/base_report_to_printer/models/printing_printer.py +++ b/base_report_to_printer/models/printing_printer.py @@ -12,7 +12,7 @@ import logging import os from tempfile import mkstemp -from odoo import fields, models +from odoo import api, fields, models _logger = logging.getLogger(__name__) @@ -67,6 +67,14 @@ class PrintingPrinter(models.Model): tray_ids = fields.One2many( comodel_name="printing.tray", inverse_name="printer_id", string="Paper Sources" ) + multi_thread = fields.Boolean( + compute="_compute_multi_thread", readonly=False, store=True + ) + + @api.depends("server_id.multi_thread") + def _compute_multi_thread(self): + for printer in self: + printer.multi_thread = printer.server_id.multi_thread def _prepare_update_from_cups(self, cups_connection, cups_printer): mapping = {3: "available", 4: "printing", 5: "error"} diff --git a/base_report_to_printer/models/printing_server.py b/base_report_to_printer/models/printing_server.py index 69c9eb3..0135870 100644 --- a/base_report_to_printer/models/printing_server.py +++ b/base_report_to_printer/models/printing_server.py @@ -42,6 +42,7 @@ class PrintingServer(models.Model): string="Printers List", help="List of printers available on this server.", ) + multi_thread = fields.Boolean() def _open_connection(self, raise_on_error=False): self.ensure_one() diff --git a/base_report_to_printer/readme/CONTRIBUTORS.rst b/base_report_to_printer/readme/CONTRIBUTORS.rst index 4626c55..3223d01 100644 --- a/base_report_to_printer/readme/CONTRIBUTORS.rst +++ b/base_report_to_printer/readme/CONTRIBUTORS.rst @@ -15,3 +15,8 @@ * Hughes Damry * Akim Juillerat * Jacques-Etienne Baudoux (BCIM) + +* `Tecnativa `_: + + * Sergio Teruel + * David Vidal diff --git a/base_report_to_printer/static/description/index.html b/base_report_to_printer/static/description/index.html index 431a96b..a9808b2 100644 --- a/base_report_to_printer/static/description/index.html +++ b/base_report_to_printer/static/description/index.html @@ -512,6 +512,11 @@ If you spotted it first, help us to smash it by providing a detailed and welcome
  • Hughes Damry <hughes.damry@acsone.eu>
  • Akim Juillerat <akim.juillerat@camptocamp.com>
  • Jacques-Etienne Baudoux (BCIM) <je@bcim.be>
  • +
  • Tecnativa:
      +
    • Sergio Teruel
    • +
    • David Vidal
    • +
    +
  • diff --git a/base_report_to_printer/static/src/js/qweb_action_manager.esm.js b/base_report_to_printer/static/src/js/qweb_action_manager.esm.js index 370fd94..640e0df 100644 --- a/base_report_to_printer/static/src/js/qweb_action_manager.esm.js +++ b/base_report_to_printer/static/src/js/qweb_action_manager.esm.js @@ -15,11 +15,11 @@ async function cupsReportActionHandler(action, options, env) { print_action.action === "server" && !print_action.printer_exception ) { - const result = await orm.call("ir.actions.report", "print_document", [ - action.id, - action.context.active_ids, - action.data, - ]); + const result = await orm.call( + "ir.actions.report", + "print_document_client_action", + [action.id, action.context.active_ids, action.data] + ); if (result) { env.services.notification.add(env._t("Successfully sent to printer!"), { type: "success", diff --git a/base_report_to_printer/tests/test_ir_actions_report.py b/base_report_to_printer/tests/test_ir_actions_report.py index e010dd8..61fd527 100644 --- a/base_report_to_printer/tests/test_ir_actions_report.py +++ b/base_report_to_printer/tests/test_ir_actions_report.py @@ -295,3 +295,20 @@ class TestIrActionsReportXml(TransactionCase): self.assertEqual(action.printer_tray_id, tray) action.onchange_printing_printer_id() self.assertFalse(action.printer_tray_id) + + def test_print_in_new_thread(self): + """It should return the action and printer from printing action in other thread""" + report = self.Model.search([], limit=1) + self.env.user.printing_action = "server" + printing_action = self.new_printing_action() + printing_action.user_id = self.env.user + printing_action.printer_id = self.new_printer() + printing_action.printer_id.multi_thread = True + self.assertEqual( + report.behaviour(), + { + "action": printing_action.action, + "printer": printing_action.printer_id, + "tray": False, + }, + ) diff --git a/base_report_to_printer/views/printing_printer.xml b/base_report_to_printer/views/printing_printer.xml index d64a208..49bae3e 100644 --- a/base_report_to_printer/views/printing_printer.xml +++ b/base_report_to_printer/views/printing_printer.xml @@ -78,6 +78,7 @@ + diff --git a/base_report_to_printer/views/printing_server.xml b/base_report_to_printer/views/printing_server.xml index 153b85f..c43d682 100644 --- a/base_report_to_printer/views/printing_server.xml +++ b/base_report_to_printer/views/printing_server.xml @@ -31,6 +31,7 @@ +