Projet

Général

Profil

0001-templatetags-add-add_days-and-add_hours-filters-3694.patch

Valentin Deniaud, 15 janvier 2020 12:04

Télécharger (3,95 ko)

Voir les différences:

Subject: [PATCH] templatetags: add add_days and add_hours filters (#36943)

 combo/public/templatetags/combo.py | 37 +++++++++++++++++++++++++++++-
 tests/test_public_templatetags.py  | 21 +++++++++++++++++
 2 files changed, 57 insertions(+), 1 deletion(-)
combo/public/templatetags/combo.py
27 27
from django.template import VariableDoesNotExist
28 28
from django.template.base import TOKEN_BLOCK, TOKEN_VAR, TOKEN_COMMENT
29 29
from django.template.defaultfilters import stringfilter
30
from django.utils import dateparse
30
from django.utils import dateparse, six
31 31
from django.utils.encoding import force_text
32 32

  
33 33
from combo.data.models import Page, Placeholder
......
269 269
@register.filter
270 270
def startswith(string, substring):
271 271
    return string and force_text(string).startswith(force_text(substring))
272

  
273
def parse_float(value):
274
    if isinstance(value, six.string_types):
275
        # replace , by . for French users comfort
276
        value = value.replace(',', '.')
277
    try:
278
        return float(value)
279
    except (ValueError, TypeError):
280
        return ''
281

  
282
@register.filter(expects_localtime=True, is_safe=False)
283
def add_days(value, arg):
284
    try:
285
        value = parse_datetime(value).date()  # consider only date, not hours
286
    except AttributeError:  # parse_datetime returned None
287
        value = parse_date(value)
288
    if not value:
289
        return ''
290
    arg = parse_float(arg)
291
    if not arg:
292
        return value
293
    result = value + datetime.timedelta(days=float(arg))
294
    return result
295

  
296
@register.filter(expects_localtime=True, is_safe=False)
297
def add_hours(value, arg):
298
    value = parse_datetime(value) or parse_date(value)
299
    if not value:
300
        return ''
301
    if not isinstance(value, datetime.datetime):
302
        value = datetime.datetime(year=value.year, month=value.month, day=value.day)
303
    arg = parse_float(arg)
304
    if not arg:
305
        return value
306
    return value + datetime.timedelta(hours=float(arg))
tests/test_public_templatetags.py
201 201
    assert t.render(context) == ''
202 202
    context = Context({'foo': 'bar'})
203 203
    assert t.render(context) == 'ok'
204

  
205
def test_date_maths():
206
    tmpl = Template('{{ plop|add_days:4 }}')
207
    assert tmpl.render(Context({'plop': '2017-12-21'})) == 'Dec. 25, 2017'
208
    assert tmpl.render(Context({'plop': '2017-12-21 18:00'})) == 'Dec. 25, 2017'
209
    tmpl = Template('{{ plop|add_days:"-1" }}')
210
    assert tmpl.render(Context({'plop': '2017-12-21'})) == 'Dec. 20, 2017'
211
    assert tmpl.render(Context({'plop': '2017-12-21 18:00'})) == 'Dec. 20, 2017'
212
    tmpl = Template('{{ plop|add_days:1.5 }}')
213
    assert tmpl.render(Context({'plop': '2017-12-21'})) == 'Dec. 22, 2017'
214
    assert tmpl.render(Context({'plop': '2017-12-21 18:00'})) == 'Dec. 22, 2017'
215
    tmpl = Template('{{ plop|add_days:"1.5" }}')
216
    assert tmpl.render(Context({'plop': '2017-12-21'})) == 'Dec. 22, 2017'
217
    assert tmpl.render(Context({'plop': '2017-12-21 18:00'})) == 'Dec. 22, 2017'
218

  
219
    tmpl = Template('{{ plop|add_hours:24 }}')
220
    assert tmpl.render(Context({'plop': '2017-12-21'})) == 'Dec. 22, 2017, midnight'
221
    assert tmpl.render(Context({'plop': '2017-12-21 18:00'})) == 'Dec. 22, 2017, 6 p.m.'
222
    tmpl = Template('{{ plop|add_hours:"12.5" }}')
223
    assert tmpl.render(Context({'plop': '2017-12-21'})) == 'Dec. 21, 2017, 12:30 p.m.'
224
    assert tmpl.render(Context({'plop': '2017-12-21 18:00'})) == 'Dec. 22, 2017, 6:30 a.m.'
204
-