สร้างโมดูล

ก่อนสร้างโมดูลแรกของคุณ จำเป็นต้อง:doc:สร้างโปรเจกต์ Odoo.sh <getting_started/create> และทราบ URL ของ repository GitHub ของคุณ

คำศัพท์

  • ~/src คือไดเรกทอรีที่มีที่เก็บ Git ที่เกี่ยวข้องกับโปรเจกต์ Odoo ของคุณ

  • odoo คือผู้ใช้ GitHub

  • odoo-addons คือ repository บน GitHub

  • feature-1 คือชื่อของ branch สำหรับการพัฒนา

  • main คือชื่อของ branch สำหรับ production

  • my_module คือชื่อของโมดูล

แทนที่สิ่งเหล่านี้ตามความจำเป็น

สร้างสาขาการพัฒนา

จาก:doc:มุมมอง Branches <getting_started/branches>:

  • ในแผง branches navigation คลิกปุ่ม + (New development branch) ถัดจาก Development

  • ภายใต้ Fork เลือก branch main

  • ภายใต้ To ใส่ feature-1

การ fork branch สำหรับ production เพื่อสร้าง branch สำหรับการพัฒนาบน Odoo.sh

เมื่อการ build เสร็จสิ้น คุณสามารถเข้าถึง:doc:ตัวแก้ไข <getting_started/online_editor>`และโค้ดของ branch สำหรับการพัฒนาของคุณได้จากโฟลเดอร์ `~/src/user

สร้างโครงสร้างโมดูล

Scaffolding

แม้ว่าจะไม่จำเป็น แต่ scaffolding ช่วยหลีกเลี่ยงความน่าเบื่อของการตั้งค่าโครงสร้างโมดูล Odoo พื้นฐาน คุณสามารถ scaffold โมดูลใหม่โดยใช้ไฟล์ปฏิบัติการ odoo-bin

จากเทอร์มินัลของ:doc:ตัวแก้ไข <getting_started/online_editor> ให้รัน:

odoo-bin scaffold my_module ~/src/user/

Tip

หากคุณไม่ต้องการติดตั้ง Odoo บนคอมพิวเตอร์ คุณยังสามารถ:download:ดาวน์โหลดเทมเพลตโครงสร้างโมดูลนี้ <create_module/my_module.zip>`ได้ แทนที่ `my_module ทุกตำแหน่งด้วยชื่อที่คุณเลือก

โครงสร้างด้านล่างนี้จะถูกสร้างขึ้น:

my_module
├── __init__.py
├── __manifest__.py
├── controllers
│   ├── __init__.py
│   └── controllers.py
├── demo
│   └── demo.xml
├── models
│   ├── __init__.py
│   └── models.py
├── security
│   ├── ir.model.access.csv
│   └── models.py
└── views
    ├── templates.xml
    └── views.xml

Warning

ใช้เฉพาะตัวอักษรและตัวเลข (a-z, 0-9) หรือขีดล่าง (_) เท่านั้นเมื่อตั้งชื่อโมดูลของคุณ เนื่องจากชื่อของโมดูลจะถูกใช้สำหรับคลาส Python และชื่อคลาสที่มีอักขระพิเศษอื่นนอกเหนือจากขีดล่างจะไม่ถูกต้องใน Python

ยกเลิกการคอมเมนต์ไฟล์ต่อไปนี้:

  • models/models.py ตัวอย่างของโมเดลพร้อมกับฟิลด์ต่าง ๆ

  • views/views.xml มุมมองแบบทรีและฟอร์ม พร้อมเมนูสำหรับเปิดมุมมองเหล่านั้น

  • demo/demo.xml ข้อมูลตัวอย่างสำหรับโมเดลตัวอย่าง

  • controllers/controllers.py ตัวอย่างของคอนโทรลเลอร์ที่ใช้งานเส้นทางต่าง ๆ

  • views/templates.xml เทมเพลต qweb ตัวอย่างสองรายการที่ใช้โดยเส้นทางของคอนโทรลเลอร์

  • __manifest__.py ไฟล์ manifest ของโมดูล ประกอบด้วยชื่อ คำอธิบาย และไฟล์ข้อมูลที่จะโหลด ยกเลิกการคอมเมนต์ไฟล์ข้อมูลรายการควบคุมการเข้าถึง:

    # 'security/ir.model.access.csv',
    

ด้วยตนเอง

หากต้องการสร้างโครงสร้างโมดูลด้วยตนเอง ให้ปฏิบัติตาม:doc:`/developer/tutorials/server_framework_101`เพื่อทำความเข้าใจโครงสร้างของโมดูลและเนื้อหาของแต่ละไฟล์

พุชไปยังสาขาการพัฒนา

  1. จัดเตรียมการเปลี่ยนแปลงที่จะคอมมิตโดยรัน:

    git add my_module
    
  2. คอมมิตการเปลี่ยนแปลงของคุณโดยรัน:

    git commit -m "My first module"
    
  3. พุชการเปลี่ยนแปลงของคุณไปยังที่เก็บระยะไกลโดยรัน:

    จากเทอร์มินัลของ:doc:ตัวแก้ไข <getting_started/online_editor> ให้รัน:

    git push https HEAD:feature-1
    

ทดสอบโมดูล

สาขาควรปรากฏภายใต้ส่วน:guilabel:การพัฒนา`ของแผงนำทาง:doc:`มุมมองสาขา <getting_started/branches>

ตัวอย่างของสาขาการพัฒนา

คลิกที่ชื่อสาขาเพื่อดูประวัติของมัน รวมถึงการเปลี่ยนแปลงที่คุณเพิ่งพุชไป เมื่อฐานข้มูลพร้อมแล้ว ให้คลิก:guilabel:`เชื่อมต่อ`เพื่อเข้าถึง

ปุ่มเชื่อมต่อเพื่อเข้าถึงฐานข้อมูล

หากโปรเจกต์ Odoo.sh ของคุณถูกกำหนดค่าให้ติดตั้งโมดูลโดยอัตโนมัติ มันจะปรากฏโดยตรงบนแดชบอร์ดฐานข้อมูล มิฉะนั้นจะสามารถติดตั้งได้ภายใต้แอป:guilabel:Apps

โมดูลใหม่บนแดชบอร์ดฐานข้อมูล

ทดสอบกับข้อมูลการใช้งาน

Note

ฐานข้อมูลที่ใช้งานจริงจำเป็นสำหรับขั้นตอนนี้ หากคุณยังไม่มี ให้สร้างมันขึ้นมา

เมื่อคุณทดสอบโมดูลในบิลด์การพัฒนาด้วยข้อมูลสาธิตและเชื่อว่ามันพร้อมแล้ว คุณสามารถทดสอบด้วยข้อมูลที่ใช้งานจริงโดยใช้สาขาสเตจจิ้ง

คุณสามารถ:

  • แปลงสาขาการพัฒนาของคุณเป็นสาขาสเตจจิ้งโดยการลากและวางลงในส่วน:guilabel:Staging

  • ผสานมันเข้ากับสาขาสเตจจิ้งที่มีอยู่โดยการลากและวางลงบนสาขานั้น

  • ใช้คำสั่ง git merge เพื่อผสานสาขาของคุณ

สิ่งนี้จะสร้างบิลด์สเตจจิ้งใหม่ที่ทำซ้ำฐานข้อมูลที่ใช้งานจริงและรันบนเซิร์ฟเวอร์ที่อัปเดตด้วยการเปลี่ยนแปลงล่าสุดของสาขาของคุณ

เมื่อฐานข้อมูลพร้อมแล้ว ให้คลิก:guilabel:`เชื่อมต่อ`เพื่อเข้าถึง

ติดตั้งโมดูล

ติดตั้งโมดูลจากแอป:guilabel:Apps เนื่องจากโมดูลอาจไม่ปรากฏโดยตรงในรายการแอป ให้อัปเดตรายการแอปโดยการเปิดใช้งาน:ref:โหมดนักพัฒนา <developer-mode>`และคลิก:menuselection:`อัปเดตรายการแอป --> อัปเดต

Note

โมดูลจะไม่ถูกติดตั้งโดยอัตโนมัติ เนื่องจากวัตถุประสงค์ของบิลด์สเตจจิ้งคือการทดสอบพฤติกรรมของการเปลี่ยนแปลงของคุณเหมือนกับที่จะเป็นบนฐานข้อมูลที่ใช้งานจริง ดังนั้นคุณจะไม่ต้องการให้โมดูลถูกติดตั้งโดยอัตโนมัติ

ปรับใช้ในการใช้งาน

เมื่อคุณทดสอบโมดูลในสาขาสเตจจิ้งด้วยข้อมูลที่ใช้งานจริงและเชื่อว่ามันพร้อมสำหรับการใช้งานจริงแล้ว คุณสามารถผสานสาขาของคุณเข้ากับสาขาที่ใช้งานจริงโดย:

  • ลากและวางสาขาสเตจจิ้งลงบนสาขาที่ใช้งานจริง

  • ใช้คำสั่ง git merge เพื่อผสานสาขาของคุณ

สิ่งนี้จะผสานการเปลี่ยนแปลงล่าสุดจากสาขาสเตจจิ้งเข้ากับสาขาที่ใช้งานจริงและอัปเดตเซิร์ฟเวอร์ที่ใช้งานจริงด้วยการเปลี่ยนแปลงเหล่านั้น

เมื่อฐานข้อมูลพร้อมแล้ว ให้คลิก:guilabel:`เชื่อมต่อ`เพื่อเข้าถึง

ติดตั้งโมดูล

ติดตั้งโมดูลจากแอป:guilabel:Apps เนื่องจากโมดูลอาจไม่ปรากฏโดยตรงในรายการแอป ให้อัปเดตรายการแอปโดยการเปิดใช้งาน:ref:โหมดนักพัฒนา <developer-mode>`และคลิก:menuselection:`อัปเดตรายการแอป --> อัปเดต

เพิ่มการเปลี่ยนแปลง

ส่วนนี้อธิบายวิธีการเพิ่มการเปลี่ยนแปลงในโมดูลของคุณโดยการเพิ่มฟิลด์ใหม่ในโมเดลและปรับใช้งาน

  1. จาก editor หรือจากคอมพิวเตอร์ของคุณ ให้เปิดโฟลเดอร์โมดูล ~/src/odoo-addons/my_module จากนั้นเปิดไฟล์ models/models.py เพื่อแก้ไข หลังจากฟิลด์ description:

    description = fields.Text()
    

    เพิ่มฟิลด์ datetime:

    start_datetime = fields.Datetime('Start time', default=lambda self: fields.Datetime.now())
    
  2. เปิดไฟล์ views/views.xml และหลังจาก:

    <field name="value2"/>
    

    เพิ่ม:

    <field name="start_datetime"/>
    
  3. การเปลี่ยนแปลงเหล่านี้จะเปลี่ยนแปลงโครงสร้างฐานข้อมูลโดยการเพิ่มคอลัมน์ลงในตารางและแก้ไขมุมมอง เพื่อนำไปใช้กับฐานข้อมูลที่มีอยู่ เช่น ฐานข้อมูลโปรดักชันของคุณ การเปลี่ยนแปลงเหล่านี้ต้องการให้โมดูลได้รับการอัปเดต หากคุณต้องการให้การอัปเดตดำเนินการโดยอัตโนมัติโดยแพลตฟอร์ม Odoo.sh เมื่อคุณพุชการเปลี่ยนแปลง ให้เพิ่มเวอร์ชั่นของโมดูลใน manifest โดยการเปิด __manifest__.py และแทนที่:

    'version': '0.1',
    

    ด้วย:

    'version': '0.2',
    

    แพลตฟอร์มจะตรวจจับการเปลี่ยนแปลงเวอร์ชั่นและทริกเกอร์การอัปเดตโมดูลเมื่อปรับใช้งานรีวิชันใหม่

  4. ถัดไป พุชการเปลี่ยนแปลง

  5. เมื่อคุณ ทดสอบการเปลี่ยนแปลงของคุณ แล้ว คุณสามารถรวมเข้ากับบรานช์โปรดักชัน เช่น โดยการลากและวางบรานช์ลงบนบรานช์โปรดักชันในอินเทอร์เฟซ Odoo.sh เนื่องจากคุณได้เพิ่มเวอร์ชั่นของโมดูลใน manifest แพลตฟอร์มจะอัปเดตโมดูลโดยอัตโนมัติ และฟิลด์ใหม่ของคุณจะพร้อมใช้งานทันที มิฉะนั้น คุณสามารถ อัปเดตโมดูลด้วยตนเอง ภายในรายการแอป

ใช้ไลบรารี Python ภายนอก

หากคุณต้องการใช้ไลบรารี Python ภายนอกที่ไม่ได้ติดตั้งโดยค่าเริ่มต้น คุณสามารถกำหนดไฟล์ requirements.txt ที่แสดงรายการไลบรารีภายนอกที่โมดูลของคุณต้องการ แพลตฟอร์มจะใช้ไฟล์นี้เพื่อติดตั้งไลบรารี Python ที่โปรเจกต์ของคุณต้องการโดยอัตโนมัติ

Note

  • ไม่สามารถติดตั้งหรืออัปเกรดแพ็กเกจระบบบนฐานข้อมูล Odoo.sh (เช่น แพ็กเกจ apt) อย่างไรก็ตาม ภายใใต้เงื่อนไขเฉพาะ แพ็กเกจสามารถพิจารณาเพื่อการติดตั้ง ได้ สิ่งนี้ใช้กับโมดูล Python ที่ต้องการแพ็กเกจระบบสำหรับการคอมไพล์และโมดูล Odoo ของบุคคลที่สามด้วย

  • ส่วนขยาย PostgreSQL ไม่รองรับใน Odoo.sh ดังนั้นจึงไม่สามารถติดตั้งส่วนขยาย (เช่น PostGIS, ltree, ...) ในฐานข้อมูล Odoo.sh

ตัวอย่างเช่น เพื่อใช้ ไลบรารี Unidecode ในโมดูลของคุณ:

  1. สร้างไฟล์ requirements.txt ในโฟลเดอร์รากของรีพอสิทอรีของคุณ:

    • จาก editor ของ Odoo.sh สร้างและเปิดไฟล์ ~/src/user/requirements.txt

    • จากคอมพิวเตอร์ของคุณ สร้างและเปิดไฟล์ ~/src/odoo-addons/requirements.txt

  2. เพิ่มลงในไฟล์:

    unidecode
    
  3. ตอนนี้คุณสามารถใช้ไลบรารีในโมดูลของคุณ เช่น เพื่อลบเครื่องหมายเสียงในตัวอักษรในฟิลด์ name ของโมเดลของคุณ ในการดำเนินการนี้ ให้เปิดไฟล์ models/models.py และก่อน:

    from odoo import models, fields, api
    

    เพิ่ม:

    from unidecode import unidecode
    
  4. หลังจาก:

    start_datetime = fields.Datetime('Start time', default=lambda self: fields.Datetime.now())
    

    เพิ่ม:

    @api.model
    def create(self, values):
        if 'name' in values:
            values['name'] = unidecode(values['name'])
        return super(my_module, self).create(values)
    
    def write(self, values):
        if 'name' in values:
            values['name'] = unidecode(values['name'])
        return super(my_module, self).write(values)
    
  5. เพิ่มเวอร์ชั่นของโมดูลเพื่อติดตั้ง Python dependency โดยแก้ไข:ref:manifest ของโมดูล <odoo-sh/module/add/manifest> __manifest__.py

  6. จากนั้น push การเปลี่ยนแปลง

    Tip

    Stage ไฟล์ requirements.txt โดยรัน git add requirements.txt