如何将我的自定义菜单添加到门户用户菜单列表?



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

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

谁能告诉我它是如何在Odoo 11实现的?

让我们从头开始创建一个名为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

在Odoo11中,门户用户将访问类似面板的网站,以便能够访问自定义模板显示的分离信息。可以在 url/my/home(如http://example.com/my/home(访问门户视图。

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

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

用于创建模板的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)

这样,将创建一个名为门户表单的新菜单,如果您单击该菜单,则上述python功能将起作用。如果你想调用另一个模板,你可以简单地输入该模板的名称来返回该函数,数据是可以在模板中使用的值。

如果您使用的是其他版本的odoo,则模板的inherit_id将发生变化。

希望你明白。 谢谢

最新更新