def test_static_templates_treatment_linearity(self):
        # With 2500 templates for starters
        nMod, nFilePerMod, nTemplatePerFile = 50, 5, 10
        self._sick_script(nMod, nFilePerMod, nTemplatePerFile)

        before = datetime.now()
        contents = HomeStaticTemplateHelpers.get_qweb_templates(addons=self._get_module_names(), debug=True)
        after = datetime.now()
        delta2500 = after - before
        _logger.runbot('Static Templates Inheritance: 2500 templates treated in %s seconds' % delta2500.total_seconds())

        whole_tree = etree.fromstring(contents)
        self.assertEqual(len(whole_tree), nMod * nFilePerMod * nTemplatePerFile)

        # With 25000 templates next
        nMod, nFilePerMod, nTemplatePerFile = 50, 5, 100
        self._sick_script(nMod, nFilePerMod, nTemplatePerFile)

        before = datetime.now()
        HomeStaticTemplateHelpers.get_qweb_templates(addons=self._get_module_names(), debug=True)
        after = datetime.now()
        delta25000 = after - before

        time_ratio = delta25000.total_seconds() / delta2500.total_seconds()
        _logger.runbot('Static Templates Inheritance: 25000 templates treated in %s seconds' % delta25000.total_seconds())
        _logger.runbot('Static Templates Inheritance: Computed linearity ratio: %s' % time_ratio)
        self.assertLessEqual(time_ratio, 12)
    def test_static_misordered_modules(self):
        self.modules.reverse()
        with self.assertRaises(ValueError) as ve:
            HomeStaticTemplateHelpers.get_qweb_templates(addons=self._get_module_names(), debug=True)

        self.assertEqual(
            str(ve.exception),
            'Module module_1 not loaded or inexistent, or templates of addon being loaded (module_2) are misordered'
        )
예제 #3
0
    def test_performance_25000(self):
        nMod, nFilePerMod, nTemplatePerFile = 50, 5, 100
        self._sick_script(nMod, nFilePerMod, nTemplatePerFile)

        before = datetime.now()
        HomeStaticTemplateHelpers.get_qweb_templates(
            addons=self._get_module_names(), debug=True)
        after = datetime.now()

        self.assertLessEqual(after - before, timedelta(milliseconds=1000))
예제 #4
0
    def _prepare_project_sharing_session_info(self, project):
        session_info = request.env['ir.http'].session_info()
        user_context = request.session.get_context(
        ) if request.session.uid else {}
        mods = conf.server_wide_modules or []
        qweb_checksum = HomeStaticTemplateHelpers.get_qweb_templates_checksum(
            debug=request.session.debug, bundle="project.assets_qweb")
        lang = user_context.get("lang")
        translation_hash = request.env[
            'ir.translation'].get_web_translations_hash(mods, lang)
        cache_hashes = {
            "qweb": qweb_checksum,
            "translations": translation_hash,
        }

        project_company = project.company_id
        session_info.update(
            cache_hashes=cache_hashes,
            action_name='project.project_sharing_project_task_action',
            project_id=project.id,
            user_companies={
                'current_company': project_company.id,
                'allowed_companies': {
                    project_company.id: {
                        'id': project_company.id,
                        'name': project_company.name,
                    },
                },
            },
            # FIXME: See if we prefer to give only the currency that the portal user just need to see the correct information in project sharing
            currencies=request.env['ir.http'].get_currencies(),
        )
        return session_info
예제 #5
0
    def test_static_inheritance_01(self):
        contents = HomeStaticTemplateHelpers.get_qweb_templates(
            addons=self._get_module_names(), debug=True)
        expected = b"""
            <templates>
                <form t-name="template_1_1" random-attr="gloria">
                    <div>At first I was afraid</div>
                    <div>Kept thinking I could never live without you by my side</div>
                </form>
                <t t-name="template_1_2">
                    <div>And I grew strong</div>
                    <div>And I learned how to get along</div>
                </t>
                <form t-name="template_2_1" random-attr="gloria">
                    <div>At first I was afraid</div>
                    <div>I was petrified</div>
                    <div>But then I spent so many nights thinking how you did me wrong</div>
                    <div>Kept thinking I could never live without you by my side</div>
                </form>
                <div t-name="template_2_2">
                    <div>And I learned how to get along</div>
                </div>
            </templates>
        """

        self.assertXMLEqual(contents, expected)
예제 #6
0
    def test_replace_in_debug_mode(self):
        """
        Replacing a template's meta definition in place doesn't keep the original attrs of the template
        """
        self.asset_paths = [
            ('module_1_file_1', 'module_1', 'bundle_1'),
        ]
        self.template_files = {
            'module_1_file_1':
            b"""
                <templates id="template" xml:space="preserve">
                    <form t-name="template_1_1" random-attr="gloria">
                        <div>At first I was afraid</div>
                    </form>
                    <t t-name="template_1_2" t-inherit="template_1_1" t-inherit-mode="extension">
                        <xpath expr="." position="replace">
                            <div overriden-attr="overriden">And I grew strong</div>
                        </xpath>
                    </t>
                </templates>
                """,
        }

        contents = HomeStaticTemplateHelpers.get_qweb_templates(
            addons=self._get_module_names(), debug=True)
        expected = b"""
            <templates>
                <div overriden-attr="overriden" t-name="template_1_1">
                    And I grew strong
                </div>
            </templates>
        """

        self.assertXMLEqual(contents, expected)
    def test_static_inheritance_02(self):
        self.template_files = {
            'module_1_file_1': b'''
                <templates id="template" xml:space="preserve">
                    <form t-name="template_1_1" random-attr="gloria">
                        <div>At first I was afraid</div>
                        <div>Kept thinking I could never live without you by my side</div>
                    </form>
                    <form t-name="template_1_2" t-inherit="template_1_1" added="true">
                        <xpath expr="//div[1]" position="after">
                            <div>I was petrified</div>
                        </xpath>
                    </form>
                </templates>
            '''
        }
        self.modules = [
            ('module_1_file_1', None, 'module_1'),
        ]
        contents = HomeStaticTemplateHelpers.get_qweb_templates(addons=self._get_module_names(), debug=True)
        expected = b"""
            <templates>
                <form t-name="template_1_1" random-attr="gloria">
                    <div>At first I was afraid</div>
                    <div>Kept thinking I could never live without you by my side</div>
                </form>
                <form t-name="template_1_2" random-attr="gloria" added="true">
                    <div>At first I was afraid</div>
                    <div>I was petrified</div>
                    <div>Kept thinking I could never live without you by my side</div>
                </form>
            </templates>
        """

        self.assertXMLEqual(contents, expected)
예제 #8
0
    def test_replace_root_node_tag_in_primary(self):
        """
<<<<<<< HEAD
        Root node is not targeted by //NODE_TAG in xpath
=======
        Root node IS targeted by //NODE_TAG in xpath
>>>>>>> f0a66d05e70e432d35dc68c9fb1e1cc6e51b40b8
        """
        self.maxDiff = None
        self.modules = [
            ('module_1_file_1', None, 'module_1'),
        ]
        self.template_files = {
            'module_1_file_1': b"""
                <templates id="template" xml:space="preserve">
                    <form t-name="template_1_1" random-attr="gloria">
                        <div>At first I was afraid</div>
                        <form>Inner Form</form>
                    </form>
<<<<<<< HEAD
                    <t t-name="template_1_2" t-inherit="template_1_1" t-inherit-mode="primary">
                        <xpath expr="//form" position="replace">
                            <div>Form replacer</div>
                        </xpath>
                    </t>
=======
                    <form t-name="template_1_2" t-inherit="template_1_1" t-inherit-mode="primary">
                        <xpath expr="//form" position="replace">
                            <div>Form replacer</div>
                        </xpath>
                    </form>
>>>>>>> f0a66d05e70e432d35dc68c9fb1e1cc6e51b40b8
                </templates>
                """,
        }

        contents = HomeStaticTemplateHelpers.get_qweb_templates(addons=self._get_module_names(), debug=True)
        expected = b"""
            <templates>
                <form t-name="template_1_1" random-attr="gloria">
                    <div>At first I was afraid</div>
                    <form>Inner Form</form>
                </form>
<<<<<<< HEAD
                <form t-name="template_1_2" random-attr="gloria" t-inherit="template_1_1">
                    <div>At first I was afraid</div>
                    <div>Form replacer</div>
                </form>
=======
                <div t-name="template_1_2">
                    Form replacer
                </div>
>>>>>>> f0a66d05e70e432d35dc68c9fb1e1cc6e51b40b8
            </templates>
        """

        self.assertXMLEqual(contents, expected)
예제 #9
0
    def test_static_templates_treatment_linearity(self):
        # With 2500 templates for starters
        nMod, nFilePerMod, nTemplatePerFile = 50, 5, 10
        self._sick_script(nMod, nFilePerMod, nTemplatePerFile)

        before = datetime.now()
        contents = HomeStaticTemplateHelpers.get_qweb_templates(addons=self._get_module_names(), debug=True)
        after = datetime.now()
        delta2500 = after - before
예제 #10
0
    def test_sibling_extension(self):
        self.modules = [
            ('module_1_file_1', None, 'module_1'),
            ('module_2_file_1', None, 'module_2'),
            ('module_3_file_1', None, 'module_3'),
        ]
        self.template_files = {
            'module_1_file_1':
            b'''
                <templates id="template" xml:space="preserve">
                    <form t-name="template_1_1">
                        <div>I am a man of constant sorrow</div>
                        <div>I've seen trouble all my days</div>
                    </form>
                </templates>
            ''',
            'module_2_file_1':
            b'''
                <templates id="template" xml:space="preserve">
                    <form t-name="template_2_1" t-inherit="module_1.template_1_1" t-inherit-mode="extension">
                        <xpath expr="//div[1]" position="after">
                            <div>In constant sorrow all through his days</div>
                        </xpath>
                    </form>
                </templates>
            ''',
            'module_3_file_1':
            b'''
                <templates id="template" xml:space="preserve">
                    <form t-name="template_3_1" t-inherit="module_1.template_1_1" t-inherit-mode="extension">
                        <xpath expr="//div[2]" position="after">
                            <div>Oh Brother !</div>
                        </xpath>
                    </form>
                </templates>
            '''
        }

        contents = HomeStaticTemplateHelpers.get_qweb_templates(
            addons=self._get_module_names(), debug=True)
        expected = b"""
            <templates>
                <form t-name="template_1_1">
                    <div>I am a man of constant sorrow</div>
                    <!-- Modified by template_2_1 from module_2 -->
                    <div>In constant sorrow all through his days</div>
                    <!-- Modified by template_3_1 from module_3 -->
                    <div>Oh Brother !</div>
                    <div>I've seen trouble all my days</div>
                </form>
            </templates>
        """

        self.assertXMLEqual(contents, expected)
    def test_static_misordered_templates(self):
        self.template_files['module_2_file_1'] = b"""
            <templates id="template" xml:space="preserve">
                <form t-name="template_2_1" t-inherit="module_2.template_2_2" t-inherit-mode="primary">
                    <xpath expr="//div[1]" position="after">
                        <div>I was petrified</div>
                    </xpath>
                </form>
                <div t-name="template_2_2">
                    <div>And I learned how to get along</div>
                </div>
            </templates>
        """
        with self.assertRaises(ValueError) as ve:
            HomeStaticTemplateHelpers.get_qweb_templates(addons=self._get_module_names(), debug=True)

        self.assertEqual(
            str(ve.exception),
            'No template found to inherit from. Module module_2 and template name template_2_2'
        )
    def session_info(self):
        session_info = super(Http, self).session_info()
        user = request.env.user

        if user.check_user_is_draft_seller() or user.check_user_is_seller():
            user_context = request.session.get_context(
            ) if request.session.uid else {}
            mods = module_boot()
            qweb_checksum = HomeStaticTemplateHelpers.get_qweb_templates_checksum(
                addons=mods, debug=request.session.debug)
            lang = user_context.get("lang")
            translations_per_module, lang_params = request.env[
                'ir.translation'].get_translations_for_webclient(mods, lang)
            translation_cache = {
                'lang':
                lang,
                'lang_parameters':
                lang_params,
                'modules':
                translations_per_module,
                'multi_lang':
                len(request.env['res.lang'].sudo().get_installed()) > 1,
            }
            menu_json_utf8 = json.dumps(request.env['ir.ui.menu'].load_menus(
                request.session.debug),
                                        default=ustr,
                                        sort_keys=True).encode()
            translations_json_utf8 = json.dumps(translation_cache,
                                                sort_keys=True).encode()
            cache_hashes = {
                "load_menus": hashlib.sha1(menu_json_utf8).hexdigest(),
                "qweb": qweb_checksum,
                "translations":
                hashlib.sha1(translations_json_utf8).hexdigest(),
            }
            session_info.update({
                "user_companies": {
                    'current_company':
                    (user.company_id.id, user.company_id.name),
                    'allowed_companies':
                    [(comp.id, comp.name) for comp in user.company_ids]
                },
                "currencies":
                self.get_currencies(),
                "show_effect":
                True,
                "display_switch_company_menu":
                user.has_group('base.group_multi_company')
                and len(user.company_ids) > 1,
                "cache_hashes":
                cache_hashes,
            })
        return session_info
예제 #13
0
    def session_info(self):
        user = request.env.user
        version_info = odoo.service.common.exp_version()

        user_context = request.session.get_context() if request.session.uid else {}

        session_info = {
            "uid": request.session.uid,
            "is_system": user._is_system() if request.session.uid else False,
            "is_admin": user._is_admin() if request.session.uid else False,
            "user_context": request.session.get_context() if request.session.uid else {},
            "db": request.session.db,
            "server_version": version_info.get('server_version'),
            "server_version_info": version_info.get('server_version_info'),
            "name": user.name,
            "username": user.login,
            "partner_display_name": user.partner_id.display_name,
            "company_id": user.company_id.id if request.session.uid else None,  # YTI TODO: Remove this from the user context
            "partner_id": user.partner_id.id if request.session.uid and user.partner_id else None,
            "web.base.url": self.env['ir.config_parameter'].sudo().get_param('web.base.url', default=''),
        }
        if self.env.user.has_group('base.group_user'):
            # the following is only useful in the context of a webclient bootstrapping
            # but is still included in some other calls (e.g. '/web/session/authenticate')
            # to avoid access errors and unnecessary information, it is only included for users
            # with access to the backend ('internal'-type users)
            mods = module_boot()
            qweb_checksum = HomeStaticTemplateHelpers.get_qweb_templates_checksum(addons=mods, debug=request.session.debug)
            lang = user_context.get("lang")
            translations_per_module, lang_params = request.env['ir.translation'].get_translations_for_webclient(mods, lang)
            translation_cache = {
                'lang': lang,
                'lang_parameters': lang_params,
                'modules': translations_per_module,
                'multi_lang': len(request.env['res.lang'].sudo().get_installed()) > 1,
            }
            menu_json_utf8 = json.dumps(request.env['ir.ui.menu'].load_menus(request.session.debug), default=ustr, sort_keys=True).encode()
            translations_json_utf8 = json.dumps(translation_cache, sort_keys=True).encode()
            cache_hashes = {
                "load_menus": hashlib.sha512(menu_json_utf8).hexdigest()[:64], # sha512/256
                "qweb": qweb_checksum,
                "translations": hashlib.sha512(translations_json_utf8).hexdigest()[:64], # sha512/256
            }
            session_info.update({
                # current_company should be default_company
                "user_companies": {'current_company': (user.company_id.id, user.company_id.name), 'allowed_companies': [(comp.id, comp.name) for comp in user.company_ids]},
                "currencies": self.get_currencies(),
                "show_effect": True,
                "display_switch_company_menu": user.has_group('base.group_multi_company') and len(user.company_ids) > 1,
                "cache_hashes": cache_hashes,
            })
        return session_info
예제 #14
0
    def test_performance_2500(self):
        nMod, nFilePerMod, nTemplatePerFile = 50, 5, 10
        self._sick_script(nMod, nFilePerMod, nTemplatePerFile)

        before = datetime.now()
        contents = HomeStaticTemplateHelpers.get_qweb_templates(
            addons=self._get_module_names(), debug=True)
        after = datetime.now()
        self.assertLessEqual(after - before, timedelta(milliseconds=130))

        whole_tree = etree.fromstring(contents)
        self.assertEqual(len(whole_tree),
                         nMod * nFilePerMod * nTemplatePerFile)
예제 #15
0
    def test_replace_in_debug_mode3(self):
        """Text outside of a div which will replace a whole template
        becomes outside of the template
        This doesn't mean anything in terms of the business of template inheritance
        But it is in the XPATH specs"""
        self.modules = [
            ('module_1_file_1', None, 'module_1'),
        ]
        self.template_files = {
            'module_1_file_1': b"""
                <templates id="template" xml:space="preserve">
                    <form t-name="template_1_1" random-attr="gloria">
                        <div>At first I was afraid</div>
                    </form>
                    <t t-name="template_1_2" t-inherit="template_1_1" t-inherit-mode="extension">
                        <xpath expr="." position="replace">
                            <div>
                                And I grew strong
                                <p>And I learned how to get along</p>
                            </div>
                            And so you're back
                        </xpath>
                    </t>
                </templates>
                """,
        }

        contents = HomeStaticTemplateHelpers.get_qweb_templates(addons=self._get_module_names(), debug=True)
        expected = b"""
            <templates>
<<<<<<< HEAD
                <form>
                    <!-- Modified by template_1_2 from module_1 -->
                    And I grew strong
                    <p>And I learned how to get along</p>
                </form>
=======
                <div t-name="template_1_1">
                    <!-- Modified by template_1_2 from module_1 -->
                    And I grew strong
                    <p>And I learned how to get along</p>
                </div>
>>>>>>> f0a66d05e70e432d35dc68c9fb1e1cc6e51b40b8
                And so you're back
            </templates>
        """

        self.assertXMLEqual(contents, expected)
예제 #16
0
    def test_inherit_primary_replace_debug(self):
        """
        The inheriting template has got both its own defining attrs
        and new ones if one is to replace its defining root node
        """
        self.modules = [
            ('module_1_file_1', None, 'module_1'),
        ]
        self.template_files = {
            'module_1_file_1': b"""
                <templates id="template" xml:space="preserve">
                    <form t-name="template_1_1" random-attr="gloria">
                        <div>At first I was afraid</div>
                    </form>
                    <t t-name="template_1_2" t-inherit="template_1_1" t-inherit-mode="primary">
                        <xpath expr="." position="replace">
                            <div overriden-attr="overriden">
                                And I grew strong
                                <p>And I learned how to get along</p>
                            </div>
                        </xpath>
                    </t>
                </templates>
                """,
        }

        contents = HomeStaticTemplateHelpers.get_qweb_templates(addons=self._get_module_names(), debug=True)
        expected = b"""
            <templates>
                <form t-name="template_1_1" random-attr="gloria">
                    <div>At first I was afraid</div>
                 </form>
<<<<<<< HEAD
                 <form overriden-attr="overriden" t-name="template_1_2" t-inherit="template_1_1">
                    And I grew strong
                    <p>And I learned how to get along</p>
                 </form>
=======
                 <div overriden-attr="overriden" t-name="template_1_2">
                    And I grew strong
                    <p>And I learned how to get along</p>
                 </div>
>>>>>>> f0a66d05e70e432d35dc68c9fb1e1cc6e51b40b8
            </templates>
        """

        self.assertXMLEqual(contents, expected)
예제 #17
0
    def session_info(self):

        user = request.env.user

        user_context = request.session.get_context(
        ) if request.session.uid else {}

        result = super().session_info()
        if self.env.user.has_group('base.group_portal'):
            # the following is only useful in the context of a webclient bootstrapping
            # but is still included in some other calls (e.g. '/web/session/authenticate')
            # to avoid access errors and unnecessary information, it is only included for users
            # with access to the backend ('internal'-type users)
            mods = module_boot()
            qweb_checksum = HomeStaticTemplateHelpers.get_qweb_templates_checksum(
                addons=mods, debug=request.session.debug)
            lang = user_context.get("lang")
            translation_hash = request.env[
                'ir.translation'].get_web_translations_hash(mods, lang)
            menu_json_utf8 = json.dumps(request.env['ir.ui.menu'].load_menus(
                request.session.debug),
                                        default=ustr,
                                        sort_keys=True).encode()
            cache_hashes = {
                "load_menus": hashlib.sha1(menu_json_utf8).hexdigest(),
                "qweb": qweb_checksum,
                "translations": translation_hash,
            }
            result.update({
                # current_company should be default_company
                "user_companies": {
                    'current_company':
                    (user.company_id.id, user.company_id.name),
                    'allowed_companies':
                    [(comp.id, comp.name) for comp in user.company_ids]
                },
                "currencies":
                self.get_currencies(),
                "show_effect":
                True,
                "display_switch_company_menu":
                user.has_group('base.group_multi_company')
                and len(user.company_ids) > 1,
                "cache_hashes":
                cache_hashes,
            })
        return result
예제 #18
0
    def session_info(self):
        user = request.env.user
        version_info = odoo.service.common.exp_version()

        user_context = request.session.get_context() if request.session.uid else {}

        mods = module_boot()
        qweb_checksum = HomeStaticTemplateHelpers.get_qweb_templates_checksum(addons=mods, debug=request.session.debug)

        lang = user_context.get("lang")
        translations_per_module, lang_params = request.env['ir.translation'].get_translations_for_webclient(mods, lang)
        translation_cache = {
            'lang': lang,
            'lang_parameters': lang_params,
            'modules': translations_per_module,
            'multi_lang': len(request.env['res.lang'].sudo().get_installed()) > 1,
        }

        menu_json_utf8 = json.dumps(request.env['ir.ui.menu'].load_menus(request.session.debug), default=ustr, sort_keys=True).encode()
        translations_json_utf8 = json.dumps(translation_cache, sort_keys=True).encode()

        return {
            "uid": request.session.uid,
            "is_system": user._is_system() if request.session.uid else False,
            "is_admin": user._is_admin() if request.session.uid else False,
            "user_context": request.session.get_context() if request.session.uid else {},
            "db": request.session.db,
            "server_version": version_info.get('server_version'),
            "server_version_info": version_info.get('server_version_info'),
            "name": user.name,
            "username": user.login,
            "partner_display_name": user.partner_id.display_name,
            "company_id": user.company_id.id if request.session.uid else None,  # YTI TODO: Remove this from the user context
            "partner_id": user.partner_id.id if request.session.uid and user.partner_id else None,
            # current_company should be default_company
            "user_companies": {'current_company': (user.company_id.id, user.company_id.name), 'allowed_companies': [(comp.id, comp.name) for comp in user.company_ids]},
            "currencies": self.get_currencies() if request.session.uid else {},
            "web.base.url": self.env['ir.config_parameter'].sudo().get_param('web.base.url', default=''),
            "show_effect": True,
            "display_switch_company_menu": user.has_group('base.group_multi_company') and len(user.company_ids) > 1,
            "cache_hashes": {
                "load_menus": hashlib.sha1(menu_json_utf8).hexdigest(),
                "qweb": qweb_checksum,
                "translations": hashlib.sha1(translations_json_utf8).hexdigest(),
            },
        }
예제 #19
0
    def test_static_inherit_extended_template(self):
        self.modules = [
            ('module_1_file_1', None, 'module_1'),
        ]
        self.template_files = {
            'module_1_file_1':
            b'''
                <templates id="template" xml:space="preserve">
                    <form t-name="template_1_1">
                        <div>At first I was afraid</div>
                        <div>Kept thinking I could never live without you by my side</div>
                    </form>
                    <form t-name="template_1_2" t-inherit="template_1_1" t-inherit-mode="extension">
                        <xpath expr="//div[1]" position="after">
                            <div>I was petrified</div>
                        </xpath>
                    </form>
                    <form t-name="template_1_3" t-inherit="template_1_1" t-inherit-mode="primary">
                        <xpath expr="//div[3]" position="after">
                            <div>But then I spent so many nights thinking how you did me wrong</div>
                        </xpath>
                    </form>
                </templates>
            ''',
        }
        contents = HomeStaticTemplateHelpers.get_qweb_templates(
            addons=self._get_module_names(), debug=True)
        expected = b"""
            <templates>
                <form t-name="template_1_1">
                    <div>At first I was afraid</div>
                    <!-- Modified by template_1_2 from module_1 -->
                    <div>I was petrified</div>
                    <div>Kept thinking I could never live without you by my side</div>
                </form>
                <form t-name="template_1_3">
                    <div>At first I was afraid</div>
                    <div>I was petrified</div>
                    <div>Kept thinking I could never live without you by my side</div>
                    <div>But then I spent so many nights thinking how you did me wrong</div>
                </form>
            </templates>
        """

        self.assertXMLEqual(contents, expected)
예제 #20
0
    def test_replace_in_debug_mode2(self):
        self.modules = [
            ('module_1_file_1', None, 'module_1'),
        ]
        self.template_files = {
            'module_1_file_1': b"""
                <templates id="template" xml:space="preserve">
                    <form t-name="template_1_1" random-attr="gloria">
                        <div>At first I was afraid</div>
                    </form>
                    <t t-name="template_1_2" t-inherit="template_1_1" t-inherit-mode="extension">
                        <xpath expr="." position="replace">
                            <div>
                                And I grew strong
                                <p>And I learned how to get along</p>
                                And so you're back
                            </div>
                        </xpath>
                    </t>
                </templates>
                """,
        }

        contents = HomeStaticTemplateHelpers.get_qweb_templates(addons=self._get_module_names(), debug=True)
        expected = b"""
            <templates>
<<<<<<< HEAD
                <form>
                    <!-- Modified by template_1_2 from module_1 -->And I grew strong
                    <p>And I learned how to get along</p>
                    And so you're back
                </form>
=======
                <div t-name="template_1_1">
                    <!-- Modified by template_1_2 from module_1 -->
                    And I grew strong
                    <p>And I learned how to get along</p>
                    And so you're back
                </div>
>>>>>>> f0a66d05e70e432d35dc68c9fb1e1cc6e51b40b8
            </templates>
        """

        self.assertXMLEqual(contents, expected)
예제 #21
0
    def test_replace_in_nodebug_mode1(self):
        """Comments already in the arch are ignored"""
        self.modules = [
            ('module_1_file_1', None, 'module_1'),
        ]
        self.template_files = {
            'module_1_file_1': b"""
                <templates id="template" xml:space="preserve">
                    <form t-name="template_1_1" random-attr="gloria">
                        <div>At first I was afraid</div>
                    </form>
                    <t t-name="template_1_2" t-inherit="template_1_1" t-inherit-mode="extension">
                        <xpath expr="." position="replace">
                            <div>
                                <!-- Random Comment -->
                                And I grew strong
                                <p>And I learned how to get along</p>
                                And so you're back
                            </div>
                        </xpath>
                    </t>
                </templates>
                """,
        }

        contents = HomeStaticTemplateHelpers.get_qweb_templates(addons=self._get_module_names(), debug=False)
        expected = b"""
            <templates>
<<<<<<< HEAD
                <form>
                    And I grew strong
                    <p>And I learned how to get along</p>
                    And so you're back
                </form>
=======
                <div t-name="template_1_1">
                    And I grew strong
                    <p>And I learned how to get along</p>
                    And so you're back
                </div>
            </templates>
        """

        self.assertXMLEqual(contents, expected)
예제 #22
0
    def test_inherit_from_dotted_tname_3(self):
        self.asset_paths = [
            ('module_1_file_1', 'module_1', 'bundle_1'),
            ('module_2_file_1', 'module_2', 'bundle_1'),
        ]
        self.template_files = {
            'module_1_file_1':
            b"""
                <templates id="template" xml:space="preserve">
                    <form t-name="module_1.template_1_1.dot" random-attr="gloria">
                        <div>At first I was afraid</div>
                    </form>
                </templates>
                """,
            'module_2_file_1':
            b"""
                <templates id="template" xml:space="preserve">
                    <t t-name="template_2_1" t-inherit="module_1.template_1_1.dot" t-inherit-mode="primary">
                        <xpath expr="." position="replace">
                            <div overriden-attr="overriden">
                                And I grew strong
                                <p>And I learned how to get along</p>
                            </div>
                        </xpath>
                    </t>
                </templates>
            """
        }

        contents = HomeStaticTemplateHelpers.get_qweb_templates(
            addons=self._get_module_names(), debug=True)
        expected = b"""
            <templates>
                <form t-name="module_1.template_1_1.dot" random-attr="gloria">
                    <div>At first I was afraid</div>
                 </form>
                 <div overriden-attr="overriden" t-name="template_2_1">
                    And I grew strong
                    <p>And I learned how to get along</p>
                 </div>
            </templates>
        """

        self.assertXMLEqual(contents, expected)
예제 #23
0
    def test_static_inheritance_in_same_module(self):
        self.asset_paths = [
            ('module_1_file_1', 'module_1', 'bundle_1'),
            ('module_1_file_2', 'module_1', 'bundle_1'),
        ]

        self.template_files = {
            'module_1_file_1':
            b'''
                <templates id="template" xml:space="preserve">
                    <form t-name="template_1_1">
                        <div>At first I was afraid</div>
                        <div>Kept thinking I could never live without you by my side</div>
                    </form>
                </templates>
            ''',
            'module_1_file_2':
            b'''
                <templates id="template" xml:space="preserve">
                    <form t-name="template_1_2" t-inherit="template_1_1" t-inherit-mode="primary">
                        <xpath expr="//div[1]" position="after">
                            <div>I was petrified</div>
                        </xpath>
                    </form>
                </templates>
            '''
        }
        contents = HomeStaticTemplateHelpers.get_qweb_templates(
            addons=self._get_module_names(), debug=True)
        expected = b"""
            <templates>
                <form t-name="template_1_1">
                    <div>At first I was afraid</div>
                    <div>Kept thinking I could never live without you by my side</div>
                </form>
                <form t-name="template_1_2">
                    <div>At first I was afraid</div>
                    <div>I was petrified</div>
                    <div>Kept thinking I could never live without you by my side</div>
                </form>
            </templates>
        """

        self.assertXMLEqual(contents, expected)
예제 #24
0
 def session_info(self):
     user = request.env.user
     result = super(IrHttp, self).session_info()
     if self.env.user.has_group('base.group_user'):
         result['notification_type'] = user.notification_type
     assets_discuss_public_hash = HomeStaticTemplateHelpers.get_qweb_templates_checksum(debug=request.session.debug, bundle='mail.assets_discuss_public')
     result['cache_hashes']['assets_discuss_public'] = assets_discuss_public_hash
     guest = self.env.context.get('guest')
     if guest:
         user_context = {'lang': guest.lang}
         mods = odoo.conf.server_wide_modules or []
         lang = user_context.get("lang")
         translation_hash = request.env['ir.translation'].sudo().get_web_translations_hash(mods, lang)
         result['cache_hashes']['translations'] = translation_hash
         result.update({
             'name': guest.name,
             'user_context': user_context,
         })
     return result
예제 #25
0
    def test_replace_root_node_tag_in_primary(self):
        """
        Root node IS targeted by //NODE_TAG in xpath
        """
        self.maxDiff = None
        self.asset_paths = [
            ('module_1_file_1', 'module_1', 'bundle_1'),
        ]
        self.template_files = {
            'module_1_file_1':
            b"""
                <templates id="template" xml:space="preserve">
                    <form t-name="template_1_1" random-attr="gloria">
                        <div>At first I was afraid</div>
                        <form>Inner Form</form>
                    </form>
                    <form t-name="template_1_2" t-inherit="template_1_1" t-inherit-mode="primary">
                        <xpath expr="//form" position="replace">
                            <div>Form replacer</div>
                        </xpath>
                    </form>
                </templates>
                """,
        }

        contents = HomeStaticTemplateHelpers.get_qweb_templates(
            addons=self._get_module_names(), debug=True)
        expected = b"""
            <templates>
                <form t-name="template_1_1" random-attr="gloria">
                    <div>At first I was afraid</div>
                    <form>Inner Form</form>
                </form>
                <div t-name="template_1_2">
                    Form replacer
                </div>
            </templates>
        """

        self.assertXMLEqual(contents, expected)
예제 #26
0
파일: portal.py 프로젝트: budisentosa/odoo
    def render_project_backend_view(self, project_id):
        project = request.env['project.project'].sudo().browse(project_id)
        if not project.exists() or not project.with_user(
                request.env.user)._check_project_sharing_access():
            return request.not_found()

        session_info = request.env['ir.http'].session_info()
        user_context = request.session.get_context(
        ) if request.session.uid else {}
        mods = conf.server_wide_modules or []
        qweb_checksum = HomeStaticTemplateHelpers.get_qweb_templates_checksum(
            debug=request.session.debug, bundle="project.assets_qweb")
        lang = user_context.get("lang")
        translation_hash = request.env[
            'ir.translation'].get_web_translations_hash(mods, lang)
        cache_hashes = {
            "qweb": qweb_checksum,
            "translations": translation_hash,
        }

        project_company = project.company_id
        session_info.update(
            cache_hashes=cache_hashes,
            action_name='project.project_sharing_project_task_action',
            project_id=project.id,
            user_companies={
                'current_company': project_company.id,
                'allowed_companies': {
                    project_company.id: {
                        'id': project_company.id,
                        'name': project_company.name,
                    },
                },
            },
        )

        return request.render(
            'project.project_sharing_embed',
            {'session_info': session_info},
        )
예제 #27
0
    def test_replace_in_debug_mode2(self):
        self.asset_paths = [
            ('module_1_file_1', 'module_1', 'bundle_1'),
        ]
        self.template_files = {
            'module_1_file_1':
            b"""
                <templates id="template" xml:space="preserve">
                    <form t-name="template_1_1" random-attr="gloria">
                        <div>At first I was afraid</div>
                    </form>
                    <t t-name="template_1_2" t-inherit="template_1_1" t-inherit-mode="extension">
                        <xpath expr="." position="replace">
                            <div>
                                And I grew strong
                                <p>And I learned how to get along</p>
                                And so you're back
                            </div>
                        </xpath>
                    </t>
                </templates>
                """,
        }

        contents = HomeStaticTemplateHelpers.get_qweb_templates(
            addons=self._get_module_names(), debug=True)
        expected = b"""
            <templates>
                <div t-name="template_1_1">
                    And I grew strong
                    <p>And I learned how to get along</p>
                    And so you're back
                </div>
            </templates>
        """

        self.assertXMLEqual(contents, expected)
예제 #28
0
            "company_id": user.company_id.id if request.session.uid else None,  # YTI TODO: Remove this from the user context
            "partner_id": user.partner_id.id if request.session.uid and user.partner_id else None,
<<<<<<< HEAD
            "web.base.url": self.env['ir.config_parameter'].sudo().get_param('web.base.url', default=''),
=======
            "web.base.url": IrConfigSudo.get_param('web.base.url', default=''),
            "active_ids_limit": int(IrConfigSudo.get_param('web.active_ids_limit', default='20000')),
>>>>>>> f0a66d05e70e432d35dc68c9fb1e1cc6e51b40b8
        }
        if self.env.user.has_group('base.group_user'):
            # the following is only useful in the context of a webclient bootstrapping
            # but is still included in some other calls (e.g. '/web/session/authenticate')
            # to avoid access errors and unnecessary information, it is only included for users
            # with access to the backend ('internal'-type users)
            mods = module_boot()
            qweb_checksum = HomeStaticTemplateHelpers.get_qweb_templates_checksum(addons=mods, debug=request.session.debug)
            lang = user_context.get("lang")
            translation_hash = request.env['ir.translation'].get_web_translations_hash(mods, lang)
            menu_json_utf8 = json.dumps(request.env['ir.ui.menu'].load_menus(request.session.debug), default=ustr, sort_keys=True).encode()
            cache_hashes = {
<<<<<<< HEAD
                "load_menus": hashlib.sha1(menu_json_utf8).hexdigest(),
=======
                "load_menus": hashlib.sha512(menu_json_utf8).hexdigest()[:64], # sha512/256
>>>>>>> f0a66d05e70e432d35dc68c9fb1e1cc6e51b40b8
                "qweb": qweb_checksum,
                "translations": translation_hash,
            }
            session_info.update({
                # current_company should be default_company
                "user_companies": {'current_company': (user.company_id.id, user.company_id.name), 'allowed_companies': [(comp.id, comp.name) for comp in user.company_ids]},
예제 #29
0
        contents = HomeStaticTemplateHelpers.get_qweb_templates(addons=self._get_module_names(), debug=True)
        after = datetime.now()
        delta2500 = after - before
<<<<<<< HEAD
        _logger.log(25, 'Static Templates Inheritance: 2500 templates treated in %s seconds' % delta2500.total_seconds())
=======
        _logger.runbot('Static Templates Inheritance: 2500 templates treated in %s seconds' % delta2500.total_seconds())
>>>>>>> f0a66d05e70e432d35dc68c9fb1e1cc6e51b40b8

        whole_tree = etree.fromstring(contents)
        self.assertEqual(len(whole_tree), nMod * nFilePerMod * nTemplatePerFile)

        # With 25000 templates next
        nMod, nFilePerMod, nTemplatePerFile = 50, 5, 100
        self._sick_script(nMod, nFilePerMod, nTemplatePerFile)

        before = datetime.now()
        HomeStaticTemplateHelpers.get_qweb_templates(addons=self._get_module_names(), debug=True)
        after = datetime.now()
        delta25000 = after - before

        time_ratio = delta25000.total_seconds() / delta2500.total_seconds()
<<<<<<< HEAD
        _logger.log(25, 'Static Templates Inheritance: 25000 templates treated in %s seconds' % delta25000.total_seconds())
        _logger.log(25, 'Static Templates Inheritance: Computed linearity ratio: %s' % time_ratio)
=======
        _logger.runbot('Static Templates Inheritance: 25000 templates treated in %s seconds' % delta25000.total_seconds())
        _logger.runbot('Static Templates Inheritance: Computed linearity ratio: %s' % time_ratio)
>>>>>>> f0a66d05e70e432d35dc68c9fb1e1cc6e51b40b8
        self.assertLessEqual(time_ratio, 10)
예제 #30
0
파일: ir_http.py 프로젝트: iCart/odoo
    def session_info(self):
        user = request.env.user
        version_info = odoo.service.common.exp_version()

        user_context = request.session.get_context(
        ) if request.session.uid else {}
        IrConfigSudo = self.env['ir.config_parameter'].sudo()
        max_file_upload_size = int(
            IrConfigSudo.get_param(
                'web.max_file_upload_size',
                default=128 * 1024 * 1024,  # 128MiB
            ))

        session_info = {
            "uid":
            request.session.uid,
            "is_system":
            user._is_system() if request.session.uid else False,
            "is_admin":
            user._is_admin() if request.session.uid else False,
            "user_context":
            request.session.get_context() if request.session.uid else {},
            "db":
            request.session.db,
            "server_version":
            version_info.get('server_version'),
            "server_version_info":
            version_info.get('server_version_info'),
            "name":
            user.name,
            "username":
            user.login,
            "partner_display_name":
            user.partner_id.display_name,
            "company_id":
            user.company_id.id if request.session.uid else
            None,  # YTI TODO: Remove this from the user context
            "partner_id":
            user.partner_id.id
            if request.session.uid and user.partner_id else None,
            "web.base.url":
            IrConfigSudo.get_param('web.base.url', default=''),
            "active_ids_limit":
            int(IrConfigSudo.get_param('web.active_ids_limit',
                                       default='20000')),
            'profile_session':
            request.session.profile_session,
            'profile_collectors':
            request.session.profile_collectors,
            'profile_params':
            request.session.profile_params,
            "max_file_upload_size":
            max_file_upload_size,
        }
        if self.env.user.has_group('base.group_user'):
            # the following is only useful in the context of a webclient bootstrapping
            # but is still included in some other calls (e.g. '/web/session/authenticate')
            # to avoid access errors and unnecessary information, it is only included for users
            # with access to the backend ('internal'-type users)
            mods = odoo.conf.server_wide_modules or []
            if request.db:
                mods = list(request.registry._init_modules) + mods
            qweb_checksum = HomeStaticTemplateHelpers.get_qweb_templates_checksum(
                debug=request.session.debug, bundle="web.assets_qweb")
            lang = user_context.get("lang")
            translation_hash = request.env[
                'ir.translation'].get_web_translations_hash(mods, lang)
            menu_json_utf8 = json.dumps(request.env['ir.ui.menu'].load_menus(
                request.session.debug),
                                        default=ustr,
                                        sort_keys=True).encode()
            cache_hashes = {
                "load_menus":
                hashlib.sha512(menu_json_utf8).hexdigest()[:64],  # sha512/256
                "qweb": qweb_checksum,
                "translations": translation_hash,
            }
            session_info.update({
                # current_company should be default_company
                "user_companies": {
                    'current_company': user.company_id.id,
                    'allowed_companies': {
                        comp.id: {
                            'id': comp.id,
                            'name': comp.name,
                        }
                        for comp in user.company_ids
                    },
                },
                "currencies":
                self.get_currencies(),
                "show_effect":
                True,
                "display_switch_company_menu":
                user.has_group('base.group_multi_company')
                and len(user.company_ids) > 1,
                "cache_hashes":
                cache_hashes,
            })
        return session_info