iT邦幫忙

2021 iThome 鐵人賽

DAY 20
0
Software Development

Let's ODOO 開發與應用30天挑戰系列 第 20

Day20 Let's ODOO: Scheduled Actions

  • 分享至 

  • xImage
  •  

有時我們背景需要一些定時任務,Odoo同樣也可以設定,依照慣例我們來寫一個範例,每半年學生的成績就要歸零重新計算。

首先在models/res_student.xml 新增方法:

class ResStudent(models.Model):
    _name = 'res.student'
    _inherit = 'res.partner'
    _description = 'Student'

    nickname = fields.Char(string='綽號')
    math_score = fields.Float(string='數學成績')
    chinese_score = fields.Float(string='國文成績')
    avg_score = fields.Float(string='學期平均', compute='_compute_score')
    birthday = fields.Date(string='生日', required=True)
    school_id = fields.Many2one('res.company', string='所屬學校')
    school_city = fields.Char(string='所在城市', related='school_id.city')
    senior_id = fields.Many2one('res.student', string='直屬學長姐')
    junior_ids = fields.One2many('res.student', 'senior_id', string='直屬學弟妹')
    teacher_ids = fields.Many2many('res.partner', string='指導老師', domain=[('is_company', '!=', True)])
    gender = fields.Selection([("male", "男"), ("female", "女"), ("other", "其他")], string='性別')
    is_leadership = fields.Boolean(default=False)
    is_active = fields.Boolean(default=True)
    channel_ids = fields.Many2many('mail.channel', 'mail_channel_profile_partner', 'partner_id', 'channel_id', copy=False)

    
    def _init_score(self):
        for record in self:
            record.math_score = 0.0
            record.chinese_score = 0.0

方法單純就是將兩項成績設為零,而平均成績我們是用計算的,所以不用設定。

並增加檔案/data/res_student_cron.xml

<?xml version="1.0" encoding="utf-8"?>
<odoo>
    <data>
       <record id="student_cron" model="ir.cron">
           <field name="name">Student Score Init Cron Job</field>
           <field name="model_id" ref="model_res_student"/>
           <field name='interval_number'>6</field>
           <field name='interval_type'>months</field>
           <field name="numbercall">-1</field>
           <field name="doall" eval="False"/>
           <field name="code">model._init_score()</field>
           <field name="state">code</field>
       </record>
    </data>
</odoo>

設定cron job文件

id:自定義,不重複即可

model:固定為ir.cron

name:cron job名稱

model_id:關聯model,寫法為 "model" + Model Name

interval_type:執行單位,分別有monthsweeksdayshoursminutes

interval_number :填入數字,配合interval_type ,本範例代表六個月執行一次。

numbercall :總共執行幾次,如果是-1,代表不斷執行。

doall :布林值,如果沒執行到重啟時會不會執行。

statecode:以code的方式執行,參照為model內的哪個方法。

依照慣例將此文件加入__manifest__.py內:

'data': [
        'data/res_student_cron.xml'
		...
    ],

我們重啟後便可以在Odoo Scheduled Actions內看到,記得要開啟開發者模式:

https://ithelp.ithome.com.tw/upload/images/20211005/20130896mK2jpeBm0b.png

這裡筆者先將時間改為一分鐘執行一次,來檢查是否正確執行,log內有cron job執行結果:

https://ithelp.ithome.com.tw/upload/images/20211005/201308962AUg2E6oar.png

Student Model內的分數也已經清空

https://ithelp.ithome.com.tw/upload/images/20211005/20130896hRePbobjkF.png
今天介紹就到這裡了,明天我們來介紹流水號的設定


上一篇
Day19 Let's ODOO: Logging
下一篇
Day21 Let's ODOO: 流水號
系列文
Let's ODOO 開發與應用30天挑戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言