0001-templatetags-add-a-qrcode-filter-for-string-values.patch
tests/test_templates.py | ||
---|---|---|
13 | 13 |
except ImportError: |
14 | 14 |
langdetect = None |
15 | 15 | |
16 |
import PIL |
|
17 | ||
16 | 18 |
from wcs import fields |
17 | 19 |
from wcs.formdef import FormDef |
18 | 20 |
from wcs.qommon.http_request import HTTPRequest |
... | ... | |
1211 | 1213 |
) |
1212 | 1214 | |
1213 | 1215 |
assert t.render({'value': 'error1', 'value2': 'error2'}) == '' |
1216 | ||
1217 | ||
1218 |
def test_qrcode(pub): |
|
1219 |
with pub.complex_data(): |
|
1220 |
img = Template('{{ url|qrcode }}').render({'url': 'http://example.com/', 'allow_complex': True}) |
|
1221 |
assert pub.has_cached_complex_data(img) |
|
1222 |
value = pub.get_cached_complex_data(img) |
|
1223 |
assert value.orig_filename == 'qrcode.png' |
|
1224 |
assert value.content_type == 'image/png' |
|
1225 |
with value.get_file_pointer() as fp: |
|
1226 |
img = PIL.Image.open(fp) |
|
1227 |
assert img.size == (330, 330) |
|
1228 | ||
1229 |
img = Template('{{ url|qrcode:"qrcode2.png" }}').render( |
|
1230 |
{'url': 'http://example.com/', 'allow_complex': True} |
|
1231 |
) |
|
1232 |
value = pub.get_cached_complex_data(img) |
|
1233 |
assert value.orig_filename == 'qrcode2.png' |
|
1234 | ||
1235 |
img = Template('{{ url|qrcode }}').render({'url': 1, 'allow_complex': True}) |
|
1236 |
assert img == '' |
wcs/qommon/templatetags/qommon.py | ||
---|---|---|
16 | 16 | |
17 | 17 |
import datetime |
18 | 18 |
import hashlib |
19 |
import io |
|
19 | 20 |
import math |
20 | 21 |
import random |
21 | 22 |
import string |
... | ... | |
26 | 27 |
from decimal import InvalidOperation as DecimalInvalidOperation |
27 | 28 | |
28 | 29 |
import pyproj |
30 | ||
31 |
try: |
|
32 |
import qrcode |
|
33 |
except ImportError: |
|
34 |
qrcode = None |
|
35 | ||
29 | 36 |
from pyproj import Geod |
30 | 37 |
from quixote import get_publisher |
31 | 38 | |
... | ... | |
42 | 49 |
from django.utils.safestring import mark_safe |
43 | 50 |
from django.utils.timezone import is_naive, make_aware |
44 | 51 | |
45 |
from wcs.qommon import calendar, evalutils, tokens |
|
52 |
from wcs.qommon import calendar, evalutils, tokens, upload_storage
|
|
46 | 53 |
from wcs.qommon.admin.texts import TextsDirectory |
47 | 54 | |
48 | 55 |
register = template.Library() |
... | ... | |
817 | 824 |
def list_(value): |
818 | 825 |
# turn a generator into a list |
819 | 826 |
return list(unlazy(value)) |
827 | ||
828 | ||
829 |
@register.filter(name='qrcode') |
|
830 |
def qrcode_filter(value, name=None): |
|
831 |
if not qrcode: |
|
832 |
return '' |
|
833 |
if not isinstance(value, str): |
|
834 |
return '' |
|
835 |
img = qrcode.make(value) |
|
836 |
buf = io.BytesIO() |
|
837 |
img.save(buf) |
|
838 |
upload = upload_storage.PicklableUpload(name or 'qrcode.png', 'image/png') |
|
839 |
upload.receive([buf.getvalue()]) |
|
840 |
return upload |
|
820 |
- |