Extend Method Write dan Create pada Kustomisasi Odoo

Apr 4, 2025 | Odoo 17 Development

Kita mungkin ingin menambahkan logika tertentu pada method yang sudah ada misalnya function write dan create. Di sini kita akan melakukan extend method write dan create.

Extend method write dan create pada kustomisasi Odoo adalah seperti pada contoh berikut ini

  1. Start SSH file system

  2. Model asrama.room
    Pembatasan create dan write untuk pengisian field remark:

    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
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    import logging
    from odoo import fields, models, api
    from odoo.exceptions import ValidationError, UserError
    from odoo.tools.translate import _
     
    _logger = logging.getLogger(__name__)
     
    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'
        )
     
        remarks = fields.Text('Remarks')
     
        @api.model
     
        def create(self,values):
            if not self.user_has_groups('base.group_allow_export'):
                if values.get('remarks'):
                    raise UserError('Anda tidak diijinkan membuat remark')
            return super(AsramaRoom, self).create(values)
         
        def write(self,values):
            if not self.user_has_groups('base.group_allow_export'):
                if values.get('remarks'):
                    raise UserError('Anda tidak diijinkan mengubah remark')
            return super(AsramaRoom, self).write(values)
     
        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
     
        def update_room_no(self):
            self.ensure_one()
            self.room_no = 'RM2772'
         
        def find_room(self):
            domain = [
                '|',
                    '&',('name','ilike','bunga'),
                        ('hostel_id.name','=','Kemayoran'),
                    '&',('name','ilike','galo'),
                        ('hostel_id.name','=','BSD')
            ]
            rooms = self.search(domain)
            #_logger.info('Room ditemukan %s',rooms)
            print('Room ditemukan %s',rooms)
            return True
     
        def filter_members(self):
            all_rooms = self.search([])
            filtered_rooms = self.rooms_with_multiple_members(all_rooms)
            #_logger.info('Filtered Rooms: %s',filtered_rooms)
            print('Filtered Rooms:', filtered_rooms)
         
        def rooms_with_multiple_members(self, all_rooms):
            def predicate(room):
                if (len(room.student_ids))>1:
                    return True
            return all_rooms.filtered(predicate)
         
        def mapped_rooms(self):
            all_rooms = self.search([])
            room_authors = self.get_member_names(all_rooms)
            #_logger.info('Room Members: %s', room_authors)
            print('Room Members:', room_authors)
             
        def get_member_names(self,all_rooms):
            return all_rooms.mapped('student_ids.name')
         
        def sort_room(self):
            all_rooms = self.search([])
            rooms_sorted = self.sort_by_rent_amount(all_rooms)
            #_logger.info('Rooms before sorting: %s', all_rooms)
            #_logger.info('Rooms after sorting: %s', rooms_sorted)
            print('Rooms before sorting:', all_rooms)
            print('Rooms after sorting:', rooms_sorted)
     
        def sort_by_rent_amount(self,all_rooms):
            return all_rooms.sorted(key='rent_amount')
  3. View asrama_room

    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
    <?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>
                            <field name="state" widget='statusbar'/>
                        </header>
                        <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"/>
                        </header>
                        <header>
                            <button name="create_categories"  string="Create categories" type="object"/>
                            <button name="update_room_no"  string="Update Room No" type="object"/>
                            <button name="find_room"  string="Find Room" type="object"/>
                        </header>
                        <header>
                            <button name="filter_members"  string="Filter Members" type="object"/>
                            <button name="mapped_rooms"  string="Mapped Rooms" type="object"/>
                            <button name="sort_room"  string="Sort Room" type="object"/>
                        </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" />
                                <field name="category_id" />
                                <field name="date_terminate" />
                            </group>
                            <group description='Harga'>
                                <field name="student_per_room"/>
                                <field name="availability"/>
                                <field name="rent_amount" />
                                <field name="currency_id" />
                                <field name="remarks" />
                            </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"/>
  4. Start Odoo dengan logfile

  5. Seting untuk user biasa

  6. User biasa mencoba mengisi remark
    Tidak diijinkan menambahkan remark:


    User biasa tidak bisa mengubah remark:

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