def render_tag_foreach(self, element, template_attributes, generated_attributes, qwebcontext):
expr = template_attributes["foreach"]
enum = self.eval_object(expr, qwebcontext)
- if enum is not None:
- varname = template_attributes['as'].replace('.', '_')
- copy_qwebcontext = qwebcontext.copy()
- size = -1
- if isinstance(enum, collections.Sized):
- size = len(enum)
- copy_qwebcontext["%s_size" % varname] = size
- copy_qwebcontext["%s_all" % varname] = enum
- ru = []
- for index, item in enumerate(enum):
- copy_qwebcontext.update({
- varname: item,
- '%s_value' % varname: item,
- '%s_index' % varname: index,
- '%s_first' % varname: index == 0,
- '%s_last' % varname: index + 1 == size,
- })
- if index % 2:
- copy_qwebcontext.update({
- '%s_parity' % varname: 'odd',
- '%s_even' % varname: False,
- '%s_odd' % varname: True,
- })
- else:
- copy_qwebcontext.update({
- '%s_parity' % varname: 'even',
- '%s_even' % varname: True,
- '%s_odd' % varname: False,
- })
- ru.append(self.render_element(element, template_attributes, generated_attributes, copy_qwebcontext))
- return "".join(ru)
- else:
+ if enum is None:
template = qwebcontext.get('__template__')
raise QWebException("foreach enumerator %r is not defined while rendering template %r" % (expr, template), template=template)
+ varname = template_attributes['as'].replace('.', '_')
+ copy_qwebcontext = qwebcontext.copy()
+ size = -1
+ if isinstance(enum, collections.Sized):
+ size = len(enum)
+ copy_qwebcontext["%s_size" % varname] = size
+ copy_qwebcontext["%s_all" % varname] = enum
+ ru = []
+ for index, item in enumerate(enum):
+ copy_qwebcontext.update({
+ varname: item,
+ '%s_value' % varname: item,
+ '%s_index' % varname: index,
+ '%s_first' % varname: index == 0,
+ '%s_last' % varname: index + 1 == size,
+ })
+ if index % 2:
+ copy_qwebcontext.update({
+ '%s_parity' % varname: 'odd',
+ '%s_even' % varname: False,
+ '%s_odd' % varname: True,
+ })
+ else:
+ copy_qwebcontext.update({
+ '%s_parity' % varname: 'even',
+ '%s_even' % varname: True,
+ '%s_odd' % varname: False,
+ })
+ ru.append(self.render_element(element, template_attributes, generated_attributes, copy_qwebcontext))
+ return "".join(ru)
+
def render_tag_if(self, element, template_attributes, generated_attributes, qwebcontext):
if self.eval_bool(template_attributes["if"], qwebcontext):
return self.render_element(element, template_attributes, generated_attributes, qwebcontext)