Odoo10开发教程十一(定时任务)

在实际的工作中我们经常需要定时完成一些操作,比如生成月度销售报表。或者我们需要把一些计算量很大的操作放在夜间执行。这些都可以用定时任务来完成,odoo提供了对定时任务的支持,我们一起来看看。
在本示例中,我们创建一个定时任务,每2分钟执行一次:循环遍历数据库表(scheduler.demo)上的所有记录,每个记录跟踪任务程序运行了多少次。这个示例展示了定时任务如何与数据库操作相结合。

创建模型和字段

创建一个类文件'scheduler_demo.py',内容如下

# -*- coding: utf-8 -*-

from odoo import models, fields, api, exceptions
import logging
from datetime import datetime
_logger = logging.getLogger(__name__)

class scheduler_demo(models.Model):
    _name = 'scheduler.demo'
    name = fields.Char(required=True)
    numberOfUpdates = fields.Integer('Number of updates')
    lastModified = fields.Datetime('Last updated')

因为后面要用到日志输出,以及获取系统时间,所以导入python的日志模块和时间模块。
我们创建了scheduler.demo的新模型,包含三个字段:name的文本字段,是定时任务的名称;numberOfUpdates的整型字段,用于记录任务调用次数;lastModified是时间类型,用于记录任务的最后执行时间。

创建视图

创建xml文件'scheduler_demo.xml',内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<odoo>
    <data>
        <record model="ir.ui.view" id="view_scheduler_form">
            <field name="name">scheduler.demo.form</field>
            <field name="model">scheduler.demo</field>
            <field name="arch" type="xml">
                <form string="Schedule Form">
                    <group>
                        <field name="name"/>
                        <field name="numberOfUpdates"/>
                        <field name="lastModified"/>
                    </group>
                </form>
            </field>
        </record>

        <record model="ir.ui.view" id="view_scheduler_tree">
            <field name="name">scheduler.demo.tree</field>
            <field name="model">scheduler.demo</field>
            <field name="arch" type="xml">
                <tree string="Schedule Tree">
                    <field name="name"/>
                    <field name="numberOfUpdates"/>
                    <field name="lastModified"/>
                </tree>
            </field>
        </record>
    </data>
</odoo>

创建了两个视图,from视图和tree视图,方便我们查看记录操作结果。这里都是最基本的视图定义写法,没有什么特别需要说明的。
另外,我们需要让视图显示出来,我这里把菜单挂载在之前的开放学院菜单下,虽然这和开放学院没什么关联。

                    <field name="lastModified"/>
                </tree>
            </field>
        </record>

        <record model="ir.actions.act_window" id="scheduler_demo_list_action">
            <field name="name">计划任务Demo</field>
            <field name="res_model">scheduler.demo</field>
            <field name="view_mode">tree,form</field>
        </record>

        <menuitem id="scheduler_demo_menu" name="计划任务Demo"
          parent="main_openacademy_menu"/>

        <menuitem id="scheduler_demo_list_menu" name="计划任务Demo"
          parent="scheduler_demo_menu"
          action="scheduler_demo_list_action"/>
    </data>
</odoo>

这里定义了一个菜单动作scheduler_demo_list_action,另外定义了两级菜单。注意定义的顺序,odoo对xml文件是顺序加载的,意味着被引用的id一定要先定义。比如这里必须先定义菜单动作,后定义菜单,因为菜单定义中会引用到菜单动作。

创建定时任务

接下来我们创建核心的定时任务,代码还是写在xml文件'scheduler_demo.xml',我这里放在了act_window定义之前。

                    <field name="lastModified"/>
                </tree>
            </field>
        </record>

        <record id="ir_cron_scheduler_demo_action" model="ir.cron">
            <field name="name">Demo scheduler</field>
            <field name="user_id" ref="base.user_root"/>
            <field name="interval_number">2</field>
            <field name="interval_type">minutes</field>
            <field name="numbercall">-1</field>
            <field eval="False" name="doall"/>
            <field eval="'scheduler.demo'" name="model"/>
            <field eval="'process_demo_scheduler_queue'" name="function"/>
        </record>

        <record model="ir.actions.act_window" id="scheduler_demo_list_action">
            <field name="name">计划任务Demo</field>

当你安装模块后,将添加一个定时任务:

Demo scheduler 定时任务界面

让我们来分析下定时任务定义的代码,这里的ir.cron模块就是odoo为所有定时任务而专门准备的模型。换句话说往这个表里添加一行数据就是添加了一个定时任务。

name
定时任务名称

user_id
执行定时任务的用户,不同的用户是有不同权限的,为了保证能有足够权限执行定时任务,一般这里就是base.user_root

interval_number
任务执行的频次,和interval_type字段一起决定了任务执行的间隔时间,比如这里为interval_number为2,interval_type为minutes,就是任务每2分钟执行一次。

interval_type
任务执行频次的单位,可选项有: minutes,hours,days,work_days,weeks,months,意思很好理解,work_days是星期几执行。

numbercall
循环运行的次数,比如你填10,那么任务执行10次后将不再执行,这里-1代表一直执行下去。

doall
如果在服务器重启期间错过了执行时机,是否再次补充执行。

model
任务方法所在模块

function
任务方法,与model一起决定了任务时机到来时,调用哪个方法执行。

添加python方法

是的,我们还有一个关键的地方,就是任务方法还没有添加,在类文件'scheduler_demo.py'中添加代码:

    lastModified = fields.Datetime('Last updated')

    def process_demo_scheduler_queue(self):
        scheduler_line_ids = self.env['scheduler.demo'].search([])
        for scheduler_line in scheduler_line_ids:
            _logger.info('line:' + scheduler_line.name)
            scheduler_line.numberOfUpdates += 1
            scheduler_line.lastModified = datetime.utcnow()

这里代码很简单,首先获取'scheduler.demo'模型中的所有数据行,然后循环操作

  • _logger.info('line:' + scheduler_line.name)在日志输出当前操作的数据行名称
  • scheduler_line.numberOfUpdates += 1 将执行次数加1
  • scheduler_line.lastModified = datetime.utcnow() 更新最后执行时间。

结论

定时任务是Odoo中的一个强大工具,非常灵活的选项。利用好定时任务,可以帮我们节省大量的手工执行时间。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,010评论 4 62
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,579评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,362评论 25 707
  • 一直以来自己有点患得患失,总想在别人眼里做个好人,一不小心做成了老好人,性格中或多或少有些懦弱有些怕事有些软弱,所...
    快快乐乐baby阅读 146评论 2 2
  • 在通往黄泉的路上,有一朵没有开放的彼岸花她的名字叫花渐隐。几天过后,她终于盛开了,她的花瓣粉粉的,嫩嫩的,在她那...
    梦渐殘阅读 223评论 0 1