Using virtualenv

install   

sudo apt-get install virtualenv

create virtualenv

virtualenv env_name

activate virtualenv

source env_name/bin/activate

switch to normal env

deactivate

 

Odoo’s Coding Tips

Proper way to get Today’s Date and Now’s Datetime

  • Now’s Datetime > fields.Datetime.now()
  • Today’s Date > fields.Date.context_today(self)

Above command resolve Timezone problem, unlike using python alone, i.e., time.strftime(‘%Y-%m-%d’)

Change how the many2one dropdown is displayed through the use of name_get()

 

On view

<field name=”calendar_period_id” context=”{‘use_calendar_name’: True}” />

On class

class AccountPeriod(models.Model):
    _inherit = 'account.period'

    calendar_name = fields.Char(
        string='Calendar Name',
    )

    @api.multi
    def name_get(self):
        res = super(AccountPeriod, self).name_get()
        if self._context.get('use_calendar_name', False):
            res = []
            for rec in self:
                res.append((rec.id, rec.calendar_name))
        return res


Sorting lines with different field on Tree view

<record id="_view_sale_order_line_tree" model="ir.ui.view">
    <field name="name">sale.order.line.tree1</field>
    <field name="model">sale.order.line</field>
    <field name="type">tree</field>
    <field name="priority" eval="1"/>
    <field name="arch" type="xml">
        <tree string="Sales Order Lines" default_order="name">
            <field name="name"/>
            <field name="sequence"/>
        </tree>
    </field>
</record>

ประเภทของ ondelete 3 วิธีใน Odoo code

ประเภทของ ondelete option ใน fields.Many2one มีอยู่ด้วยกัน 3 แบบ

  1. fields.Many2one(‘model’, ondelete=’cascade‘)
    • หมายความว่า ถ้าข้อมูลรายการของ model ที่ถูกอ้างถึงถูกลบ รายการผู้อ้างก็จะถูกลบไปด้วย
  2. fields.Many2one(‘model’, ondelete=’restrict‘)
    • หมายความว่า ถ้าข้อมูลรายการของ model ที่ถูกอ้างถึงถูกลบ ระบบจะเตือนว่ามีรายการอื่นที่ยังอ้างถึงอยู่และระบบจะไม่ยอมให้ลบ
  3. fields.Many2one(‘model’, ondelete=’set null‘)
    • หมายความว่า ถ้าข้อมูลรายการของ model ที่ถูกอ้างถึงถูกลบก็ยอมให้ลย แต่ระบบจะ set null ในฟิลด์นี้ของรายการที่อ้ง

การประกาศว่า cascade แต่ละแบบเหมาะสมกับแต่ละสถานการณ์ไม่เหมือนกัน

Cascade

มักใช้กับ Document ที่มีส่วนหัวและส่วนรายการที่ถึงเป็นเอกสารเดียวกัน อย่างเช่น Sales Order มี Sales Order Line, ใน sales order line จะมีการสร้าง

order_id = fields.Many2one(‘sale.order’, ondelete=’cascade’)

ซึ่งจะให้เมื่อ Sales Order ถูกลบ Sales Order Line ก็จะถูกลบไปด้วย ซึ่งเป็นสิ่งที่ถูกต้อง

Restrict

มักใช้กับการอ้างถึง Master Data เช่น Sales Order มีการอ้างถึงลูกค้า

partner_id = fields.Many2one(‘res.partner’, ondelete=’restrict’)

และเนื่องจากการลบ master data ลูกค้า เราคงไม่อยากให้ระบบลบ Sales Order ทั้งระบบที่อ้างถึงลูกค้านี้ด้วยแน่ (ถ้าใช้ cascade) ดังนั้นการใช้ restrict เพื่อไม่ยอมให้มีการลบลูกค้าที่มีใช้ใน Sales Order แล้วจึงเหมาะสม

Set Null

น่าจะเป็นประเภทที่ใช้น้อยที่สุด การที่ยอมให้ระบบลบข้อมูลที่ถูกอ้างถึงในรายการอื่นๆและ set null ไปที่รายการนั้นๆโดยไม่แจ้งเตือนอะไร น่าจะเป็นสิ่งที่ไม่พึงประสงค์ในระบบ ERP หากแต่เป็นข้อมูลที่ไม่มีความสำคัญมากนักก็อาจพอยอมได้