summaryrefslogtreecommitdiff
path: root/postgresqleu
diff options
context:
space:
mode:
authorMagnus Hagander2024-11-12 10:05:36 +0000
committerMagnus Hagander2024-11-12 10:05:36 +0000
commitaa7967d5d39f909a4c340866d25c1456e66af33d (patch)
treee627ed144259057b215f53a0c8d1a53b0a59feaf /postgresqleu
parent29c56f8ce2900d6e2411c92eeaec1d94133b06d0 (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-xpostgresqleu/confreg/jinjapdf.py31
-rw-r--r--postgresqleu/util/apps.py7
-rwxr-xr-xpostgresqleu/util/misc/baseinvoice.py25
-rw-r--r--postgresqleu/util/qr.py23
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()