Odoo 11:在手动创建的 ir.cron 的调用方法中获取 cron id 或名称,而不仅仅是从 XML 创建的那些

Odoo 11: get cron id or name inside the called method for ir.cron that are create manually not just the ones that are created from XML

我将 (m2o) 分配给 my_object 一个 cron(自动化 -> 预定操作)。 cron 执行(Python 代码)一个方法。 我需要在方法内部调用方法的 cron 的 ID(或名称),以便对分配给 cron 的对象执行一些操作。

我认为cron-object并没有在方法执行的时候定义,但是可以在方法调用的时候定义。所以我认为方法是将 id 作为参数传递,但我不知道该怎么做。我尝试 "env" 但没有成功。

Cron Python 代码

<record id="myobject_cron_task" forcecreate='True' model="ir.cron">
    <field name="name">MyModel Task</field>
    <field name="active" eval="True" />
    <field name="user_id" ref="base.user_root"/>
    <field name="interval_number">1</field>
    <field name="interval_type">minutes</field>
    <field name="numbercall">-1</field>
    <field name="model_id" ref="model_my_object"/>
    <field name="state">code</field>
    <field name="code">model.my_method(cron_id)</field>
</record>

方法

def my_method(self, active_cron_id):
    sel_objec = self.env['my.object'].search([('cron_id', '=', active_cron_id)])
    print(sel_objec)

注意:同样的问题asked here没有解决方案

请尝试以下代码。

def my_method(self, active_cron_id):
    cron = self.env.ref('module_name.myobject_cron_task')
    print(cron)

检索从 setting 菜单 (no xml_id) 创建的 crons 的数据库 id

事实证明,odoo 也将相同的 context 传递给执行,因此您添加到 context 的任何内容都将在 selfcontext 中找到你的 method,所以只需覆盖 method:

中的 context 添加 cronId
from odoo import models, api

class IrCron(models.Model):
    _inherit = 'ir.cron'

    @api.model
    def _callback(self, cron_name, server_action_id, job_id):
        """ to handle cron thread executed by Odoo."""
        self = self.with_context(cron_id=job_id)
        return super(IrCron, self)._callback(cron_name,server_action_id, job_id)

    @api.multi
    def method_direct_trigger(self):
        """ to handle manual execution using the button."""
        for rec in self:
            # rec = rec.with_context(cron_id=rec.id)
            super(IrCron, rec).method_direct_trigger()
        return True

在你的方法中:

def my_method(self):
    cron_id = self.env.context.get('cron_id', False)
    if cron_id:
        cron = self['ir.cron'].browse(cron_id)
        print(cron)

我测试了这个并且它工作希望它对你来说很容易,并且不需要在 cron 中传递任何参数或任何内容。希望这就是您要找的。 默认情况下,Odoo 逻辑不提供此信息,因此您需要更改此行为。没有简单的方法。