diff --git a/base_report_to_printer/README.rst b/base_report_to_printer/README.rst index 009291b..1613e83 100644 --- a/base_report_to_printer/README.rst +++ b/base_report_to_printer/README.rst @@ -89,9 +89,8 @@ this will not be displayed by CUPS web interface or in Odoo. To see this information, you need to change the configuration of your CUPS server and set the JobPrivateValue directive to "none" (or some other list of values which does not include "job-name") , and reload the server. See -cupsd.conf(5) -<`https://www.cups.org/doc/man-cupsd.conf.html\\> >`__ -for details. +cupsd.conf(5) for +details. Usage ===== diff --git a/base_report_to_printer/models/ir_actions_report.py b/base_report_to_printer/models/ir_actions_report.py index 4d8dd8c..cbe447f 100644 --- a/base_report_to_printer/models/ir_actions_report.py +++ b/base_report_to_printer/models/ir_actions_report.py @@ -3,10 +3,12 @@ # 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 time import time -from odoo import _, api, exceptions, fields, models +from odoo import _, api, exceptions, fields, models, registry from odoo.tools.safe_eval import safe_eval REPORT_TYPES = {"qweb-pdf": "pdf", "qweb-text": "text"} @@ -66,9 +68,9 @@ class IrActionsReport(models.Model): return dict( action=user.printing_action or "client", printer=user.printing_printer_id or printer_obj.get_default(), - tray=str(user.printer_tray_id.system_name) - if user.printer_tray_id - else False, + tray=( + str(user.printer_tray_id.system_name) if user.printer_tray_id else False + ), ) def _get_report_default_print_behaviour(self): @@ -119,6 +121,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 67fc590..a7e2587 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 a072567..6d64088 100644 --- a/base_report_to_printer/models/printing_server.py +++ b/base_report_to_printer/models/printing_server.py @@ -41,6 +41,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/static/description/index.html b/base_report_to_printer/static/description/index.html index 6aec188..5b5360f 100644 --- a/base_report_to_printer/static/description/index.html +++ b/base_report_to_printer/static/description/index.html @@ -8,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -274,7 +275,7 @@ pre.literal-block, pre.doctest-block, pre.math, pre.code { margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -300,7 +301,7 @@ span.option { span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { @@ -438,9 +439,8 @@ this will not be displayed by CUPS web interface or in Odoo. To see this information, you need to change the configuration of your CUPS server and set the JobPrivateValue directive to “none” (or some other list of values which does not include “job-name”) , and reload the server. See -cupsd.conf(5) -<https://www.cups.org/doc/man-cupsd.conf.html\> -for details.

+cupsd.conf(5) <https://www.cups.org/doc/man-cupsd.conf.html> for +details.

Usage

@@ -523,7 +523,9 @@ If you spotted it first, help us to smash it by providing a detailed and welcome

Maintainers

This module is maintained by the OCA.

-Odoo Community Association + +Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

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 7b95ed0..3c3a90f 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 @@ -16,11 +16,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(_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 5b5578b..4e1e77d 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,21 @@ 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 4424c84..0c7f0f4 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 de9a04b..259ec1a 100644 --- a/base_report_to_printer/views/printing_server.xml +++ b/base_report_to_printer/views/printing_server.xml @@ -32,6 +32,7 @@ +