odoo-addon-base-report-to-printer 18.0.1.1.6__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. odoo/addons/base_report_to_printer/README.rst +205 -0
  2. odoo/addons/base_report_to_printer/__init__.py +9 -0
  3. odoo/addons/base_report_to_printer/__manifest__.py +39 -0
  4. odoo/addons/base_report_to_printer/data/neutralize.sql +2 -0
  5. odoo/addons/base_report_to_printer/data/printing_data.xml +27 -0
  6. odoo/addons/base_report_to_printer/i18n/am.po +936 -0
  7. odoo/addons/base_report_to_printer/i18n/base_report_to_printer.pot +932 -0
  8. odoo/addons/base_report_to_printer/i18n/bg.po +939 -0
  9. odoo/addons/base_report_to_printer/i18n/ca.po +936 -0
  10. odoo/addons/base_report_to_printer/i18n/de.po +994 -0
  11. odoo/addons/base_report_to_printer/i18n/el_GR.po +937 -0
  12. odoo/addons/base_report_to_printer/i18n/es.po +1004 -0
  13. odoo/addons/base_report_to_printer/i18n/es_AR.po +987 -0
  14. odoo/addons/base_report_to_printer/i18n/es_ES.po +937 -0
  15. odoo/addons/base_report_to_printer/i18n/fi.po +939 -0
  16. odoo/addons/base_report_to_printer/i18n/fr.po +999 -0
  17. odoo/addons/base_report_to_printer/i18n/gl.po +936 -0
  18. odoo/addons/base_report_to_printer/i18n/hr.po +966 -0
  19. odoo/addons/base_report_to_printer/i18n/hr_HR.po +941 -0
  20. odoo/addons/base_report_to_printer/i18n/it.po +985 -0
  21. odoo/addons/base_report_to_printer/i18n/nl.po +939 -0
  22. odoo/addons/base_report_to_printer/i18n/nl_NL.po +950 -0
  23. odoo/addons/base_report_to_printer/i18n/pt.po +936 -0
  24. odoo/addons/base_report_to_printer/i18n/pt_BR.po +940 -0
  25. odoo/addons/base_report_to_printer/i18n/pt_PT.po +937 -0
  26. odoo/addons/base_report_to_printer/i18n/sl.po +943 -0
  27. odoo/addons/base_report_to_printer/i18n/sv.po +983 -0
  28. odoo/addons/base_report_to_printer/i18n/tr.po +936 -0
  29. odoo/addons/base_report_to_printer/i18n/zh_CN.po +958 -0
  30. odoo/addons/base_report_to_printer/models/__init__.py +8 -0
  31. odoo/addons/base_report_to_printer/models/ir_actions_report.py +253 -0
  32. odoo/addons/base_report_to_printer/models/printing_action.py +26 -0
  33. odoo/addons/base_report_to_printer/models/printing_job.py +131 -0
  34. odoo/addons/base_report_to_printer/models/printing_printer.py +268 -0
  35. odoo/addons/base_report_to_printer/models/printing_report_xml_action.py +48 -0
  36. odoo/addons/base_report_to_printer/models/printing_server.py +275 -0
  37. odoo/addons/base_report_to_printer/models/printing_tray.py +21 -0
  38. odoo/addons/base_report_to_printer/models/res_users.py +55 -0
  39. odoo/addons/base_report_to_printer/readme/CONFIGURE.md +13 -0
  40. odoo/addons/base_report_to_printer/readme/CONTRIBUTORS.md +18 -0
  41. odoo/addons/base_report_to_printer/readme/CREDITS.md +1 -0
  42. odoo/addons/base_report_to_printer/readme/DESCRIPTION.md +27 -0
  43. odoo/addons/base_report_to_printer/readme/HISTORY.md +7 -0
  44. odoo/addons/base_report_to_printer/readme/INSTALL.md +10 -0
  45. odoo/addons/base_report_to_printer/readme/ROADMAP.md +3 -0
  46. odoo/addons/base_report_to_printer/readme/USAGE.md +15 -0
  47. odoo/addons/base_report_to_printer/security/ir.model.access.csv +2 -0
  48. odoo/addons/base_report_to_printer/security/security.xml +151 -0
  49. odoo/addons/base_report_to_printer/static/description/icon.png +0 -0
  50. odoo/addons/base_report_to_printer/static/description/index.html +561 -0
  51. odoo/addons/base_report_to_printer/static/src/js/qweb_action_manager.esm.js +92 -0
  52. odoo/addons/base_report_to_printer/tests/__init__.py +13 -0
  53. odoo/addons/base_report_to_printer/tests/test_ir_actions_report.py +350 -0
  54. odoo/addons/base_report_to_printer/tests/test_printing_job.py +70 -0
  55. odoo/addons/base_report_to_printer/tests/test_printing_printer.py +198 -0
  56. odoo/addons/base_report_to_printer/tests/test_printing_printer_tray.py +256 -0
  57. odoo/addons/base_report_to_printer/tests/test_printing_printer_wizard.py +94 -0
  58. odoo/addons/base_report_to_printer/tests/test_printing_report_xml_action.py +98 -0
  59. odoo/addons/base_report_to_printer/tests/test_printing_server.py +219 -0
  60. odoo/addons/base_report_to_printer/tests/test_printing_tray.py +49 -0
  61. odoo/addons/base_report_to_printer/tests/test_report.py +226 -0
  62. odoo/addons/base_report_to_printer/tests/test_res_users.py +53 -0
  63. odoo/addons/base_report_to_printer/views/ir_actions_report.xml +21 -0
  64. odoo/addons/base_report_to_printer/views/printing_job.xml +46 -0
  65. odoo/addons/base_report_to_printer/views/printing_printer.xml +147 -0
  66. odoo/addons/base_report_to_printer/views/printing_report.xml +39 -0
  67. odoo/addons/base_report_to_printer/views/printing_server.xml +79 -0
  68. odoo/addons/base_report_to_printer/views/res_users.xml +33 -0
  69. odoo/addons/base_report_to_printer/wizards/__init__.py +2 -0
  70. odoo/addons/base_report_to_printer/wizards/print_attachment_report.py +80 -0
  71. odoo/addons/base_report_to_printer/wizards/print_attachment_report.xml +56 -0
  72. odoo/addons/base_report_to_printer/wizards/printing_printer_update_wizard.py +27 -0
  73. odoo/addons/base_report_to_printer/wizards/printing_printer_update_wizard_view.xml +37 -0
  74. odoo_addon_base_report_to_printer-18.0.1.1.6.dist-info/METADATA +222 -0
  75. odoo_addon_base_report_to_printer-18.0.1.1.6.dist-info/RECORD +77 -0
  76. odoo_addon_base_report_to_printer-18.0.1.1.6.dist-info/WHEEL +5 -0
  77. odoo_addon_base_report_to_printer-18.0.1.1.6.dist-info/top_level.txt +1 -0
@@ -0,0 +1,350 @@
1
+ # Copyright 2016 LasLabs Inc.
2
+ # Copyright 2016 SYLEAM
3
+ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
4
+
5
+ import logging
6
+ from unittest import mock
7
+
8
+ from odoo.tests.common import TransactionCase
9
+
10
+ model = "odoo.addons.base.models.ir_actions_report.IrActionsReport"
11
+
12
+
13
+ class TestIrActionsReportXml(TransactionCase):
14
+ def setUp(self):
15
+ super().setUp()
16
+ self.Model = self.env["ir.actions.report"].with_context(
17
+ skip_printer_exception=True
18
+ )
19
+ self.vals = {}
20
+
21
+ self.report = self.Model.search([], limit=1)
22
+ self.server = self.env["printing.server"].create({})
23
+
24
+ def new_action(self):
25
+ return self.env["printing.action"].create(
26
+ {"name": "Printing Action", "action_type": "server"}
27
+ )
28
+
29
+ def new_printing_action(self):
30
+ return self.env["printing.report.xml.action"].create(
31
+ {
32
+ "report_id": self.report.id,
33
+ "user_id": self.env.ref("base.user_demo").id,
34
+ "action": "server",
35
+ }
36
+ )
37
+
38
+ def new_printer(self):
39
+ return self.env["printing.printer"].create(
40
+ {
41
+ "name": "Printer",
42
+ "server_id": self.server.id,
43
+ "system_name": "Sys Name",
44
+ "default": True,
45
+ "status": "unknown",
46
+ "status_message": "Msg",
47
+ "model": "res.users",
48
+ "location": "Location",
49
+ "uri": "URI",
50
+ }
51
+ )
52
+
53
+ def new_tray(self, vals=None, defaults=None):
54
+ values = dict(defaults)
55
+ if vals is not None:
56
+ values.update(vals)
57
+ return self.env["printing.tray"].create(values)
58
+
59
+ def test_print_action_for_report_name_gets_report(self):
60
+ """It should get report by name"""
61
+ with mock.patch(f"{model}._get_report_from_name") as mk:
62
+ expect = "test"
63
+ self.Model.print_action_for_report_name(expect)
64
+ mk.assert_called_once_with(expect)
65
+
66
+ def test_print_action_for_report_name_returns_if_no_report(self):
67
+ """It should return empty dict when no matching report"""
68
+ with mock.patch(f"{model}._get_report_from_name") as mk:
69
+ expect = "test"
70
+ mk.return_value = False
71
+ res = self.Model.print_action_for_report_name(expect)
72
+ self.assertDictEqual({}, res)
73
+
74
+ def test_print_action_for_report_name_returns_if_report(self):
75
+ """It should return correct serializable result for behaviour"""
76
+ with mock.patch(f"{model}._get_report_from_name") as mk:
77
+ res = self.Model.print_action_for_report_name("test")
78
+ behaviour = mk().behaviour()
79
+ expect = {
80
+ "action": behaviour["action"],
81
+ "printer_name": behaviour["printer"].name,
82
+ }
83
+ self.assertDictEqual(expect, res, f"Expect {expect}, Got {res}")
84
+
85
+ def test_behaviour_default_values(self):
86
+ """It should return the default action and printer"""
87
+ report = self.Model.search([], limit=1)
88
+ self.env.user.printing_action = False
89
+ self.env.user.printing_printer_id = False
90
+ report.property_printing_action_id = False
91
+ report.printing_printer_id = False
92
+ self.assertEqual(
93
+ report.behaviour(),
94
+ {
95
+ "action": "client",
96
+ "printer": self.env["printing.printer"],
97
+ "tray": False,
98
+ },
99
+ )
100
+
101
+ def test_behaviour_user_values(self):
102
+ """It should return the action and printer from user"""
103
+ report = self.Model.search([], limit=1)
104
+ self.env.user.printing_action = "client"
105
+ self.env.user.printing_printer_id = self.new_printer()
106
+ with (
107
+ self.assertLogs(level=logging.WARNING) as logs,
108
+ ):
109
+ self.assertEqual(
110
+ report.behaviour(),
111
+ {
112
+ "action": "client",
113
+ "printer": self.env.user.printing_printer_id,
114
+ "tray": False,
115
+ },
116
+ )
117
+ self.assertEqual(len(logs.records), 1)
118
+ self.assertEqual(logs.records[0].levelno, logging.WARNING)
119
+
120
+ def test_behaviour_report_values(self):
121
+ """It should return the action and printer from report"""
122
+ report = self.Model.search([], limit=1)
123
+ self.env.user.printing_action = "client"
124
+ report.property_printing_action_id = self.new_action()
125
+ report.printing_printer_id = self.new_printer()
126
+ with (
127
+ self.assertLogs(level=logging.WARNING) as logs,
128
+ ):
129
+ self.assertEqual(
130
+ report.behaviour(),
131
+ {
132
+ "action": report.property_printing_action_id.action_type,
133
+ "printer": report.printing_printer_id,
134
+ "tray": False,
135
+ },
136
+ )
137
+ self.assertEqual(len(logs.records), 1)
138
+ self.assertEqual(logs.records[0].levelno, logging.WARNING)
139
+
140
+ def test_behaviour_user_action(self):
141
+ """It should return the action and printer from user action"""
142
+ report = self.Model.search([], limit=1)
143
+ self.env.user.printing_action = "client"
144
+ report.property_printing_action_id.action_type = "user_default"
145
+ self.assertEqual(
146
+ report.behaviour(),
147
+ {"action": "client", "printer": report.printing_printer_id, "tray": False},
148
+ )
149
+
150
+ def test_behaviour_printing_action_on_wrong_user(self):
151
+ """It should return the action and printer ignoring printing action"""
152
+ report = self.Model.search([], limit=1)
153
+ self.env.user.printing_action = "client"
154
+ printing_action = self.new_printing_action()
155
+ printing_action.user_id = self.env["res.users"].search(
156
+ [("id", "!=", self.env.user.id)], limit=1
157
+ )
158
+ self.assertEqual(
159
+ report.behaviour(),
160
+ {"action": "client", "printer": report.printing_printer_id, "tray": False},
161
+ )
162
+
163
+ def test_behaviour_printing_action_on_wrong_report(self):
164
+ """It should return the action and printer ignoring printing action"""
165
+ report = self.Model.search([], limit=1)
166
+ self.env.user.printing_action = "client"
167
+ printing_action = self.new_printing_action()
168
+ printing_action.user_id = self.env.user
169
+ printing_action.report_id = self.Model.search(
170
+ [("id", "!=", report.id)], limit=1
171
+ )
172
+ self.assertEqual(
173
+ report.behaviour(),
174
+ {"action": "client", "printer": report.printing_printer_id, "tray": False},
175
+ )
176
+
177
+ def test_behaviour_printing_action_with_no_printer(self):
178
+ """It should return the action from printing action and printer from
179
+ other
180
+ """
181
+ report = self.Model.search([], limit=1)
182
+ self.env.user.printing_action = "client"
183
+ printing_action = self.new_printing_action()
184
+ printing_action.user_id = self.env.user
185
+ printing_action.report_id = report
186
+ self.assertEqual(
187
+ report.behaviour(),
188
+ {
189
+ "action": printing_action.action,
190
+ "printer": report.printing_printer_id,
191
+ "tray": False,
192
+ },
193
+ )
194
+
195
+ def test_behaviour_printing_action_with_printer(self):
196
+ """It should return the action and printer from printing action"""
197
+ report = self.Model.search([], limit=1)
198
+ self.env.user.printing_action = "client"
199
+ printing_action = self.new_printing_action()
200
+ printing_action.user_id = self.env.user
201
+ printing_action.printer_id = self.new_printer()
202
+ with (
203
+ self.assertLogs(level=logging.WARNING) as logs,
204
+ ):
205
+ self.assertEqual(
206
+ report.behaviour(),
207
+ {
208
+ "action": printing_action.action,
209
+ "printer": printing_action.printer_id,
210
+ "tray": False,
211
+ },
212
+ )
213
+ self.assertEqual(len(logs.records), 1)
214
+ self.assertEqual(logs.records[0].levelno, logging.WARNING)
215
+
216
+ def test_behaviour_printing_action_user_defaults(self):
217
+ """It should return the action and printer from user with printing
218
+ action
219
+ """
220
+ report = self.Model.search([], limit=1)
221
+ self.env.user.printing_action = "client"
222
+ printing_action = self.new_printing_action()
223
+ printing_action.user_id = self.env.user
224
+ printing_action.action = "user_default"
225
+ self.assertEqual(
226
+ report.behaviour(),
227
+ {"action": "client", "printer": report.printing_printer_id, "tray": False},
228
+ )
229
+
230
+ def test_print_tray_behaviour(self):
231
+ """
232
+ It should return the correct tray
233
+ """
234
+ with (
235
+ self.assertLogs(level=logging.WARNING) as logs,
236
+ ):
237
+ report = self.Model.search([], limit=1)
238
+ action = self.env["printing.report.xml.action"].create(
239
+ {
240
+ "user_id": self.env.user.id,
241
+ "report_id": report.id,
242
+ "action": "server",
243
+ }
244
+ )
245
+ printer = self.new_printer()
246
+ tray_vals = {
247
+ "name": "Tray",
248
+ "system_name": "Tray",
249
+ "printer_id": printer.id,
250
+ }
251
+ user_tray = self.new_tray({"system_name": "User tray"}, tray_vals)
252
+ report_tray = self.new_tray({"system_name": "Report tray"}, tray_vals)
253
+ action_tray = self.new_tray({"system_name": "Action tray"}, tray_vals)
254
+
255
+ # No report passed
256
+ self.env.user.printer_tray_id = False
257
+ options = printer.print_options()
258
+ self.assertFalse("InputSlot" in options)
259
+
260
+ # No tray defined
261
+ self.env.user.printer_tray_id = False
262
+ report.printer_tray_id = False
263
+ action.printer_tray_id = False
264
+ options = report.behaviour()
265
+ self.assertTrue("tray" in options)
266
+
267
+ # Only user tray is defined
268
+ self.env.user.printer_tray_id = user_tray
269
+ report.printer_tray_id = False
270
+ action.printer_tray_id = False
271
+ self.assertEqual("User tray", report.behaviour()["tray"])
272
+
273
+ # Only report tray is defined
274
+ self.env.user.printer_tray_id = False
275
+ report.printer_tray_id = report_tray
276
+ action.printer_tray_id = False
277
+ self.assertEqual("Report tray", report.behaviour()["tray"])
278
+
279
+ # Only action tray is defined
280
+ self.env.user.printer_tray_id = False
281
+ report.printer_tray_id = False
282
+ action.printer_tray_id = action_tray
283
+ self.assertEqual("Action tray", report.behaviour()["tray"])
284
+
285
+ # User and report tray defined
286
+ self.env.user.printer_tray_id = user_tray
287
+ report.printer_tray_id = report_tray
288
+ action.printer_tray_id = False
289
+ self.assertEqual("Report tray", report.behaviour()["tray"])
290
+
291
+ # All trays are defined
292
+ self.env.user.printer_tray_id = user_tray
293
+ report.printer_tray_id = report_tray
294
+ action.printer_tray_id = action_tray
295
+ self.assertEqual("Action tray", report.behaviour()["tray"])
296
+ self.assertEqual(len(logs.records), 6)
297
+ for record in logs.records:
298
+ self.assertEqual(record.levelno, logging.WARNING)
299
+
300
+ def test_onchange_printer_tray_id_empty(self):
301
+ action = self.Model.new({"printer_tray_id": False})
302
+ action.onchange_printing_printer_id()
303
+ self.assertFalse(action.printer_tray_id)
304
+
305
+ def test_onchange_printer_tray_id_not_empty(self):
306
+ server = self.env["printing.server"].create({})
307
+ printer = self.env["printing.printer"].create(
308
+ {
309
+ "name": "Printer",
310
+ "server_id": server.id,
311
+ "system_name": "Sys Name",
312
+ "default": True,
313
+ "status": "unknown",
314
+ "status_message": "Msg",
315
+ "model": "res.users",
316
+ "location": "Location",
317
+ "uri": "URI",
318
+ }
319
+ )
320
+ tray = self.env["printing.tray"].create(
321
+ {"name": "Tray", "system_name": "TrayName", "printer_id": printer.id}
322
+ )
323
+
324
+ action = self.Model.new({"printer_tray_id": tray.id})
325
+ self.assertEqual(action.printer_tray_id, tray)
326
+ action.onchange_printing_printer_id()
327
+ self.assertFalse(action.printer_tray_id)
328
+
329
+ def test_print_in_new_thread(self):
330
+ """It should return the action and printer from printing action in other
331
+ thread"""
332
+ report = self.Model.search([], limit=1)
333
+ self.env.user.printing_action = "server"
334
+ printing_action = self.new_printing_action()
335
+ printing_action.user_id = self.env.user
336
+ printing_action.printer_id = self.new_printer()
337
+ printing_action.printer_id.multi_thread = True
338
+ with (
339
+ self.assertLogs(level=logging.WARNING) as logs,
340
+ ):
341
+ self.assertEqual(
342
+ report.behaviour(),
343
+ {
344
+ "action": printing_action.action,
345
+ "printer": printing_action.printer_id,
346
+ "tray": False,
347
+ },
348
+ )
349
+ self.assertEqual(len(logs.records), 1)
350
+ self.assertEqual(logs.records[0].levelno, logging.WARNING)
@@ -0,0 +1,70 @@
1
+ # Copyright 2016 LasLabs Inc.
2
+ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
3
+
4
+ import logging
5
+ from unittest import mock
6
+
7
+ from odoo import fields
8
+ from odoo.tests.common import TransactionCase
9
+
10
+ model = "odoo.addons.base_report_to_printer.models.printing_server"
11
+
12
+
13
+ class TestPrintingJob(TransactionCase):
14
+ def setUp(self):
15
+ super().setUp()
16
+ self.Model = self.env["printing.server"]
17
+ self.server = self.Model.create({})
18
+ self.printer_vals = {
19
+ "name": "Printer",
20
+ "server_id": self.server.id,
21
+ "system_name": "Sys Name",
22
+ "default": True,
23
+ "status": "unknown",
24
+ "status_message": "Msg",
25
+ "model": "res.users",
26
+ "location": "Location",
27
+ "uri": "URI",
28
+ }
29
+ self.job_vals = {
30
+ "server_id": self.server.id,
31
+ "job_id_cups": 1,
32
+ "job_media_progress": 0,
33
+ "time_at_creation": fields.Datetime.now(),
34
+ }
35
+
36
+ def new_printer(self):
37
+ return self.env["printing.printer"].create(self.printer_vals)
38
+
39
+ def new_job(self, printer, vals=None):
40
+ values = self.job_vals
41
+ if vals is not None:
42
+ values.update(vals)
43
+ values["printer_id"] = printer.id
44
+ return self.env["printing.job"].create(values)
45
+
46
+ def test_cancel_job_error(self):
47
+ """It should catch any exception from CUPS and update status"""
48
+ with (
49
+ mock.patch(f"{model}.cups") as cups,
50
+ self.assertLogs(level=logging.WARNING) as logs,
51
+ ):
52
+ cups.Connection.side_effect = Exception
53
+ printer = self.new_printer()
54
+ job = self.new_job(printer, {"job_id_cups": 2})
55
+ job.action_cancel()
56
+ cups.Connection.side_effect = None
57
+ self.assertEqual(cups.Connection().cancelJob.call_count, 0)
58
+
59
+ self.assertEqual(len(logs.records), 3)
60
+ self.assertEqual(logs.records[0].levelno, logging.WARNING)
61
+
62
+ @mock.patch(f"{model}.cups")
63
+ def test_cancel_job(self, cups):
64
+ """It should catch any exception from CUPS and update status"""
65
+ printer = self.new_printer()
66
+ job = self.new_job(printer)
67
+ job.cancel()
68
+ cups.Connection().cancelJob.assert_called_once_with(
69
+ job.job_id_cups, purge_job=False
70
+ )
@@ -0,0 +1,198 @@
1
+ # Copyright 2016 LasLabs Inc.
2
+ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
3
+
4
+ import logging
5
+ import tempfile
6
+ from unittest import mock
7
+
8
+ from odoo.exceptions import UserError
9
+ from odoo.tests.common import TransactionCase
10
+
11
+ model = "odoo.addons.base_report_to_printer.models.printing_printer"
12
+ server_model = "odoo.addons.base_report_to_printer.models.printing_server"
13
+
14
+
15
+ class TestPrintingPrinter(TransactionCase):
16
+ def setUp(self):
17
+ super().setUp()
18
+ self.Model = self.env["printing.printer"]
19
+ self.ServerModel = self.env["printing.server"]
20
+ self.server = self.env["printing.server"].create({})
21
+ self.printer_vals = {
22
+ "name": "Printer",
23
+ "server_id": self.server.id,
24
+ "system_name": "Sys Name",
25
+ "default": True,
26
+ "status": "unknown",
27
+ "status_message": "Msg",
28
+ "model": "res.users",
29
+ "location": "Location",
30
+ "uri": "URI",
31
+ }
32
+ self.report = self.env["ir.actions.report"].search([], limit=1)
33
+
34
+ def new_record(self):
35
+ return self.Model.create(self.printer_vals)
36
+
37
+ def test_option_tray(self):
38
+ """
39
+ It should put the value in InputSlot
40
+ """
41
+ self.assertEqual(
42
+ self.Model._set_option_tray(None, "Test Tray"), {"InputSlot": "Test Tray"}
43
+ )
44
+ self.assertEqual(self.Model._set_option_tray(None, False), {})
45
+
46
+ def test_option_noops(self):
47
+ """
48
+ Noops should return an empty dict
49
+ """
50
+ self.assertEqual(self.Model._set_option_action(None, "printer"), {})
51
+ self.assertEqual(self.Model._set_option_printer(None, self.Model), {})
52
+
53
+ def test_option_doc_format(self):
54
+ """
55
+ Raw documents should set raw boolean.
56
+ """
57
+ self.assertEqual(
58
+ self.Model._set_option_doc_format(None, "raw"), {"raw": "True"}
59
+ )
60
+ # Deprecate _set_option_format in v12.
61
+ self.assertEqual(self.Model._set_option_format(None, "raw"), {"raw": "True"})
62
+
63
+ self.assertEqual(self.Model._set_option_doc_format(None, "pdf"), {})
64
+ # Deprecate _set_option_format in v12.
65
+ self.assertEqual(self.Model._set_option_format(None, "pdf"), {})
66
+
67
+ def test_print_options(self):
68
+ """It should generate the right options dictionnary"""
69
+ # TODO: None here used as report - tests here should be merged
70
+ # with tests in test_printing_printer_tray from when modules merged
71
+ report = self.env["ir.actions.report"].search([], limit=1)
72
+ self.assertEqual(self.Model.print_options(doc_format="raw"), {"raw": "True"})
73
+ self.assertEqual(
74
+ self.Model.print_options(report, doc_format="pdf", copies=2),
75
+ {"copies": "2"},
76
+ )
77
+ self.assertEqual(
78
+ self.Model.print_options(report, doc_format="raw", copies=2),
79
+ {"raw": "True", "copies": "2"},
80
+ )
81
+ self.assertTrue("InputSlot" in self.Model.print_options(report, tray="Test"))
82
+
83
+ @mock.patch(f"{server_model}.cups")
84
+ def test_print_report(self, cups):
85
+ """It should print a report through CUPS"""
86
+ fd, file_name = tempfile.mkstemp()
87
+ with mock.patch(f"{model}.mkstemp") as mkstemp:
88
+ mkstemp.return_value = fd, file_name
89
+ printer = self.new_record()
90
+ printer.print_document(self.report, b"content to print", doc_format="pdf")
91
+ cups.Connection().printFile.assert_called_once_with(
92
+ printer.system_name, file_name, file_name, options={}
93
+ )
94
+
95
+ def test_print_report_error(self):
96
+ """It should print a report through CUPS"""
97
+ with (
98
+ mock.patch(f"{model}.cups") as cups,
99
+ self.assertLogs(level=logging.WARNING) as logs,
100
+ ):
101
+ cups.Connection.side_effect = Exception
102
+ fd, file_name = tempfile.mkstemp()
103
+ with mock.patch(f"{model}.mkstemp") as mkstemp:
104
+ mkstemp.return_value = fd, file_name
105
+ printer = self.new_record()
106
+ with self.assertRaises(UserError):
107
+ printer.print_document(
108
+ self.report, b"content to print", doc_format="pdf"
109
+ )
110
+ self.assertEqual(len(logs.records), 1)
111
+ self.assertEqual(logs.records[0].levelno, logging.WARNING)
112
+
113
+ def test_print_file(self):
114
+ """It should print a file through CUPS"""
115
+ with (
116
+ mock.patch(f"{server_model}.cups") as cups,
117
+ self.assertLogs(level=logging.WARNING) as logs,
118
+ ):
119
+ file_name = "file_name"
120
+ printer = self.new_record()
121
+ printer.print_file(file_name, "pdf")
122
+ cups.Connection().printFile.assert_called_once_with(
123
+ printer.system_name, file_name, file_name, options={}
124
+ )
125
+ self.assertEqual(len(logs.records), 1)
126
+ self.assertEqual(logs.records[0].levelno, logging.WARNING)
127
+
128
+ def test_print_file_error(self):
129
+ """It should print a file through CUPS"""
130
+ with (
131
+ mock.patch(f"{server_model}.cups") as cups,
132
+ self.assertLogs(level=logging.WARNING) as logs,
133
+ ):
134
+ cups.Connection.side_effect = Exception
135
+ file_name = "file_name"
136
+ printer = self.new_record()
137
+ with self.assertRaises(UserError):
138
+ printer.print_file(file_name)
139
+ self.assertEqual(len(logs.records), 1)
140
+ self.assertEqual(logs.records[0].levelno, logging.WARNING)
141
+
142
+ def test_set_default(self):
143
+ """It should set a single record as default"""
144
+ printer = self.new_record()
145
+ self.assertTrue(printer.default)
146
+ other_printer = self.new_record()
147
+ other_printer.set_default()
148
+ self.assertFalse(printer.default)
149
+ self.assertTrue(other_printer.default)
150
+ # Check that calling the method on an empty recordset does nothing
151
+ self.Model.set_default()
152
+ self.assertEqual(other_printer, self.Model.get_default())
153
+
154
+ def test_unset_default(self):
155
+ """It should unset the default state of the printer"""
156
+ printer = self.new_record()
157
+ self.assertTrue(printer.default)
158
+ printer.unset_default()
159
+ self.assertFalse(printer.default)
160
+
161
+ @mock.patch(f"{server_model}.cups")
162
+ def test_cancel_all_jobs(self, cups):
163
+ """It should cancel all jobs"""
164
+ printer = self.new_record()
165
+ printer.action_cancel_all_jobs()
166
+ cups.Connection().cancelAllJobs.assert_called_once_with(
167
+ name=printer.system_name, purge_jobs=False
168
+ )
169
+
170
+ @mock.patch(f"{server_model}.cups")
171
+ def test_cancel_and_purge_all_jobs(self, cups):
172
+ """It should cancel all jobs"""
173
+ printer = self.new_record()
174
+ printer.cancel_all_jobs(purge_jobs=True)
175
+ cups.Connection().cancelAllJobs.assert_called_once_with(
176
+ name=printer.system_name, purge_jobs=True
177
+ )
178
+
179
+ @mock.patch(f"{server_model}.cups")
180
+ def test_enable_printer(self, cups):
181
+ """It should enable the printer"""
182
+ printer = self.new_record()
183
+ printer.enable()
184
+ cups.Connection().enablePrinter.assert_called_once_with(printer.system_name)
185
+
186
+ @mock.patch(f"{server_model}.cups")
187
+ def test_disable_printer(self, cups):
188
+ """It should disable the printer"""
189
+ printer = self.new_record()
190
+ printer.disable()
191
+ cups.Connection().disablePrinter.assert_called_once_with(printer.system_name)
192
+
193
+ @mock.patch(f"{server_model}.cups")
194
+ def test_print_test_page(self, cups):
195
+ """It should print a test page"""
196
+ printer = self.new_record()
197
+ printer.print_test_page()
198
+ cups.Connection().printTestPage.assert_called_once_with(printer.system_name)