Kita akan melanjutkan pembahasan pemrograman Odoo 17 mengenai method yang menggunakan api decorator.
Method model dengan API decorator pada kustomisasi Odoo 17 adalah seperti pada langkah berikut ini
- Start SSH Filesystem
- Model asrama.room
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485from odoo import fields, models, api, _
from odoo.exceptions import ValidationError
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
:
continue
def make_available(self):
self.change_state(
'available'
)
def make_closed(self):
self.change_state(
'closed'
)
- View asrama_room
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576<?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"
/>
<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>
- Start Odoo dan upgrade modul
- Tabel asrama_room
- Tampilan
Informasi lebih lanjut mengenai decorator pada Odoo silahkan mengunjungi
1. https://www.odoo.com/forum/help-1/when-i-use-api-model-205479 .
2. https://www.cybrosys.com/blog/an-overview-of-method-decorators-in-odoo-17 .
Kunjungi www.proweb.co.id/implementasi-odoo/ untuk menambah wawasan implementasi Odoo ERP.