diff options
| author | Magnus Hagander | 2024-11-12 10:05:36 +0000 |
|---|---|---|
| committer | Magnus Hagander | 2024-11-12 10:05:36 +0000 |
| commit | aa7967d5d39f909a4c340866d25c1456e66af33d (patch) | |
| tree | e627ed144259057b215f53a0c8d1a53b0a59feaf /postgresqleu | |
| parent | 29c56f8ce2900d6e2411c92eeaec1d94133b06d0 (diff) | |
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
Diffstat (limited to 'postgresqleu')
| -rwxr-xr-x | postgresqleu/confreg/jinjapdf.py | 31 | ||||
| -rw-r--r-- | postgresqleu/util/apps.py | 7 | ||||
| -rwxr-xr-x | postgresqleu/util/misc/baseinvoice.py | 25 | ||||
| -rw-r--r-- | postgresqleu/util/qr.py | 23 |
4 files changed, 60 insertions, 26 deletions
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() |
