def run_test_file(self, path): doc = etree.parse(path).getroot() loader = FileSystemLoader(path) context = QWebContext(self.cr, self.uid, {}, loader=loader) qweb = self.env['ir.qweb'] for template in loader: if not template or template.startswith('_'): continue param = doc.find('params[@id="{}"]'.format(template)) # OrderedDict to ensure JSON mappings are iterated in source order # so output is predictable & repeatable params = {} if param is None else json.loads( param.text, object_pairs_hook=collections.OrderedDict) ctx = context.copy() ctx.update(params) result = doc.find('result[@id="{}"]'.format(template)).text self.assertEqual( qweb.render(template, qwebcontext=ctx).strip(), (result or u'').strip().encode('utf-8'), template)
def run_test_file(self, path): doc = etree.parse(path).getroot() loader = FileSystemLoader(path) context = QWebContext(self.cr, self.uid, {}, loader=loader) qweb = self.env['ir.qweb'] for template in loader: if not template or template.startswith('_'): continue param = doc.find('params[@id="{}"]'.format(template)) # OrderedDict to ensure JSON mappings are iterated in source order # so output is predictable & repeatable params = {} if param is None else json.loads(param.text, object_pairs_hook=collections.OrderedDict) ctx = context.copy() ctx.update(params) result = doc.find('result[@id="{}"]'.format(template)).text self.assertEqual( qweb.render(template, qwebcontext=ctx).strip(), (result or u'').strip().encode('utf-8'), template )
def render(self, cr, uid, id_or_xml_id, qwebcontext=None, loader=None, context=None): if qwebcontext is None: qwebcontext = {} if not isinstance(qwebcontext, QWebContext): qwebcontext = QWebContext(cr, uid, qwebcontext, loader=loader, context=context) if context is None: context = {} website_id = context.get('website_id') if website_id: if 'experiment_id' in context: #Is there a version which have the view.key == id_or_xml_id and which is in a running experiment? exp_ver_id = self.pool["website_version.experiment.version"].search(cr, uid, [('version_id.view_ids.key', '=', id_or_xml_id), ('experiment_id.state', '=', 'running'), ('experiment_id.website_id.id', '=', website_id)], context=context) if exp_ver_id: #If yes take the first because there is no overlap between running experiments. exp_version = self.pool["website_version.experiment.version"].browse(cr, uid, [exp_ver_id[0]], context=context) exp = exp_version.experiment_id #We set the google_id as key in the dictionnary to avoid problem when reinitializating the db, exp.google_id is unique version_id = context.get('website_version_experiment').get(str(exp.google_id)) if version_id: context['version_id'] = int(version_id) if 'version_id' in context: version_id = context.get('version_id') if version_id: id_or_xml_id = self.pool["ir.ui.view"].search(cr, uid, [('key', '=', id_or_xml_id), '|', ('version_id', '=', False), ('version_id', '=', version_id), '|', ('website_id', '=', website_id), ('website_id', '=', False)], order='website_id, version_id', limit=1, context=context)[0] else: id_or_xml_id = self.pool["ir.ui.view"].search(cr, uid, [('key', '=', id_or_xml_id), ('version_id', '=', False), '|', ('website_id', '=', website_id), ('website_id', '=', False)], order='website_id', limit=1, context=context)[0] else: id_or_xml_id = self.pool["ir.ui.view"].search(cr, uid, [('key', '=', id_or_xml_id), '|', ('website_id', '=', website_id), ('website_id', '=', False), ('version_id', '=', False)], order='website_id', limit=1, context=context)[0] qwebcontext['__template__'] = id_or_xml_id stack = qwebcontext.get('__stack__', []) if stack: qwebcontext['__caller__'] = stack[-1] stack.append(id_or_xml_id) qwebcontext['__stack__'] = stack qwebcontext['xmlid'] = str(stack[0]) return self.render_node(self.get_template(id_or_xml_id, qwebcontext), qwebcontext)
def _generate_email_batch_get_newsletter_qcontext(self, values=None): return QWebContext( self.env.cr, self.env.uid, dict(env=self.env, request=request, debug=request.debug if request else False, json=simplejson, quote_plus=werkzeug.url_quote_plus, time=time, datetime=datetime, relativedelta=relativedelta, **(values or {})), loader=lambda name: self.env['ir.qweb'].read_template(name), context=self.env.context)
def convert(self, obj, dest): converter = self.registry('ir.qweb.field.monetary') options = { 'widget': 'monetary', 'display_currency': 'c2' } context = dict(inherit_branding=True) converted = converter.to_html( self.cr, self.uid, 'value', obj, options, etree.Element('span'), {'field': 'obj.value', 'field-options': json.dumps(options)}, '', QWebContext(self.env, {'obj': obj, 'c2': dest, }), context=context, ) return converted
def _qcontext(self, locals_dict, tsession): qcontext = QWebContext(self._cr, self._uid, {}) qcontext['data'] = locals_dict['data'] qcontext['subscribed'] = locals_dict.get('subscribed') qcontext['tsession'] = tsession return qcontext
def qwebcontext(self, data): return QWebContext(self.env, data)
def render_tag_call_xpath(self, element, template_attributes, generated_attributes, qwebcontext): if not len(element): template = qwebcontext.get('__template__') raise QWebException("t-call-xpath need to contain children nodes", template=template) d = qwebcontext.copy() d[0] = self.render_element(element, template_attributes, generated_attributes, d) cr = d.get('request') and d['request'].cr or None uid = d.get('request') and d['request'].uid or None template = self.eval_format(template_attributes["call-xpath"], d) try: template = int(template) except ValueError: pass if qwebcontext is None: qwebcontext = {} if not isinstance(qwebcontext, QWebContext): def loader(name): return self.read_template(cr, uid, name, context=d) qwebcontext = QWebContext(cr, uid, qwebcontext, loader=loader, context=d) qwebcontext['__template__'] = template stack = qwebcontext.get('__stack__', []) if stack: qwebcontext['__caller__'] = stack[-1] stack.append(template) qwebcontext['__stack__'] = stack qwebcontext['xmlid'] = str(stack[0]) # Temporary fix inner = self.get_template( template, qwebcontext) #self.render(cr, uid, template, d) res_nodes = [] for spec in element: if spec.tag == 'xpath': nodes = inner.xpath(spec.get('expr')) for node in nodes: if node is not None: pos = spec.get('position', 'childs') if pos == 'childs': for child in node: res_nodes.append(copy.deepcopy(child)) # elif pos == 'attributes': # for child in spec.getiterator('attribute'): # attribute = (child.get('name'), child.text or None) # if attribute[1]: # node.set(attribute[0], attribute[1]) # elif attribute[0] in node.attrib: # del node.attrib[attribute[0]] # else: # sib = node.getnext() # for child in spec: # if pos == 'inside': # node.append(child) # elif pos == 'after': # if sib is None: # node.addnext(child) # node = child # else: # sib.addprevious(child) # elif pos == 'before': # node.addprevious(child) options = simplejson.loads( template_attributes.get('call-options') or '{}') #inner = "".join(map(lambda el: etree.tostring(el), res_nodes)) node_root = etree.Element('div') node_root.set('class', 'row') if options.get('widget', False): widget = self.get_widget_for(options.get('widget')) for node in res_nodes: node_root.append(node) return widget.format(node_root, options, qwebcontext) return inner
def context(self, values): return QWebContext(self.env, values)