diff --git a/odoo/addons/base/models/ir_actions_report.py b/odoo/addons/base/models/ir_actions_report.py index db3b875fad3..c4c37111860 100644 --- a/odoo/addons/base/models/ir_actions_report.py +++ b/odoo/addons/base/models/ir_actions_report.py @@ -507,6 +507,9 @@ class IrActionsReport(models.Model): barcode_type = 'EAN13' if len(value) in (11, 12): value = '0%s' % value + elif barcode_type == 'auto': + symbology_guess = {8: 'EAN8', 13: 'EAN13'} + barcode_type = symbology_guess.get(len(value), 'Code128') try: width, height, humanreadable, quiet = int(width), int(height), bool(int(humanreadable)), bool(int(quiet)) # for `QR` type, `quiet` is not supported. And is simply ignored. diff --git a/odoo/addons/base/models/ir_qweb_fields.py b/odoo/addons/base/models/ir_qweb_fields.py index 653533ebf1e..73a54807424 100644 --- a/odoo/addons/base/models/ir_qweb_fields.py +++ b/odoo/addons/base/models/ir_qweb_fields.py @@ -651,17 +651,25 @@ class BarcodeConverter(models.AbstractModel): width=dict(type='integer', string=_('Width'), default_value=600), height=dict(type='integer', string=_('Height'), default_value=100), humanreadable=dict(type='integer', string=_('Human Readable'), default_value=0), + quiet=dict(type='integer', string='Quiet', default_value=1), + mask=dict(type='string', string='Mask', default_value='') ) return options @api.model def value_to_html(self, value, options=None): + if not value: + return '' barcode_symbology = options.get('symbology', 'Code128') barcode = self.env['ir.actions.report'].barcode( barcode_symbology, value, - **{key: value for key, value in options.items() if key in ['width', 'height', 'humanreadable']}) - return u'' % base64.b64encode(barcode).decode('ascii') + **{key: value for key, value in options.items() if key in ['width', 'height', 'humanreadable', 'quiet', 'mask']}) + img_attributes = {k[4:]: v for k, v in options.items() if k.startswith('img_')} + if 'alt' not in img_attributes: + img_attributes.update({'alt': 'Barcode %s' % value}) + attributes = ' '.join(['%s="%s"' % attrs for attrs in img_attributes.items()]) + return u'' % (base64.b64encode(barcode).decode('ascii'), attributes) class Contact(models.AbstractModel): diff --git a/odoo/addons/base/tests/test_qweb.py b/odoo/addons/base/tests/test_qweb.py index 5c80d204a19..72de3e9c3e9 100644 --- a/odoo/addons/base/tests/test_qweb.py +++ b/odoo/addons/base/tests/test_qweb.py @@ -557,6 +557,30 @@ class TestQWebNS(TransactionCase): rendered = view2.with_context(lang=current_lang)._render().strip() self.assertEqual(rendered, b'9/000/000*00') + def test_render_barcode(self): + partner = self.env['res.partner'].create({ + 'name': 'bacode_test', + 'barcode': 'test' + }) + + view = self.env['ir.ui.view'].create({ + 'name': "a_barcode_view", + 'type': 'qweb', + }) + + view.arch = u"""
""" + rendered = view._render(values={'partner': partner}).strip().decode() + self.assertRegex(rendered,r'
Barcode test
') + + partner.barcode = '4012345678901' + view.arch = u"""
""" + ean_rendered = view._render(values={'partner': partner}).strip().decode() + self.assertRegex(ean_rendered,r'
Barcode
') + + view.arch = u"""
""" + auto_rendered = view._render(values={'partner': partner}).strip().decode() + self.assertRegex(auto_rendered,r'
Barcode
') + from copy import deepcopy class FileSystemLoader(object):