[IMP] base_report_to_printer: exceptions notifications

Better handling of exceptions feedback. A notification will show up with
the issued printer and report and a button for the user to download the
report as a fallback to the failure.

TT51628
This commit is contained in:
David
2024-11-11 13:31:15 +01:00
parent f097b37767
commit b9e968510c
5 changed files with 94 additions and 31 deletions

View File

@@ -111,6 +111,13 @@ Guidelines for use:
When no tray is configured for a report and a user, the default tray When no tray is configured for a report and a user, the default tray
setup on the CUPS server is used. setup on the CUPS server is used.
Known issues / Roadmap
======================
- With threaded printing there's no download fallback when the issue
isn't detected by the CUPS Odoo backend. To able to do it, we would
need to notify the bus or use web_notify for it.
Changelog Changelog
========= =========

View File

@@ -59,6 +59,8 @@ class IrActionsReport(models.Model):
"skip_printer_exception" "skip_printer_exception"
): ):
serializable_result["printer_exception"] = True serializable_result["printer_exception"] = True
if self.env.context.get("force_print_to_client"):
serializable_result["action"] = "client"
return serializable_result return serializable_result
def _get_user_default_print_behaviour(self): def _get_user_default_print_behaviour(self):
@@ -135,7 +137,10 @@ class IrActionsReport(models.Model):
return True return True
else: else:
return self.print_document(record_ids, data=data) try:
return self.print_document(record_ids, data=data)
except Exception:
return
def print_document_threaded(self, report_id, record_ids, data): def print_document_threaded(self, report_id, record_ids, data):
with registry(self._cr.dbname).cursor() as cr: with registry(self._cr.dbname).cursor() as cr:
@@ -171,6 +176,7 @@ class IrActionsReport(models.Model):
else: else:
title = self.report_name title = self.report_name
behaviour["title"] = title behaviour["title"] = title
behaviour["res_ids"] = record_ids
# TODO should we use doc_format instead of report_type # TODO should we use doc_format instead of report_type
return printer.print_document( return printer.print_document(
self, document, doc_format=self.report_type, **behaviour self, document, doc_format=self.report_type, **behaviour

View File

@@ -0,0 +1,3 @@
- With threaded printing there's no download fallback when the issue
isn't detected by the CUPS Odoo backend. To able to do it, we would
need to notify the bus or use web_notify for it.

View File

@@ -399,16 +399,17 @@ preprinted paper such as payment slip.</p>
<li><a class="reference internal" href="#installation" id="toc-entry-1">Installation</a></li> <li><a class="reference internal" href="#installation" id="toc-entry-1">Installation</a></li>
<li><a class="reference internal" href="#configuration" id="toc-entry-2">Configuration</a></li> <li><a class="reference internal" href="#configuration" id="toc-entry-2">Configuration</a></li>
<li><a class="reference internal" href="#usage" id="toc-entry-3">Usage</a></li> <li><a class="reference internal" href="#usage" id="toc-entry-3">Usage</a></li>
<li><a class="reference internal" href="#changelog" id="toc-entry-4">Changelog</a><ul> <li><a class="reference internal" href="#known-issues-roadmap" id="toc-entry-4">Known issues / Roadmap</a></li>
<li><a class="reference internal" href="#section-1" id="toc-entry-5">13.0.1.0.0 (2019-09-30)</a></li> <li><a class="reference internal" href="#changelog" id="toc-entry-5">Changelog</a><ul>
<li><a class="reference internal" href="#section-2" id="toc-entry-6">12.0.1.0.0 (2018-02-04)</a></li> <li><a class="reference internal" href="#section-1" id="toc-entry-6">13.0.1.0.0 (2019-09-30)</a></li>
<li><a class="reference internal" href="#section-2" id="toc-entry-7">12.0.1.0.0 (2018-02-04)</a></li>
</ul> </ul>
</li> </li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-7">Bug Tracker</a></li> <li><a class="reference internal" href="#bug-tracker" id="toc-entry-8">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-8">Credits</a><ul> <li><a class="reference internal" href="#credits" id="toc-entry-9">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-9">Authors</a></li> <li><a class="reference internal" href="#authors" id="toc-entry-10">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-10">Contributors</a></li> <li><a class="reference internal" href="#contributors" id="toc-entry-11">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-11">Maintainers</a></li> <li><a class="reference internal" href="#maintainers" id="toc-entry-12">Maintainers</a></li>
</ul> </ul>
</li> </li>
</ul> </ul>
@@ -462,23 +463,31 @@ preferences.</li>
<p>When no tray is configured for a report and a user, the default tray <p>When no tray is configured for a report and a user, the default tray
setup on the CUPS server is used.</p> setup on the CUPS server is used.</p>
</div> </div>
<div class="section" id="known-issues-roadmap">
<h1><a class="toc-backref" href="#toc-entry-4">Known issues / Roadmap</a></h1>
<ul class="simple">
<li>With threaded printing theres no download fallback when the issue
isnt detected by the CUPS Odoo backend. To able to do it, we would
need to notify the bus or use web_notify for it.</li>
</ul>
</div>
<div class="section" id="changelog"> <div class="section" id="changelog">
<h1><a class="toc-backref" href="#toc-entry-4">Changelog</a></h1> <h1><a class="toc-backref" href="#toc-entry-5">Changelog</a></h1>
<div class="section" id="section-1"> <div class="section" id="section-1">
<h2><a class="toc-backref" href="#toc-entry-5">13.0.1.0.0 (2019-09-30)</a></h2> <h2><a class="toc-backref" href="#toc-entry-6">13.0.1.0.0 (2019-09-30)</a></h2>
<ul class="simple"> <ul class="simple">
<li>[RELEASE] Port from V12.</li> <li>[RELEASE] Port from V12.</li>
</ul> </ul>
</div> </div>
<div class="section" id="section-2"> <div class="section" id="section-2">
<h2><a class="toc-backref" href="#toc-entry-6">12.0.1.0.0 (2018-02-04)</a></h2> <h2><a class="toc-backref" href="#toc-entry-7">12.0.1.0.0 (2018-02-04)</a></h2>
<ul class="simple"> <ul class="simple">
<li>[RELEASE] Port from V11.</li> <li>[RELEASE] Port from V11.</li>
</ul> </ul>
</div> </div>
</div> </div>
<div class="section" id="bug-tracker"> <div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#toc-entry-7">Bug Tracker</a></h1> <h1><a class="toc-backref" href="#toc-entry-8">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/report-print-send/issues">GitHub Issues</a>. <p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/report-print-send/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported. In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed If you spotted it first, help us to smash it by providing a detailed and welcomed
@@ -486,9 +495,9 @@ If you spotted it first, help us to smash it by providing a detailed and welcome
<p>Do not contact contributors directly about support or help with technical issues.</p> <p>Do not contact contributors directly about support or help with technical issues.</p>
</div> </div>
<div class="section" id="credits"> <div class="section" id="credits">
<h1><a class="toc-backref" href="#toc-entry-8">Credits</a></h1> <h1><a class="toc-backref" href="#toc-entry-9">Credits</a></h1>
<div class="section" id="authors"> <div class="section" id="authors">
<h2><a class="toc-backref" href="#toc-entry-9">Authors</a></h2> <h2><a class="toc-backref" href="#toc-entry-10">Authors</a></h2>
<ul class="simple"> <ul class="simple">
<li>Agile Business Group &amp; Domsense</li> <li>Agile Business Group &amp; Domsense</li>
<li>Pegueroles SCP</li> <li>Pegueroles SCP</li>
@@ -499,7 +508,7 @@ If you spotted it first, help us to smash it by providing a detailed and welcome
</ul> </ul>
</div> </div>
<div class="section" id="contributors"> <div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-10">Contributors</a></h2> <h2><a class="toc-backref" href="#toc-entry-11">Contributors</a></h2>
<ul class="simple"> <ul class="simple">
<li>Ferran Pegueroles &lt;<a class="reference external" href="mailto:ferran&#64;pegueroles.com">ferran&#64;pegueroles.com</a>&gt;</li> <li>Ferran Pegueroles &lt;<a class="reference external" href="mailto:ferran&#64;pegueroles.com">ferran&#64;pegueroles.com</a>&gt;</li>
<li>Albert Cervera i Areny &lt;<a class="reference external" href="mailto:albert&#64;nan-tic.com">albert&#64;nan-tic.com</a>&gt;</li> <li>Albert Cervera i Areny &lt;<a class="reference external" href="mailto:albert&#64;nan-tic.com">albert&#64;nan-tic.com</a>&gt;</li>
@@ -521,7 +530,7 @@ If you spotted it first, help us to smash it by providing a detailed and welcome
</ul> </ul>
</div> </div>
<div class="section" id="maintainers"> <div class="section" id="maintainers">
<h2><a class="toc-backref" href="#toc-entry-11">Maintainers</a></h2> <h2><a class="toc-backref" href="#toc-entry-12">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p> <p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"> <a class="reference external image-reference" href="https://odoo-community.org">
<img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /> <img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" />

View File

@@ -1,4 +1,5 @@
/** @odoo-module */ /** @odoo-module */
import {Markup} from "web.utils";
import {_t} from "@web/core/l10n/translation"; import {_t} from "@web/core/l10n/translation";
import {registry} from "@web/core/registry"; import {registry} from "@web/core/registry";
@@ -9,13 +10,12 @@ async function cupsReportActionHandler(action, options, env) {
const print_action = await orm.call( const print_action = await orm.call(
"ir.actions.report", "ir.actions.report",
"print_action_for_report_name", "print_action_for_report_name",
[action.report_name] [action.report_name],
{context: {force_print_to_client: action.context.force_print_to_client}}
); );
if ( var printer_exception = print_action.printer_exception;
print_action && if (print_action && print_action.action === "server" && !printer_exception) {
print_action.action === "server" && // The Odoo CUPS backend is ok. We try to print into the printer
!print_action.printer_exception
) {
const result = await orm.call( const result = await orm.call(
"ir.actions.report", "ir.actions.report",
"print_document_client_action", "print_document_client_action",
@@ -25,20 +25,58 @@ async function cupsReportActionHandler(action, options, env) {
env.services.notification.add(_t("Successfully sent to printer!"), { env.services.notification.add(_t("Successfully sent to printer!"), {
type: "success", type: "success",
}); });
} else { return true;
env.services.notification.add(_t("Could not send to printer!"), { // In case of exception during the job, we won't get any response. So we
type: "danger", // should flag the exception and notify the user
});
} }
return true; env.services.notification.add(_t("Could not sent to printer!"), {
type: "danger",
});
printer_exception = true;
} }
if (print_action.printer_exception) { if (print_action && print_action.action === "server" && printer_exception) {
env.services.notification.add( // Just so the translation engine detects them as it doesn't do it inside
env._t("The printer couldn't be reached. Downloading document instead"), // template strings
const terms = {
the_report: env._t("The report"),
couldnt_be_printed: env._t(
"couldn't be printed. Click on the button below to download it"
),
issue_on: env._t("Issue on"),
};
const notificationRemove = env.services.notification.add(
Markup(
`<p>${terms.the_report} <strong>${action.name}</strong> ${terms.couldnt_be_printed}</p>`
),
{ {
title: `${terms.issue_on} ${print_action.printer_name}`,
type: "warning", type: "warning",
sticky: true,
messageIsHtml: true,
buttons: [
{
name: env._t("Print"),
primary: true,
icon: "fa-print",
onClick: async () => {
const context = {
force_print_to_client: true,
must_skip_send_to_printer: true,
};
env.services.user.updateContext(context);
await env.services.action.doAction(
{type: "ir.actions.report", ...action},
{
additionalContext: context,
}
);
notificationRemove();
},
},
],
} }
); );
return true;
} }
} }
} }