Skip to content
Open
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
44 changes: 36 additions & 8 deletions base_report_to_printer/models/ir_actions_report.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,12 +85,40 @@ def _get_report_default_print_behaviour(self):
result["tray"] = self.printer_tray_id.system_name
return result

def behaviour(self):
def _set_extra_print_options(self, extras):
"""
extra: A dictionary with extra print options
"""
extras_options = {}
for extra, value in extras.items():
try:
extras_options.update(
getattr(self, "_set_print_extra_%s" % extra)(value)
)
except AttributeError:
extras_options[extra] = str(value)
return extras_options

def _set_print_extra_quantity(self, value):
"""
We add the 'copies' attribute
"""
return {"copies": str(value)} if value else {}

def _set_print_extra_printer(self, value):
"""
We force the printer that will be used
The printer should be a recordset
"""
return {"printer": value} if value else {}

def behaviour(self, **extras):
self.ensure_one()
printing_act_obj = self.env["printing.report.xml.action"]

result = self._get_user_default_print_behaviour()
result.update(self._get_report_default_print_behaviour())
result.update(self._set_extra_print_options(extras=extras))

# Retrieve report-user specific values
print_action = printing_act_obj.search(
Expand Down Expand Up @@ -122,8 +150,8 @@ def behaviour(self):
result["printer_exception"] = True
return result

def print_document_client_action(self, record_ids, data=None):
behaviour = self.behaviour()
def print_document_client_action(self, record_ids, data=None, **extras):
behaviour = self.behaviour(**extras)
printer = behaviour.pop("printer", None)
if printer.multi_thread:

Expand All @@ -138,17 +166,17 @@ def _launch_print_thread():
return True
else:
try:
return self.print_document(record_ids, data=data)
return self.print_document(record_ids, data=data, **extras)
except Exception:
return

def print_document_threaded(self, report_id, record_ids, data):
def print_document_threaded(self, report_id, record_ids, data, **extras):
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)
report.print_document(record_ids, data, **extras)

def print_document(self, record_ids, data=None):
def print_document(self, record_ids, data=None, **extras):
"""Print a document, do not return the document file"""
report_type = REPORT_TYPES.get(self.report_type)
if not report_type:
Expand All @@ -160,7 +188,7 @@ def print_document(self, record_ids, data=None):
document, doc_format = getattr(
self.with_context(must_skip_send_to_printer=True), method_name
)(self.report_name, record_ids, data=data)
behaviour = self.behaviour()
behaviour = self.behaviour(**extras)
printer = behaviour.pop("printer", None)

if not printer:
Expand Down
14 changes: 14 additions & 0 deletions base_report_to_printer/tests/test_printing_printer.py
Original file line number Diff line number Diff line change
Expand Up @@ -180,3 +180,17 @@ def test_print_test_page(self, cups):
printer = self.new_record()
printer.print_test_page()
cups.Connection().printTestPage.assert_called_once_with(printer.system_name)

@mock.patch("%s.cups" % server_model)
def test_print_report_quantity(self, cups):
"""It should print a report through CUPS"""
fd, file_name = tempfile.mkstemp()
with mock.patch("%s.mkstemp" % model) as mkstemp:
mkstemp.return_value = fd, file_name
printer = self.new_record()
printer.print_document(
self.report, b"content to print", doc_format="pdf", **{"copies": 3}
)
cups.Connection().printFile.assert_called_once_with(
printer.system_name, file_name, file_name, options={"copies": "3"}
)
77 changes: 76 additions & 1 deletion base_report_to_printer/tests/test_report.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
# Copyright 2016 LasLabs Inc.
# Copyright 2017 Tecnativa - Jairo Llopis
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

from unittest import mock

from odoo import exceptions
from odoo.tests import common

REPORT_TYPES = {"qweb-pdf": "pdf", "qweb-text": "text"}

server_model = "odoo.addons.base_report_to_printer.models.printing_server"


class TestReport(common.HttpCase):
def setUp(self):
Expand Down Expand Up @@ -203,3 +206,75 @@ def test_print_document_string(self):
) as print_file:
self.new_printer().print_document("", "test")
print_file.assert_called_once()

def test_print_document_printable_quantity(self):
"""It should print the report, regardless of the defined behaviour"""
self.report.property_printing_action_id.action_type = "server"
self.report.printing_printer_id = self.new_printer()
report_type = REPORT_TYPES.get(self.report.report_type)
behaviour = self.report.behaviour(**{"quantity": 3})
behaviour.pop("printer")
method_name = "_render_qweb_%s" % (report_type)
document, doc_format = getattr(
self.report.with_context(must_skip_send_to_printer=True), method_name
)(self.report.report_name, self.partners.ids, data=None)
behaviour["title"] = self.report.report_name
behaviour["res_ids"] = self.partners.ids
with mock.patch(
"odoo.addons.base_report_to_printer.models."
"printing_printer.PrintingPrinter."
"print_document"
) as print_document:
self.report.print_document(self.partners.ids, **{"quantity": 3})
print_document.assert_called_once_with(
self.report, document, doc_format=self.report.report_type, **behaviour
)

def test_print_document_printable_unknown(self):
"""It should print the report, regardless of the defined behaviour"""
self.report.property_printing_action_id.action_type = "server"
self.report.printing_printer_id = self.new_printer()
report_type = REPORT_TYPES.get(self.report.report_type)
behaviour = self.report.behaviour(**{"unknown": "test"})
behaviour.pop("printer")
method_name = "_render_qweb_%s" % (report_type)
document, doc_format = getattr(
self.report.with_context(must_skip_send_to_printer=True), method_name
)(self.report.report_name, self.partners.ids, data=None)
behaviour["title"] = self.report.report_name
behaviour["res_ids"] = self.partners.ids
with mock.patch(
"odoo.addons.base_report_to_printer.models."
"printing_printer.PrintingPrinter."
"print_document"
) as print_document:
self.report.print_document(self.partners.ids, **{"unknown": "test"})
print_document.assert_called_once_with(
self.report, document, doc_format=self.report.report_type, **behaviour
)

@mock.patch("%s.cups" % server_model)
def test_print_document_printer_extra(self, cups):
"""
It should print the report to the desired printer
"""
self.report.property_printing_action_id.action_type = "server"
self.report.printing_printer_id = self.new_printer()
forced_printer = self.new_printer()
forced_printer.system_name = "Forced Printer"
report_type = REPORT_TYPES.get(self.report.report_type)
behaviour = self.report.behaviour(**{"printer": forced_printer})
behaviour.pop("printer")
method_name = "_render_qweb_%s" % (report_type)
document, doc_format = getattr(
self.report.with_context(must_skip_send_to_printer=True), method_name
)(self.report.report_name, self.partners.ids, data=None)
behaviour["title"] = self.report.report_name
behaviour["res_ids"] = self.partners.ids
extras = {
"printer": forced_printer,
}
self.report.print_document(self.partners.ids, **extras)
self.assertEqual(
"Forced Printer", cups.Connection().printFile.call_args.args[0]
)