Commit ff410565 authored by Jonathan Slenders's avatar Jonathan Slenders Committed by Tim Graham
Browse files

Fixed #20709 -- Allowed {% widthratio %} to accept an "as" parameter.

Thanks clay.evil@ for the suggestion.
parent 71c49197
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -539,6 +539,7 @@ answer newbie questions, and generally made Django that much better:
    Brenton Simpson <http://theillustratedlife.com>
    Jozko Skrablin <jozko.skrablin@gmail.com>
    Ben Slavin <benjamin.slavin@gmail.com>
    Jonathan Slenders
    sloonz <simon.lipp@insa-lyon.fr>
    Paul Smith <blinkylights23@gmail.com>
    Steven L. Smith (fvox13) <steven@stevenlsmith.com>
+28 −7
Original line number Diff line number Diff line
@@ -458,10 +458,11 @@ class VerbatimNode(Node):
        return self.content

class WidthRatioNode(Node):
    def __init__(self, val_expr, max_expr, max_width):
    def __init__(self, val_expr, max_expr, max_width, asvar=None):
        self.val_expr = val_expr
        self.max_expr = max_expr
        self.max_width = max_width
        self.asvar = asvar

    def render(self, context):
        try:
@@ -480,7 +481,13 @@ class WidthRatioNode(Node):
            return '0'
        except (ValueError, TypeError):
            return ''
        return str(int(round(ratio)))
        result = str(int(round(ratio)))

        if self.asvar:
            context[self.asvar] = result
            return ''
        else:
            return result

class WithNode(Node):
    def __init__(self, var, name, nodelist, extra_context=None):
@@ -1353,20 +1360,34 @@ def widthratio(parser, token):

    For example::

        <img src='bar.gif' height='10' width='{% widthratio this_value max_value max_width %}' />
        <img src="bar.png" alt="Bar"
             height="10" width="{% widthratio this_value max_value max_width %}" />

    If ``this_value`` is 175, ``max_value`` is 200, and ``max_width`` is 100,
    the image in the above example will be 88 pixels wide
    (because 175/200 = .875; .875 * 100 = 87.5 which is rounded up to 88).

    In some cases you might want to capture the result of widthratio in a
    variable. It can be useful for instance in a blocktrans like this::

        {% widthratio this_value max_value max_width as width %}
        {% blocktrans %}The width is: {{ width }}{% endblocktrans %}
    """
    bits = token.split_contents()
    if len(bits) != 4:
        raise TemplateSyntaxError("widthratio takes three arguments")
    if len(bits) == 4:
        tag, this_value_expr, max_value_expr, max_width = bits
        asvar = None
    elif len(bits) == 6:
        tag, this_value_expr, max_value_expr, max_width, as_, asvar = bits
        if as_ != 'as':
            raise TemplateSyntaxError("Invalid syntax in widthratio tag. Expecting 'as' keyword")
    else:
        raise TemplateSyntaxError("widthratio takes at least three arguments")

    return WidthRatioNode(parser.compile_filter(this_value_expr),
                          parser.compile_filter(max_value_expr),
                          parser.compile_filter(max_width))
                          parser.compile_filter(max_width),
                          asvar=asvar)

@register.tag('with')
def do_with(parser, token):
+8 −0
Original line number Diff line number Diff line
@@ -1108,6 +1108,14 @@ If ``this_value`` is 175, ``max_value`` is 200, and ``max_width`` is 100, the
image in the above example will be 88 pixels wide
(because 175/200 = .875; .875 * 100 = 87.5 which is rounded up to 88).

.. versionchanged:: 1.7

In some cases you might want to capture the result of ``widthratio`` in a
variable. It can be useful, for instance, in a :ttag:`blocktrans` like this::

    {% widthratio this_value max_value max_width as width %}
    {% blocktrans %}The width is: {{ width }}{% endblocktrans %}

.. templatetag:: with

with
+3 −0
Original line number Diff line number Diff line
@@ -156,6 +156,9 @@ Minor features
  :meth:`~django.contrib.auth.models.User.email_user()` are passed to the
  underlying :meth:`~django.core.mail.send_mail()` call.

* The :ttag:`widthratio` template tag now accepts an "as" parameter to capture
  the result in a variable.

Backwards incompatible changes in 1.7
=====================================

+7 −0
Original line number Diff line number Diff line
@@ -1575,6 +1575,13 @@ class TemplateTests(TransRealMixin, TestCase):
            # Test whitespace in filter argument
            'widthratio15': ('{% load custom %}{% widthratio a|noop:"x y" b 0 %}', {'a':50,'b':100}, '0'),

            # Widthratio with variable assignment
            'widthratio16': ('{% widthratio a b 100 as variable %}-{{ variable }}-', {'a':50,'b':100}, '-50-'),
            'widthratio17': ('{% widthratio a b 100 as variable %}-{{ variable }}-', {'a':100,'b':100}, '-100-'),

            'widthratio18': ('{% widthratio a b 100 as %}', { }, template.TemplateSyntaxError),
            'widthratio19': ('{% widthratio a b 100 not_as variable %}', { }, template.TemplateSyntaxError),

            ### WITH TAG ########################################################
            'with01': ('{% with key=dict.key %}{{ key }}{% endwith %}', {'dict': {'key': 50}}, '50'),
            'legacywith01': ('{% with dict.key as key %}{{ key }}{% endwith %}', {'dict': {'key': 50}}, '50'),