Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[15.0][IMP] base_report_to_printer: out of connection fallback to client #346

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 25 additions & 1 deletion base_report_to_printer/models/ir_actions_report.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,10 @@
"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

Check warning on line 59 in base_report_to_printer/models/ir_actions_report.py

View check run for this annotation

Codecov / codecov/patch

base_report_to_printer/models/ir_actions_report.py#L59

Added line #L59 was not covered by tests
return serializable_result

def _get_user_default_print_behaviour(self):
Expand Down Expand Up @@ -97,6 +101,21 @@
# 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 [

Check warning on line 110 in base_report_to_printer/models/ir_actions_report.py

View check run for this annotation

Codecov / codecov/patch

base_report_to_printer/models/ir_actions_report.py#L110

Added line #L110 was not covered by tests
"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

Check warning on line 118 in base_report_to_printer/models/ir_actions_report.py

View check run for this annotation

Codecov / codecov/patch

base_report_to_printer/models/ir_actions_report.py#L118

Added line #L118 was not covered by tests
return result

def print_document(self, record_ids, data=None):
Expand Down Expand Up @@ -140,7 +159,12 @@
"""
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

Expand Down
22 changes: 19 additions & 3 deletions base_report_to_printer/static/src/js/qweb_action_manager.esm.js
Original file line number Diff line number Diff line change
Expand Up @@ -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",
}
);
}
}
}

Expand Down
14 changes: 8 additions & 6 deletions base_report_to_printer/tests/test_ir_actions_report.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,12 @@
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):
Expand Down Expand Up @@ -153,7 +155,7 @@ def test_behaviour_printing_action_on_wrong_report(self):
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(
Expand Down Expand Up @@ -213,7 +215,7 @@ def test_print_tray_behaviour(self):
"""
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"}
)
Expand Down Expand Up @@ -266,7 +268,7 @@ def test_print_tray_behaviour(self):
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)

Expand All @@ -289,7 +291,7 @@ def test_onchange_printer_tray_id_not_empty(self):
{"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)
4 changes: 3 additions & 1 deletion base_report_to_printer/tests/test_report.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@
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",
Expand Down
Loading