odoo開發教程十六:定時任務
阿新 • • 發佈:2021-12-17
一:定義定時器資料模型
模型中定義需要用到的欄位、定時方法
from odoo import models, fields, api, exceptions import logging from datetime import datetime _logger = logging.getLogger(__name__) class scheduler(models.Model): _name = 'scheduler.demo' #需要用到的欄位 name = fields.Char(required=True) numberOfUpdates = fields.Integer('Number of updates') 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()
二:建立定時器檢視
<odoo> <data> <!--1:建立定時器表單--> <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> <!--2:建立定時器列表檢視--> <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> <!--最重要:定義定時動作,制定定時任務--> <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> <field name="res_model">scheduler.demo</field> <field name="view_mode">tree,form</field> </record> <!--定義選單--> <menuitem id="scheduler_demo_menu" name="計劃任務Demo" parent="top_menu"/> <menuitem id="scheduler_demo_list_menu" name="計劃任務Demo" parent="scheduler_demo_menu" action="scheduler_demo_list_action"/> </data> </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一起決定了任務時機到來時,呼叫哪個方法執行。
三:註冊定時器
在init中import定時器模型;
在manifest中引入定時器檢視檔案