我为 my_object 分配了 (m2o) 一个 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无解
最佳答案
检索从设置
菜单创建的
。crons
的数据库id
(无xml_id)
事实证明,odoo 也将相同的 context
传递给了执行,因此您添加到 context
的任何内容都将在 context
中找到它方法
中的self
,因此只需在上下文
中添加cron
的Id
即可code> 只需重写两个 方法
:
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 逻辑不提供此信息,因此您需要更改此行为。没有简单的方法可以做到这一点。
关于python - Odoo 11 : get cron id or name inside the called method for ir. 手动创建的 cron 不仅仅是从 XML 创建的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58157779/