Skip to content

Commit aa7967d

Browse files
committed
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
1 parent 29c56f8 commit aa7967d

File tree

6 files changed

+61
-28
lines changed

6 files changed

+61
-28
lines changed

postgresqleu/confreg/jinjapdf.py

+20-11
Original file line numberDiff line numberDiff line change
@@ -166,18 +166,27 @@ def draw_qrimage(self, o):
166166
raise Exception("String too long for QR encode")
167167

168168
try:
169-
import qrencode
170-
except ImportError:
171-
o2 = o.copy()
172-
o2['stroke'] = True
173-
o2['text'] = "qrencode library\nnot found"
174-
self.draw_box(o2)
175-
self.draw_paragraph(o2)
176-
return
169+
import qrcode
177170

178-
(ver, size, qrimage) = qrencode.encode(s, version=ver, level=qrencode.QR_ECLEVEL_M)
179-
if size < 500:
180-
size = (500 // size) * size
171+
qrimage = qrcode.make(s, version=ver, border=0)
172+
except ImportError:
173+
raise
174+
try:
175+
import qrencode
176+
(ver, size, qrimage) = qrencode.encode(s, version=ver, level=qrencode.QR_ECLEVEL_M)
177+
except ImportError:
178+
o2 = o.copy()
179+
o2['stroke'] = True
180+
o2['text'] = "qrencode library\nnot found"
181+
self.draw_box(o2)
182+
self.draw_paragraph(o2)
183+
return
184+
185+
if qrimage.size[0] != 500:
186+
if qrimage.size[0] < 500:
187+
size = (500 // qrimage.size[0]) * qrimage.size[0]
188+
else:
189+
size = qrimage.size[0] // (qrimage.size[0] // 500 + 1)
181190
qrimage = qrimage.resize((size, size), Image.NEAREST)
182191

183192
self.canv.drawImage(ImageReader(qrimage),

postgresqleu/util/apps.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,12 @@ def ready(self):
5757
logging.getLogger(__name__).warning("Could not load cairosvg library, PNG cards will not be available")
5858

5959
try:
60-
import qrencode
60+
import qrcode
6161
except ImportError:
62-
logging.getLogger(__name__).warning("Could not load qrencode library. QR code based functionality will not be available")
62+
try:
63+
import qrencode
64+
except ImportError:
65+
logging.getLogger(__name__).warning("Could not load qrcode or qrencode library. QR code based functionality will not be available")
6366

6467
try:
6568
import fitz

postgresqleu/util/misc/baseinvoice.py

+17-8
Original file line numberDiff line numberDiff line change
@@ -323,17 +323,26 @@ def draw_footer(self):
323323
p.wrapOn(self.canvas, cm(12), cm(2))
324324
p.drawOn(self.canvas, cm(2), cm(3.5))
325325

326-
try:
327-
import qrencode
328-
(ver, size, qrimage) = qrencode.encode(self.paymentlink)
329-
qrimage = qrimage.resize((size * 4, size * 4))
326+
def _draw_qr():
327+
try:
328+
import qrcode
329+
330+
qrimage = qrcode.make(self.paymentlink, border=0)
331+
except ImportError:
332+
try:
333+
import qrencode
334+
(ver, size, qrimage) = qrencode.encode(self.paymentlink)
335+
except ImportError:
336+
# If we don't have the qrcode module, we just don't bother drawing the
337+
# QR code for the link
338+
return
339+
340+
qrimage = qrimage.resize((150, 150))
330341
self.canvas.drawImage(ImageReader(qrimage),
331342
cm(2), cm(1.8),
332343
cm(1.5), cm(1.5))
333-
except ImportError:
334-
# If we don't have the qrcode module, we just don't bother drawing the
335-
# QR code for the link
336-
pass
344+
345+
_draw_qr()
337346

338347
if self.reverse_vat:
339348
t = self.canvas.beginText()

postgresqleu/util/qr.py

+18-5
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,28 @@
33
from io import BytesIO
44

55

6+
# Support both the qrcode library (current) and the qrencode one (legacy)
67
def generate_base64_qr(s, version, requested_size):
8+
if not version:
9+
version = 5
10+
711
try:
8-
import qrencode
12+
import qrcode
13+
14+
qrimage = qrcode.make(s, version=version, border=0)
915
except ImportError:
10-
return ""
16+
try:
17+
import qrencode
18+
19+
(ver, size, qrimage) = qrencode.encode(s, version=version, level=qrencode.QR_ECLEVEL_M)
20+
except ImportError:
21+
return ""
1122

12-
(ver, size, qrimage) = qrencode.encode(s, version=5, level=qrencode.QR_ECLEVEL_M)
13-
if size < requested_size:
14-
size = (requested_size // size) * size
23+
if qrimage.size[0] != requested_size:
24+
if qrimage.size[0] < requested_size:
25+
size = (requested_size // qrimage.size[0]) * qrimage.size[0]
26+
else:
27+
size = qrimage.size[0] // (qrimage.size[0] // requested_size + 1)
1528
qrimage = qrimage.resize((size, size), Image.NEAREST)
1629

1730
b = BytesIO()

tools/devsetup/README.txt

-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ this script.
1414
* openssl development libraries (typically libssl-dev) -- for crypto related modules
1515
* libjpeg-dev and libpng-dev (*before* installing pillow in python)
1616
* pg_config for postgresql, in path, for the correct version. Typically postgresql-dev package.
17-
* libqrencode-dev
1817
* uwsgi, uwsgi-plugin-python3
1918

2019

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
# Install these requirements as well for full functionality, but they
22
# are not required for the base.
3-
qrencode
3+
qrcode
44
cairosvg

0 commit comments

Comments
 (0)