[IMP] qweb: foreach handling
* fix mapping handling to match JS impl: current value set as _value instead of being lost * add handling of integer parameter * only set _size and _last if current iterable is sized
This commit is contained in:
parent
d5e3d121e3
commit
c5dca416da
|
@ -362,29 +362,40 @@ class QWeb(orm.AbstractModel):
|
||||||
inner = widget.format(template_attributes['esc'], options, qwebcontext)
|
inner = widget.format(template_attributes['esc'], options, qwebcontext)
|
||||||
return self.render_element(element, template_attributes, generated_attributes, qwebcontext, inner)
|
return self.render_element(element, template_attributes, generated_attributes, qwebcontext, inner)
|
||||||
|
|
||||||
|
def _iterate(self, iterable):
|
||||||
|
if isinstance (iterable, collections.Mapping):
|
||||||
|
return iterable.iteritems()
|
||||||
|
|
||||||
|
return itertools.izip(*itertools.tee(iterable))
|
||||||
|
|
||||||
def render_tag_foreach(self, element, template_attributes, generated_attributes, qwebcontext):
|
def render_tag_foreach(self, element, template_attributes, generated_attributes, qwebcontext):
|
||||||
expr = template_attributes["foreach"]
|
expr = template_attributes["foreach"]
|
||||||
enum = self.eval_object(expr, qwebcontext)
|
enum = self.eval_object(expr, qwebcontext)
|
||||||
if enum is None:
|
if enum is None:
|
||||||
template = qwebcontext.get('__template__')
|
template = qwebcontext.get('__template__')
|
||||||
raise QWebException("foreach enumerator %r is not defined while rendering template %r" % (expr, template), template=template)
|
raise QWebException("foreach enumerator %r is not defined while rendering template %r" % (expr, template), template=template)
|
||||||
|
if isinstance(enum, int):
|
||||||
|
enum = range(enum)
|
||||||
|
|
||||||
varname = template_attributes['as'].replace('.', '_')
|
varname = template_attributes['as'].replace('.', '_')
|
||||||
copy_qwebcontext = qwebcontext.copy()
|
copy_qwebcontext = qwebcontext.copy()
|
||||||
size = -1
|
|
||||||
|
size = None
|
||||||
if isinstance(enum, collections.Sized):
|
if isinstance(enum, collections.Sized):
|
||||||
size = len(enum)
|
size = len(enum)
|
||||||
copy_qwebcontext["%s_size" % varname] = size
|
copy_qwebcontext["%s_size" % varname] = size
|
||||||
|
|
||||||
copy_qwebcontext["%s_all" % varname] = enum
|
copy_qwebcontext["%s_all" % varname] = enum
|
||||||
ru = []
|
ru = []
|
||||||
for index, item in enumerate(enum):
|
for index, (item, value) in enumerate(self._iterate(enum)):
|
||||||
copy_qwebcontext.update({
|
copy_qwebcontext.update({
|
||||||
varname: item,
|
varname: item,
|
||||||
'%s_value' % varname: item,
|
'%s_value' % varname: value,
|
||||||
'%s_index' % varname: index,
|
'%s_index' % varname: index,
|
||||||
'%s_first' % varname: index == 0,
|
'%s_first' % varname: index == 0,
|
||||||
'%s_last' % varname: index + 1 == size,
|
|
||||||
})
|
})
|
||||||
|
if size is not None:
|
||||||
|
copy_qwebcontext['%s_last' % varname] = index + 1 == size
|
||||||
if index % 2:
|
if index % 2:
|
||||||
copy_qwebcontext.update({
|
copy_qwebcontext.update({
|
||||||
'%s_parity' % varname: 'odd',
|
'%s_parity' % varname: 'odd',
|
||||||
|
|
Loading…
Reference in New Issue