Commit d563e3be authored by Ola Sitarska's avatar Ola Sitarska Committed by Tim Graham
Browse files

Fixed #23913 -- Deprecated the `=` comparison in `if` template tag.

parent 412066e7
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -999,7 +999,7 @@ def do_if(parser, token):
    ``{% if 1>2 %}`` is not a valid if tag.

    All supported operators are: ``or``, ``and``, ``in``, ``not in``
    ``==`` (or ``=``), ``!=``, ``>``, ``>=``, ``<`` and ``<=``.
    ``==``, ``!=``, ``>``, ``>=``, ``<`` and ``<=``.

    Operator precedence follows Python.
    """
+9 −0
Original line number Diff line number Diff line
"""
Parser and utilities for the smart 'if' tag
"""
import warnings

from django.utils.deprecation import RemovedInDjango20Warning


# Using a simple top down parser, as described here:
@@ -99,6 +102,7 @@ OPERATORS = {
    'not': prefix(8, lambda context, x: not x.eval(context)),
    'in': infix(9, lambda context, x, y: x.eval(context) in y.eval(context)),
    'not in': infix(9, lambda context, x, y: x.eval(context) not in y.eval(context)),
    # This should be removed in Django 2.0:
    '=': infix(10, lambda context, x, y: x.eval(context) == y.eval(context)),
    '==': infix(10, lambda context, x, y: x.eval(context) == y.eval(context)),
    '!=': infix(10, lambda context, x, y: x.eval(context) != y.eval(context)),
@@ -174,6 +178,11 @@ class IfParser(object):
        except (KeyError, TypeError):
            return self.create_var(token)
        else:
            if token == '=':
                warnings.warn(
                    "Operator '=' is deprecated and will be removed in Django 2.0. Use '==' instead.",
                    RemovedInDjango20Warning, stacklevel=2
                )
            return op()

    def next_token(self):
+3 −0
Original line number Diff line number Diff line
@@ -140,6 +140,9 @@ details on these changes.

* The ``ssi`` template tag will be removed.

* Support for the ``=`` comparison operator in the ``if`` template tag will be
  removed.

.. _deprecation-removed-in-1.9:

1.9
+6 −0
Original line number Diff line number Diff line
@@ -1492,6 +1492,12 @@ absolute path. This is of limited use in most deployment situations, and
the :ttag:`include` tag often makes more sense. This tag is now deprecated and
will be removed in Django 2.0.

``=`` as comparison operator in ``if`` template tag
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Using a single equals sign with the ``{% if %}`` template tag for equality
testing was undocumented and untested. It's now deprecated in favor of ``==``.

.. removed-features-1.8:

Features removed in 1.8
+43 −1
Original line number Diff line number Diff line
import warnings

from django.template import TemplateSyntaxError
from django.test import SimpleTestCase
from django.test import ignore_warnings, SimpleTestCase
from django.utils.deprecation import RemovedInDjango20Warning

from ..utils import setup, TestObj

@@ -521,3 +524,42 @@ class IfTagTests(SimpleTestCase):
    def test_if_tag_badarg04(self):
        output = self.engine.render_to_string('if-tag-badarg04')
        self.assertEqual(output, 'no')

    @setup({'if-tag-eq-deprecated': '{% if foo = bar %}yes{% else %}no{% endif %}'},
        test_once=True)
    def test_if_tag_eq_deprecated(self):
        with warnings.catch_warnings(record=True) as warns:
            warnings.simplefilter('always')
            output = self.engine.render_to_string('if-tag-eq-deprecated')
            self.assertEqual(output, 'yes')
        self.assertEqual(len(warns), 1)
        self.assertEqual(
            str(warns[0].message),
            "Operator '=' is deprecated and will be removed in Django 2.0. "
            "Use '==' instead."
        )


@ignore_warnings(category=RemovedInDjango20Warning)
class TestEqualitySingleEqualsSign(SimpleTestCase):
    # The following tests should be changed to template.TemplateSyntaxError
    # (or simply removed) when the deprecation path ends in Django 2.0.
    @setup({'if-tag-eq01': '{% if foo = bar %}yes{% else %}no{% endif %}'})
    def test_if_tag_eq01(self):
        output = self.engine.render_to_string('if-tag-eq01', {'foo': 1})
        self.assertEqual(output, 'no')

    @setup({'if-tag-eq02': '{% if foo = bar %}yes{% else %}no{% endif %}'})
    def test_if_tag_eq02(self):
        output = self.engine.render_to_string('if-tag-eq02', {'foo': 1, 'bar': 1})
        self.assertEqual(output, 'yes')

    @setup({'if-tag-eq03': '{% if foo = bar %}yes{% else %}no{% endif %}'})
    def test_if_tag_eq03(self):
        output = self.engine.render_to_string('if-tag-eq03', {'foo': 1, 'bar': 2})
        self.assertEqual(output, 'no')

    @setup({'if-tag-eq04': '{% if foo == \'\' %}yes{% else %}no{% endif %}'})
    def test_if_tag_eq04(self):
        output = self.engine.render_to_string('if-tag-eq04')
        self.assertEqual(output, 'no')
Loading