Dalam pengisian form pada aplikasi berbasis Odoo 17 kita dapat menggunakan serangkaian wizard untuk mengarahkan pengisian form secara tepat.
Pembuatan wizard pada pengembangan aplikasi Odoo 17 adalah seperti pada langkah-langkah berikut ini
- Memulai SSH file system
- Model untuk wizard
from odoo import models, fields from datetime import datetime class AssignRoomStudentWizard(models.TransientModel): _name = 'assign.room.student.wizard' room_id = fields.Many2one('asrama.room', 'Room', required=True) def add_room_in_student(self): asrama_room_student = self.env['asrama.student'].browse(self.env.context.get('active_id')) if (asrama_room_student): asrama_room_student.update({ 'hostel_id' : self.room_id.hostel_id.id, 'room_id' : self.room_id.id, 'admission_date' : datetime.today() })
- View untuk wizard
<?xml version="1.0" encoding="utf-8"?> <odoo> <!-- assign.room.student.wizard form view --> <record id="assign_room_student_wizard_view_form" model="ir.ui.view"> <field name="name">Assign room student wizard view.form</field> <field name="model">assign.room.student.wizard</field> <field name="arch" type="xml"> <form string="Assign Room"> <sheet> <group> <field name="room_id" /> </group> </sheet> <footer> <button string="Update" name="add_room_in_student" class="btn-primary" type="object" /> <button string="Cancel" class="btn-default" special='cancel' /> </footer> </form> </field> </record> <!-- assign.room.student.wizard action window --> <record id="assign_room_student_wizard_action" model="ir.actions.act_window"> <field name="name">Assign Room</field> <field name="res_model">assign.room.student.wizard</field> <field name="view_mode">form</field> <field name="target">new</field> </record> <menuitem id="wizard_assign_room_menu" name="Wizard Assign Room" parent="hostel_main_menu" action="assign_room_student_wizard_action" sequence="4"/> </odoo>
- Pengisian ir.model.access.csv
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 access_hostel_assign_room_student_wizard_id,access.hostel.assign.room.student.wizard,asramaku.model_assign_room_student_wizard,asramaku.group_hostel_manager,1,1,1,1
- Model asrama.student
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') 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
- View asrama_student.xml
<?xml version="1.0" encoding="utf-8"?> <odoo> <!-- 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"/> </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>
- Wizard init
from . import assign_room_student
- Init
from . import models from . import controllers from . import wizard
- Manifest
{ 'name': 'Manajemen Asrama', "data":[ "security/hostel_security.xml", "security/ir.model.access.csv", "data/data.xml", "wizard/assign_room_student.xml", "views/hostel.xml", "views/asrama_room.xml", "views/asrama_student.xml", ], }
- Memulai Odoo dengan upgrade modul
- Menjalankan wizard
Room awal suatu murid kemudian klik Wizard Assign Room:
Pengupdatean kamar menggunakan wizard:
Hasil pemanggilan wizard:
Kunjungi www.proweb.co.id/implementasi-odoo/ jika anda membutuhkan layanan mplementasi Odoo ERP.