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
的任何内容都将在 self
的 context
中找到你的 method
,所以只需覆盖 method
:
中的 context
添加 cron
的 Id
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 逻辑不提供此信息,因此您需要更改此行为。没有简单的方法。
我将 (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
的任何内容都将在 self
的 context
中找到你的 method
,所以只需覆盖 method
:
context
添加 cron
的 Id
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 逻辑不提供此信息,因此您需要更改此行为。没有简单的方法。