如何将我的定制菜单添加到门户网站用户菜单列表中?

时间:2018-10-10 06:07:47

标签: python security odoo odoo-11

我有一个名为Portal Form的菜单。我希望该菜单对具有Portal组的用户可见。

到目前为止,我已经创建了用户并为Portal分配了Portal组。我还为门户网站组添加了模型访问权限。上一个问题中与我的问题类似的所有建议,我都遵循了所有解决方案。 但是我的自定义菜单对门户网站用户不可见。

有人能告诉我在Odoo 11中如何实现吗?

3 个答案:

答案 0 :(得分:1)

让我们从头开始创建一个名为my_module的玩具模块。

首先,我们需要创建一个模型。文件addons/my_module/models/models.py包含:



    from odoo import api, fields, models, tools, _

    class Books(models.Model): 
      _name = 'my_module.books'

      title = fields.Char(string='Title')
      author = fields.Char(string='Author')

现在,我们可以创建菜单,操作和视图。文件addons/my_module/views/views.xml包含:



    <?xml version="1.0" encoding="utf-8"?>
    <openerp>
      <data>

        <!-- Top menu item -->
        <menuitem name="My top menu" id="my_module.menu_root"/>

        <!-- menu categories -->
        <menuitem name="My left-side menu" id="my_module.menu_left" parent="my_module.menu_root"/>    

        <!-- Model Books: views, actions and menus -->

        <!-- explicit tree view definition -->
        <record model="ir.ui.view" id="my_module.books_view_tree">
          <field name="name">My books - List view</field>
          <field name="model">my_module.books</field>
          <field name="arch" type="xml">
            <tree>
          <field name="title"/>
          <field name="author"/>
            </tree>
          </field>
       </record>

       <!-- explicit form view definition -->
        <record model="ir.ui.view" id="my_module.books_view_form">
          <field name="name">My books - Form view</field>
          <field name="model">my_module.books</field>
          <field name="arch" type="xml">
        <form string="My books">
          <sheet>
            <group>
              <field name="title"/>
              <field name="author"/>
            </group>
          </sheet>
        </form>
          </field>
        </record>

        <!-- action opening views for this model -->
        <record model="ir.actions.act_window" id="my_module.books_action_window">
          <field name="name">My Books - Window action</field>
          <field name="res_model">my_module.books</field>
          <field name="view_mode">tree,form</field>
        </record>

        <!-- menu for the above action -->
        <menuitem name="Books" id="my_module.menu_books" parent="my_module.menu_left" action="my_module.books_action_window" sequence="6" />

      </data>
    </openerp>

然后,我们需要一个宣言。文件addons/my_module/__manifest__.py包含:


    {
        'name': "my_module",
        'summary': "Answer to Stack Overflow Question 52733625",
        'description': "Answer to Stack Overflow Question 52733625",
        'author': "Adán Cortés Medina",
        'website': "http://www.linkedin.com/in/1acme",

        # Categories can be used to filter modules in modules listing
        # Check https://github.com/odoo/odoo/blob/9.0/openerp/addons/base/module/module_data.xml
        # for the full list
        'category': 'Uncategorized',
        'version': '0.1',

        # any module necessary for this one to work correctly
        'depends': ['website'],

        # always loaded
        'data': [
            'views/views.xml',
            #'security/ir.model.access.csv',
        ],
        # only loaded in demonstration mode
        'demo': [
            #'demo/demo.xml',
        ],
    }

这时,您很可能想要创建一个新数据库并加载该模块。顶部将有一个名为My top menu的菜单,然后在左边的标签为My left-side menu的标签,下面将有一个菜单的标签Books,当您单击它时,图书模型的列表视图将显示。另外,当您点击Create按钮时,将显示该模型的表单视图。

一旦经过测试,让我们增加安全性。首先,转到__manifest__.py文件并通过删除开头的#'security/ir.model.access.csv',取消注释#。然后使用以下内容创建addons/my_module/security/ir.model.access.csv


"id","name","model_id/id","group_id/id","perm_read","perm_write","perm_create","perm_unlink"
"access_my_module_books","my_module.books","my_module.model_my_module_books","base.group_portal","True","True","True","True"

为了安全起见,请重新启动Odoo,然后转到Apps菜单,并通过先单击其卡,然后单击Upgrade按钮来重新加载模块。

现在,通过在debug之前添加#进入调试模式(URL应该像http://example.com:8096/web?debug#..。)并在确保它属于门户网站组的同时创建用户。 (必须选中其他Extra Rights/Portal)。单击Save按钮。在表单顶部寻找Action下拉菜单,然后选择Change password。输入密码,单击Save

然后打开一个新的隐身窗口(以便能够同时打开两个Odoo帐户)并使用您刚创建的用户登录。图书菜单应显示在此处。

最后,创建一个不属于门户网站组的新用户,并以该用户身份登录,并检查“图书”菜单不会显示。

您可以从https://github.com/AdanCortes/stackoverflow/tree/q52733625

下载上述玩具模块

答案 1 :(得分:0)

在Odoo 11中,门户网站用户将访问面板之类的网站,以便能够访问由自定义模板显示的分隔信息。门户网站视图可以像/my/home一样通过URL http://example.com/my/home访问。

您可以在下面看到一个示例(在用户门户网站上购买订单):

https://github.com/odoo/odoo/blob/078b31dc7f67f3893bcbe5a3b76936490add0e38/addons/purchase/views/portal_templates.xml

答案 2 :(得分:0)

用于创建模板(即新菜单)的XML代码

<template id="your_id" name="your name" inherit_id="portal.portal_my_home" priority="21">
    <xpath expr="//ul[hasclass('o_portal_docs')]" position="inside">
        <li class="list-group-item">
            <span class="badge" t-esc="quotation_count"/>
            <a href="/my/records/portal"> Portal Form</a>
        </li>
    </xpath>
</template>

下面是python代码,应该在控制器中

class CustomerPortal(CustomerPortal):

    @http.route(['/my/records/portal', '/my/quotes/page/<int:page>'], type='http', auth="user", website=True)
    def portal_my_records(self, page=1, date_begin=None, date_end=None, sortby=None, **kw):     
        print("IN PYTHON CONTROLLER")
        data={}
        return request.render("module_name.template_name", data)

这样,将创建一个名为Portal Form的新菜单,如果您单击该菜单,则上面的python函数将起作用。而且,如果您要调用其他模板,则只需键入该模板的名称即可返回该函数,并且数据是可以在模板中使用的值。

如果您正在使用其他版本的odoo,则模板的Inherited_id中会有更改。

希望您能理解。 谢谢