· documentation · 3 min read
OpenUpgrade อาวุธลับของ Odoo Community
โมดูลน่าสนใจจาก Odoo Community ที่ช่วยให้การ upgrade version เป็นเรื่องง่าย
Source: https://github.com/OCA/OpenUpgrade
Documentation: https://oca.github.io/OpenUpgrade/
ทุกการเปรียบเทียบความแตกต่างระหว่าง Odoo Enterprise กับ Odoo Community มักจะมีการชูจุดเด่นของ Enterprise ในเรื่องของการ support migration (Upgrade version odoo) ไป version ใหม่ ซึ่ง Odoo Community ไม่มีในสิ่งนี้
…แต่ปัจจุบันกลุ่ม OCA ได้พัฒนาโมดูลในการ upgrade version สำหรับ Community ชื่อว่า OpenUpgrade ซึ่งเป็น Tools ที่จะช่วยในการแก้ปัญหาและได้รับการแนะนำโดย Fabien Pinckaers (CEO and Founder of Odoo S.A.)
จากที่ผมศึกษามาและเห็นถึงความน่าสนใจของโมดูลนี้ จึงอยากที่จะมาแชร์การ Upgrade Version โดยใช้โมดูล OpenUpgrade ตั้งแต่ Version14 เป็นต้นไป ให้ดูกันครับ
Note สำหรับ Version อื่นๆที่เก่ากว่า จะมีขั้นตอนการทำงานที่แตกต่างกัน หากสนใจสามารถศึกษาเพิ่มเติมได้ที่ Documentation ของโมดูล OpenUpgrade ได้นะครับ
การเตรียมตัวก่อน Upgrade Version
- Database Version ปัจจุบัน
- Source Code OpenUpgrade (Version ถัดไป): https://github.com/OCA/OpenUpgrade
- Server ทดสอบ Version ถัดไป
- Module สำหรับ Version ถัดไป ที่มีการติดตั้งใน Version ปัจจุบัน
- การทำ Migration จะสามารถทำได้ทีละ 1 version หากต้องการ upgrade จาก version 14 → version 16 จะต้องทำ 2 รอบ
- version 14 → version 15
- Version 15 → version 16
ขั้นตอนการทำ Migrations (ตัวอย่าง V14 -> V15)
- ติดตั้ง Odoo Version 15
- ติดตั้ง Database ของ Version 14 เข้าไปใน Version 15
- เพิ่ม OpenUpgrade เข้าไปใน addons path ใน Version 15
- Run odoo ด้วยคำสั่งดังนี้
./odoo-bin —upgrade-path=./OpenUpgrade/openupgrade_scripts/scripts —update all —stop-after-init —load=base,web,openupgrade_framework —database=devel_14
- —upgrade-path: ใส่ scripts ที่อยู่ใน OpenUpgrade
- —load: เพิ่ม openupgrade_framework
- —database: ระบุชื่อ database ที่ต้องการ migrate
- ระบบจะทำการ Migrate เป็น Version ตาม OpenUpgrade ให้
- ตรวจสอบความถูกต้องและข้อมูลเทียบกับปัจจุบัน
เสร็จสิ้นกระบวนการ Migrate !! ง่าย ๆ แบบนี้เลยครับ อย่างไรก็ตาม กรณีนี้จะเป็นกรณีที่ไม่มีการ Customize Module เพิ่มเติม ซึ่งในการทำงานจริงคงเป็นไปได้ยาก อย่างน้อยก็คงมีการ Customize ในส่วนของ Form ซึ่งหากใน Version ถัดไปมีการเปลี่ยน, เพิ่ม, ลบ Field จาก Version เดิม ทางผู้ใช้งานจะต้องเขียน script เพิ่มเติม เพื่อให้ข้อมูลเก่ายังคงถูกต้องใน Version ใหม่
การทำ Migration Scripts
ส่วนนี้ถือว่าเป็นส่วนหลักของ OpenUpgrade เลยทีเดียว เพราะผู้ใช้งานจะต้องเขียน Scripts ที่มีการเปลี่ยนแปลงจาก Version เก่าทั้งหมดไว้ในนี้ โดยตัวอย่างจะเป็นการทำ script ของโมดูล Purchase Request https://github.com/OCA/purchase-workflow/ จาก Version14 → Version 15 โดยจากการตรวจสอบจะพบว่ามีการเปลี่ยนแปลง Field currency เป็น store
Version 14 (Purchase Request)
ทดสอบโดยการไม่มี Migration Script ของ Purchase Request
Version 15 after migrated (Purchase Request)
จากภาพจะเห็นว่า หลัง Migrated ข้อมูลของเอกสาร PR00004 ไม่ถูกต้อง เพราะใน Version 15 มีการแสดง Currency และเก็บข้อมูล แต่ Version 14 เป็น compute field
จากตัวอย่างข้างต้น วิธีแก้ไขจะต้องทำ Migration Scripts เพื่อเปลี่ยนค่าข้อมูลให้ถูกต้องก่อนที่จะทำการ Migrate database จริง
ขั้นตอนการเขียน Migration Scripts
- ทุกการเขียน Migration Scripts จะต้องไปที่โมดูล OpenUpgrade → openupgrade_scripts → scripts
- สร้าง Folder โมดูลที่ต้องการเขียน script ในที่นี้คือ purchase_request
- สร้าง Folder version โมดูลใน Folder โมดูล ในที่นี้จะเป็น version 15.0.1.1.2
- สร้าง File upgrade_analysis_work.txt เพื่อวิเคราะห์ความแตกต่างจาก Version เดิม (ในส่วนนี้สามารถติดตั้งโมดูล upgrade_analysis เพื่อช่วยวิเคราะห์ความต่างของทั้ง 2 Version ได้)
---Models in module ‘purchase_request’--- ---Fields in module ‘purchase_request’--- purchase_request / purchase.request / currency_id (many2one) : is now stored # DONE: post-migration: fill currency_id from the company for empty ones
purchase_request / purchase.request / currency_id (many2one) : not related anymore purchase_request / purchase.request / currency_id (many2one) : now required purchase_request / res.company / notify_request_allocations (boolean): DEL # NOTHING TO DO
---XML records in module ‘purchase_request’--- NEW ir.ui.view: purchase_request.view_purchase_request_line_details DEL ir.ui.view: purchase_request.res_config_settings_view_form # NOTHING TO DO
- หลังจากวิเคราะห์แล้วว่าโมดูล purchase_request มีการเปลี่ยน field เป็น store ทางผู้ใช้งานจะต้องวิเคราะห์ต่อว่าต้องการ run script เมื่อไหร่
- pre-migration.py — run script ก่อนทำ Migration
- post-migration.py — run script หลังทำ Migration
- end-migration.py — run script หลังจบการทำ Migration
จากตัวอย่างต้องการ run script หลังจากระบบ Migration โมดูล purchase_request เสร็จ เพราะต้องการให้ใน database มี field currency ก่อนแล้วค่อย run script จึงเลือกสร้าง file post-migration.py
Script การ update field currency ที่เอกสาร PR โดยให้ currency PR มีค่าตาม currency ของ company PR
from openupgradelib import openupgrade
def _compute_currency_id_has_not_value(env): openupgrade.logged_query( env.cr, """ UPDATE purchase_request pr SET currency_id = c.currency_id FROM res_company c WHERE c.id = pr.company_id """, )
@openupgrade.migrate() def migrate(env, version): _compute_currency_id_has_not_value(env)
OpenUpgrade → openupgrade_scripts → scripts → purchase_request → 15.0.1.1.2 → post-migration.py, upgrade_analysis_work.txt
- ทดสอบโดยการ Migration ระบบและตรวจสอบข้อมูลอีกครั้งหนึ่ง
เพียงเท่านี้ข้อมูลของ Version 15 ก็จะออกถูกต้องแล้ว
การวิเคราะห์ความแตกต่างของ Database
จากขั้นตอนการเขียน Migration Script จะพบว่า เราจะรู้ได้อย่างไรว่าโมดูลไหนมีการเปลี่ยนแปลงไปบ้าง หากต้องมานั่งไล่เทียบทีละโมดูลคงใช้เวลาเยอะมาก ทาง OCA จึงมีโมดูล upgrade_analysis (https://github.com/OCA/server-tools) ใช้สำหรับการวิเคราะห์ความแตกต่างของ Database
ขั้นตอนการวิเคราะห์ความต่างของ Database
- ติดตั้งโมดูล upgrade_analysis ทั้ง 2 Version
- ไปที่เมนู Settings → Upgrade Analysis → Generate Records Wizard → Continue ระบบจะทำการสร้าง Record ของโมดูลทั้งหมดที่ติดตั้งในระบบ
- ตรวจสอบ Records ที่ถูกสร้างที่เมนู Settings → Upgrade Analysis → Records จะพบว่ามี Records ที่ระบบสร้างให้อัตโนมัติทั้งหมด
- ทำตามขั้นตอนที่ (2) และ (3) ทั้ง 2 Version
- เข้า server database version ถัดไป (Version 15)
- ไปที่เมนู Settings → Upgrade Analysis → Comparison Configurations
- สร้าง config ในการเปรียบเทียบกับ version ก่อนหน้า
- หลังกรอกข้อมูลแล้วทดสอบการเชื่อมต่อโดยการกด Test Connection หากเชื่อมต่อสำเร็จจะมีข้อความแจ้งเตือนด้านขวาบน
- กดปุ่ม New Analysis → Perform Analysis ระบบจะวิเคราะห์หาความแตกต่างเทียบกับระหว่าง Version 15 — Version 14 และแสดงผลที่ Log
หากเลือก Write File ระบบจะสร้างให้ใน Folder openupgrade_scripts → scripts โดยจะได้เป็นชื่อโมดูล → version โมดูล และภายในจะมีไฟล์ upgrade_analysis.txt เพื่อนำมาวิเคราะห์ต่อ
by Saran Lim.