Openerp/module 2

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา

Note & Category

ไฟล์จากครั้งก่อน

easynote.py

from osv import osv, fields
 
class Category(osv.Model):
    _name = 'easynote.category'
    _columns = {
        'name': fields.char('Name', size=50, required=True),
        'note_ids': fields.one2many('easynote.note', 'category_id', 'Notes')
    }

class Note(osv.Model):
    _name = 'easynote.note'
    _rec_name = 'title' 
    _columns = {
        'title': fields.char('Title', size=100, required=True),
        'body': fields.text('Body', required=True),
        'number': fields.integer('Number'),
        'category_id': fields.many2one('easynote.category', 'Category'),
    }

easynote_view.xml

<?xml version="1.0" encoding="utf-8"?>
<openerp>
  <data>
    <record model="ir.ui.view" id="view_easynote_note_tree">
      <field name="name">easynote.note.tree</field>
      <field name="model">easynote.note</field>
      <field name="arch" type="xml">
        <tree string="Note">
          <field name="title"/>
          <field name="body"/>
          <field name="number"/>
          <field name="category_id"/>
        </tree>
      </field>
    </record>
 
    <record model="ir.ui.view" id="view_easynote_note_form">
        <field name="name">easynote.note.form</field>
        <field name="model">easynote.note</field>
        <field name="arch" type="xml">
          <form string="Note" version="7.0" class="oe_form_nomargin">
            <field name="title" />
            <field name="body" widget="html" class="oe_memo" editor_height="100px" />
            <field name="number"/>
            <field name="category_id"/>
          </form>
        </field>
    </record>
 
    <record model="ir.actions.act_window" id="action_easynote_note">
      <field name="name">EasyNotes</field>
      <field name="res_model">easynote.note</field>
      <field name="view_type">form</field>
      <field name="view_mode">tree,form</field>
      <field name="context">{'search_default_open_true':True}</field>
      <field name="help" type="html">
        <p class="oe_view_nocontent_create">
          Click to add a note. blah blah
        </p>
        <p>
          Use notes to organize personal tasks or notes. 
        </p>
      </field>
    </record>

    <record model="ir.ui.view" id="view_easynote_category_tree">
      <field name="name">easynote.category.tree</field>
      <field name="model">easynote.category</field>
      <field name="arch" type="xml">
        <tree string="Categry">
          <field name="name"/>
          <field name="note_ids"/>
        </tree>
      </field>
    </record>
 
    <record model="ir.ui.view" id="view_easynote_category_form">
        <field name="name">easynote.category.form</field>
        <field name="model">easynote.category</field>
        <field name="arch" type="xml">
          <form string="Category">
            <field name="name"/>
            <field name="note_ids"/>
          </form>
        </field>
    </record>
 
    <record model="ir.actions.act_window" id="action_easynote_category">
      <field name="name">Category</field>
      <field name="res_model">easynote.category</field>
      <field name="view_type">form</field>
      <field name="view_mode">tree,form</field>
      <field name="context">{'search_default_open_true':True}</field>
      <field name="help" type="html">
        <p class="oe_view_nocontent_create">
          Click to add a category.
        </p>
      </field>
    </record>
 
    <menuitem name="Notes" id="menu_easynote_top" 
              parent="" sequence="1" 
              action="easynote.action_easynote_note"/>
 
    <menuitem name="Your Notes" id="menu_easynote_main" 
              parent="menu_easynote_top" sequence="1"/>
 
    <menuitem name="Notes" id="menu_easynote_note" 
              parent="menu_easynote_main" sequence="1" 
              action="easynote.action_easynote_note"/>
    <menuitem name="Categories" id="menu_easynote_category" 
              parent="menu_easynote_main" sequence="2" 
              action="easynote.action_easynote_category"/>
  </data>
</openerp>

onchange

ใน easynote_view.xml

    <record model="ir.ui.view" id="view_easynote_note_form">
        ...
        <field name="arch" type="xml">
          <form string="Note" version="7.0">
            <field name="title" on_change="onchange_note_title(title)"/>
            ...
          </form>
        </field>
    </record>

การระบุดังกล่าวจะทำให้เมื่อข้อมูลในฟอร์มในฟิลด์นั้นมีการเปลี่ยนแปลง จะมีการเรียกเมท็อด onchange_note_title ที่โมเดล

    def onchange_note_title(self, cr, uid, ids, title):
        pass

พารามิเตอร์ cr, uid, ids นั้นจะเป็นพารามิเตอร์ที่ส่งให้โดยอัตโนมัติ ส่วน title นั้น มาจากที่เราระบุใน attribute on_change ด้านบน

เมท็อดดังกล่าวสามารถประมวลผลแล้วส่งค่าคืนได้หลายแบบ อ่านเพิ่มได้จากเอกสารส่วน onchange

action / ORM methods

ในฟอร์ม เราสามารถเพิ่มปุ่มและกำหนดกิจกรรม (action) ให้กับปุ่มนั้นได้ (เอกสาร openerp) โดยใน xml ที่ระบุฟอร์ม เราสามารถเพิ่มปุ่มเช่น

            <button name="action_test_action" type="object" string="Test"/>

โดยที่

  • type ที่ระบุเป็น object หมายถึงให้เรียกใช้เมท็อดในคลาสของโมเดล
  • name จะระบุชื่อเมท็อดที่ต้องการเรียกให้ทำงาน

จากตัวอย่างข้างต้น ในโมเดลเราจะระบุเมท็อด

    def action_test_action(self, cr, uid, ids, context=None):
        pass

ในการทำงานกับโมเดล สามารถดู methods ของ ORM ได้จากเอกสารที่แจก

states

class Note(osv.Model):
    _name = 'easynote.note'
    _rec_name = 'title'
    _columns = {
        'title': fields.char('Title',
                             size=100,
                             required=True,
                             states={'confirmed': [('readonly', True)]}),
        'body': fields.text('Body', required=True),
        'number': fields.integer('Number'),
        'category_id': fields.many2one('easynote.category', 'Category'),

        'state': fields.selection([('draft','Draft'),
                                   ('confirmed','Confirmed')],
                                  'State',
                                  required=True,
                                  readonly=False),
    }
    _defaults = {
        'state': 'draft',
    }