Changeset 14134


Ignore:
Timestamp:
03/15/12 17:00:56 (12 years ago)
Author:
ramonb
Message:

templatetags/cmts_extras.py:

  • update tag: store
  • supports multiple files output between {% store %} tags as in ramonb_extras
  • see #4
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sara_cmt/sara_cmt/cluster/templatetags/cmts_extras.py

    r14133 r14134  
    160160        return ''
    161161
    162 class MetaNode(template.Node):
    163     """
    164         Renderer, which stores the save path to the context.
    165     """
    166 
    167     def __init__(self, tag, values):
     162
     163@register.tag(name='store')
     164def do_save_meta(parser, token):
     165    """
     166        Compilation function to use for meta-info.
     167
     168        Usage: {% store '/path/to/file' %}
     169               {% store variable %} # variable = '/path/to/file'
     170    """
     171    try:
     172        # RB: split_contents respects quoted 'strings containing spaces'
     173        tag, path_str = token.split_contents()
     174    except ValueError:
     175        raise template.TemplateSyntaxError, '%r tag requires at least 1 argument' % tag
     176
     177    # RB: parse the template thing until %endstore found
     178    nodelist = parser.parse(('endstore',))
     179    parser.delete_first_token()
     180
     181    # RB: Now lets start writing output files
     182    return generateStoreOutput(tag, path_str, nodelist)
     183
     184class generateStoreOutput(template.Node):
     185
     186    def __init__(self, tag, path_str, nodelist):
    168187        self.tag = tag
    169         self.values = values
    170 
    171     def render(self, context):
    172         # This is where the work actually happens
    173         context[self.tag] = self.values
    174         return ''
    175 
    176 
    177 @register.tag(name='store')
    178 #@stringfilter
    179 def do_save_meta(parser, token):
    180     """
    181         Compilation function to use for meta-info.
    182     """
    183     tag = token.contents.split()[0]
    184     try:
    185         meta_info = token.split_contents()
    186         # meta_info should look like ['<tag>', '<path>', 'as', '<key>']
    187     except ValueError:
    188         raise template.TemplateSyntaxError, '%r tag requires at least 3 arguments' % tag
    189     if len(meta_info) != 4:
    190         raise template.TemplateSyntaxError, '%r tag requires at least 3 arguments' % tag
    191     if meta_info[-2] != 'as':
    192         raise template.TemplateSyntaxError, "second last argument of %r tag has to be 'as'" % tag
    193     return MetaNode(meta_info[-1], meta_info[1])
     188        self.nodelist = nodelist
     189        self.path_str = path_str
     190
     191    def render(self, context):
     192
     193        if (self.path_str[0] == self.path_str[-1] and self.path_str[0] in ('"', "'")):
     194
     195            mypath_str = str(self.path_str)[1:-1]
     196
     197        else:
     198            # RB: Not quoted: must be a variable: attempt to resolve to value
     199            try:
     200                pathvar = template.Variable( str(self.path_str) )
     201                mypath_str = pathvar.resolve(context)
     202            except template.VariableDoesNotExist:
     203                #raise template.TemplateSyntaxError, '%r tag argument 1: not a variable %r' %( tag, path_str )
     204                pass
     205
     206        # RB: render template between store tags
     207        output = self.nodelist.render(context)
     208
     209        # RB: store output in context dict for later writing to file
     210        context['stores'][ mypath_str ] = output
     211
     212        # RB: output generated into context dict, so we return nothing
     213        return ''
    194214
    195215
Note: See TracChangeset for help on using the changeset viewer.