Skip to content

Commit 8eb77aa

Browse files
committed
[IMP] base_report_to_printer: Add ability to send a print quantity
If we use the direct printing function, be able to transmit the quantity of copies we want.
1 parent f76ba51 commit 8eb77aa

File tree

3 files changed

+91
-8
lines changed

3 files changed

+91
-8
lines changed

base_report_to_printer/models/ir_actions_report.py

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -85,12 +85,33 @@ def _get_report_default_print_behaviour(self):
8585
result["tray"] = self.printer_tray_id.system_name
8686
return result
8787

88-
def behaviour(self):
88+
def _set_extra_print_options(self, extras):
89+
"""
90+
extra: A dictionary with extra print options
91+
"""
92+
extras_options = {}
93+
for extra, value in extras.items():
94+
try:
95+
extras_options.update(
96+
getattr(self, "_set_print_extra_%s" % extra)(value)
97+
)
98+
except AttributeError:
99+
extras_options[extra] = str(value)
100+
return extras_options
101+
102+
def _set_print_extra_quantity(self, value):
103+
"""
104+
We add the 'copies' attribute
105+
"""
106+
return {"copies": str(value)} if value else {}
107+
108+
def behaviour(self, **extras):
89109
self.ensure_one()
90110
printing_act_obj = self.env["printing.report.xml.action"]
91111

92112
result = self._get_user_default_print_behaviour()
93113
result.update(self._get_report_default_print_behaviour())
114+
result.update(self._set_extra_print_options(extras=extras))
94115

95116
# Retrieve report-user specific values
96117
print_action = printing_act_obj.search(
@@ -122,8 +143,8 @@ def behaviour(self):
122143
result["printer_exception"] = True
123144
return result
124145

125-
def print_document_client_action(self, record_ids, data=None):
126-
behaviour = self.behaviour()
146+
def print_document_client_action(self, record_ids, data=None, **extras):
147+
behaviour = self.behaviour(**extras)
127148
printer = behaviour.pop("printer", None)
128149
if printer.multi_thread:
129150

@@ -138,17 +159,17 @@ def _launch_print_thread():
138159
return True
139160
else:
140161
try:
141-
return self.print_document(record_ids, data=data)
162+
return self.print_document(record_ids, data=data, **extras)
142163
except Exception:
143164
return
144165

145-
def print_document_threaded(self, report_id, record_ids, data):
166+
def print_document_threaded(self, report_id, record_ids, data, **extras):
146167
with registry(self._cr.dbname).cursor() as cr:
147168
self = self.with_env(self.env(cr=cr))
148169
report = self.env["ir.actions.report"].browse(report_id)
149-
report.print_document(record_ids, data)
170+
report.print_document(record_ids, data, **extras)
150171

151-
def print_document(self, record_ids, data=None):
172+
def print_document(self, record_ids, data=None, **extras):
152173
"""Print a document, do not return the document file"""
153174
report_type = REPORT_TYPES.get(self.report_type)
154175
if not report_type:
@@ -160,7 +181,7 @@ def print_document(self, record_ids, data=None):
160181
document, doc_format = getattr(
161182
self.with_context(must_skip_send_to_printer=True), method_name
162183
)(self.report_name, record_ids, data=data)
163-
behaviour = self.behaviour()
184+
behaviour = self.behaviour(**extras)
164185
printer = behaviour.pop("printer", None)
165186

166187
if not printer:

base_report_to_printer/tests/test_printing_printer.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,3 +180,17 @@ def test_print_test_page(self, cups):
180180
printer = self.new_record()
181181
printer.print_test_page()
182182
cups.Connection().printTestPage.assert_called_once_with(printer.system_name)
183+
184+
@mock.patch("%s.cups" % server_model)
185+
def test_print_report_quantity(self, cups):
186+
"""It should print a report through CUPS"""
187+
fd, file_name = tempfile.mkstemp()
188+
with mock.patch("%s.mkstemp" % model) as mkstemp:
189+
mkstemp.return_value = fd, file_name
190+
printer = self.new_record()
191+
printer.print_document(
192+
self.report, b"content to print", doc_format="pdf", **{"copies": 3}
193+
)
194+
cups.Connection().printFile.assert_called_once_with(
195+
printer.system_name, file_name, file_name, options={"copies": "3"}
196+
)

base_report_to_printer/tests/test_report.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
from odoo import exceptions
88
from odoo.tests import common
99

10+
REPORT_TYPES = {"qweb-pdf": "pdf", "qweb-text": "text"}
11+
1012

1113
class TestReport(common.HttpCase):
1214
def setUp(self):
@@ -203,3 +205,49 @@ def test_print_document_string(self):
203205
) as print_file:
204206
self.new_printer().print_document("", "test")
205207
print_file.assert_called_once()
208+
209+
def test_print_document_printable_quantity(self):
210+
"""It should print the report, regardless of the defined behaviour"""
211+
self.report.property_printing_action_id.action_type = "server"
212+
self.report.printing_printer_id = self.new_printer()
213+
report_type = REPORT_TYPES.get(self.report.report_type)
214+
behaviour = self.report.behaviour(**{"quantity": 3})
215+
behaviour.pop("printer")
216+
method_name = "_render_qweb_%s" % (report_type)
217+
document, doc_format = getattr(
218+
self.report.with_context(must_skip_send_to_printer=True), method_name
219+
)(self.report.report_name, self.partners.ids, data=None)
220+
behaviour["title"] = self.report.report_name
221+
behaviour["res_ids"] = self.partners.ids
222+
with mock.patch(
223+
"odoo.addons.base_report_to_printer.models."
224+
"printing_printer.PrintingPrinter."
225+
"print_document"
226+
) as print_document:
227+
self.report.print_document(self.partners.ids, **{"quantity": 3})
228+
print_document.assert_called_once_with(
229+
self.report, document, doc_format=self.report.report_type, **behaviour
230+
)
231+
232+
def test_print_document_printable_unknown(self):
233+
"""It should print the report, regardless of the defined behaviour"""
234+
self.report.property_printing_action_id.action_type = "server"
235+
self.report.printing_printer_id = self.new_printer()
236+
report_type = REPORT_TYPES.get(self.report.report_type)
237+
behaviour = self.report.behaviour(**{"unknown": "test"})
238+
behaviour.pop("printer")
239+
method_name = "_render_qweb_%s" % (report_type)
240+
document, doc_format = getattr(
241+
self.report.with_context(must_skip_send_to_printer=True), method_name
242+
)(self.report.report_name, self.partners.ids, data=None)
243+
behaviour["title"] = self.report.report_name
244+
behaviour["res_ids"] = self.partners.ids
245+
with mock.patch(
246+
"odoo.addons.base_report_to_printer.models."
247+
"printing_printer.PrintingPrinter."
248+
"print_document"
249+
) as print_document:
250+
self.report.print_document(self.partners.ids, **{"unknown": "test"})
251+
print_document.assert_called_once_with(
252+
self.report, document, doc_format=self.report.report_type, **behaviour
253+
)

0 commit comments

Comments
 (0)