将python函数添加到特定动作odoo

Posted

技术标签:

【中文标题】将python函数添加到特定动作odoo【英文标题】:add python function to specific action odoo 【发布时间】:2020-01-06 13:02:27 【问题描述】:

我想将此函数添加到动作“hr_holidays.open_allocation_holidays”中,以使“holiday_status_id”字段每次根据“employee_id”动态变化

@api.onchange('employee_id')
def change_leave_type(self):
    for holiday_type in self:
        if holiday_type.env.uid == holiday_type.user_id.id and not holiday_type.env.user.has_group(
                'hr_holidays.group_hr_holidays_user'):
            allocate_type = holiday_type.env['hr.holidays.status'].search([('name', '=', 'Compensatory Days')]).id
            return 'domain': 'holiday_status_id': [('id', '=', allocate_type)]
        elif holiday_type.env.user.has_group(
                'hr_holidays.group_hr_holidays_user') and not holiday_type.env.user.has_group(
                'hr_holidays.group_hr_holidays_manager'):
            ids = []
            allocation_types = holiday_type.env['hr.holidays.status'].search([])
            for allocate in allocation_types:
                if allocate.name != 'Unpaid':
                    ids.append(allocate.id)
            return 'domain': 'holiday_status_id': [('id', '=', ids)]

【问题讨论】:

【参考方案1】:

您可以通过将 domain-get 函数添加到该字段的域来将生成的域传递给该字段。


@api.model
def _get_holiday_status_id_domain(self):
    if self.env.uid == self.user_id.id and not self.env.user.has_group('hr_holidays.group_hr_holidays_user'):
        allocate_type = self.env['hr.holidays.status'].search([('name', '=', 'Compensatory Days')], limit=1)
        return [('id', '=', allocate_type.id)]
    elif self.env.user.has_group('hr_holidays.group_hr_holidays_user') and not self.env.user.has_group('hr_holidays.group_hr_holidays_manager'):
        allocation_types = self.env['hr.holidays.status'].search([('name', '!=', 'Unpaid')])
        return [('id', 'in', allocation_types.mapped('id'))]

holiday_status_id = fields.Many2one(
    comodel_name='hr.holidays.status', 
    string='Holiday Status',
    domain=_get_holiday_status_id_domain,
    # and your other settings
    )

【讨论】:

您的解决方案非常好,域工作正常.....但仍然是一个问题,它会影响“离开请求”操作和“分配请求”操作(因为它们加载相同的视图 具有相同的外部ID) 非常感谢 如果只需要改变分配的行为,只需要在hr_leave_allocation.py下的HolidaysAllocation类中加入域生成函数和domain=_get_holiday_status_id_domain即可;如果将其添加到hr_leave.py 下的HolidaysRequest 类中,也会影响请假请求。 我使用 odoo 11 .....叶子模块中没有 HolidaysAllocation 类,只有 'hr.holidays' 类和 'hr.holiday.status' 类 你可以简单的在开头添加if语句,在一定条件下返回[(1, '=', 1)],必须有一个字段告诉它是请假请求还是分配请求。 hr.holidays 模型中有 'type' 字段:type = fields.Selection([ ('remove', 'Leave Request'), ('add', 'Allocation Request') ])但它不适用于域功能

以上是关于将python函数添加到特定动作odoo的主要内容,如果未能解决你的问题,请参考以下文章

将上下文菜单添加到特定的 Qtablewdiget 表列,Python

如何以编程方式将按钮添加到 gridview 并将其分配给特定的代码隐藏函数?

30天Python入门到进阶——第7天:函数

Plotly:如何在绘图线图中的特定点添加标记(python / pandas)

python 类和对象_1

UIActivityViewController 在特定动作中使用项目