0001-templatetags-add-add_days-and-add_hours-filters-3694.patch
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 |
- |