From 6b8eec5ddac18fc1d3024fa9b4d253d4899b289a Mon Sep 17 00:00:00 2001 From: David Date: Thu, 19 Sep 2019 14:26:53 +0200 Subject: [PATCH] [IMP] report_qr: Allow to use SVG as output --- report_qr/controllers/qr.py | 8 ++++++-- report_qr/models/ir_actions_report.py | 25 ++++++++++++++++++++++--- report_qr/readme/CONTRIBUTORS.rst | 4 ++++ 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/report_qr/controllers/qr.py b/report_qr/controllers/qr.py index b0a12721..50b74fef 100644 --- a/report_qr/controllers/qr.py +++ b/report_qr/controllers/qr.py @@ -6,12 +6,16 @@ from odoo.http import request class Home(http.Controller): @http.route('/report/qr', type='http', auth="public") - def report_qr(self, value, box_size=3, border=3, **kwargs): + def report_qr(self, value, box_size=3, border=3, factory='png', **kwargs): try: barcode = request.env['ir.actions.report'].qr_generate( - value, box_size=box_size, border=border, **kwargs) + value, box_size=box_size, border=border, + factory=factory, **kwargs) except (ValueError, AttributeError): raise werkzeug.exceptions.HTTPException( description='Cannot convert into barcode.') + if factory != 'png': + return request.make_response( + barcode, headers=[('Content-Type', 'image/svg+xml')]) return request.make_response( barcode, headers=[('Content-Type', 'image/png')]) diff --git a/report_qr/models/ir_actions_report.py b/report_qr/models/ir_actions_report.py index e2dd1609..9fc4ec63 100644 --- a/report_qr/models/ir_actions_report.py +++ b/report_qr/models/ir_actions_report.py @@ -1,5 +1,6 @@ from odoo import api, models import qrcode +from qrcode.image import svg, pil import io @@ -7,11 +8,29 @@ class IrActionsReport(models.Model): _inherit = 'ir.actions.report' @api.model - def qr_generate(self, value, box_size=3, border=5, **kwargs): + def qr_generate(self, value, box_size=3, border=5, + factory='png', **kwargs): + factories = { + 'png': pil.PilImage, + 'svg': svg.SvgImage, + 'svg-fragment': svg.SvgFragmentImage, + 'svg-path': svg.SvgPathImage, + } + # Color parameters seem to be inverted in the library + back_color = kwargs.pop("back_color", "black") + fill_color = kwargs.pop("fill_color", "white") try: - qr = qrcode.make(value, box_size=box_size, border=border, **kwargs) + # Defaults to png if the argument is unknown + image_factory = factories.get(factory, pil.PilImage) + qr = qrcode.QRCode( + box_size=box_size, border=border, + image_factory=image_factory, **kwargs) + qr.add_data(value) + qr.make() + img = qr.make_image(fill_color=fill_color, + back_color=back_color) arr = io.BytesIO() - qr.save(arr, format='png') + img.save(arr) return arr.getvalue() except Exception: raise ValueError("Cannot convert into barcode.") diff --git a/report_qr/readme/CONTRIBUTORS.rst b/report_qr/readme/CONTRIBUTORS.rst index 93ec993e..ba55fe73 100644 --- a/report_qr/readme/CONTRIBUTORS.rst +++ b/report_qr/readme/CONTRIBUTORS.rst @@ -1 +1,5 @@ * Enric Tobella + +* `Tecnativa `_: + + * David Vidal