diff options
| -rw-r--r-- | odoo/addons/base/models/ir_actions_report.py | 3 | ||||
| -rw-r--r-- | odoo/addons/base/models/ir_qweb_fields.py | 19 | ||||
| -rw-r--r-- | odoo/addons/base/tests/test_qweb.py | 24 |
3 files changed, 43 insertions, 3 deletions
diff --git a/odoo/addons/base/models/ir_actions_report.py b/odoo/addons/base/models/ir_actions_report.py index debd5a6997e..643f3f21bcf 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 f7ddac0f192..9435c19af06 100644 --- a/odoo/addons/base/models/ir_qweb_fields.py +++ b/odoo/addons/base/models/ir_qweb_fields.py @@ -7,10 +7,11 @@ from odoo import api, fields, models, _, _lt from PIL import Image import babel import babel.dates -from lxml import etree +from lxml import etree, html import math from odoo.tools import html_escape as escape, posix_to_ldml, float_utils, format_date, format_duration, pycompat +from odoo.tools.mail import safe_attrs from odoo.tools.misc import get_lang, babel_locale_parse import logging @@ -651,17 +652,29 @@ 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'<img src="data:png;base64,%s">' % base64.b64encode(barcode).decode('ascii') + **{key: value for key, value in options.items() if key in ['width', 'height', 'humanreadable', 'quiet', 'mask']}) + + img_element = html.Element('img') + for k, v in options.items(): + if k.startswith('img_') and k[4:] in safe_attrs: + img_element.set(k[4:], v) + if not img_element.get('alt'): + img_element.set('alt', _('Barcode %s') % value) + img_element.set('src', 'data:image/png;base64,%s' % base64.b64encode(barcode).decode()) + return html.tostring(img_element, encoding='unicode') class Contact(models.AbstractModel): diff --git a/odoo/addons/base/tests/test_qweb.py b/odoo/addons/base/tests/test_qweb.py index 00cf26d4031..c8874d4cd8f 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"""<div t-field="partner.barcode" t-options="{'widget': 'barcode', 'width': 100, 'height': 30}"/>""" + rendered = view._render(values={'partner': partner}).strip().decode() + self.assertRegex(rendered, r'<div><img alt="Barcode test" src="data:image/png;base64,\S+"></div>') + + partner.barcode = '4012345678901' + view.arch = u"""<div t-field="partner.barcode" t-options="{'widget': 'barcode', 'symbology': 'EAN13', 'width': 100, 'height': 30, 'img_style': 'width:100%;', 'img_alt': 'Barcode'}"/>""" + ean_rendered = view._render(values={'partner': partner}).strip().decode() + self.assertRegex(ean_rendered, r'<div><img style="width:100%;" alt="Barcode" src="data:image/png;base64,\S+"></div>') + + view.arch = u"""<div t-field="partner.barcode" t-options="{'widget': 'barcode', 'symbology': 'auto', 'width': 100, 'height': 30, 'img_style': 'width:100%;', 'img_alt': 'Barcode'}"/>""" + auto_rendered = view._render(values={'partner': partner}).strip().decode() + self.assertRegex(auto_rendered, r'<div><img style="width:100%;" alt="Barcode" src="data:image/png;base64,\S+"></div>') + from copy import deepcopy class FileSystemLoader(object): |
