From 14ef92fa9e87a77cd3642235387e6f683048046b Mon Sep 17 00:00:00 2001 From: Mariusz Felisiak Date: Tue, 12 Sep 2023 21:34:40 +0200 Subject: [PATCH] Refs #33864 -- Removed length_is template filter per deprecation timeline. --- django/template/defaultfilters.py | 16 --- docs/ref/templates/builtins.txt | 18 --- docs/releases/5.1.txt | 2 + .../filter_tests/test_length_is.py | 130 ------------------ 4 files changed, 2 insertions(+), 164 deletions(-) delete mode 100644 tests/template_tests/filter_tests/test_length_is.py diff --git a/django/template/defaultfilters.py b/django/template/defaultfilters.py index 589ca38414..1e1bdbc5c9 100644 --- a/django/template/defaultfilters.py +++ b/django/template/defaultfilters.py @@ -2,7 +2,6 @@ import random as random_module import re import types -import warnings from decimal import ROUND_HALF_UP, Context, Decimal, InvalidOperation, getcontext from functools import wraps from inspect import unwrap @@ -12,7 +11,6 @@ from urllib.parse import quote from django.utils import formats from django.utils.dateformat import format, time_format -from django.utils.deprecation import RemovedInDjango51Warning from django.utils.encoding import iri_to_uri from django.utils.html import avoid_wrapping, conditional_escape, escape, escapejs from django.utils.html import json_script as _json_script @@ -622,20 +620,6 @@ def length(value): return 0 -@register.filter(is_safe=False) -def length_is(value, arg): - """Return a boolean of whether the value's length is the argument.""" - warnings.warn( - "The length_is template filter is deprecated in favor of the length template " - "filter and the == operator within an {% if %} tag.", - RemovedInDjango51Warning, - ) - try: - return len(value) == int(arg) - except (ValueError, TypeError): - return "" - - @register.filter(is_safe=True) def random(value): """Return a random item from the list.""" diff --git a/docs/ref/templates/builtins.txt b/docs/ref/templates/builtins.txt index 4798663bf0..e0e06dafe8 100644 --- a/docs/ref/templates/builtins.txt +++ b/docs/ref/templates/builtins.txt @@ -2161,24 +2161,6 @@ If ``value`` is ``['a', 'b', 'c', 'd']`` or ``"abcd"``, the output will be The filter returns ``0`` for an undefined variable. -.. templatefilter:: length_is - -``length_is`` -------------- - -.. deprecated:: 4.2 - -Returns ``True`` if the value's length is the argument, or ``False`` otherwise. - -For example: - -.. code-block:: html+django - - {{ value|length_is:"4" }} - -If ``value`` is ``['a', 'b', 'c', 'd']`` or ``"abcd"``, the output will be -``True``. - .. templatefilter:: linebreaks ``linebreaks`` diff --git a/docs/releases/5.1.txt b/docs/releases/5.1.txt index c8d6f5f3f6..c6c4e2217d 100644 --- a/docs/releases/5.1.txt +++ b/docs/releases/5.1.txt @@ -254,3 +254,5 @@ to remove usage of these features. * The ``BaseUserManager.make_random_password()`` method is removed. * The model's ``Meta.index_together`` option is removed. + +* The ``length_is`` template filter is removed. diff --git a/tests/template_tests/filter_tests/test_length_is.py b/tests/template_tests/filter_tests/test_length_is.py deleted file mode 100644 index 5f24b2ab59..0000000000 --- a/tests/template_tests/filter_tests/test_length_is.py +++ /dev/null @@ -1,130 +0,0 @@ -from django.template.defaultfilters import length_is -from django.test import SimpleTestCase, ignore_warnings -from django.utils.deprecation import RemovedInDjango51Warning - -from ..utils import setup - - -@ignore_warnings(category=RemovedInDjango51Warning) -class LengthIsTests(SimpleTestCase): - @setup({"length_is01": '{% if some_list|length_is:"4" %}Four{% endif %}'}) - def test_length_is01(self): - output = self.engine.render_to_string( - "length_is01", {"some_list": ["4", None, True, {}]} - ) - self.assertEqual(output, "Four") - - @setup( - { - "length_is02": ( - '{% if some_list|length_is:"4" %}Four{% else %}Not Four{% endif %}' - ) - } - ) - def test_length_is02(self): - output = self.engine.render_to_string( - "length_is02", {"some_list": ["4", None, True, {}, 17]} - ) - self.assertEqual(output, "Not Four") - - @setup({"length_is03": '{% if mystring|length_is:"4" %}Four{% endif %}'}) - def test_length_is03(self): - output = self.engine.render_to_string("length_is03", {"mystring": "word"}) - self.assertEqual(output, "Four") - - @setup( - { - "length_is04": ( - '{% if mystring|length_is:"4" %}Four{% else %}Not Four{% endif %}' - ) - } - ) - def test_length_is04(self): - output = self.engine.render_to_string("length_is04", {"mystring": "Python"}) - self.assertEqual(output, "Not Four") - - @setup( - { - "length_is05": ( - '{% if mystring|length_is:"4" %}Four{% else %}Not Four{% endif %}' - ) - } - ) - def test_length_is05(self): - output = self.engine.render_to_string("length_is05", {"mystring": ""}) - self.assertEqual(output, "Not Four") - - @setup( - { - "length_is06": ( - "{% with var|length as my_length %}{{ my_length }}{% endwith %}" - ) - } - ) - def test_length_is06(self): - output = self.engine.render_to_string("length_is06", {"var": "django"}) - self.assertEqual(output, "6") - - # Boolean return value from length_is should not be coerced to a string - @setup( - { - "length_is07": ( - '{% if "X"|length_is:0 %}Length is 0{% else %}Length not 0{% endif %}' - ) - } - ) - def test_length_is07(self): - output = self.engine.render_to_string("length_is07", {}) - self.assertEqual(output, "Length not 0") - - @setup( - { - "length_is08": ( - '{% if "X"|length_is:1 %}Length is 1{% else %}Length not 1{% endif %}' - ) - } - ) - def test_length_is08(self): - output = self.engine.render_to_string("length_is08", {}) - self.assertEqual(output, "Length is 1") - - # Invalid uses that should fail silently. - @setup({"length_is09": '{{ var|length_is:"fish" }}'}) - def test_length_is09(self): - output = self.engine.render_to_string("length_is09", {"var": "django"}) - self.assertEqual(output, "") - - @setup({"length_is10": '{{ int|length_is:"1" }}'}) - def test_length_is10(self): - output = self.engine.render_to_string("length_is10", {"int": 7}) - self.assertEqual(output, "") - - @setup({"length_is11": '{{ none|length_is:"1" }}'}) - def test_length_is11(self): - output = self.engine.render_to_string("length_is11", {"none": None}) - self.assertEqual(output, "") - - -@ignore_warnings(category=RemovedInDjango51Warning) -class FunctionTests(SimpleTestCase): - def test_empty_list(self): - self.assertIs(length_is([], 0), True) - self.assertIs(length_is([], 1), False) - - def test_string(self): - self.assertIs(length_is("a", 1), True) - self.assertIs(length_is("a", 10), False) - - -class DeprecationTests(SimpleTestCase): - @setup( - {"length_is_warning": "{{ string|length_is:3 }}"}, - test_once=True, - ) - def test_length_is_warning(self): - msg = ( - "The length_is template filter is deprecated in favor of the length " - "template filter and the == operator within an {% if %} tag." - ) - with self.assertRaisesMessage(RemovedInDjango51Warning, msg): - self.engine.render_to_string("length_is_warning", {"string": "good"})