You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Odoo特定用户组超24小时记录隐藏功能修复请求

Odoo记录过滤函数问题:无法隐藏超过24小时的案例

开发的Odoo记录过滤函数可正常对指定用户组进行筛选,但无法仅返回过去24小时内的案例,需调整功能以隐藏所有超过24小时的案例。相关代码如下:

import logging
from datetime import datetime, timedelta
from odoo import api, models

_logger = logging.getLogger(__name__)

class LinhaverdeCase(models.Model):
    _inherit = 'linhaverde.case'

    @api.model
    def cases_records_hide(self):
        _logger.info("cases_records_hide()函数调用成功。")

        # 查询创建时间超过24小时的记录
        records_to_hide = self.env['linhaverde.case'].search([
            ('datetime_created', '<', datetime.now() - timedelta(hours=24))
        ])

        _logger.info(f"找到{len(records_to_hide)}条需隐藏的记录。")

        # 记录将被隐藏的记录ID
        _logger.info(f"需隐藏的记录ID列表:{records_to_hide.ids}")

        # 获取当前用户
        current_user = self.env.user

        # 记录用户名及所属用户组
        _logger.info(f"用户名:{current_user.name}")
        _logger.info(f"用户所属组:{current_user.groups_id.mapped('name')}")

        # 检查用户是否属于指定组
        if current_user.has_group('linhaverde_odoo.group_linhaverde_focal_point') or \
        current_user.has_group('linhaverde_odoo.group_linhaverde_operator') or \
        current_user.has_group('linhaverde_odoo.group_linhaverde_partner'):
            # 'linhaverde_focal_point'、'linhaverde_operator'或'linhaverde_partner'组用户无法查看超24小时的案例
            _logger.info("成功移除记录的读取权限。")
            return [('id', 'not in', records_to_hide.ids)]
        else:
            # 其他用户可查看所有案例
            _logger.info("用户不属于指定组,返回所有记录。")
            return []

_logger.info("成功移除记录的读取权限。")

问题分析

  1. 时区不匹配:代码用datetime.now()取本地时间,但Odoo默认存储的datetime字段(如datetime_created)是UTC时间,导致时间计算偏差,无法准确筛选超24小时的记录。
  2. 权限上下文缺失:直接用self.env['linhaverde.case'].search()查询,没有继承当前用户的权限上下文,可能查询到用户原本就无权访问的记录,干扰过滤逻辑。
  3. 无效日志语句:类定义外的最后一行日志永远不会被执行,属于冗余代码。

修正方案

调整时间计算逻辑并修正权限上下文问题,代码如下:

import logging
from datetime import timedelta
from odoo import api, models, fields

_logger = logging.getLogger(__name__)

class LinhaverdeCase(models.Model):
    _inherit = 'linhaverde.case'

    @api.model
    def cases_records_hide(self):
        _logger.info("cases_records_hide()函数调用成功。")

        # 使用Odoo内置UTC时间计算24小时前的节点,匹配字段存储时区
        twenty_four_hours_ago = fields.Datetime.now() - timedelta(hours=24)

        # 基于当前用户权限查询需隐藏的记录
        records_to_hide = self.search([
            ('datetime_created', '<', twenty_four_hours_ago)
        ])

        _logger.info(f"找到{len(records_to_hide)}条需隐藏的记录。")
        _logger.info(f"需隐藏的记录ID列表:{records_to_hide.ids}")

        current_user = self.env.user
        _logger.info(f"用户名:{current_user.name}")
        _logger.info(f"用户所属组:{current_user.groups_id.mapped('name')}")

        if current_user.has_group('linhaverde_odoo.group_linhaverde_focal_point') or \
           current_user.has_group('linhaverde_odoo.group_linhaverde_operator') or \
           current_user.has_group('linhaverde_odoo.group_linhaverde_partner'):
            _logger.info("应用过滤规则:隐藏超过24小时的记录。")
            return [('id', 'not in', records_to_hide.ids)]
        else:
            _logger.info("用户不属于指定组,返回所有可见记录。")
            return []

关键修改说明

  • 替换时间获取方式:用fields.Datetime.now()获取UTC时间,与Odoo字段存储时区一致,确保时间计算精准。
  • 修正查询上下文:用self.search()替代直接调用模型的search方法,继承当前用户的权限,只查询用户原本可见的记录。
  • 删除无效代码:移除类外的冗余日志语句。

内容的提问来源于stack exchange,提问作者Darken Machava

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 12:58:18