อยากจะ Fix path แต่ก็ไม่อยาก Hardcode ลงไปตรง ๆ แบบนั้น แต่ไอครั้นจะทำหน้า UI มาเพื่อสำหรับการ input ข้อมูลส่วนนี้ก็ดูจะมากเกินไปหน่อย
. .
แล้วเราจะทำยังไงได้บ้างล่ะ ?
หลายคนอาจจะเคยประสบปัญหา เวลาที่เราต้องการเรียก Static path อะไรสักอย่าง เช่น เขียนสคริปเพื่อ Migration จาก .csv file หรืออะไรก็ตามที่เป็นโจทย์ในลักษณะ ที่เราต้อง Fix path ลงไปตรง ๆ เพื่อ สามารถ ref ถึง File / Folder นั้น ๆ ได้
.
สิ่งที่พอจะทำได้
ก็จะมีอยู่สักประมาณ 2 แบบ ที่เรามักจะทำกัน
1. Hardcode - แต่ก็จะต้องเปลี่ยนชื่อไฟล์และ commit code ใหม่ไปทุกครั้งที่มีการเปลี่ยนแปลง 2. Custom models - สร้าง Model ใหม่ขึ้นมาเพื่อเก็บข้อมูล Static path แล้วก็ต้องเขียนเพื่อ get ข้อมูลจาก model นี้มาเพื่อใช้ชื่อ path ที่เราต้องการ - แต่ก็ต้องเขียน custom model และ view ขึ้นมาใหม่ทั้งหมด
แล้วมีอะไรที่พอที่จะเปลี่ยนได้ โดยไม่ต้อง commit code ใหม่ทุกครั้ง และก็ไม่ต้องถึงกับเขียน custom model ขึ้นมาใหม่ทั้งก้อนบ้างล่ะ ?
Config file คือคำตอบ
จุดกึ่งกลางที่พอที่จะเป็นไปได้ของเรื่องอยู่ที่ไฟล์ .conf นั่นเองครับ ปกติเราอาจจะคุ้นเคยว่า Config file นั้นใช้สำหรับการใส่ค่า System parameter ต่าง ๆ ไว้ในนี้ แต่เราสามารถใช้เจ้า Config file ในการเซ็ต Custom system parameter ได้เหมือนกัน และการเรียกใช้ก็ไม่ได้ยากจนเกินไป
.
ขอกลับไปโจทย์เดิมว่าเราต้องการ Fix path ของ File / Folder
odoo.conf
[options] addons_path = /mnt/extra-addons,/mnt/extra-addons/custom_module custom_var_static_path = /mnt/extra-addons/custom_module/my_module_that_works/static/src/data/ employee_migration_file = /mnt/extra-addons/custom_module/my_module_that_works/static/src/data/a_file.csv . . .
ทีนี้เราก็จะสามารถเรียกใช้ Params ที่อยู่ใน config นี้ได้แล้ว โดยที่ฝั่ง python เราจะเรียกใช้แบบนี้
module_file.py
from odoo.tools import config MIGRATION_PATH = config.get("custom_var_static_path") EMPLOYEE_FILE = config.get("employee_migration_file") def user_data_migration(self): filename = "user_migration.csv" complete_file_path = MIGRATION_PATH + filename # ... processing user def migration_employee(self): employee_csv_file = EMPLOYEE_FILE # ... processing employee
ในวิธีการนี้ ก็จะช่วยให้เราไม่ต้องไป Hardcode ตรง ๆ ที่ python file และยังมีความยืดหยุ่นของการเปลี่ยนชื่อไฟล์ได้
. .
ก็จบไปกับการทำ Custom config variable และนำมาใช้งานใน python code ของเรา
.
Trade off & Consideration
ทั้งนี้นั้นนี่เป็นอีกแค่เพียงหนึ่งวิธีการในการจัดการกับเรื่อง Static path โดยมีเรื่องที่จะต้องพิจารณาอยู่ไม่ต่างกับวิธีการอื่น ๆ
1. การเรียกใช้แบบนี้ แปลว่าถ้ามีการเปลี่ยนแปลง path dev จำเป็นจะต้องเข้าถึง .config file ได้ด้วย ซึ่งถ้าเป็นการทำงานใน project ใหญ่ ที่จำเป็นต้องมีการจำกัดสิทธิ์ในการเข้าถึง server / config file อาจจะมีความไม่สะดวกเกิดขึ้นได้ในส่วนนี้ 2. การ Setup & Config ในตอนเริ่มต้นกรณีที่เป็นการย้าย Server หรือติดตั้งใหม่ อาจเกิดข้อผิดพลาดจากการกำหนดตัวแปรใน .conf file ไม่ครบเกิดขึ้นได้ 3. End user ไม่สามารถเปลี่ยนแปลงข้อมูลส่วนนี้ได้ด้วยตัวเอง
ก็นับว่าเป็นอีกตัวเลือกนึงที่จะต้องพิจารณา use case ในการเอาไปใช้ให้เหมาะสม เพราะก็คงตอบได้ยากว่า เหตุการณ์ไหนที่จะเหมาะหรือไม่เหมาะ ขึ้นอยู่กับการออกแบบ และสถานการณ์ในภาพรวมของ project ด้วยล่ะครับ
. .
งั้นวันนี้ก็ขอลาไปก่อนนนนน แล้วพบกันใหม่ครับพ้ม !
>_JV
