Membuat Record Baru pada Pemrograman Odoo 17

Feb 27, 2025 | Odoo 17 Development

Dalam melakukan implementasi Odoo kita mungkin perlu membuat record baru adalah bagian setiap pemrograman dengan Odoo 17.

Membuat record baru pada pemrograman Odoo 17 adalah seperti pada langkah-langkah berikut ini

  1. Memulai file sistem SSH
  2. Model asrama.room

    from odoo import fields, models, api, _
    from odoo.exceptions import ValidationError, UserError
    
    class BaseArchive(models.AbstractModel):
    	_name = 'base.archive'
    	active = fields.Boolean(default=True)
    	
    	def do_archive(self):
    		for record in self:
    			record.active = not record.active
    
    class AsramaRoom(models.Model):
        _name = 'asrama.room'
        _inherit = ['base.archive']
        _description = 'Informasi Kamar Asrama'
        _rec_name = 'room_no'
    
        name = fields.Char('Nama kamar',required=True)
        room_no = fields.Char('No kamar',required=True)
        floor_no = fields.Integer('No Lantai',default=1, help='No Lantai')
        currency_id = fields.Many2one('res.currency',string='Mata uang')
        rent_amount = fields.Monetary('Harga sewa',help='Masukkan harga sewa')
    
        hostel_id = fields.Many2one('asrama.hostel','Hostel', help='Nama hostel')    
    
        student_per_room = fields.Integer('Jml pelajar per kamar',required=True,
            help='Jml yang dialokasikan per kamar')
    
        @api.depends('student_per_room','student_ids')
        def _compute_check_availability(self):
            """Mengecek ketersediaan"""
            for rec in self:
                rec.availability = rec.student_per_room - len (rec.student_ids.ids)
        
        availability = fields.Float(compute='_compute_check_availability',store=True,
            string='Ketersediaan',help='Ketersediaan kamar pada asrama')
    
        student_ids = fields.One2many('asrama.student','room_id','Daftar pelajar',
            help='Pelajar-pelajar dalam room ini')
    
        asrama_amenities_ids = fields.Many2many('asrama.amenities',
            'asrama_amenities_rel','room_id','amenity_id',
            string='Amenities', domain="[('active','=',True)]",
            help='Pilih fasilitas room' 
        )
    
        _sql_constraints = [('room_no_unique','unique(room_no)','Nomor room harus unik!')]
    
        @api.constrains('rent_amount')
        def _check_rent_amount(self):
            """Constraint pada nilai negatif"""
            if self.rent_amount < 0:
                raise ValidationError(_('Nilai rental tidak boleh negatif'))
        
        room_rating = fields.Float('Rata-rata Rating dari Room',digits=(14,4))
        state = fields.Selection([
                ('draft','Unavailable'),
                ('available','Available'),
                ('closed','Closed')
            ],
            'State',
            default='draft'
        )
    
        @api.model
        def is_allowed_transition(self,old_state,new_state):
            allowed = [
                 ('draft','available'),
                 ('available','closed'),
                 ('closed','draft')             
            ]
            return (old_state,new_state) in allowed
        
        def change_state(self,new_state):
            for room in self:
                if room.is_allowed_transition(room.state, new_state):
                    room.state = new_state
                else:
                    msg = _('Pindah dari %s ke %s tidak diperbolehkan!') % (room.state,new_state)
                    raise UserError(msg)
    
        def make_available(self):
            self.change_state('available')
        
        def make_closed(self):
            self.change_state('closed')
    
        def log_all_room_members(self):
            asrama_student_obj = self.env['asrama.student']
            all_members = asrama_student_obj.search([])
            print('Semua anggota',all_members)
            return True
        
        def create_categories(self):
            categ1 = {
                'name': 'Child category 1',
                'description': 'Description for child 1'              
            }
            categ2 = {
                'name': 'Child category 2',
                'description':  'Description child 2'
            }
            parent_category_val = {
                'name': 'Parent category',
                'description': 'Description for parent category',
                'child_ids': [
                    (0,0,categ1),
                    (0,0,categ2),
                ]
            }
    
            record = self.env['asrama.category'].create(parent_category_val)
            return True
    
  3. View asrama_room

    <?xml version='1.0' encoding='utf-8'?>
    <odoo>
        <!-- asrama.room tree view -->
        <record id="asrama_room_view_tree" model="ir.ui.view">
            <field name="name">asrama.room.view.tree</field>
            <field name="model">asrama.room</field>
            <field name="arch" type="xml">
                <tree string='Room'>
                    <field name="name"/>
                    <field name="room_no" />
                    <field name="floor_no" />
                </tree>
            </field>
        </record>
    
        <!-- asrama.room form view -->
        <record id="asrama_room_view_form" model="ir.ui.view">
            <field name="name">asrama.room.view.form</field>
            <field name="model">asrama.room</field>
            <field name="arch" type="xml">
                <form string="Room">
                    <sheet>
                        <header>
                            <button name="make_available"  string="Make Available" type="object"/>
                            <button name="make_closed"  string="Make Closed" type="object"/>
                            <button name="log_all_room_members"  string="Log semua kamar members" type="object"/>
                            <button name="create_categories"  string="Create categories" type="object"/>
                            <field name="state" widget='statusbar'/>
                        </header>
                        <group>
                            <group description='Kamar'>
                                <field name="name" />
                                <field name="room_no" />
                                <field name="hostel_id" required="1"/>
                                <field name="floor_no" />
                                <field name="active" />
                            </group>
                            <group description='Harga'>
                                <field name="student_per_room"/>
                                <field name="availability"/>
                                <field name="rent_amount" />
                                <field name="currency_id" />
                            </group>
                        </group>
                        <notebook>
                            <page name="room_studennt" string="Para Pelajar">
                                <field name="student_ids"/>
                            </page>
                            <page name="asrama_amenities" string="Room Amenities">
                                <group>
                                    <field name="asrama_amenities_ids" widget="many2many_tags"/>
                                </group>
                            </page>
                        </notebook>
                    </sheet>
                </form>
            </field>
        </record>
    
        <!-- asrama.room action window -->
        <record id="asrama_room_action" model="ir.actions.act_window">
            <field name="name">Room</field>
            <field name="type">ir.actions.act_window</field>
            <field name="res_model">asrama.room</field>
            <field name="view_mode">tree,form</field>
            <field name="domain">[]</field>
            <field name="context">{}</field>
            <field name="help" type="html">
                <p class="oe_view_nocontent_create">
                    Tambah kamar
                </p>
            </field>
        </record>
    
        <!-- This Menu Item must have a parent and an action -->
        <menuitem id="asrama_room_menu" name="Room Asrama" parent="hostel_main_menu" action="asrama_room_action" sequence="2"/>
    
    </odoo>
    
  4. Model asrama.category

    from odoo import fields, models, api
    from odoo.exceptions import ValidationError
    
    class AsramaCategory(models.Model):
        _name = 'asrama.category'
        _description = 'Kategori Hostel'
        _parent_store = True
        _parent_name = 'parent_id'
    
        name = fields.Char('Kategori')
        description = fields.Char('Description')
        
        parent_id = fields.Many2one(
            'asrama.category',
            string='Parent Category',
            ondelete='restrict',
            index=True)
        parent_path = fields.Char(index=True,unaccent=False)
        child_ids = fields.One2many('asrama.category','parent_id', string='Child Categories')
    
        @api.constrains('parent_id')
        def _check_hierarchy(self):
            if not self._check_recursion():
                raise models.ValidationError('Error! Tidak boleh kategori yang rekursif')
    
  5. Tambahkan hak akses pada ir.model.access

    id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
    access_hostel_manager_id,access.hostel.manager,asramaku.model_asrama_hostel,group_hostel_manager,1,1,1,1
    access_hostel_user_id,access.hostel.user,asramaku.model_asrama_hostel,group_hostel_user,1,0,0,0
    access_hostel_room_manager_id,access.hostel.room.manager,asramaku.model_asrama_room,asramaku.group_hostel_manager,1,1,1,1
    access_hostel_room_user_id,access.hostel.room.user,asramaku.model_asrama_room,asramaku.group_hostel_user,1,0,0,0
    access_hostel_amenities_manager_id,access.hostel.amenities.manager,asramaku.model_asrama_amenities,asramaku.group_hostel_manager,1,1,1,1
    access_hostel_amenities_user_id,access.hostel.amenities.user,asramaku.model_asrama_amenities,asramaku.group_hostel_user,1,0,0,0
    access_hostel_student_manager_id,access.hostel.student.manager,asramaku.model_asrama_student,asramaku.group_hostel_manager,1,1,1,1
    access_hostel_student_user_id,access.hostel.student.user,asramaku.model_asrama_student,asramaku.group_hostel_user,1,0,0,0
    access_hostel_category_manager_id,access.hostel.category.manager,asramaku.model_asrama_category,asramaku.group_hostel_manager,1,1,1,1
    access_hostel_category_user_id,access.hostel.category.user,asramaku.model_asrama_category,asramaku.group_hostel_user,1,0,0,0
    
  6. Start ssh dengan upgrade modul

  7. Tampilan yang dihasilkan
  8. Data yang masuk ke tabel asrama_category

Kunjungi www.proweb.co.id/implementasi-odoo/ untuk menambah wawasan implementasi Odoo ERP.