【问题标题】:How to add my custom menu to the portal users menu list?如何将我的自定义菜单添加到门户用户菜单列表?
【发布时间】:2019-05-21 18:22:55
【问题描述】:

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

到目前为止,我已经创建了用户并为他们分配了门户组。我还为门户组添加了我的模型的访问权限。上一个问题中建议的所有内容都与我的类似,我已经完成了所有解决方案。 然而,Portal 用户看不到我的自定义菜单。

谁能告诉我Odoo 11是怎么实现的?

【问题讨论】:

    标签: python security odoo odoo-11


    【解决方案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 帐户)并使用您刚刚创建的用户登录。 Books 菜单应显示在此处。

    最后,创建一个不属于 Portal 组的新用户,使用该用户登录并检查 Books 菜单是否不会显示。

    您可以从https://github.com/AdanCortes/stackoverflow/tree/q52733625下载上述玩具模块

    【讨论】:

    • 嘿..谢谢你这么详细的回答。只是为了检查上面链接中给出的模块是否适用于我的测试插件,或者我在下载后安装了它。因此,当我使用演示用户登录时,我看不到 Books 菜单。普通用户也不是。只有管​​理员可以看到它。
    • 随时,梅格。通常,普通用户不属于portal 组,但如果您通过编辑portal 组成员手动添加它们,他们应该能够看到菜单。如果出现问题,请给我留言。
    【解决方案2】:

    在 Odoo 11 中,门户用户将访问类似面板的网站,以便能够访问自定义模板显示的单独信息。门户视图可以通过 URL /my/home 访问,例如 http://example.com/my/home

    您可以在(用户门户的采购订单)处看到一个示例:

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

    【讨论】:

      【解决方案3】:

      用于创建模板的 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,模板的inherit_id会有变化。

      希望你能理解。 谢谢你

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-24
        • 2018-08-23
        • 1970-01-01
        • 2017-05-26
        • 2011-09-21
        • 1970-01-01
        • 2016-06-22
        相关资源
        最近更新 更多