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("成功移除记录的读取权限。")
问题分析
- 时区不匹配:代码用
datetime.now()取本地时间,但Odoo默认存储的datetime字段(如datetime_created)是UTC时间,导致时间计算偏差,无法准确筛选超24小时的记录。 - 权限上下文缺失:直接用
self.env['linhaverde.case'].search()查询,没有继承当前用户的权限上下文,可能查询到用户原本就无权访问的记录,干扰过滤逻辑。 - 无效日志语句:类定义外的最后一行日志永远不会被执行,属于冗余代码。
修正方案
调整时间计算逻辑并修正权限上下文问题,代码如下:
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
相关产品推荐
相关产品推荐

