在窗口动作odoo中调用Python函数

Posted

技术标签:

【中文标题】在窗口动作odoo中调用Python函数【英文标题】:Call Python function in window action odoo 【发布时间】:2020-01-13 09:39:38 【问题描述】:

我将这个 python 函数添加到 'hr.holidays' 模型中

class InheritHrHolidays(models.Model):
_inherit = 'hr.holidays'

def _get_holiday_status_id_domain(self):
    if 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'))]

我想在动作 id="hr_holidays.open_allocation_holidays' 中调用此函数以在动作运行时仍然执行..

<record id="open_allocation_holidays" model="ir.actions.act_window">
        <field name="name">Allocation Request</field>
        <field name="res_model">hr.holidays</field>
        <field name="view_type">form</field>
        <field name="view_mode">tree,kanban,form</field>
        <field name="context">
            'default_type':'add',
            'search_default_my_leaves': 1,
            'needaction_menu_ref':
            [
                'hr_holidays.menu_open_company_allocation',
            ]
        </field>
        <field name="help" type="html">
            <p class="oe_view_nocontent_create">
                Click here to create a new leave allocation request.
            </p>
        </field>
        <field name="domain">[('type','=','add')]</field>
        <field name="view_id" ref="edit_holiday_new"/>
        <field name="search_view_id" ref="view_hr_holidays_filter"/>
    </record>

【问题讨论】:

【参考方案1】:

您不能在窗口操作中调用函数,而是必须创建例如服务器操作(带有代码),然后菜单项应调用或使用该操作。在该服务器操作中,您可以使用原始窗口操作,但使用您的函数中的域进行操作。

服务器操作的代码应该是这样的:

action = env.ref('hr_holidays.open_allocation_holidays').read()[0]
domain = model._get_holiday_status_id_domain()
action['domain'] = domain

【讨论】:

这样的:&lt;record id="dynamic_domain_for_allocation_action" model="ir.actions.server"&gt; &lt;field name="name"&gt;Dynamic Domain For Allocate Action&lt;/field&gt; &lt;field name="model_id" ref="hr_holidays.model_hr_holidays"/&gt; &lt;field name="code"&gt;action = env.ref('hr_holidays.open_allocation_holidays').read()[0] domain = model._get_holiday_status_id_domain() action['domain'] = domain &lt;/field&gt; &lt;/record&gt; 不影响 是否也更改了菜单项的操作? 我不明白??我从“hr_holidays”继承了这个动作,然后按照你说的更新了它 原始动作 (window; hr_holidays.open_allocation_holidays) 用于菜单项,其中整个动作都将开始执行(双关语)。您现在必须将菜单项的操作更改为您的服务器操作。

以上是关于在窗口动作odoo中调用Python函数的主要内容,如果未能解决你的问题,请参考以下文章

Odoo 8 函数调用打开(树)视图

odoo name_get与name_search

Odoo 10 - 重载 Python 方法

Odoo10/Odoo11 动态进度条 - 在 python 中触发 javascript 函数

odoo自定义模块的安装动作

odoo12动作里添加向导