odoo 定时任务的使用方法

编写执行程序

编写openerp模块代码,在模块代码中编写执行程序! 此处为了方便,只是做了简单的打印输入, 代码如下:

# -*- coding: utf-8 -*-
from openerp.osv import osv

class task_test(osv.osv):
    _auto = False
    _name = "task.test"

    def run_scheduler(self, cr, uid, args,context=None):
        print "test scheduler"

配置任务运行参数

在模块中申明一个xxx_data.xml文件,xxx可以不为模块名称,然后在openerp.py 文件中的data属性中加入xxx_data.xml即可,xxx_data.xml文件的配置内容如下:

<?xml version="1.0" encoding="utf-8"?>
<openerp>
    <data noupdate="1">
        <record forcecreate="True" id="ir_cron_scheduler_action" model="ir.cron">
            <field name="name">Run mrp scheduler</field>
            <field eval="True" name="active"/>
            <field name="user_id" ref="base.user_root"/>
            <field name="interval_number">1</field>
            <field name="interval_type">minutes</field>
            <field name="numbercall">3</field>
            <field eval="False" name="doall"/>
            <field eval="'task.test'" name="model"/>
            <field eval="'run_scheduler'" name="function"/>
            <field eval="'(True,)'" name="args"/>
        </record>
    </data>
</openerp>

配置参数说明

从上面我们可以看到配置的这个xxx_data.xml文件在文件的第4行配置了model="ir.cron" 那么我们在oe中打开model ir_cron 可以看到该class的_columns有如下字段:

_columns = {
        'name': fields.char('Name', required=True),
        'user_id': fields.many2one('res.users', 'User', required=True),
        'active': fields.boolean('Active'),
        'interval_number': fields.integer('Interval Number',help="Repeat every x."),
        'interval_type': fields.selection( [('minutes', 'Minutes'),
            ('hours', 'Hours'), ('work_days','Work Days'), ('days', 'Days'),('weeks', 'Weeks'), ('months', 'Months')], 'Interval Unit'),
        'numbercall': fields.integer('Number of Calls', help='How many times the method is called,\na negative number indicates no limit.'),
        'doall' : fields.boolean('Repeat Missed', help="Specify if missed occurrences should be executed when the server restarts."),
        'nextcall' : fields.datetime('Next Execution Date', required=True, help="Next planned execution date for this job."),
        'model': fields.char('Object', help="Model name on which the method to be called is located, e.g. 'res.partner'."),
        'function': fields.char('Method', help="Name of the method to be called when this job is processed."),
        'args': fields.text('Arguments', help="Arguments to be passed to the method, e.g. (uid,)."),
        'priority': fields.integer('Priority', help='The priority of the job, as an integer: 0 means higher priority, 10 means lower priority.')
    }
  • name 即该task的名称,由用户定义为该task主要的职责
  • user_id 对应res_users表,需要一个用户ID
  • active 是否激活该task,默认为True
  • interval_number 间隔时间,类型为integer
  • interval_type 执行task的周期类型,只能选择分钟、小时、天、周、月,可惜没有秒。
  • numbercall 方法调用多少次,-1则是没有限制
  • doall 如果任务执行时间错过了服务器重启时间是否重新执行任务
  • nextcall 下次的调用时间,我们不用配置,oe会自动计算
  • model 即模块名称
  • function 要执行的方法
  • args 传递的参数
  • priority 任务优先级别 0是最高级别,10是最低级别

执行过程

ir_cron模块中主要有三个主要的方法分别为:_callback_process_job_acquire_job ,在server.py文件中有如下的Python代码:

def cron_thread(self, number):
        while True:
            time.sleep(SLEEP_INTERVAL + number)     # Steve Reich timing style
            registries = openerp.modules.registry.RegistryManager.registries
            _logger.debug('cron%d polling for jobs', number)
            for db_name, registry in registries.items():
                while True and registry.ready:
                    acquired = openerp.addons.base.ir.ir_cron.ir_cron._acquire_job(db_name)
                    if not acquired:
                        break

到此调用过程就清楚了,server先调用_acquire_job 方法,_acquire_job 会根据dbname获取任务执行的相关数据、例如获取数据操作cr对象,要执行的jobs等,例如:

 db = openerp.sql_db.db_connect(db_name)
 threading.current_thread().dbname = db_name
 cr = db.cursor()

,这个代码又帮我们了解到了如何获取数据库的cr对象。_acquire_job获取相关数据之后,然后交给_process_job方法,该方法会去更新任务的下一次执行时间等数据,然后交由_callback 方法,有兴趣的可以去读一下ir_cronserver的源码。

要在Odoo中嵌入视图,可以按照以下方法进行操作: 1. 使用看板视图进行嵌入:看板视图是一种可视化的视图,将记录显示为卡片,并可以按列分组。您可以在看板视图中设置属性,如default_group_by和default_order,来定义视图的默认行为。您还可以使用属性examples来定义看板示例设置。 2. 使用表单视图进行嵌入:表单视图是Odoo中最常见的视图类型之一,您可以使用表单视图来显示和编辑记录的详细信息。如果您想要在看板视图中进行记录的快速创建,可以设置quick_create属性为true。 3. 使用列表视图进行嵌入:列表视图以表格形式显示记录,并提供了排序、筛选和分页等功能。您可以在列表视图中设置属性,如default_order,来定义记录的默认排序顺序。 总结起来,要在Odoo中嵌入视图,您可以使用看板视图、表单视图或列表视图,并根据您的需求设置相应的属性来定义视图的行为。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Odoo看板视图](https://blog.csdn.net/weixin_44141284/article/details/128813441)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [odoo14视图通过路由嵌入内容](https://blog.csdn.net/weixin_44565926/article/details/122139573)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值