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"],
|
"action": result["action"],
|
||||||
"printer_name": result["printer"].name,
|
"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
|
return serializable_result
|
||||||
|
|
||||||
def _get_user_default_print_behaviour(self):
|
def _get_user_default_print_behaviour(self):
|
||||||
@@ -97,6 +101,21 @@ class IrActionsReport(models.Model):
|
|||||||
# For some reason design takes report defaults over
|
# For some reason design takes report defaults over
|
||||||
# False action entries so we must allow for that here
|
# False action entries so we must allow for that here
|
||||||
result.update({k: v for k, v in print_action.behaviour().items() if v})
|
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
|
return result
|
||||||
|
|
||||||
def print_document(self, record_ids, data=None):
|
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"):
|
if self.env.context.get("must_skip_send_to_printer"):
|
||||||
return False
|
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 True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|||||||
@@ -10,19 +10,35 @@ async function cupsReportActionHandler(action, options, env) {
|
|||||||
"print_action_for_report_name",
|
"print_action_for_report_name",
|
||||||
[action.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", [
|
const result = await orm.call("ir.actions.report", "print_document", [
|
||||||
action.id,
|
action.id,
|
||||||
action.context.active_ids,
|
action.context.active_ids,
|
||||||
action.data,
|
action.data,
|
||||||
]);
|
]);
|
||||||
if (result) {
|
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 {
|
} 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;
|
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):
|
class TestIrActionsReportXml(TransactionCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(TestIrActionsReportXml, self).setUp()
|
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.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({})
|
self.server = self.env["printing.server"].create({})
|
||||||
|
|
||||||
def new_action(self):
|
def new_action(self):
|
||||||
@@ -153,7 +155,7 @@ class TestIrActionsReportXml(TransactionCase):
|
|||||||
self.env.user.printing_action = "client"
|
self.env.user.printing_action = "client"
|
||||||
printing_action = self.new_printing_action()
|
printing_action = self.new_printing_action()
|
||||||
printing_action.user_id = self.env.user
|
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
|
[("id", "!=", report.id)], limit=1
|
||||||
)
|
)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
@@ -213,7 +215,7 @@ class TestIrActionsReportXml(TransactionCase):
|
|||||||
"""
|
"""
|
||||||
It should return the correct tray
|
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(
|
action = self.env["printing.report.xml.action"].create(
|
||||||
{"user_id": self.env.user.id, "report_id": report.id, "action": "server"}
|
{"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"])
|
self.assertEqual("Action tray", report.behaviour()["tray"])
|
||||||
|
|
||||||
def test_onchange_printer_tray_id_empty(self):
|
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()
|
action.onchange_printing_printer_id()
|
||||||
self.assertFalse(action.printer_tray_id)
|
self.assertFalse(action.printer_tray_id)
|
||||||
|
|
||||||
@@ -289,7 +291,7 @@ class TestIrActionsReportXml(TransactionCase):
|
|||||||
{"name": "Tray", "system_name": "TrayName", "printer_id": printer.id}
|
{"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)
|
self.assertEqual(action.printer_tray_id, tray)
|
||||||
action.onchange_printing_printer_id()
|
action.onchange_printing_printer_id()
|
||||||
self.assertFalse(action.printer_tray_id)
|
self.assertFalse(action.printer_tray_id)
|
||||||
|
|||||||
@@ -11,7 +11,9 @@ from odoo.tests import common
|
|||||||
class TestReport(common.HttpCase):
|
class TestReport(common.HttpCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(TestReport, self).setUp()
|
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.server = self.env["printing.server"].create({})
|
||||||
self.report_vals = {
|
self.report_vals = {
|
||||||
"name": "Test Report",
|
"name": "Test Report",
|
||||||
|
|||||||
Reference in New Issue
Block a user