From 01feda743175bb33b6960303963245086bf57c06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laur=C3=A9line=20Gu=C3=A9rin?= Date: Tue, 16 Jun 2020 10:51:00 +0200 Subject: [PATCH] templates: add tests for datetime_in_past filter (#44023) rename date_in_past into datetime_in_past --- combo/manager/templates/combo/page_view.html | 2 +- combo/public/templatetags/combo.py | 13 +++++--- tests/test_public_templatetags.py | 32 ++++++++++++++++++++ 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/combo/manager/templates/combo/page_view.html b/combo/manager/templates/combo/page_view.html index 2b4d6885..515d8a4d 100644 --- a/combo/manager/templates/combo/page_view.html +++ b/combo/manager/templates/combo/page_view.html @@ -152,7 +152,7 @@ {{cell.get_additional_label|default_if_none:""}} {% if cell.get_invalid_reason %} {{ cell.get_invalid_reason }} - - {% if cell.get_validity_info.invalid_datetime|date_in_past %} + {% if cell.get_validity_info.invalid_datetime|datetime_in_past %} {% blocktrans with cell.get_validity_info.invalid_datetime|date:"DATETIME_FORMAT" as invalidity_date %}This cell is no longer displayed since {{ invalidity_date }}.{% endblocktrans %} {% else %} {% blocktrans with cell.get_validity_info.invalid_datetime|timeuntil as invalidity_delay %}This cell will no longer be displayed in {{ invalidity_delay }}.{% endblocktrans %} diff --git a/combo/public/templatetags/combo.py b/combo/public/templatetags/combo.py index 702494c7..36fbf386 100644 --- a/combo/public/templatetags/combo.py +++ b/combo/public/templatetags/combo.py @@ -42,7 +42,7 @@ from django.utils import dateparse, six from django.utils.encoding import force_text from django.utils.html import format_html from django.utils.safestring import mark_safe -from django.utils.timezone import now +from django.utils.timezone import is_naive, make_aware from combo.data.models import Page, Placeholder from combo.public.menu import get_menu_context @@ -452,13 +452,16 @@ def age_in_months(value, today=None): @register.filter(expects_localtime=True) -def date_in_past(value): +def datetime_in_past(value): value = parse_datetime(value) - try: - return value <= now() - except TypeError: + if not value: return False + if is_naive(value): + value = make_aware(value) + date_now = make_aware(datetime.datetime.now()) + return value <= date_now + def parse_decimal(value, default=Decimal(0)): if isinstance(value, six.string_types): diff --git a/tests/test_public_templatetags.py b/tests/test_public_templatetags.py index 6a2a3d40..2489d3e6 100644 --- a/tests/test_public_templatetags.py +++ b/tests/test_public_templatetags.py @@ -12,6 +12,7 @@ from django.test import override_settings from django.test.client import RequestFactory from django.contrib.auth.models import User, Group, AnonymousUser from django.utils.six import StringIO +from django.utils.timezone import now from combo.data.models import Page, TextCell from combo.apps.assets.models import Asset @@ -511,6 +512,37 @@ def test_age_in(): assert tmpl.render(Context(context)) == 'Good' +@pytest.mark.parametrize('value, expected', [ + (None, False), + ('', False), + ('foobar', False), + (42, False), + ('1970-06-15T12:01:03', True), + ('2500-06-15T12:01:02', False), + ('1970-01-01 02:03', True), + ('2500-01-01 02:03', False), + ('01/01/1970 02h03', True), + ('01/01/2500 02h03', False), + ('1970-01-01', True), + ('2500-01-01', False), + ('01/01/1970', True), + ('01/01/2500', False), + (datetime.datetime(1970, 6, 15, 12, 1, 3), True), + (datetime.datetime(2500, 6, 15, 12, 1, 2), False), + (datetime.date(1970, 6, 15), True), + (datetime.date(2500, 6, 15), False), + (datetime.datetime.now(), True), + (datetime.datetime.now() + datetime.timedelta(hours=1), False), + (now(), True), + (now() + datetime.timedelta(hours=1), False), + (datetime.date.today(), True), + (datetime.date.today() + datetime.timedelta(days=1), False), +]) +def test_datetime_in_past(value, expected): + t = Template('{{ value|datetime_in_past }}') + assert t.render(Context({'value': value})) == str(expected) + + def test_decimal_templatetag(): tmpl = Template('{{ plop|decimal }}') assert tmpl.render(Context({'plop': 'toto'})) == '0'