Pemanggilan Onchange on Server pada Pembuatan Addon Odoo 17

Jun 12, 2025 | Odoo 17 Development

Kadang-kadang kita memerlukan onchange di mana datanya diambil dari server yang mungkin diubah oleh aplikasi lain saat kita membuat aplikasi dengan Odoo 17.

Pemanggilan onchange on server pada pembuatan aplikasi Odoo 17 adalah seperti pada penjelasan-penjelasan 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
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    from datetime import datetime, timedelta
    from odoo import  _, fields, models, api
    from odoo.exceptions import UserError
    from odoo.tests.common import Form
     
     
    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
         
        def return_room(self):
            self.ensure_one()
            wizard = self.env['assign.room.student.wizard']
            with Form(wizard) as return_form:
                return_form.room_id = self.room_id
                record = return_form.save()
                record.with_context(active_id=self.id).add_room_in_student()
  3. View 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
        <!-- asrama.student form view -->
        <record id="asrama_student_view_form" model="ir.ui.view">
            <field name="name">asrama.student.view.form</field>
            <field name="model">asrama.student</field>
            <field name="arch" type="xml">
                <form string="">
                    <sheet>
                    <header>
                        <button name="action_assign_room"  string="Assign Room" type="object" class="btn-primary"/>
                        <button name="action_wizard_assign_room"  string="Wizard Assign Room" type="object" class="btn-primary"/>
                        <button name="return_room"  string="Return Room" type="object" class="btn-primary"/>
                    </header>
                        <group>
                                <group>
                                    <field name="name"/>
                                    <field name="city"/>
                                    <field name="zip"/>
                                    <field name="country_id"/>
                                    <field name="gender"/>
                                    <field name="active"/>
                                </group>
                                <group>
                                    <field name="room_id"/>
                                    <field name="hostel_id"/>
                                    <field name="status"/>
                                    <field name="admission_date"/>
                                    <field name="discharge_date"/>
                                    <field name="duration"/>
                                </group>                   
                        </group>
                    </sheet>
                </form>
            </field>
        </record>
     
       <record model="ir.actions.act_window" id="action_asrama_student">
                <field name="name">Students</field>
                <field name="type">ir.actions.act_window</field>
                <field name="res_model">asrama.student</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">
                        Create Student.
                    </p>
                 </field>
        </record>
     
         
            <!-- This Menu Item must have a parent and an action -->
        <menuitem id="asrama_student_menu" name="Pelajar-pelajar" parent="hostel_main_menu" action="action_asrama_student" sequence="3"/>
     
    </odoo>
  4. Start Odoo dengan upgrade modul

  5. Tampilan

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