From 34097b4f88f6a0f8fb374cccebd4bfeed2e61f84 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 5 Jun 2014 11:46:56 +0200 Subject: [PATCH 1/6] [IMP] mandate a variable name in foreach --- openerp/addons/base/ir/ir_qweb.py | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/openerp/addons/base/ir/ir_qweb.py b/openerp/addons/base/ir/ir_qweb.py index 11c2432a874..01ed5bc32e4 100644 --- a/openerp/addons/base/ir/ir_qweb.py +++ b/openerp/addons/base/ir/ir_qweb.py @@ -355,32 +355,29 @@ class QWeb(orm.AbstractModel): expr = template_attributes["foreach"] enum = self.eval_object(expr, qwebcontext) if enum is not None: - var = template_attributes.get('as', expr).replace('.', '_') + varname = template_attributes['as'].replace('.', '_') copy_qwebcontext = qwebcontext.copy() size = -1 if isinstance(enum, (list, tuple)): size = len(enum) elif hasattr(enum, 'count'): size = enum.count() - copy_qwebcontext["%s_size" % var] = size - copy_qwebcontext["%s_all" % var] = enum + copy_qwebcontext["%s_size" % varname] = size + copy_qwebcontext["%s_all" % varname] = enum index = 0 ru = [] for i in enum: - copy_qwebcontext["%s_value" % var] = i - copy_qwebcontext["%s_index" % var] = index - copy_qwebcontext["%s_first" % var] = index == 0 - copy_qwebcontext["%s_even" % var] = index % 2 - copy_qwebcontext["%s_odd" % var] = (index + 1) % 2 - copy_qwebcontext["%s_last" % var] = index + 1 == size + copy_qwebcontext[varname] = i + copy_qwebcontext["%s_value" % varname] = i + copy_qwebcontext["%s_index" % varname] = index + copy_qwebcontext["%s_first" % varname] = index == 0 + copy_qwebcontext["%s_even" % varname] = index % 2 + copy_qwebcontext["%s_odd" % varname] = (index + 1) % 2 + copy_qwebcontext["%s_last" % varname] = index + 1 == size if index % 2: - copy_qwebcontext["%s_parity" % var] = 'odd' + copy_qwebcontext["%s_parity" % varname] = 'odd' else: - copy_qwebcontext["%s_parity" % var] = 'even' - if 'as' in template_attributes: - copy_qwebcontext[var] = i - elif isinstance(i, dict): - copy_qwebcontext.update(i) + copy_qwebcontext["%s_parity" % varname] = 'even' ru.append(self.render_element(element, template_attributes, generated_attributes, copy_qwebcontext)) index += 1 return "".join(ru) From 0b3abaf4ceb6ef73d8d63205a66baaf15d05fa90 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 5 Jun 2014 12:01:04 +0200 Subject: [PATCH 2/6] [FIX] _even/_odd were reversed, also some reformatting thing --- openerp/addons/base/ir/ir_qweb.py | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/openerp/addons/base/ir/ir_qweb.py b/openerp/addons/base/ir/ir_qweb.py index 01ed5bc32e4..38ad5c19393 100644 --- a/openerp/addons/base/ir/ir_qweb.py +++ b/openerp/addons/base/ir/ir_qweb.py @@ -366,18 +366,26 @@ class QWeb(orm.AbstractModel): copy_qwebcontext["%s_all" % varname] = enum index = 0 ru = [] - for i in enum: - copy_qwebcontext[varname] = i - copy_qwebcontext["%s_value" % varname] = i - copy_qwebcontext["%s_index" % varname] = index - copy_qwebcontext["%s_first" % varname] = index == 0 - copy_qwebcontext["%s_even" % varname] = index % 2 - copy_qwebcontext["%s_odd" % varname] = (index + 1) % 2 - copy_qwebcontext["%s_last" % varname] = index + 1 == size + for item in 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["%s_parity" % varname] = 'odd' + copy_qwebcontext.update({ + '%s_parity' % varname: 'odd', + '%s_even' % varname: False, + '%s_odd' % varname: True, + }) else: - copy_qwebcontext["%s_parity" % varname] = 'even' + 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)) index += 1 return "".join(ru) From 03b75477ecc342c31ad3de3b1a719560243befcb Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 5 Jun 2014 12:01:44 +0200 Subject: [PATCH 3/6] [IMP] use enumerate instead of explicit index thing --- openerp/addons/base/ir/ir_qweb.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/openerp/addons/base/ir/ir_qweb.py b/openerp/addons/base/ir/ir_qweb.py index 38ad5c19393..1fe1abd35eb 100644 --- a/openerp/addons/base/ir/ir_qweb.py +++ b/openerp/addons/base/ir/ir_qweb.py @@ -364,9 +364,8 @@ class QWeb(orm.AbstractModel): size = enum.count() copy_qwebcontext["%s_size" % varname] = size copy_qwebcontext["%s_all" % varname] = enum - index = 0 ru = [] - for item in enum: + for index, item in enumerate(enum): copy_qwebcontext.update({ varname: item, '%s_value' % varname: item, @@ -387,7 +386,6 @@ class QWeb(orm.AbstractModel): '%s_odd' % varname: False, }) ru.append(self.render_element(element, template_attributes, generated_attributes, copy_qwebcontext)) - index += 1 return "".join(ru) else: template = qwebcontext.get('__template__') From 7f0db3c257e097c36ae9c8d32c69bf3d5c3ca795 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 5 Jun 2014 12:03:16 +0200 Subject: [PATCH 4/6] [IMP] use Sized for iterable size and remove support for count --- openerp/addons/base/ir/ir_qweb.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/openerp/addons/base/ir/ir_qweb.py b/openerp/addons/base/ir/ir_qweb.py index 1fe1abd35eb..d74ba0566f0 100644 --- a/openerp/addons/base/ir/ir_qweb.py +++ b/openerp/addons/base/ir/ir_qweb.py @@ -358,10 +358,8 @@ class QWeb(orm.AbstractModel): varname = template_attributes['as'].replace('.', '_') copy_qwebcontext = qwebcontext.copy() size = -1 - if isinstance(enum, (list, tuple)): + if isinstance(enum, collections.Sized): size = len(enum) - elif hasattr(enum, 'count'): - size = enum.count() copy_qwebcontext["%s_size" % varname] = size copy_qwebcontext["%s_all" % varname] = enum ru = [] From 0de6710c3c43db55aad94bfb4a59a1f87f4436b4 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 5 Jun 2014 12:05:24 +0200 Subject: [PATCH 5/6] [IMP] guard for None enum, remove 1 level of indent --- openerp/addons/base/ir/ir_qweb.py | 64 +++++++++++++++---------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/openerp/addons/base/ir/ir_qweb.py b/openerp/addons/base/ir/ir_qweb.py index d74ba0566f0..a7183eacc7a 100644 --- a/openerp/addons/base/ir/ir_qweb.py +++ b/openerp/addons/base/ir/ir_qweb.py @@ -354,41 +354,41 @@ class QWeb(orm.AbstractModel): 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) From a9a83d00c94331a02ee400fc06c5915d60e803be Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 5 Jun 2014 17:49:08 +0200 Subject: [PATCH 6/6] [REM] python-qweb support for as-less foreach --- addons/website/views/website_templates.xml | 30 ++++++++++++------- addons/website_event/views/website_event.xml | 17 ++++++----- .../views/website_membership.xml | 8 ++--- 3 files changed, 32 insertions(+), 23 deletions(-) diff --git a/addons/website/views/website_templates.xml b/addons/website/views/website_templates.xml index f6f9c475f57..253424b9401 100644 --- a/addons/website/views/website_templates.xml +++ b/addons/website/views/website_templates.xml @@ -428,29 +428,37 @@ - - + + - - diff --git a/addons/website_event/views/website_event.xml b/addons/website_event/views/website_event.xml index 15bb778ab0b..774d38381fb 100644 --- a/addons/website_event/views/website_event.xml +++ b/addons/website_event/views/website_event.xml @@ -162,10 +162,11 @@
-
+
- + + + -