Odoo 11: получить идентификатор или имя cron внутри вызываемого метода для ir.cron, которые создаются вручную, а не только те, которые создаются из XML - PullRequest
1 голос
/ 29 сентября 2019

Я назначил (m2o) my_object cron (Автоматизация-> Запланированные действия). Cron выполняет (код Python) метод. Мне нужно иметь идентификатор (или имя) cron, который вызывает метод внутри метода, чтобы выполнить некоторые действия над объектами, назначенными cron.

Я думаю, что объект cron не определен, когдаметод выполняется, но это может быть при вызове метода. Поэтому я думаю, что путь состоит в том, чтобы передать идентификатор в качестве аргумента, но я не знаю, как это сделать. Я пытался с "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)

Примечание: тот же вопрос заданный здесь безрешение

Ответы [ 2 ]

1 голос
/ 30 сентября 2019

Для извлечения базы данных id из crons, созданной из setting меню (no xml_id).

Оказывается, что odoo передал то же самое context и на выполнение, так что все, что выдобавив к context вы найдете его в context из self в вашем method, поэтому просто добавьте Id из cron в context, просто переопределив два method:

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 не предоставляет эту информацию, поэтому вам нужно изменить это поведение. нет простого способа сделать это.

1 голос
/ 30 сентября 2019

Пожалуйста, попробуйте следующий код.

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