From: Magnus Hagander Date: Tue, 12 Nov 2024 10:05:36 +0000 (+0100) Subject: Add support for qrcode library, and make it default X-Git-Url: http://git.postgresql.org/gitweb/static/%7B%7Bpgdulink%28?a=commitdiff_plain;h=aa7967d5d39f909a4c340866d25c1456e66af33d;p=pgeu-system.git Add support for qrcode library, and make it default The qrencode library we've been using is basically dead (and has been for a while), so add support for the newer pure-python qrcode library. We keep support for the qrencode one around, so we don't break things on existing installs, but consider it deprecated and should eventually be removed. Fixes #123 --- diff --git a/postgresqleu/confreg/jinjapdf.py b/postgresqleu/confreg/jinjapdf.py index d7fc1435..56cc2495 100755 --- a/postgresqleu/confreg/jinjapdf.py +++ b/postgresqleu/confreg/jinjapdf.py @@ -166,18 +166,27 @@ class JinjaFlowable(Flowable): raise Exception("String too long for QR encode") try: - import qrencode - except ImportError: - o2 = o.copy() - o2['stroke'] = True - o2['text'] = "qrencode library\nnot found" - self.draw_box(o2) - self.draw_paragraph(o2) - return + import qrcode - (ver, size, qrimage) = qrencode.encode(s, version=ver, level=qrencode.QR_ECLEVEL_M) - if size < 500: - size = (500 // size) * size + qrimage = qrcode.make(s, version=ver, border=0) + except ImportError: + raise + try: + import qrencode + (ver, size, qrimage) = qrencode.encode(s, version=ver, level=qrencode.QR_ECLEVEL_M) + except ImportError: + o2 = o.copy() + o2['stroke'] = True + o2['text'] = "qrencode library\nnot found" + self.draw_box(o2) + self.draw_paragraph(o2) + return + + if qrimage.size[0] != 500: + if qrimage.size[0] < 500: + size = (500 // qrimage.size[0]) * qrimage.size[0] + else: + size = qrimage.size[0] // (qrimage.size[0] // 500 + 1) qrimage = qrimage.resize((size, size), Image.NEAREST) self.canv.drawImage(ImageReader(qrimage), diff --git a/postgresqleu/util/apps.py b/postgresqleu/util/apps.py index def15275..da7f228f 100644 --- a/postgresqleu/util/apps.py +++ b/postgresqleu/util/apps.py @@ -57,9 +57,12 @@ class UtilAppConfig(AppConfig): logging.getLogger(__name__).warning("Could not load cairosvg library, PNG cards will not be available") try: - import qrencode + import qrcode except ImportError: - logging.getLogger(__name__).warning("Could not load qrencode library. QR code based functionality will not be available") + try: + import qrencode + except ImportError: + logging.getLogger(__name__).warning("Could not load qrcode or qrencode library. QR code based functionality will not be available") try: import fitz diff --git a/postgresqleu/util/misc/baseinvoice.py b/postgresqleu/util/misc/baseinvoice.py index 20cf5549..c4ce77d9 100755 --- a/postgresqleu/util/misc/baseinvoice.py +++ b/postgresqleu/util/misc/baseinvoice.py @@ -323,17 +323,26 @@ class BaseInvoice(PDFBase): p.wrapOn(self.canvas, cm(12), cm(2)) p.drawOn(self.canvas, cm(2), cm(3.5)) - try: - import qrencode - (ver, size, qrimage) = qrencode.encode(self.paymentlink) - qrimage = qrimage.resize((size * 4, size * 4)) + def _draw_qr(): + try: + import qrcode + + qrimage = qrcode.make(self.paymentlink, border=0) + except ImportError: + try: + import qrencode + (ver, size, qrimage) = qrencode.encode(self.paymentlink) + except ImportError: + # If we don't have the qrcode module, we just don't bother drawing the + # QR code for the link + return + + qrimage = qrimage.resize((150, 150)) self.canvas.drawImage(ImageReader(qrimage), cm(2), cm(1.8), cm(1.5), cm(1.5)) - except ImportError: - # If we don't have the qrcode module, we just don't bother drawing the - # QR code for the link - pass + + _draw_qr() if self.reverse_vat: t = self.canvas.beginText() diff --git a/postgresqleu/util/qr.py b/postgresqleu/util/qr.py index 4a346684..11a64bf7 100644 --- a/postgresqleu/util/qr.py +++ b/postgresqleu/util/qr.py @@ -3,15 +3,28 @@ import base64 from io import BytesIO +# Support both the qrcode library (current) and the qrencode one (legacy) def generate_base64_qr(s, version, requested_size): + if not version: + version = 5 + try: - import qrencode + import qrcode + + qrimage = qrcode.make(s, version=version, border=0) except ImportError: - return "" + try: + import qrencode + + (ver, size, qrimage) = qrencode.encode(s, version=version, level=qrencode.QR_ECLEVEL_M) + except ImportError: + return "" - (ver, size, qrimage) = qrencode.encode(s, version=5, level=qrencode.QR_ECLEVEL_M) - if size < requested_size: - size = (requested_size // size) * size + if qrimage.size[0] != requested_size: + if qrimage.size[0] < requested_size: + size = (requested_size // qrimage.size[0]) * qrimage.size[0] + else: + size = qrimage.size[0] // (qrimage.size[0] // requested_size + 1) qrimage = qrimage.resize((size, size), Image.NEAREST) b = BytesIO() diff --git a/tools/devsetup/README.txt b/tools/devsetup/README.txt index 3252c1f0..57f4d94e 100644 --- a/tools/devsetup/README.txt +++ b/tools/devsetup/README.txt @@ -14,7 +14,6 @@ this script. * openssl development libraries (typically libssl-dev) -- for crypto related modules * libjpeg-dev and libpng-dev (*before* installing pillow in python) * pg_config for postgresql, in path, for the correct version. Typically postgresql-dev package. -* libqrencode-dev * uwsgi, uwsgi-plugin-python3 diff --git a/tools/devsetup/dev_requirements_full.txt b/tools/devsetup/dev_requirements_full.txt index 0afc5109..e1fdeca2 100644 --- a/tools/devsetup/dev_requirements_full.txt +++ b/tools/devsetup/dev_requirements_full.txt @@ -1,4 +1,4 @@ # Install these requirements as well for full functionality, but they # are not required for the base. -qrencode +qrcode cairosvg