Developer Logs

Static path ? หมดห่วงการเรียก path หลายที่ แค่เซ็ตให้ดีตั้งแต่ .conf

odoo
Config
Python

อีกหนึ่งวิธีกับการจัดการกับ Static path ใน odoo

Days: 6 | Publish : 16/02/2025

odoo static path within config file
              

อยากจะ 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