假设一个小区管理员用户,只想看到自己小区的信息。
首先添加一个用户信息选项卡界面,如下图的 用户 > 隶属信息:
我们在自己创建的user模块中,views
文件夹下添加base_user.xml
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="ev_01_base_res_users_inherit_form" model="ir.ui.view">
<field name="name">res.users.simple.form.inherit</field>
<field name="model">res.users</field>
<field name="inherit_id" ref="base.view_users_form"/>
<field name="arch" type="xml">
<xpath expr="//page[@name='access_rights']" position="after">
<page string="隶属信息">
<group col="4">
<field name="use_community_id"/>
</group>
</page>
</xpath>
</field>
</record>
</odoo>
上述代码中,添加的use_community_id
字段是引用的user
模型层,如下:
# -*- coding: utf-8 -*-
from odoo import models, fields, api
class user(models.Model):
_inherit = 'res.users'
class ResUsers(models.Model):
"""扩展用户类型"""
_name = "res.users"
_inherit = "res.users"
use_community_id = fields.Many2one("community", string=u"所属小区")
@api.model
# @tools.ormcache('self._uid')
def context_get(self):
# 扩展context,方便xml里面写domain
user = self.env.user
result = super(ResUsers, self).context_get()
result["self_community_id"] = user.use_community_id.id
return result
user
模块的最后一项工作就是在__manifest__.py
中添加依赖项,在depends
属性中添加需要被权限控制的模块名,添加刚才创建的base_user.xml
。
在需要被控制的模块的views.xml的action中添加一个名为domain
的字段,来控制是否为与当前用户关联的数据。换言之就是,只显示自己数据。
<!-- 小区 Action -->
<record id="action_community" model="ir.actions.act_window">
<field name="name">小区信息</field>
<field name="res_model">community</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
创建第一个小区信息
</p>
</field>
<field name="domain">[('id','=',self_community_id)]</field>
</record>
上述代码中的self_community_id
是ResUsers
类的context_get
方法注册来的。做完这一步,就是注册菜单了,如下代码:
<!-- 小区 Menuitem -->
<menuitem id="menu_community_root" name="小区" groups="ev_01.group_tw_use_xq_user"/>
<menuitem id="menu_community" name="小区信息" parent="menu_community_root" action="action_community" sequence="10" groups="ev_01.group_tw_use_xq_user"/>
通过配置多个action和菜单,可以让不同的用户显示不同的菜单,例如超级管理员的菜单应该显示全部小区信息,而小区用户只能显示自己小区的信息。最后记得升级user模块和被权限控制的模块,效果如下: