odoo中通过自定义search函数实现自定义过滤条件的一个例子

admin 2020-11-3 13593

昨天遇到一个小需求: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])]  # 只有用户所在组中含有类型允许组的才允许显示

表示只搜索出那些登记类型可查看组是在用户拥有组中的登记记录




最新回复 (0)
返回