Ticket #17675: 17675.patch

File 17675.patch, 3.6 KB (added by aaugustin, 4 years ago)
  • tests/regressiontests/templates/tests.py

     
    88    # before importing 'template'.
    99    settings.configure()
    1010
    11 from datetime import datetime, timedelta
     11from datetime import date, datetime, timedelta
    1212import time
    1313import os
    1414import sys
     
    13761376                          '{% endfor %},'
    13771377                          '{% endfor %}',
    13781378                          {}, ''),
     1379
     1380            # Regression test for #17675
     1381            'regroup03': ('{% regroup data by at|date:"m" as grouped %}'
     1382                          '{% for group in grouped %}'
     1383                          '{{ group.grouper }}:'
     1384                          '{% for item in group.list %}'
     1385                          '{{ item.at|date:"d" }}'
     1386                          '{% endfor %},'
     1387                          '{% endfor %}',
     1388                          {'data': [{'at': date(2012, 2, 14)},
     1389                                    {'at': date(2012, 2, 28)},
     1390                                    {'at': date(2012, 7, 4)}]},
     1391                          '02:1428,07:04,'),
     1392
    13791393            ### SSI TAG ########################################################
    13801394
    13811395            # Test normal behavior
  • django/template/defaulttags.py

     
    1010    TemplateSyntaxError, VariableDoesNotExist, InvalidTemplateLibrary,
    1111    BLOCK_TAG_START, BLOCK_TAG_END, VARIABLE_TAG_START, VARIABLE_TAG_END,
    1212    SINGLE_BRACE_START, SINGLE_BRACE_END, COMMENT_TAG_START, COMMENT_TAG_END,
    13     get_library, token_kwargs, kwarg_re)
     13    VARIABLE_ATTRIBUTE_SEPARATOR, get_library, token_kwargs, kwarg_re)
    1414from django.template.smartif import IfParser, Literal
    1515from django.template.defaultfilters import date
    1616from django.utils.encoding import smart_str, smart_unicode
     
    287287        self.target, self.expression = target, expression
    288288        self.var_name = var_name
    289289
     290    def resolve_expression(self, obj, context):
     291        # Put obj in context under self.var_name, because it's guaranteed
     292        # not to be used (yet) when this function is called.
     293        context[self.var_name] = obj
     294        return self.expression.resolve(context, True)
     295
    290296    def render(self, context):
    291297        obj_list = self.target.resolve(context, True)
    292298        if obj_list == None:
     
    298304        context[self.var_name] = [
    299305            {'grouper': key, 'list': list(val)}
    300306            for key, val in
    301             groupby(obj_list, lambda v, f=self.expression.resolve: f(v, True))
     307            groupby(obj_list, lambda obj: self.resolve_expression(obj, context))
    302308        ]
    303309        return ''
    304310
     
    11121118    if lastbits_reversed[1][::-1] != 'as':
    11131119        raise TemplateSyntaxError("next-to-last argument to 'regroup' tag must"
    11141120                                  " be 'as'")
    1115 
    1116     expression = parser.compile_filter(lastbits_reversed[2][::-1])
    1117 
    11181121    var_name = lastbits_reversed[0][::-1]
     1122    # Hack -- RegroupNode will put each item in 'target' in the context
     1123    # under the key 'var_name' and evaluate this expression,
     1124    # before finally saving the final groups under the same key.
     1125    expression = parser.compile_filter(var_name +
     1126                                       VARIABLE_ATTRIBUTE_SEPARATOR +
     1127                                       lastbits_reversed[2][::-1])
    11191128    return RegroupNode(target, expression, var_name)
    11201129
    11211130@register.tag
Back to Top