Onchange untuk Perubahan Field Pembuatan Aplikasi Odoo 17

Jun 6, 2025 | Odoo 17 Development

Ketika mengembangkan aplikasi menggunakan Odoo 17 kita biasa membuat tampilan di mana nilai suatu field bergantung dari field-filed lain. Di sini kita akan menggunakan onchange.

Penggunaan onchange untuk perubahan field pembuakan aplikasi Odoo 17 adalah seperti pada langkah-langkah berikut ini

  1. Start SSH filesystem

  2. Model asrama.student

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    from datetime import datetime, timedelta
    from odoo import  _, fields, models, api
    from odoo.exceptions import UserError
     
    class AsramaStudent(models.Model):
        _name = 'asrama.student'
        _description = 'Informasi Asrama Student'
        partner_id = fields.Many2one('res.partner', ondelete='cascade', delegate=True)
     
        #name = fields.Char('Nama pelajar')
        gender = fields.Selection(
            [('male','Male'),('female','Female'),('other','Other')],
            string='Jenis kelamin',
            help='Jenis kelamin pelajar',
        )
        active = fields.Boolean('Active',default=True,help='Activate/Deactive record')
     
        room_id = fields.Many2one('asrama.room','Room',help='Pilih room')
        hostel_id = fields.Many2one('asrama.hostel',related='room_id.hostel_id')
         
        status = fields.Selection(
            [('draft','Draft'),('reservation','Reservation'),('pending','Pending'),('paid','Paid'),('discharge','Discharge'),('cancel','Cancel')],
            string='Status',copy=False,default='draft',
            help='Status asrama student'
        )
     
        @api.depends('admission_date','discharge_date')
         
        def _compute_check_duration(self):
            """Mengecek durasi"""
            for rec in self:
                if rec.discharge_date and rec.admission_date:
                    rec.duration = (rec.discharge_date - rec.admission_date).days
     
        def _inverse_duration(self):
            for stu in self:
                if stu.discharge_date and stu.admission_date:
                    duration = (stu.discharge_date - stu.admission_date).days
                    if duration != stu.duration:
                        stu.discharge_date = (stu.admission_date + timedelta(days=stu.duration)).strftime('%Y-%m-%d')
                         
        admission_date = fields.Date('Tanggal masuk',help='Tangga di mana pelajar masuk asrama',
            default=fields.Datetime.today())
     
        discharge_date = fields.Date('Tanggal keluar',help='Tanggal di mana pelajar keluar asrama')
     
    #    duration = fields.Integer('Durasi', compute='_compute_check_duration',inverse='_inverse_duration',
    #        help='Durasi lamanya tinggal')
     
        duration = fields.Integer('Durasi', inverse='_inverse_duration',
            help='Durasi lamanya tinggal')
     
        def action_assign_room(self):
            self.ensure_one()
            if self.status != 'paid':
                raise UserError(_("Tidak bisa memberikan room jika belum Paid!"))
            room_as_super_user = self.env['asrama.room'].sudo()
            room_rec = room_as_super_user.create({
                'name': 'Kamar A-505',
                'room_no': 'A-505',
                'floor_no': 1,
                'student_per_room' : 5,
                'category_id' : self.env.ref("asramaku.kategori_elite").id,
                'hostel_id': self.hostel_id.id,
            })
     
            if room_rec:
                self.sudo().room_id = room_rec.id
             
        def action_wizard_assign_room(self):
            return {
                'type' : 'ir.actions.act_window',
                'name' : _('Assign Room'),
                'res_model' : 'assign.room.student.wizard',
                'view_type' : 'form',
                'view_mode' : 'form' ,
                'views' : [[False,'form']],
                'target': 'new',
            }
         
        def action_remove_room(self):
            if self.env.context.get('is_hostel_room'):
                self.room_id = False
     
        @api.onchange('admission_date','discharge_date')
        def onchange_duration(self):
            if self.discharge_date and self.admission_date:
                self.duration = (self.discharge_date - self.admission_date).days
  3. Start Odoo dengan upgrade modul

  4. Tampilan yang dihasilkan

Kunjungi www.proweb.co.id/implementasi-odoo/ jika anda membutuhkan layanan mplementasi Odoo ERP.