mirror of
https://github.com/OCA/report-print-send.git
synced 2025-02-16 07:11:31 +02:00
@@ -53,6 +53,10 @@ class IrActionsReport(models.Model):
|
||||
"action": result["action"],
|
||||
"printer_name": result["printer"].name,
|
||||
}
|
||||
if result.get("printer_exception") and not self.env.context.get(
|
||||
"skip_printer_exception"
|
||||
):
|
||||
serializable_result["printer_exception"] = True
|
||||
return serializable_result
|
||||
|
||||
def _get_user_default_print_behaviour(self):
|
||||
@@ -97,6 +101,21 @@ class IrActionsReport(models.Model):
|
||||
# For some reason design takes report defaults over
|
||||
# False action entries so we must allow for that here
|
||||
result.update({k: v for k, v in print_action.behaviour().items() if v})
|
||||
printer = result.get("printer")
|
||||
if printer:
|
||||
# When no printer is available we can fallback to the default behavior
|
||||
# letting the user to manually print the reports.
|
||||
try:
|
||||
printer.server_id._open_connection(raise_on_error=True)
|
||||
printer_exception = printer.status in [
|
||||
"error",
|
||||
"server-error",
|
||||
"unavailable",
|
||||
]
|
||||
except Exception:
|
||||
printer_exception = True
|
||||
if printer_exception and not self.env.context.get("skip_printer_exception"):
|
||||
result["printer_exception"] = True
|
||||
return result
|
||||
|
||||
def print_document(self, record_ids, data=None):
|
||||
@@ -140,7 +159,12 @@ class IrActionsReport(models.Model):
|
||||
"""
|
||||
if self.env.context.get("must_skip_send_to_printer"):
|
||||
return False
|
||||
if behaviour["action"] == "server" and printer and document:
|
||||
if (
|
||||
behaviour["action"] == "server"
|
||||
and printer
|
||||
and document
|
||||
and not behaviour.get("printer_exception")
|
||||
):
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
@@ -10,19 +10,35 @@ async function cupsReportActionHandler(action, options, env) {
|
||||
"print_action_for_report_name",
|
||||
[action.report_name]
|
||||
);
|
||||
if (print_action && print_action.action === "server") {
|
||||
if (
|
||||
print_action &&
|
||||
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,
|
||||
]);
|
||||
if (result) {
|
||||
env.services.notification.add(env._t("Successfully sent to printer!"));
|
||||
env.services.notification.add(env._t("Successfully sent to printer!"), {
|
||||
type: "success",
|
||||
});
|
||||
} else {
|
||||
env.services.notification.add(env._t("Could not sent to printer!"));
|
||||
env.services.notification.add(env._t("Could not sent to printer!"), {
|
||||
type: "danger",
|
||||
});
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if (print_action.printer_exception) {
|
||||
env.services.notification.add(
|
||||
env._t("The printer couldn't be reached. Downloading document instead"),
|
||||
{
|
||||
type: "warning",
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -12,10 +12,12 @@ model = "odoo.addons.base.models.ir_actions_report.IrActionsReport"
|
||||
class TestIrActionsReportXml(TransactionCase):
|
||||
def setUp(self):
|
||||
super(TestIrActionsReportXml, self).setUp()
|
||||
self.Model = self.env["ir.actions.report"]
|
||||
self.Model = self.env["ir.actions.report"].with_context(
|
||||
skip_printer_exception=True
|
||||
)
|
||||
self.vals = {}
|
||||
|
||||
self.report = self.env["ir.actions.report"].search([], limit=1)
|
||||
self.report = self.Model.search([], limit=1)
|
||||
self.server = self.env["printing.server"].create({})
|
||||
|
||||
def new_action(self):
|
||||
@@ -153,7 +155,7 @@ class TestIrActionsReportXml(TransactionCase):
|
||||
self.env.user.printing_action = "client"
|
||||
printing_action = self.new_printing_action()
|
||||
printing_action.user_id = self.env.user
|
||||
printing_action.report_id = self.env["ir.actions.report"].search(
|
||||
printing_action.report_id = self.Model.search(
|
||||
[("id", "!=", report.id)], limit=1
|
||||
)
|
||||
self.assertEqual(
|
||||
@@ -213,7 +215,7 @@ class TestIrActionsReportXml(TransactionCase):
|
||||
"""
|
||||
It should return the correct tray
|
||||
"""
|
||||
report = self.env["ir.actions.report"].search([], limit=1)
|
||||
report = self.Model.search([], limit=1)
|
||||
action = self.env["printing.report.xml.action"].create(
|
||||
{"user_id": self.env.user.id, "report_id": report.id, "action": "server"}
|
||||
)
|
||||
@@ -266,7 +268,7 @@ class TestIrActionsReportXml(TransactionCase):
|
||||
self.assertEqual("Action tray", report.behaviour()["tray"])
|
||||
|
||||
def test_onchange_printer_tray_id_empty(self):
|
||||
action = self.env["ir.actions.report"].new({"printer_tray_id": False})
|
||||
action = self.Model.new({"printer_tray_id": False})
|
||||
action.onchange_printing_printer_id()
|
||||
self.assertFalse(action.printer_tray_id)
|
||||
|
||||
@@ -289,7 +291,7 @@ class TestIrActionsReportXml(TransactionCase):
|
||||
{"name": "Tray", "system_name": "TrayName", "printer_id": printer.id}
|
||||
)
|
||||
|
||||
action = self.env["ir.actions.report"].new({"printer_tray_id": tray.id})
|
||||
action = self.Model.new({"printer_tray_id": tray.id})
|
||||
self.assertEqual(action.printer_tray_id, tray)
|
||||
action.onchange_printing_printer_id()
|
||||
self.assertFalse(action.printer_tray_id)
|
||||
|
||||
@@ -11,7 +11,9 @@ from odoo.tests import common
|
||||
class TestReport(common.HttpCase):
|
||||
def setUp(self):
|
||||
super(TestReport, self).setUp()
|
||||
self.Model = self.env["ir.actions.report"]
|
||||
self.Model = self.env["ir.actions.report"].with_context(
|
||||
skip_printer_exception=True
|
||||
)
|
||||
self.server = self.env["printing.server"].create({})
|
||||
self.report_vals = {
|
||||
"name": "Test Report",
|
||||
|
||||
Reference in New Issue
Block a user