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.
- odoo/addons/base_report_to_printer/README.rst +205 -0
- odoo/addons/base_report_to_printer/__init__.py +9 -0
- odoo/addons/base_report_to_printer/__manifest__.py +39 -0
- odoo/addons/base_report_to_printer/data/neutralize.sql +2 -0
- odoo/addons/base_report_to_printer/data/printing_data.xml +27 -0
- odoo/addons/base_report_to_printer/i18n/am.po +936 -0
- odoo/addons/base_report_to_printer/i18n/base_report_to_printer.pot +932 -0
- odoo/addons/base_report_to_printer/i18n/bg.po +939 -0
- odoo/addons/base_report_to_printer/i18n/ca.po +936 -0
- odoo/addons/base_report_to_printer/i18n/de.po +994 -0
- odoo/addons/base_report_to_printer/i18n/el_GR.po +937 -0
- odoo/addons/base_report_to_printer/i18n/es.po +1004 -0
- odoo/addons/base_report_to_printer/i18n/es_AR.po +987 -0
- odoo/addons/base_report_to_printer/i18n/es_ES.po +937 -0
- odoo/addons/base_report_to_printer/i18n/fi.po +939 -0
- odoo/addons/base_report_to_printer/i18n/fr.po +999 -0
- odoo/addons/base_report_to_printer/i18n/gl.po +936 -0
- odoo/addons/base_report_to_printer/i18n/hr.po +966 -0
- odoo/addons/base_report_to_printer/i18n/hr_HR.po +941 -0
- odoo/addons/base_report_to_printer/i18n/it.po +985 -0
- odoo/addons/base_report_to_printer/i18n/nl.po +939 -0
- odoo/addons/base_report_to_printer/i18n/nl_NL.po +950 -0
- odoo/addons/base_report_to_printer/i18n/pt.po +936 -0
- odoo/addons/base_report_to_printer/i18n/pt_BR.po +940 -0
- odoo/addons/base_report_to_printer/i18n/pt_PT.po +937 -0
- odoo/addons/base_report_to_printer/i18n/sl.po +943 -0
- odoo/addons/base_report_to_printer/i18n/sv.po +983 -0
- odoo/addons/base_report_to_printer/i18n/tr.po +936 -0
- odoo/addons/base_report_to_printer/i18n/zh_CN.po +958 -0
- odoo/addons/base_report_to_printer/models/__init__.py +8 -0
- odoo/addons/base_report_to_printer/models/ir_actions_report.py +253 -0
- odoo/addons/base_report_to_printer/models/printing_action.py +26 -0
- odoo/addons/base_report_to_printer/models/printing_job.py +131 -0
- odoo/addons/base_report_to_printer/models/printing_printer.py +268 -0
- odoo/addons/base_report_to_printer/models/printing_report_xml_action.py +48 -0
- odoo/addons/base_report_to_printer/models/printing_server.py +275 -0
- odoo/addons/base_report_to_printer/models/printing_tray.py +21 -0
- odoo/addons/base_report_to_printer/models/res_users.py +55 -0
- odoo/addons/base_report_to_printer/readme/CONFIGURE.md +13 -0
- odoo/addons/base_report_to_printer/readme/CONTRIBUTORS.md +18 -0
- odoo/addons/base_report_to_printer/readme/CREDITS.md +1 -0
- odoo/addons/base_report_to_printer/readme/DESCRIPTION.md +27 -0
- odoo/addons/base_report_to_printer/readme/HISTORY.md +7 -0
- odoo/addons/base_report_to_printer/readme/INSTALL.md +10 -0
- odoo/addons/base_report_to_printer/readme/ROADMAP.md +3 -0
- odoo/addons/base_report_to_printer/readme/USAGE.md +15 -0
- odoo/addons/base_report_to_printer/security/ir.model.access.csv +2 -0
- odoo/addons/base_report_to_printer/security/security.xml +151 -0
- odoo/addons/base_report_to_printer/static/description/icon.png +0 -0
- odoo/addons/base_report_to_printer/static/description/index.html +561 -0
- odoo/addons/base_report_to_printer/static/src/js/qweb_action_manager.esm.js +92 -0
- odoo/addons/base_report_to_printer/tests/__init__.py +13 -0
- odoo/addons/base_report_to_printer/tests/test_ir_actions_report.py +350 -0
- odoo/addons/base_report_to_printer/tests/test_printing_job.py +70 -0
- odoo/addons/base_report_to_printer/tests/test_printing_printer.py +198 -0
- odoo/addons/base_report_to_printer/tests/test_printing_printer_tray.py +256 -0
- odoo/addons/base_report_to_printer/tests/test_printing_printer_wizard.py +94 -0
- odoo/addons/base_report_to_printer/tests/test_printing_report_xml_action.py +98 -0
- odoo/addons/base_report_to_printer/tests/test_printing_server.py +219 -0
- odoo/addons/base_report_to_printer/tests/test_printing_tray.py +49 -0
- odoo/addons/base_report_to_printer/tests/test_report.py +226 -0
- odoo/addons/base_report_to_printer/tests/test_res_users.py +53 -0
- odoo/addons/base_report_to_printer/views/ir_actions_report.xml +21 -0
- odoo/addons/base_report_to_printer/views/printing_job.xml +46 -0
- odoo/addons/base_report_to_printer/views/printing_printer.xml +147 -0
- odoo/addons/base_report_to_printer/views/printing_report.xml +39 -0
- odoo/addons/base_report_to_printer/views/printing_server.xml +79 -0
- odoo/addons/base_report_to_printer/views/res_users.xml +33 -0
- odoo/addons/base_report_to_printer/wizards/__init__.py +2 -0
- odoo/addons/base_report_to_printer/wizards/print_attachment_report.py +80 -0
- odoo/addons/base_report_to_printer/wizards/print_attachment_report.xml +56 -0
- odoo/addons/base_report_to_printer/wizards/printing_printer_update_wizard.py +27 -0
- odoo/addons/base_report_to_printer/wizards/printing_printer_update_wizard_view.xml +37 -0
- odoo_addon_base_report_to_printer-18.0.1.1.6.dist-info/METADATA +222 -0
- odoo_addon_base_report_to_printer-18.0.1.1.6.dist-info/RECORD +77 -0
- odoo_addon_base_report_to_printer-18.0.1.1.6.dist-info/WHEEL +5 -0
- 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)
|