Projet

Général

Profil

0001-templatetags-add-mathematics-filters-27709.patch

Nicolas Roche, 25 février 2019 14:11

Télécharger (6,94 ko)

Voir les différences:

Subject: [PATCH] templatetags: add mathematics filters (#27709)

 tests/test_formdata.py            | 33 +++++++++++++++-
 tests/test_templates.py           | 64 +++++++++++++++++++++++++++++++
 wcs/qommon/templatetags/qommon.py | 24 ++++++++++++
 3 files changed, 120 insertions(+), 1 deletion(-)
tests/test_formdata.py
7 7

  
8 8
from quixote import cleanup
9 9
from quixote.http_request import Upload
10
from qommon.template import Template
10
from qommon.template import Template, TemplateError
11 11
from qommon.form import PicklableUpload
12 12
from wcs.qommon.http_request import HTTPRequest
13 13
from wcs import fields, formdef
......
1336 1336

  
1337 1337
        tmpl = Template('{{ 4.12|decimal:form_var_arg }}')
1338 1338
        assert tmpl.render(context) == '4.120'
1339

  
1340
def test_lazy_formdata_mathematics_filters(pub):
1341
    formdef = FormDef()
1342
    formdef.name = 'foobar'
1343
    formdef.url_name = 'foobar'
1344
    formdef.fields = [
1345
        fields.StringField(id='0', label='term1', varname='term1'),
1346
        fields.StringField(id='1', label='term2', varname='term2')
1347
    ]
1348
    formdef.store()
1349
    formdata = formdef.data_class()()
1350
    formdata.data = {'0': '3', '1': '4'}
1351
    formdata.store()
1352
    pub.substitutions.feed(formdata)
1353
    for mode in (None, 'lazy'):
1354
        context = pub.substitutions.get_context_variables(mode=mode)
1355

  
1356
        tmpl = Template('{{ form_var_term1|decimal }}')
1357
        assert tmpl.render(context) == '3'
1358

  
1359
        tmpl = Template('{{ form_var_term1|add:form_var_term2 }}')
1360
        assert tmpl.render(context) == '7'
1361

  
1362
        tmpl = Template('{{ form_var_term1|subtract:form_var_term2 }}')
1363
        assert tmpl.render(context) == '-1'
1364

  
1365
        tmpl = Template('{{ form_var_term1|multiply:form_var_term2 }}')
1366
        assert tmpl.render(context) == '12'
1367

  
1368
        tmpl = Template('{{ form_var_term1|divide:form_var_term2 }}')
1369
        assert tmpl.render(context) == '0.75'
tests/test_templates.py
323 323
    assert tmpl.render() == 'hello'
324 324
    tmpl = Template('{% if 3|decimal|decimal == 3 %}hello{% endif %}')
325 325
    assert tmpl.render() == 'hello'
326

  
327
def test_mathematics_templatetag():
328
    tmpl = Template('{{ term1|add:term2 }}')
329

  
330
    # using string: convert to number or 0
331
    assert tmpl.render({'term1': '1.1', 'term2': 0}) == '1.1'
332
    assert tmpl.render({'term1': 'not a number', 'term2': 1.2}) == '1.2'
333
    assert tmpl.render({'term1': 0.3, 'term2': "1"}) == '1.3'
334
    assert tmpl.render({'term1': 1.4, 'term2': "not a number"}) == '1.4'
335

  
336
    # add
337
    assert tmpl.render({'term1': 4, 'term2': -0.9}) == '3.1'
338
    assert tmpl.render({'term1': '4', 'term2': -0.8}) == '3.2'
339
    assert tmpl.render({'term1': 4, 'term2': '-0.7'}) == '3.3'
340
    assert tmpl.render({'term1': '4', 'term2': '-0.6'}) == '3.4'
341
    assert tmpl.render({'term1': '', 'term2': 3.5}) == '3.5'
342
    assert tmpl.render({'term1': 3.6, 'term2': ''}) == '3.6'
343
    assert tmpl.render({'term1': '', 'term2': ''}) == '0'
344
    assert tmpl.render({'term1': 0, 'term2': ''}) == '0'
345
    assert tmpl.render({'term1': '', 'term2': 0}) == '0'
346
    assert tmpl.render({'term1': 0, 'term2': 0}) == '0'
347

  
348
    # subtract
349
    tmpl = Template('{{ term1|subtract:term2 }}')
350
    assert tmpl.render({'term1': 5.1, 'term2': 1}) == '4.1'
351
    assert tmpl.render({'term1': '5.2', 'term2': 1}) == '4.2'
352
    assert tmpl.render({'term1': 5.3, 'term2': '1'}) == '4.3'
353
    assert tmpl.render({'term1': '5.4', 'term2': '1'}) == '4.4'
354
    assert tmpl.render({'term1': '', 'term2': -4.5}) == '4.5'
355
    assert tmpl.render({'term1': 4.6, 'term2': ''}) == '4.6'
356
    assert tmpl.render({'term1': '', 'term2': ''}) == '0'
357
    assert tmpl.render({'term1': 0, 'term2': ''}) == '0'
358
    assert tmpl.render({'term1': '', 'term2': 0}) == '0'
359
    assert tmpl.render({'term1': 0, 'term2': 0}) == '0'
360

  
361
    # multiply
362
    tmpl = Template('{{ term1|multiply:term2 }}')
363
    assert tmpl.render({'term1': '3', 'term2': '2'}) == '6'
364
    assert tmpl.render({'term1': 2.5, 'term2': 2}) == '5.0'
365
    assert tmpl.render({'term1': '2.5', 'term2': 2}) == '5.0'
366
    assert tmpl.render({'term1': 2.5, 'term2': '2'}) == '5.0'
367
    assert tmpl.render({'term1': '2.5', 'term2': '2'}) == '5.0'
368
    assert tmpl.render({'term1': '', 'term2': '2'}) == '0'
369
    assert tmpl.render({'term1': 2.5, 'term2': ''}) == '0.0'
370
    assert tmpl.render({'term1': '', 'term2': ''}) == '0'
371
    assert tmpl.render({'term1': 0, 'term2': ''}) == '0'
372
    assert tmpl.render({'term1': '', 'term2': 0}) == '0'
373
    assert tmpl.render({'term1': 0, 'term2': 0}) == '0'
374

  
375
    # divide
376
    tmpl = Template('{{ term1|divide:term2 }}')
377
    assert tmpl.render({'term1': 16, 'term2': 2}) == '8'
378
    assert tmpl.render({'term1': 6, 'term2': 0.75}) == '8'
379
    assert tmpl.render({'term1': '6', 'term2': 0.75}) == '8'
380
    assert tmpl.render({'term1': 6, 'term2': '0.75'}) == '8'
381
    assert tmpl.render({'term1': '6', 'term2': '0.75'}) == '8'
382
    assert tmpl.render({'term1': '', 'term2': '2'}) == '0'
383
    assert tmpl.render({'term1': 6, 'term2': ''}) == ''
384
    assert tmpl.render({'term1': '', 'term2': ''}) == ''
385
    assert tmpl.render({'term1': 0, 'term2': ''}) == ''
386
    assert tmpl.render({'term1': '', 'term2': 0}) == ''
387
    assert tmpl.render({'term1': 0, 'term2': 0}) == ''
388
    tmpl = Template('{{ term1|divide:term2|decimal:2 }}')
389
    assert tmpl.render({'term1': 2, 'term2': 3}) == '0.67'
wcs/qommon/templatetags/qommon.py
16 16

  
17 17
import datetime
18 18
from decimal import Decimal
19
from decimal import InvalidOperation as DecimalInvalidOperation
20
from decimal import DivisionByZero as DecimalDivisionByZero
19 21

  
20 22
from django import template
21 23
from django.template import defaultfilters
......
227 229
    }
228 230
    token.store()
229 231
    return '---===BUTTON:%s:%s===---' % (token.id, label)
232

  
233
@register.filter
234
def add(term1, term2):
235
    '''replace the "add" native django filter'''
236
    return parse_decimal(term1) + parse_decimal(term2)
237

  
238
@register.filter
239
def subtract(term1, term2):
240
    return parse_decimal(term1) - parse_decimal(term2)
241

  
242
@register.filter
243
def multiply(term1, term2):
244
    return parse_decimal(term1) * parse_decimal(term2)
245

  
246
@register.filter
247
def divide(term1, term2):
248
    try:
249
        return parse_decimal(term1) / parse_decimal(term2)
250
    except DecimalInvalidOperation:
251
        return ''
252
    except DecimalDivisionByZero:
253
        return ''
230
-