Projet

Général

Profil

0001-templatetags-add-a-qrcode-filter-for-string-values.patch

Benjamin Dauvergne, 25 juin 2021 15:28

Télécharger (3,18 ko)

Voir les différences:

Subject: [PATCH 1/2] templatetags: add a qrcode filter for string values

 tests/test_templates.py           | 23 +++++++++++++++++++++++
 wcs/qommon/templatetags/qommon.py | 23 ++++++++++++++++++++++-
 2 files changed, 45 insertions(+), 1 deletion(-)
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
-