昨天遇到一个小需求:IT设备报修登记模块,需要根据报修类型显示给不同不同用户组看。比如:
1、电脑硬件类的,显示给电脑硬件维修人员组看;
2、OA软件类的,显示给软件维护人员组看;
一、设置一个维修类型model:
class MalfunctionType(models.Model):
_name = "it.malfunction.type"
_description = "故障类型"
name = fields.Char(string="类型名称", required=True, help="故障类型名称")
group_ids = fields.Many2many(comodel_name='res.groups', relation = 'it_malfunction_type_group_rel',
column1='malfunction_type_id', column2='gid', string='维护用户组',
help="如果设置了组,则属于指定组里的人员可以看到该记录.")
note = fields.Text(string="备注", help="对该类型的的补充说明")
_sql_constraints = [
('name_uniq', 'unique (name)', '类型名称已经存在!'),
]
在该model中设置一个 group_ids字段,用来控制该类型的申请有哪些组可看;
二、设置登记信息model如下:
class Malfunction(models.Model):
_name = "it.malfunction"
_description = "故障记录"
@api.depends('maintenance_ids')
def _compute_working_hours(self):
for rec in self:
if rec.maintenance_ids:
rec.working_hours = sum([x.duration for x in rec.maintenance_ids])
type_id = fields.Many2one(comodel_name="it.malfunction.type", string="故障类型", required=True, help="故障类型")
dev_id = fields.Many2one(comodel_name="it.device", string="设备", help="要维修/维护的设备")
dev_brand_name = fields.Char(string="设备品牌", help="设备品牌名称")
dev_model = fields.Char(string="设备型号", help="设备型号")
department_id = fields.Many2one(comodel_name="hr.department", related="create_uid.employee_id.department_id", string="部门", help="用户所在部门")
office = fields.Char(string="办公室", required=True, help="联系人所在办公室")
description = fields.Text(string="故障描述", required=True, help="故障描述")
image = fields.Image(string="故障图片", help="设备故障图片")
contact_name = fields.Char(string="联系人", related="create_uid.name", help="联系人姓名(即故障报告人姓名)")
contact_phone = fields.Char(string="联系电话", help="联系电话")
maintenance_ids = fields.One2many(comodel_name="it.malfunction.maintenance", inverse_name="malfunction_id", string="维修情况", help="对故障的维修情况说明")
state = fields.Selection([('new', '未处理'), ('processing', '正在维修'), ('fixed', '已修复'), ('scrapped', '报废')], string="状态", default='new', help="故障以及维修状态")
working_hours = fields.Float(string="工作时长(分钟)", compute="_compute_working_hours", store=True, help="工作时长(分钟)") #
@api.depends('type_id', 'description')
def name_get(self):
res = []
for malfunction in self:
res.append((malfunction.id, "[%s] %s" % (malfunction.type_id.name, malfunction.description[:30])))
return res
def search(self, args, **kwargs):
"""
给搜索函数增加按搜索类型过滤
:param args:
:param kwargs:
:return:
"""
if not (SUPERUSER_ID == self._uid or self.create_uid == self.env.user
or self.env.ref('it_device_maintain.it_group_user') in self.env.user.groups_id):
args += [('type_id.group_ids', 'in', [g.id for g in self.env.user.groups_id])] # 只有用户所在组中含有类型允许组的才允许显示
return super(Malfunction, self).search(args, **kwargs)
在这里,通过重写search函数,在函数里实现自定义规则:
如果用户不是超级管理员、不是记录创建人、或者不是it_group_user(普通员工组,是报修登记人)的,则增加搜索domain:
args += [('type_id.group_ids', 'in', [g.id for g in self.env.user.groups_id])] # 只有用户所在组中含有类型允许组的才允许显示
表示只搜索出那些登记类型可查看组是在用户拥有组中的登记记录