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)
Exemple #2
0
    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
            )
Exemple #3
0
    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)
Exemple #4
0
 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)
Exemple #5
0
 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
Exemple #6
0
 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
Exemple #7
0
 def qwebcontext(self, data):
     return QWebContext(self.env, data)
Exemple #8
0
    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
Exemple #9
0
 def context(self, values):
     return QWebContext(self.env, values)