Django

Code

Show
Ignore:
Timestamp:
06/22/07 11:56:04 (2 years ago)
Author:
bouldersprinters
Message:

boulder-oracle-sprint: Merged to [5511]

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/boulder-oracle-sprint/django/template/defaulttags.py

    r5491 r5512  
    1616            yield data[index] 
    1717 
     18 
    1819register = Library() 
    1920 
    2021class CommentNode(Node): 
    21     def iter_render(self, context): 
    22         return () 
     22    def render(self, context): 
     23        return '' 
    2324 
    2425class CycleNode(Node): 
     
    2930        self.variable_name = variable_name 
    3031 
    31     def iter_render(self, context): 
    32         return (self.render(context),) 
    33  
    3432    def render(self, context): 
    3533        self.counter += 1 
     
    4038 
    4139class DebugNode(Node): 
    42     def iter_render(self, context): 
     40    def render(self, context): 
    4341        from pprint import pformat 
    44         for val in context: 
    45             yield pformat(val
    46         yield "\n\n" 
    47         yield pformat(sys.modules
     42        output = [pformat(val) for val in context] 
     43        output.append('\n\n'
     44        output.append(pformat(sys.modules)) 
     45        return ''.join(output
    4846 
    4947class FilterNode(Node): 
     
    5149        self.filter_expr, self.nodelist = filter_expr, nodelist 
    5250 
    53     def iter_render(self, context): 
     51    def render(self, context): 
    5452        output = self.nodelist.render(context) 
    5553        # apply filters 
     
    5755        filtered = self.filter_expr.resolve(context) 
    5856        context.pop() 
    59         return (filtered,) 
     57        return filtered 
    6058 
    6159class FirstOfNode(Node): 
    6260    def __init__(self, vars): 
    6361        self.vars = vars 
    64  
    65     def iter_render(self, context): 
    66         return (self.render(context),) 
    6762 
    6863    def render(self, context): 
     
    10196        return nodes 
    10297 
    103     def iter_render(self, context): 
     98    def render(self, context): 
     99        nodelist = NodeList() 
    104100        if 'forloop' in context: 
    105101            parentloop = context['forloop'] 
     
    109105        try: 
    110106            values = self.sequence.resolve(context, True) 
    111             if values is None: 
    112                 values = () 
    113             elif not hasattr(values, '__len__'): 
    114                 values = list(values) 
    115107        except VariableDoesNotExist: 
    116             values = () 
     108            values = [] 
     109        if values is None: 
     110            values = [] 
     111        if not hasattr(values, '__len__'): 
     112            values = list(values) 
    117113        len_values = len(values) 
    118114        if self.reversed: 
     
    133129            } 
    134130            if unpack: 
    135                 # If there are multiple loop variables, unpack the item into 
    136                 # them. 
     131                # If there are multiple loop variables, unpack the item into them. 
    137132                context.update(dict(zip(self.loopvars, item))) 
    138133            else: 
    139134                context[self.loopvars[0]] = item 
    140  
    141             # We inline this to avoid the overhead since ForNode is pretty 
    142             # common. 
    143135            for node in self.nodelist_loop: 
    144                 for chunk in node.iter_render(context): 
    145                     yield chunk 
     136                nodelist.append(node.render(context)) 
    146137            if unpack: 
    147138                # The loop variables were pushed on to the context so pop them 
     
    152143                context.pop() 
    153144        context.pop() 
     145        return nodelist.render(context) 
    154146 
    155147class IfChangedNode(Node): 
     
    159151        self._varlist = varlist 
    160152 
    161     def iter_render(self, context): 
     153    def render(self, context): 
    162154        if 'forloop' in context and context['forloop']['first']: 
    163155            self._last_seen = None 
     
    177169            context.push() 
    178170            context['ifchanged'] = {'firstloop': firstloop} 
    179             for chunk in self.nodelist.iter_render(context): 
    180                 yield chunk 
     171            content = self.nodelist.render(context) 
    181172            context.pop() 
     173            return content 
     174        else: 
     175            return '' 
    182176 
    183177class IfEqualNode(Node): 
     
    190184        return "<IfEqualNode>" 
    191185 
    192     def iter_render(self, context): 
     186    def render(self, context): 
    193187        try: 
    194188            val1 = resolve_variable(self.var1, context) 
     
    200194            val2 = None 
    201195        if (self.negate and val1 != val2) or (not self.negate and val1 == val2): 
    202             return self.nodelist_true.iter_render(context) 
    203         return self.nodelist_false.iter_render(context) 
     196            return self.nodelist_true.render(context) 
     197        return self.nodelist_false.render(context) 
    204198 
    205199class IfNode(Node): 
     
    226220        return nodes 
    227221 
    228     def iter_render(self, context): 
     222    def render(self, context): 
    229223        if self.link_type == IfNode.LinkTypes.or_: 
    230224            for ifnot, bool_expr in self.bool_exprs: 
     
    234228                    value = None 
    235229                if (value and not ifnot) or (ifnot and not value): 
    236                     return self.nodelist_true.iter_render(context) 
    237             return self.nodelist_false.iter_render(context) 
     230                    return self.nodelist_true.render(context) 
     231            return self.nodelist_false.render(context) 
    238232        else: 
    239233            for ifnot, bool_expr in self.bool_exprs: 
     
    243237                    value = None 
    244238                if not ((value and not ifnot) or (ifnot and not value)): 
    245                     return self.nodelist_false.iter_render(context) 
    246             return self.nodelist_true.iter_render(context) 
     239                    return self.nodelist_false.render(context) 
     240            return self.nodelist_true.render(context) 
    247241 
    248242    class LinkTypes: 
     
    255249        self.var_name = var_name 
    256250 
    257     def iter_render(self, context): 
     251    def render(self, context): 
    258252        obj_list = self.target.resolve(context, True) 
    259253        if obj_list == None: # target_var wasn't found in context; fail silently 
    260254            context[self.var_name] = [] 
    261             return () 
     255            return '' 
    262256        # List of dictionaries in the format 
    263257        # {'grouper': 'key', 'list': [list of contents]}. 
    264258        context[self.var_name] = [{'grouper':key, 'list':list(val)} for key, val in 
    265259            groupby(obj_list, lambda v, f=self.expression.resolve: f(v, True))] 
    266         return () 
     260        return '' 
    267261 
    268262def include_is_allowed(filepath): 
     
    276270        self.filepath, self.parsed = filepath, parsed 
    277271 
    278     def iter_render(self, context): 
     272    def render(self, context): 
    279273        if not include_is_allowed(self.filepath): 
    280274            if settings.DEBUG: 
    281                 return ("[Didn't have permission to include file]",) 
     275                return "[Didn't have permission to include file]" 
    282276            else: 
    283277                return '' # Fail silently for invalid includes. 
     
    290284        if self.parsed: 
    291285            try: 
    292                 return Template(output, name=self.filepath).iter_render(context) 
     286                t = Template(output, name=self.filepath) 
     287                return t.render(context) 
    293288            except TemplateSyntaxError, e: 
    294289                if settings.DEBUG: 
     
    296291                else: 
    297292                    return '' # Fail silently for invalid included templates. 
    298         return (output,) 
     293        return output 
    299294 
    300295class LoadNode(Node): 
    301     def iter_render(self, context): 
    302         return () 
     296    def render(self, context): 
     297        return '' 
    303298 
    304299class NowNode(Node): 
    305300    def __init__(self, format_string): 
    306301        self.format_string = format_string 
    307  
    308     def iter_render(self, context): 
    309         return (self.render(context),) 
    310302 
    311303    def render(self, context): 
     
    337329        self.tagtype = tagtype 
    338330 
    339     def iter_render(self, context): 
    340         return (self.render(context),) 
    341  
    342331    def render(self, context): 
    343332        return self.mapping.get(self.tagtype, '') 
     
    349338        self.kwargs = kwargs 
    350339 
    351     def iter_render(self, context): 
     340    def render(self, context): 
    352341        from django.core.urlresolvers import reverse, NoReverseMatch 
    353342        args = [arg.resolve(context) for arg in self.args] 
    354343        kwargs = dict([(k, v.resolve(context)) for k, v in self.kwargs.items()]) 
    355344        try: 
    356             return (reverse(self.view_name, args=args, kwargs=kwargs),
     345            return reverse(self.view_name, args=args, kwargs=kwargs
    357346        except NoReverseMatch: 
    358347            try: 
     
    360349                return reverse(project_name + '.' + self.view_name, args=args, kwargs=kwargs) 
    361350            except NoReverseMatch: 
    362                 return () 
     351                return '' 
    363352 
    364353class WidthRatioNode(Node): 
     
    367356        self.max_expr = max_expr 
    368357        self.max_width = max_width 
    369  
    370     def iter_render(self, context): 
    371         return (self.render(context),) 
    372358 
    373359    def render(self, context): 
     
    394380        return "<WithNode>" 
    395381 
    396     def iter_render(self, context): 
     382    def render(self, context): 
    397383        val = self.var.resolve(context) 
    398384        context.push() 
    399385        context[self.name] = val 
    400         for chunk in self.nodelist.iter_render(context): 
    401             yield chunk 
     386        output = self.nodelist.render(context) 
    402387        context.pop() 
     388        return output 
    403389 
    404390#@register.tag 
  • django/branches/boulder-oracle-sprint/django/template/__init__.py

    r5491 r5512  
    5656""" 
    5757import re 
    58 import types 
    5958from inspect import getargspec 
    6059from django.conf import settings 
     
    169168                yield subnode 
    170169 
    171     def iter_render(self, context): 
     170    def render(self, context): 
    172171        "Display stage -- can be called many times" 
    173         return self.nodelist.iter_render(context) 
    174  
    175     def render(self, context): 
    176         return ''.join(self.iter_render(context)) 
     172        return self.nodelist.render(context) 
    177173 
    178174def compile_string(template_string, origin): 
     
    700696    return current 
    701697 
    702 class NodeBase(type): 
    703     def __new__(cls, name, bases, attrs): 
    704         """ 
    705         Ensures that either a 'render' or 'render_iter' method is defined on 
    706         any Node sub-class. This avoids potential infinite loops at runtime. 
    707         """ 
    708         if not (isinstance(attrs.get('render'), types.FunctionType) or 
    709                 isinstance(attrs.get('iter_render'), types.FunctionType)): 
    710             raise TypeError('Unable to create Node subclass without either "render" or "iter_render" method.') 
    711         return type.__new__(cls, name, bases, attrs) 
    712  
    713698class Node(object): 
    714     __metaclass__ = NodeBase 
    715  
    716     def iter_render(self, context): 
    717         return (self.render(context),) 
    718  
    719699    def render(self, context): 
    720700        "Return the node rendered as a string" 
    721         return ''.join(self.iter_render(context)) 
     701        pass 
    722702 
    723703    def __iter__(self): 
     
    735715class NodeList(list): 
    736716    def render(self, context): 
    737         return ''.join(self.iter_render(context)) 
    738  
    739     def iter_render(self, context): 
     717        bits = [] 
    740718        for node in self: 
    741             for chunk in node.iter_render(context): 
    742                 yield chunk 
     719            if isinstance(node, Node): 
     720                bits.append(self.render_node(node, context)) 
     721            else: 
     722                bits.append(node) 
     723        return ''.join(bits) 
    743724 
    744725    def get_nodes_by_type(self, nodetype): 
     
    749730        return nodes 
    750731 
     732    def render_node(self, node, context): 
     733        return(node.render(context)) 
     734 
    751735class DebugNodeList(NodeList): 
    752     def iter_render(self, context): 
    753         for node in self: 
    754             if not isinstance(node, Node): 
    755                 yield node 
    756                 continue 
    757             try: 
    758                 for chunk in node.iter_render(context): 
    759                     yield chunk 
    760             except TemplateSyntaxError, e: 
    761                 if not hasattr(e, 'source'): 
    762                     e.source = node.source 
    763                 raise 
    764             except Exception, e: 
    765                 from sys import exc_info 
    766                 wrapped = TemplateSyntaxError('Caught an exception while rendering: %s' % e) 
    767                 wrapped.source = node.source 
    768                 wrapped.exc_info = exc_info() 
    769                 raise wrapped 
     736    def render_node(self, node, context): 
     737        try: 
     738            result = node.render(context) 
     739        except TemplateSyntaxError, e: 
     740            if not hasattr(e, 'source'): 
     741                e.source = node.source 
     742            raise 
     743        except Exception, e: 
     744            from sys import exc_info 
     745            wrapped = TemplateSyntaxError('Caught an exception while rendering: %s' % e) 
     746            wrapped.source = node.source 
     747            wrapped.exc_info = exc_info() 
     748            raise wrapped 
     749        return result 
    770750 
    771751class TextNode(Node): 
     
    775755    def __repr__(self): 
    776756        return "<Text Node: '%s'>" % self.s[:25] 
    777  
    778     def iter_render(self, context): 
    779         return (self.s,) 
    780757 
    781758    def render(self, context): 
     
    801778        else: 
    802779            return output 
    803  
    804     def iter_render(self, context): 
    805         return (self.render(context),) 
    806780 
    807781    def render(self, context): 
     
    893867                self.vars_to_resolve = vars_to_resolve 
    894868 
    895             #def iter_render(self, context): 
    896             #    return (self.render(context),) 
    897  
    898869            def render(self, context): 
    899870                resolved_vars = [resolve_variable(var, context) for var in self.vars_to_resolve] 
     
    918889                    self.vars_to_resolve = vars_to_resolve 
    919890 
    920                 def iter_render(self, context): 
     891                def render(self, context): 
    921892                    resolved_vars = [resolve_variable(var, context) for var in self.vars_to_resolve] 
    922893                    if takes_context: 
     
    934905                            t = get_template(file_name) 
    935906                        self.nodelist = t.nodelist 
    936                     return self.nodelist.iter_render(context_class(dict)) 
     907                    return self.nodelist.render(context_class(dict)) 
    937908 
    938909            compile_func = curry(generic_tag_compiler, params, defaults, getattr(func, "_decorated_function", func).__name__, InclusionNode) 
  • django/branches/boulder-oracle-sprint/django/template/loader.py

    r5491 r5512  
    8888    return Template(source, origin, name) 
    8989 
    90 def _render_setup(template_name, dictionary=None, context_instance=None): 
     90def render_to_string(template_name, dictionary=None, context_instance=None): 
    9191    """ 
    92     Common setup code for render_to_string and render_to_iter. 
     92    Loads the given template_name and renders it with the given dictionary as 
     93    context. The template_name may be a string to load a single template using 
     94    get_template, or it may be a tuple to use select_template to find one of 
     95    the templates in the list. Returns a string. 
    9396    """ 
    94     if dictionary is None: 
    95         dictionary = {} 
     97    dictionary = dictionary or {} 
    9698    if isinstance(template_name, (list, tuple)): 
    9799        t = select_template(template_name) 
     
    102104    else: 
    103105        context_instance = Context(dictionary) 
    104     return t, context_instance 
    105  
    106 def render_to_string(template_name, dictionary=None, context_instance=None): 
    107     """ 
    108     Loads the given template_name and renders it with the given dictionary as 
    109     context. The template_name may be a string to load a single template using 
    110     get_template, or it may be a tuple to use select_template to find one of 
    111     the templates in the list. Returns a string. 
    112     """ 
    113     t, c = _render_setup(template_name, dictionary=dictionary, context_instance=context_instance) 
    114     return t.render(c) 
    115  
    116 def render_to_iter(template_name, dictionary=None, context_instance=None): 
    117     """ 
    118     Loads the given template_name and renders it with the given dictionary as 
    119     context. The template_name may be a string to load a single template using 
    120     get_template, or it may be a tuple to use select_template to find one of 
    121     the templates in the list. Returns a string. 
    122     """ 
    123     t, c = _render_setup(template_name, dictionary=dictionary, context_instance=context_instance) 
    124     return t.iter_render(c) 
    125  
     106    return t.render(context_instance) 
    126107 
    127108def select_template(template_name_list): 
  • django/branches/boulder-oracle-sprint/django/template/loader_tags.py

    r5491 r5512  
    1616        return "<Block Node: %s. Contents: %r>" % (self.name, self.nodelist) 
    1717 
    18     def iter_render(self, context): 
     18    def render(self, context): 
    1919        context.push() 
    2020        # Save context in case of block.super(). 
    2121        self.context = context 
    2222        context['block'] = self 
    23         for chunk in self.nodelist.iter_render(context): 
    24             yield chunk 
     23        result = self.nodelist.render(context) 
    2524        context.pop() 
     25        return result 
    2626 
    2727    def super(self): 
     
    6060            return get_template_from_string(source, origin, parent) 
    6161 
    62     def iter_render(self, context): 
     62    def render(self, context): 
    6363        compiled_parent = self.get_parent(context) 
    6464        parent_is_child = isinstance(compiled_parent.nodelist[0], ExtendsNode) 
     
    8080                parent_block.add_parent(parent_block.nodelist) 
    8181                parent_block.nodelist = block_node.nodelist 
    82         return compiled_parent.iter_render(context) 
     82        return compiled_parent.render(context) 
    8383 
    8484class ConstantIncludeNode(Node): 
     
    9292            self.template = None 
    9393 
    94     def iter_render(self, context): 
     94    def render(self, context): 
    9595        if self.template: 
    96             return self.template.iter_render(context) 
    97         return () 
     96            return self.template.render(context) 
     97        else: 
     98            return '' 
    9899 
    99100class IncludeNode(Node): 
     
    101102        self.template_name = template_name 
    102103 
    103     def iter_render(self, context): 
     104    def render(self, context): 
    104105        try: 
    105106            template_name = resolve_variable(self.template_name, context) 
    106107            t = get_template(template_name) 
    107             return t.iter_render(context) 
     108            return t.render(context) 
    108109        except TemplateSyntaxError, e: 
    109110            if settings.TEMPLATE_DEBUG: 
    110111                raise 
    111             return () 
     112            return '' 
    112113        except: 
    113             return () # Fail silently for invalid included templates. 
     114            return '' # Fail silently for invalid included templates. 
    114115 
    115116def do_block(parser, token):