Technical Training -Part 3-

Setelah kita berhasil membuat modul training dan menginstallnya, maka modul training tersebut akan menghasilkan beberapa menu dan form. Diantara pelajarannya adalah :

1. Mempelajari cara membuat menu utama “Training OpenERP”
2. Mempelajari cara membuat group submenu “Training”
3. Mempelajari cara membuat submenu “Kursus”
4. Mempelajari cara membuat interface tree dan form sebuah object “Kursus”.

Selanjutnya kita akan mencoba mengembangkan modul training kita sebelumnya dengan teori-teori yang telah kita pelajari. Untuk yang pertama kita akan mempelajari relasi antar object, sebelum kita membuat relasi antar object maka kita akan membuat object baru yang bernama Sesi yang nantinya akan kita relasikan ke object kursus sebelumnya. Contoh codingnya seperti dibawah ini :


class Sesi(osv.osv):
    _name = 'training.sesi'
    _columns = {
        'name': fields.char('Judul Sesi', 128, required=True),
        'tanggal_mulai': fields.date('Tanggal Mulai'),
        'durasi': fields.float('Durasi', digits=(16,2), help="Durasi dalam hari"),
        'kursi':fields.integer('Jumlah Kursi')
    }

Sesi()

Setelah kita membuat object class Sesi , maka selanjutnya seperti biasa kita harus membuat interface untuk tampilan form dan tree dari object tersebut. Contohnya seperti script dibawah ini :


	<record model="ir.ui.view" id="sesi_tree_view">
	     <field name="name">training.sesi.tree</field>
	     <field name="model">training.sesi</field>
	     <field name="arch" type="xml">
	         <tree string="List Sesi">
				<field name="name" />
				<field name="tanggal_mulai"/>
				<field name="durasi"/>
	         </tree>
	     </field>
	</record>
	
	<record model="ir.ui.view" id="sesi_form_view">
	     <field name="name">training.sesi.form</field>
	     <field name="model">training.sesi</field>
	     <field name="arch" type="xml">
	         <form string="Form Sesi" version="7.0">
	             <group>
					<field name="name" />
					<field name="tanggal_mulai" />
					<field name="durasi"/>
					<field name="kursi"/>
	             </group>
	         </form>
	     </field>
	</record>

	<record model="ir.actions.act_window" id="sesi_list_action">
	    <field name="name">Sesi</field>
	    <field name="res_model">training.sesi</field>
	    <field name="view_type">form</field>
	    <field name="view_mode">tree,form</field>
	</record>
	
	<menuitem id="sesi_menu" name="Sesi" parent="kursus_menu" action="sesi_list_action" />

Selanjutnya, untuk membuat relasi antar object, OpenERP telah menyediakan beberapa fields relasi -seperti yang kita pelajari sebelumnya-, diantaranya adalah :

1. many2one : tampilannya seperti combobox
2. one2many : tampilannya seperti tabel, field-fieldnya bisa di tambah/kurang
3. many2many : tampilannya hampir sama seperti one2many tetapi tabelnya tidak bisa ditambah/kurangi fieldsnya

Pada tutorial kali ini, kita akan mencoba membuat relasi antar tabel dengan menggunakan field many2one dan one2many. Jika kita membuat sebuah field one2many maka field ini PASTI membutuhkan field many2one pada object tujuan.

Untuk lebih jelasnya kita akan menambahkan field one2many dan one2many pada object ‘training.kursus’ yang telah kita buat pada tutorial sebelumnya. Hasilnya seperti dibawah ini :


class Kursus(osv.osv):
...
        'koordinator_id': fields.many2one('res.users', string='Koordinator', select=True),
        'sesi_ids': fields.one2many('training.sesi', 'kursus_id', 'Sesi'),
...

Kursus()

Jika kita perhatikan pada field one2many diatas yaitu sesi_ids, field tersebut memiliki beberapa parameter diantaranya adalah :

1. ‘training.sesi’ : object tujuan yang akan menjadi ‘anak’ dari object kursus
2. ‘kursus_id’ : fields yang harus dibuat dan akan menjadi foreign key pada object ‘training.sesi’

Setelah kita menambahkan fields relasi one2many pada object ‘training.kursus’ diatas, maka kita harus membuat field relasi many2one pada object ‘training.sesi’ seperti yang saya jelaskan diatas, karna fields one2many pasti membutuhkan field many2one pada object tujuan. Sehingga object ‘training.sesi’ harus kita tambah field many2one seperti dibawah ini :


class Sesi(osv.osv):
...

        'instructur_id': fields.many2one('res.partner', 'Instructur'),
        'kursus_id':fields.many2one('training.kursus', 'Kursus', required=True, ondelete='cascade'),

...

Sesi()

Langkah terakhir adalah membuat tampilan form dari object kursus dan sesi yang telah kita revisi, sehingga tampilan akhirnya menjadi seperti ini :


	<record model="ir.ui.view" id="kursus_tree_view">
	    <field name="name">training.kursus.tree</field>
	    <field name="model">training.kursus</field>
	    <field name="arch" type="xml">
	        <tree string="List Kursus">
	            <field name="name"/>
	            <field name="koordinator_id"/>
	            <field name="keterangan"/>
	        </tree>
	     </field>
	</record>
	
	<record model="ir.ui.view" id="kursus_form_view">
	    <field name="name">training.kursus.form</field>
	    <field name="model">training.kursus</field>
	    <field name="arch" type="xml">
	        <form string="Form Kursus" version="7.0">
	            <group> 
					<field name="name" />
	            	<field name="koordinator_id" />
	            </group>
	            <notebook colspan="4">
	                <page string="Keterangan">
	                    <field name="keterangan" nolabel="1" colspan="4" />
	                </page>
	                <page string="Sesi">
	                    <field name="sesi_ids" nolabel="1" colspan="4">
	                        <tree string="Sesi Training">
	                            <field name="name"/>
	                            <field name="instructur_id"/>
	                            <field name="tanggal_mulai"/>
	                            <field name="durasi"/>
	                            <field name="kursi"/>
	                        </tree>
	                        <form string="Sesi Training">
	                            <field name="name"/>
	                            <field name="instructur_id"/>
	                            <field name="tanggal_mulai"/>
	                            <field name="durasi"/>
	                            <field name="kursi"/>
	                        </form>
	                    </field>
	                </page>
	            </notebook>
	        </form>
	    </field>
	</record>


	<record model="ir.ui.view" id="sesi_tree_view">
	     <field name="name">training.sesi.tree</field>
	     <field name="model">training.sesi</field>
	     <field name="arch" type="xml">
	         <tree string="List Sesi">
				<field name="name" />
				<field name="instructur_id"/>
				<field name="kursus_id"/>
				<field name="tanggal_mulai"/>
				<field name="durasi"/>
	         </tree>
	     </field>
	</record>
	
	<record model="ir.ui.view" id="sesi_form_view">
	     <field name="name">training.sesi.form</field>
	     <field name="model">training.sesi</field>
	     <field name="arch" type="xml">
	         <form string="Form Sesi" version="7.0">
	             <group>
					<field name="name" />
					<field name="instructur_id" />
					<field name="kursus_id"/>
					<field name="tanggal_mulai" />
					<field name="durasi"/>
					<field name="kursi"/>
	             </group>
	         </form>
	     </field>
	</record>

Jika kita lihat code xml diatas, maka ada perbedaan ketika kita menambahkan field one2many kedalam file xml dibandingkan field lainnya, yaitu kita harus mendefinikan tampilan form dan tree dari field one2many tersebut, karna field one2many akan berbentuk seperti tabel baru dan untuk menambahkannya diperlukan tampilan form dan tree.

Tampilan tree field one2many sesi_ids akan terlihat pada form utama Kursus. Sedangkan tampilan form field one2many sesi_ids akan terlihat ketika kita ingin menambahkan data baru field tersebut dengan munculnya popup sebuah form.

Semoga bermanfaat dan selamat mencoba …
In syaa Allah bersambung …

Advertisements

19 thoughts on “Technical Training -Part 3-

  1. Asalamualaikum wrb wb
    Saya sudah mencoba sesuai petunjuk diatas mas, tapi ko setelah saya update tidak ada perubahan di tampilan, dan menu “sesi” tidak keluar.. Langkah saya pertama menggabungkan object kursus dengan object sesi di file training_openerp.py , setelah itu update file training_openerp_view.xml sesuai dengan code xml terakhir + saya tambahin

    apakah langkah saya sudah benar?
    terimakasih sebelumnya

    waalaikumsalam wr wb

    • oh ia waktu upgrade muncul error “ValueError: No such external ID currently defined in the system: training_openerp.sesi_list_action”

      • Wa’alaikumussalamwarohmatulloh mas ..

        Ada 2 kemungkinan :
        1. Salah penulisan ejaan untuk sesi_list_action
        2. Urutan pendefinisiannya tidak berurut, pastikan actionnya dibuat dulu baru bikin menunya seperti contoh code diatas :

        
        <record model="ir.actions.act_window" id="sesi_list_action">
            <field name="name">Sesi</field>
            <field name="res_model">training.sesi</field>
            <field name="view_type">form</field>
            <field name="view_mode">tree,form</field>
        </record>
         
        <menuitem id="sesi_menu" name="Sesi" parent="kursus_menu" action="sesi_list_action" />
        
        
  2. Alhamdulillah mas, sudah bisa ternyata saya lupa memasukkan sesi_list_action nya he9, kesalahan saya di asal copas di sourecode yg telah mas gabungin diatas yg belum termasuk action + menunya

  3. Assalamu’alaikum Warahmatullahi Wabarakatuh,

    Mohon bimbingan kembali Mas Aziz,

    Saya baru saja melakukan langkah-langkah di atas, dan ketika saya update modulenya keluar pesan error seperti ini:

    Client Traceback (most recent call last):
    File “C:\Program Files\OpenERP 7.0-20130709-231045\Server\server\openerp\addons\web\http.py”, line 204, in dispatch
    File “C:\Program Files\OpenERP 7.0-20130709-231045\Server\server\openerp\addons\web\controllers\main.py”, line 1132, in call_button
    File “C:\Program Files\OpenERP 7.0-20130709-231045\Server\server\openerp\addons\web\controllers\main.py”, line 1120, in _call_kw
    File “C:\Program Files\OpenERP 7.0-20130709-231045\Server\server\openerp\addons\web\session.py”, line 42, in proxy
    File “C:\Program Files\OpenERP 7.0-20130709-231045\Server\server\openerp\addons\web\session.py”, line 30, in proxy_method
    File “C:\Program Files\OpenERP 7.0-20130709-231045\Server\server\openerp\addons\web\session.py”, line 103, in send

    Server Traceback (most recent call last):
    File “C:\Program Files\OpenERP 7.0-20130709-231045\Server\server\openerp\addons\web\session.py”, line 89, in send
    File “C:\Program Files\OpenERP 7.0-20130709-231045\Server\server\.\openerp\netsvc.py”, line 292, in dispatch_rpc
    File “C:\Program Files\OpenERP 7.0-20130709-231045\Server\server\.\openerp\service\web_services.py”, line 622, in dispatch
    File “C:\Program Files\OpenERP 7.0-20130709-231045\Server\server\.\openerp\service\security.py”, line 40, in check
    File “C:\Program Files\OpenERP 7.0-20130709-231045\Server\server\.\openerp\pooler.py”, line 49, in get_pool
    File “C:\Program Files\OpenERP 7.0-20130709-231045\Server\server\.\openerp\pooler.py”, line 33, in get_db_and_pool
    File “C:\Program Files\OpenERP 7.0-20130709-231045\Server\server\.\openerp\modules\registry.py”, line 192, in get
    File “C:\Program Files\OpenERP 7.0-20130709-231045\Server\server\.\openerp\modules\registry.py”, line 218, in new
    File “C:\Program Files\OpenERP 7.0-20130709-231045\Server\server\.\openerp\modules\loading.py”, line 341, in load_modules
    File “C:\Program Files\OpenERP 7.0-20130709-231045\Server\server\.\openerp\modules\loading.py”, line 256, in load_marked_modules
    File “C:\Program Files\OpenERP 7.0-20130709-231045\Server\server\.\openerp\modules\loading.py”, line 187, in load_module_graph
    File “C:\Program Files\OpenERP 7.0-20130709-231045\Server\server\.\openerp\modules\loading.py”, line 74, in
    File “C:\Program Files\OpenERP 7.0-20130709-231045\Server\server\.\openerp\modules\loading.py”, line 124, in _load_data
    File “C:\Program Files\OpenERP 7.0-20130709-231045\Server\server\.\openerp\tools\convert.py”, line 954, in convert_xml_import
    File “C:\Program Files\OpenERP 7.0-20130709-231045\Server\server\.\openerp\tools\convert.py”, line 847, in parse
    File “C:\Program Files\OpenERP 7.0-20130709-231045\Server\server\.\openerp\tools\convert.py”, line 814, in _tag_record
    File “C:\Program Files\OpenERP 7.0-20130709-231045\Server\server\openerp\addons\base\ir\ir_model.py”, line 936, in _update
    File “C:\Program Files\OpenERP 7.0-20130709-231045\Server\server\openerp\addons\base\ir\ir_ui_view.py”, line 208, in write
    File “C:\Program Files\OpenERP 7.0-20130709-231045\Server\server\.\openerp\osv\orm.py”, line 4201, in write
    File “C:\Program Files\OpenERP 7.0-20130709-231045\Server\server\.\openerp\osv\orm.py”, line 1544, in _validate
    except_orm: (‘ValidateError’, u’Error occurred while validating the field(s) arch: Invalid XML for View Architecture!’)
    Ok

    pesan itu keluar ketika saya update file xml, adapun script xml saya ubah dengan tambahan tulisan diatas, adapun penulisan lengkapnya adalah sebagai berikut:

    training.kursus.tree
    training.kursus

    training.kursus.form
    training.kursus

    training.sesi.tree
    training.sesi

    training.sesi.form
    training.sesi

    Sesi
    training.sesi
    form
    tree,form

    Mohon koreksinya mas Aziz, apakah benar penulisannya

      • Tadinya saya juga pakai ubuntu, tapi setelah saya coba materi technical 2 jalan juga di windows saya jadi ketagihan deh di windows :), tapi apakah benar langkah saya dimateri ini adalah dengan menambahkan script: diatas pada file training_openerp.py (yang sudah dibuat pada materi 2), dan relasi, dan untuk interface tampilan di file xml yang sudah dibuat juga pada materi 2,

        Tq, sebelumnya

  4. Assalamu’alaikum,

    Mas Aziz, setelah saya ubah file xml dengan script di atas:

    training.kursus.tree
    training.kursus

    training.kursus.form
    training.kursus

    training.sesi.tree
    training.sesi

    training.sesi.form
    training.sesi

    Sesi
    training.sesi
    form
    tree,form

    dan saya lakukan update modul, hasilnya malah error, yang menjadi pertanyaan, apakah penulisan script di file xml seperti yang diatas sudah benar?

    NB: Saya sekarang sudah pakai linux lagi nih hehehehe,

    Terima kasih ya Mas Aziz atas pencerahannya

      • Mas mau menayakan kalo error seperti ini bagaimana yah, sedangkan di model saya sudah tulis persis dengan tutorial yang di ajarkan

        Either you wrongly customized this view, or some modules bringing those views are not compatible with your current data model
        2015-03-02 07:11:49,512 1440 ERROR snc openerp.addons.base.ir.ir_ui_view: Can’t render view training_openerp.kursus_tree_view for model: training.kursus
        Traceback (most recent call last):
        File “D:\Program Files\OpenERP 7.0-20150109\server\openerp\addons\base\ir\ir_ui_view.py”, line 126, in _check_render_view
        File “D:\Program Files\OpenERP 7.0-20150109\server\.\openerp\osv\orm.py”, line 2304, in fields_view_get
        File “D:\Program Files\OpenERP 7.0-20150109\server\.\openerp\osv\orm.py”, line 1981, in __view_look_dom_arch
        except_orm: (‘View error’, u”Can’t find field ‘koordinator_id’ in the following view parts composing the view of object model ‘training.kursus’:\n * training.kursus.tree\n\nEither you wrongly customized this view, or some modules bringing those views are not compatible with your current data model”)
        2015-03-02 07:11:49,517 1440 ERROR snc openerp.tools.convert: Parse error in file:///C:/Users/Ihsan%20Seftian/Desktop/SNC%20Project/Addons_Custom/training_openerp/training_openerp_view.xml:4:

        training.kursus.tree
        training.kursus

      • Pastikan field “koordinator_id” ada pada object “training.kursus” di file pythonnya. WIndows memang terkadang agak sulit untuk mengupdate perubahan, jika diperlukan bisa di Restart PC nya πŸ™‚ ….

  5. permisi mas, sayakan sedang belajar development odoo…

    dari tutor yg saya lihat di atas, itu yg class sesi di letakan di file .py yg sebelumnya sudah di buat bukan?
    terus file .xmlnya juga sama? di letakin di file .xml yg sudah d buat di tutor sebelumnya

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s